|
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 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
|
|
|