реклама на сайте
подробности

 
 
> Assembler uart
KIG
сообщение Jan 11 2009, 17:02
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Goodefine
сообщение Jan 12 2009, 15:34
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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 .


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
KIG
сообщение Jan 13 2009, 09:48
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884



Спасибо, разобрался, отсутсвовало определение регистра UCSR0C. Он задает количество бит в сообщении.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016