|
|
  |
Assembler uart |
|
|
|
Jan 11 2009, 17:02
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884

|
Здравствуйте. Написал программу для передачи символа через UART на Ассемблере. Прошил МК, а символ получить не могу. Подскажите, пожалуйста, что не так? Программа следующая (Atmega164P, кварц 7,3728МГц):
include <m164def.inc> #include <iomacros.inc>
.def dummy=R19 .cseg
ldi R24, low(RAMEND) ; SP = RAMEND ldi R25, high(RAMEND) out SPL, R24 out SPH, R25
; ---------------------------------- init UART ------------------------------------------
ldi R24, 23 ; Baud rate = 19.2 bps sts UBRR0L, R24
ldi R24,0 sts UBRR0H, R24
ldi R24,(1<<RXEN0)|(1<<TXEN0) ; Enable receiver & transmitter, 8-bit mode sts UCSR0B,R24
rcall uartSend ; send the read character via the UART
uartSend: SKBS UCSR0A,UDRE0,dummy ; wait for empty transmit buffer (until UDRE==1) rjmp uartSend ldi R16, 48 STORE UDR0,R16 ; UDR = R16, start transmission
Delay: ldi R16,10 rjmp Delay
|
|
|
|
|
Jan 11 2009, 18:27
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата Код ; ---------------------------------- init UART ------------------------------------------
ldi R24, 23; Baud rate = 19.2 bps sts UBRR0L, R24
ldi R24,0 sts UBRR0H, R24 Команда sts выполняет непосредственную запись в ОЗУ. Вам же нужно переслать значение из регистра общего назначения в регистр ввода-вывода. Кроме того, сначала производится запись в старший байт, затем в младший. Этим обычно занимается команда out: Код ; ---------------------------------- init UART ------------------------------------------ ldi R24, 0 ldi R25, 0x17 ... out UBRR0H, R24; Baud rate = 19.2 bps out UBRR0L, R25 ... ldi R24,(1<<RXEN0)|(1<<TXEN0); Enable receiver & transmitter, 8-bit mode out UCSR0B,R24
Сообщение отредактировал Goodefine - Jan 11 2009, 19:01
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Jan 11 2009, 19:27
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(KIG @ Jan 11 2009, 21:46)  Согласно описания МК регистры имеют следующие адреса: .equ UBRR0L = 0xc4 ; MEMORY MAPPED .equ UBRR0H = 0xc5 ; И правда, не глянул какая мега... Цитата(KIG @ Jan 11 2009, 21:46)  На языке СИ задаю сначала младший регистр, а затем старший и все работает нормально. Если на Си у вас работает, загляните в листинг. Вот, например, как CAVR генерит начальный код инициализации USART0: На Cи: Код // USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud Rate: 19200 UCSR0A=0x00; UCSR0B=0x18; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x17; На асме: Код ;0000 007F // USART0 initialization ;0000 0080 // Communication Parameters: 8 Data, 1 Stop, No Parity ;0000 0081 // USART0 Receiver: On ;0000 0082 // USART0 Transmitter: On ;0000 0083 // USART0 Mode: Asynchronous ;0000 0084 // USART0 Baud Rate: 19200 ;0000 0085 UCSR0A=0x00; STS 192,R30 ;0000 0086 UCSR0B=0x18; LDI R30,LOW(24) STS 193,R30 ;0000 0087 UCSR0C=0x06; LDI R30,LOW(6) STS 194,R30 ;0000 0088 UBRR0H=0x00; LDI R30,LOW(0) STS 197,R30 ;0000 0089 UBRR0L=0x17; LDI R30,LOW(23) STS 196,R30
Сообщение отредактировал Goodefine - Jan 11 2009, 19:45
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Jan 12 2009, 15:34
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(KIG @ Jan 12 2009, 13:47)  ...определение регистров X,Z,Y. Минималисткий рабочий вариант: CODE ;Chip type : ATmega164P ;Clock frequency : 7,372800 MHz
#pragma AVRPART ADMIN PART_NAME ATmega164P #pragma AVRPART MEMORY PROG_FLASH 16384 #pragma AVRPART MEMORY EEPROM 512 #pragma AVRPART MEMORY INT_SRAM SIZE 1024 #pragma AVRPART MEMORY INT_SRAM START_ADDR 0x100
.EQU RAMEND=0x4FF .EQU EECR=0x1F .EQU UCSR0B=0xC1 .EQU UBRR0H=0xC5 .EQU UBRR0L=0xC4 .EQU SPL=0x3D .EQU SPH=0x3E ;///////////////////// ;INTERRUPT VECTORS JMP __RESET
__RESET: CLI CLR R30 OUT EECR,R30
;STACK POINTER INITIALIZATION LDI R30,LOW(RAMEND) OUT SPL,R30 LDI R30,HIGH(RAMEND) OUT SPH,R30
;DATA STACK POINTER INITIALIZATION LDI R28,LOW(0x200) LDI R29,HIGH(0x200)
JMP _main
;///////////////// _transmitRS232byte: _fl_transmit: LDS R30,192 LDI R31,0 ANDI R30,LOW(0x20) BREQ _fl_transmit ;UDR0=byte; LD R30,Y STS 198,R30 ADIW R28,1 RET ;///////////////
_main: ;UASART0 init ;UCSR0B=0x18; LDI R30,LOW(24) STS UCSR0B,R30 ;UBRR0H=0x00; LDI R30,LOW(0) STS UBRR0H,R30 ;UBRR0L=0x17; LDI R30,LOW(23) STS UBRR0L,R30
;///////////////////// ;transmitRS232byte(48); LDI R30,LOW(48) ST -Y,R30 RCALL _transmitRS232byte
_while_1_:
;/// Main Loop \\\
RJMP _while_1_ От модератора. Для объемных исходников пользуйтесь тэгом codebox, вместо code .
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|