Регистр 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 сразу формат выставился.