Регистр UCSRC не инициализируется в atmega8
- Войдите на сайт для отправки комментариев
Пнд, 24/05/2021 - 10:06
Здравствуйте уважаемые форумчане! Регистр UCSRC не инициализируется в atmega8! В чем может быть проблема?
Вот код
.device ATmega8
.include "m8def.inc" ; Присоединение файла описаний
.list
.cseg ; Выбор сегмента программного кода
.org 0 ; Установка текущего адреса в нуль
start:
.org $000
rjmp RESET ; Reset Handler
.org $001
reti ;rjmp EXT_INT0 ; IRQ0 Handler
.org $002
reti ;rjmp EXT_INT1 ; IRQ1 Handler
.org $003
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
.org $004
reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
.org $005
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
.org $006
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
.org $007
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
.org $008
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
.org $009
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org $00a
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
.org $00b
reti ;rjmp USART_RXC ; USART RX Complete Handler
.org $00c
reti ;rjmp USART_UDRE ; UDR Empty Handler
.org $00d
reti ;rjmp USART_TXC ; USART TX Complete Handler
.org $00e
reti ;rjmp ADC ; ADC Conversion Complete Handler
.org $00f
reti ;rjmp EE_RDY ; EEPROM Ready Handler
.org $010
reti ;rjmp ANA_COMP ; Analog Comparator Handler
.org $011
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
.org $012
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
; -----------------------------------------Модуль инициализации
RESET: ldi r16,high(RAMEND) ; Main program start
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
; -----------------------------------------Инициализация UART
ldi r16,51 ; load baud prescale
ldi r17,0
rcall initUART ; call initUART subroutine
cli
; -----------------------------------------Начало основного цикла программы
main:
ldi r16,'A' ; load char 'a' into r16
rcall send ; transmit character
rjmp main
; -----------------------------------------Подпрограмма отправки по UART
send: ldi r17,UCSRA ; load UCSR0A into r17
sbrs r17,UDRE ; wait for empty transmit buffer
rjmp send ; repeat loop
out UDR,r16 ; transmit character
ret ; return from subroutine
; -----------------------------------------Инициализация UART
initUART:
out UBRRL,r16 ; load baud prescale
out UBRRH,r17
; to UBRR0
ldi r16, 0b00000000
out UCSRA, r16
ldi r16,(1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE) ; enable transmitter
out UCSRB,r16
; and receiver
ldi r16,(1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1) ; enable transmitter
out UCSRC,r16
ret ; return from subroutine
Проверяю в Simulator, в панеле I/0:


Значение UBRR 51 правильно выбрали? Соответствует частоте процессора?
Да, верно. Частота 8МГц, внутренний RC. Я уже смог его инициализировать. Оказывается бит URSEL не нужно выставлять. Там получается что UBRRH и UCSRC в одном адресе находятся. Если URSEL = 1 то тогда это UBRRH, а если URSEL = 0 то это UCSRC. Только теперь другая проблема возникла. В программу Terminal v1.9b приходит символ <0>, вместо 'A'.
Там получается что UBRRH и UCSRC в одном адресе находятся. Если URSEL = 1 то тогда это UBRRH, а если URSEL = 0 то это UCSRC.
Странно . Как раз даташит на "столе" был, занимался устройством с Atmega8. Глянул но там как раз наоборот...
Да, я тоже через даташит делал. Но в итоге так регистр UCSRC не инициализировался. После того как убрал бит URSEL сразу формат выставился.