Регистр UCSRC не инициализируется в atmega8

Tima123
Offline
Зарегистрирован: 29.01.2020

Здравствуйте уважаемые форумчане! Регистр 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:

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Значение UBRR   51 правильно выбрали? Соответствует частоте процессора?

Tima123
Offline
Зарегистрирован: 29.01.2020

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

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Tima123 пишет:

Там получается что UBRRH и UCSRC в одном адресе находятся. Если URSEL = 1 то тогда это UBRRH, а если URSEL = 0 то это UCSRC.

Странно . Как раз даташит на "столе" был, занимался устройством с Atmega8. Глянул но там как раз наоборот...

 

 

 

 

Tima123
Offline
Зарегистрирован: 29.01.2020

Да, я тоже через даташит делал. Но в итоге так регистр UCSRC не инициализировался. После того как убрал бит URSEL сразу формат выставился.