Atmega8515 AVR Usart, AVR памяти, AVR CPU L oop журналы моделирования - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть такой код для atmega8515

.nolist             

.include "m8515def.inc"     

.list               

.equ fCK = 8000000          
.equ BAUD = 9600            
.equ UBRR_value = (fCK/(BAUD*16))-1 
.cseg               
.org 0              


main:

rcall init_USART    

LDI R16, 0xFF       
OUT DDRC, R16       

rcall USART_recieve 

OUT PORTC, R16  

LDI R16, 0x00       
OUT DDRA, R16       

in R16, PINA        

OUT PORTC, R16  

rcall USART_send    


init_USART:

ldi   R16, high(UBRR_value) 
out   UBRRH, R16                
ldi   R16, low(UBRR_value)      
out   UBRRL, R16                 

ldi   R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE) 
out   UCSRB, R16    


ldi   R16, (1<< URSEL)|(1<<UPM1)|(1<<UPM0)|(1<< UCSZ1)|(1<< UCSZ0)
out   UCSRC, R16            
ret                    

USART_send:
out   UDR, R16               
sending:                    

sbis  UCSRA, TXC       
rjmp  sending       
ret                   
USART_recieve:
sbis  UCSRA, RXC         


rjmp  USART_recieve  

in   R16, UDR       

ret                  

Я запускаю этот код в Proteus и получаю циклически следующие ошибки

PC = 0x0030. [AVR USART] Ошибка четности RX. [U1]

ПК = 0x0024. [AVR MEMORY] Чтение внешней памяти, когда интерфейс не включен (SRE = 0): [0x0260]. [U1]

ПК = 0x0000. [AVR MEMORY] Чтение внешней памяти, когда интерфейс не включен (SRE = 0): [0x0261]. [U1]

ПК = 0x0000. [AVR CPU] RET address = 0x0000 [U1]

PC = 0x0002. [AVR MEMORY] Запись во внешнюю память, когда интерфейс не включен (SRE = 0): [0x0261] = 01. [U1]

PC = 0x0002. [AVR MEMORY] Запись во внешнюю память, когда интерфейс не включен (SRE = 0): [0x0260] = 00. [U1] **

ПК = 0x0024. [AVR MEMORY] Чтение внешней памяти, когда интерфейс не включен (SRE = 0): [0x0260]. [U1] **

ПК = 0x0002. [AVR MEMORY] Чтение внешней памяти, когда интерфейс не включен (SRE = 0): [0x0261]. [U1] **

Я также включил схему протея для лучшего понимания Proteus_schema

1 Ответ

0 голосов
/ 06 апреля 2020

Похоже, что проблема в неинициализированном указателе стека.

После сброса SPH: SPL инициализируется равным 0x0000, поэтому любая запись в стек (push, rcall et c .) запишет на адрес 0x0000 (который сопоставлен с регистром r0), после чего указатель стека будет уменьшен и станет 0xFFFF. В ATmega8515 места RAM в 0x0260 и выше отображаются на внешнюю память, которая явно не связана с вашими схемами.

Добавьте инициализацию указателя стека в качестве первого действия в вашей программе, например:

ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16

Кроме того, в вашей программе нет l oop, и после rcall USART_send он будет go за пределами init_USART: label.

Возможно, вы захотите добавить rjmp main в этой точке .

А зачем вам писать программу на ассемблере? Не проще ли написать это в C?

...