Atmega8, UART

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Вс ноя 25, 2012 08:12:54

Сообщение buregon »

Добрый день.
Сейчас ковыряюсь с UART`ом на меге8, налепил из примеров пробную прошивку - берет из массива строку, побайтно шлет в порт. Вроде все просто, но где то накосячил... Железка просто молчит, гоняю в дебаге (AVRStudio 4.13) - вижу, что первый байт упешно уходит (в отличие от железки), а после отправки второго - флаг готовности UDRE падает в 0 и не возвращается, ловлю вечный цикл. Ткните, пожалуйста, носом в ошибку :oops:
И вопрос не в тем: а где в AVR Studio 4 можно сменить кодировку файлов? У меня почему то Win-1252 стоит, неудобно...
Спойлер.include "m8def.inc"
.cseg
.org 0
;****************************************************
;Вектора прерываний
;****************************************************
rjmp Reset ;1 All Reset
rjmp INT_0 ;2 External Interrupt Request 0
rjmp INT_1 ;3 External Interrupt Request 1
rjmp TM2_COM ;4 Timer/Counter2 Compare Match
rjmp TM2_OVF ;5 Timer/Counter2 Overflow
rjmp TM1_CAPT ;6 Timer/Counter1 Capture Event
rjmp TM1_COMA ;7 Timer/Counter1 Compare Match A
rjmp TM1_COMB ;8 Timer/Counter1 Compare Match B
rjmp TM1_OVF ;9 Timer/Counter1 Overflow
rjmp TM0_OVF ;10 Timer/Counter0 Overflow
rjmp SerTrCom ;11 Serial Transfer Complete
rjmp UsRxCom ;12 USART Rx Complete
rjmp UsEmt ;13 USART Data Register Empty
rjmp UsTxCom ;14 USART Tx Complete
rjmp ADCCom ;15 ADC Conversion Complete
rjmp EprRdy ;16 EEPROM Ready
rjmp AnCom ;17 Analog Comparator
rjmp TWSerIn ;18 Two-Wire Serial Interface
rjmp ProMemRdy ;19 Store Program Memory Ready

;rjmp Start
;****************************************************
;Прерывания, заглушки для неиспользуемых
;****************************************************
;Reset: ;1 All Reset
INT_0: ;2 External Interrupt Request 0
INT_1: ;3 External Interrupt Request 1
TM2_COM: ;4 Timer/Counter2 Compare Match
TM2_OVF: ;5 Timer/Counter2 Overflow
TM1_CAPT: ;6 Timer/Counter1 Capture Event
TM1_COMA: ;7 Timer/Counter1 Compare Match A
TM1_COMB: ;8 Timer/Counter1 Compare Match B
TM1_OVF: ;9 Timer/Counter1 Overflow
TM0_OVF: ;10 Timer/Counter0 Overflow
SerTrCom: ;11 Serial Transfer Complete
UsRxCom: ;12 USART Rx Complete
UsEmt: ;13 USART Data Register Empty
UsTxCom: ;14 USART Tx Complete
ADCCom: ;15 ADC Conversion Complete
EprRdy: ;16 EEPROM Ready
AnCom: ;17 Analog Comparator
TWSerIn: ;18 Two-Wire Serial Interface
ProMemRdy: ;19 Store Program Memory Ready
RETI
Reset:
; Инициализация стека для возврата из вызова
ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16

; Разрешаем прерывания
;SEI



; Internal Hardware Init ====================
; Устанавливаем скорость, 51 - 9600 для 8МГц
.equ bauddivider = 51


uart_init:
; Шъем скорость,
LDI R16, low(bauddivider)
OUT UBRRL,R16
; Учитывать, что в UBRRH можно писать только при старшем бите 0
; т.к. частота - 51, в верхние биты писать не надо. Или надо для обнуления?
; Надо проверить
LDI R16, high(bauddivider)
OUT UBRRH,R16

LDI R16,0
OUT UCSRA, R16

; Включаем UART, иначе пины пашут как I/O
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT UCSRB, R16

; Учитывать, что в UCSRC можно писать только при старшем бите 1 (URSEL)
LDI R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC, R16

; Main =====================
; LDI R16,1
RJMP InitDB

Main:
RCALL ReadDB
MOV R16,R0

CPI R16,0 ; сравнить с крайним знач.
BREQ InitDB ; если равно - загрузка нач. знач.

RCALL uart_snt ; Отправляем букву в UART.

INC R18 ; Переходим на следующую букву
RJMP Main ; В начало цикла

;Отправка байта
uart_snt:
SBIS UCSRA,UDRE ; Пропускаем. если нет готовности
RJMP uart_snt ; Ждем готовности - флага UDRE

OUT UDR, R16 ; Шлем байт из R16
RET ; Возврат

ReadDB:
LDI ZH,High(TestLine*2) ;загрузка адреса 0-го
LDI ZL,Low(TestLine*2) ;элемента в рег. пару Z
LDI R17,0 ; прибавление внутр. адреса
ADD ZL,R18 ; R18 - указатель на номер элемента
ADC ZH,R17
LPM
RET

InitDB:
LDI R18,0
RJMP Main


TestLine:
.db "Testing read DB "
.db 0
Реклама
Родился
Сообщения: 3
Зарегистрирован: Вс ноя 25, 2012 08:12:54

Сообщение buregon »

Вопрос снимается, по запарке прошивал не тот хекс, на железке все работает :)))
Не понятно, откуда такой глюк в дебаге, ну да и пёс с ним
Реклама
Ответить

Вернуться в «AVR»