Niedawno zacząłem sie bawić asemblerem, napisałem taki krótki program, który odbiera 1 bajt danej z PC przez rs232c, a potem ją odsyła. Mam następujący problem: przy pierwszym cyklu wyslij-wróć dostaję błędną daną, i zawsze tę samą, np. wysyłam "a" (69dec) i dostaję jakies R z daszkiem, potem juz wszystko działa poprawnie, np. wysyłam znowu "a", wraca mi "a", wysyłam "4", dostaję "4".
Wartość w rejstrze odebrana przez mikrokontroler jest poprawna w pierwszym cyklu (ilustruje to na wyświetlaczu led). Wychodziłoby na to, ze do rejestru UDR trafia jakas błędna wartość, albo UART coś świruje za pierwszym razem.. W uP mam załozony kwarc 4MHz, baud rate = 9600, 1 bit stopu, brak kontroli parzystości. Z góry dziękuję za pomoc, niżej zamieszczam mój program. Btw zmiana baud rate na 2400 nie pomogła (ubrrl=103)
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc"
.cseg
.org 0x0000
rjmp start
start:
ldi r16,255 //ustawiamy porty
out ddrb,r16
out ddrd,r16
out portb,r16
ldi r16,0
out portd,r16
// ustawiamy uart
ldi r16,25
out ubrrl,r16
sbi ucsrb,rxen // włączamy odbieranie
rjmp read
read:
sbis ucsra,rxc // czeka az odbierze znak
rjmp read
in r0,udr // czyta z UDR
rjmp wyslij
wyslij:
out udr,r0 //ładuje z powrotem otrzymany bajt
out portb,r0 // wyswietla na ledach wartość R0
sbi ucsrb,txen // wysyła bajt do PC
rjmp read // wraca do oczekiwania na nowy znak
Dodano po 55 [minuty]:
wyslanie na początku programu "0" do uddr tymczasowo rozwiązało problem, jednak dalej nie wiem co moze byc powodem taiego zachowania UART'u. Byc moze po resecie cos pozostaje w rejestrze udr.. Bede bardzo wdzieczny za wyjasnienie
Wartość w rejstrze odebrana przez mikrokontroler jest poprawna w pierwszym cyklu (ilustruje to na wyświetlaczu led). Wychodziłoby na to, ze do rejestru UDR trafia jakas błędna wartość, albo UART coś świruje za pierwszym razem.. W uP mam załozony kwarc 4MHz, baud rate = 9600, 1 bit stopu, brak kontroli parzystości. Z góry dziękuję za pomoc, niżej zamieszczam mój program. Btw zmiana baud rate na 2400 nie pomogła (ubrrl=103)
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc"
.cseg
.org 0x0000
rjmp start
start:
ldi r16,255 //ustawiamy porty
out ddrb,r16
out ddrd,r16
out portb,r16
ldi r16,0
out portd,r16
// ustawiamy uart
ldi r16,25
out ubrrl,r16
sbi ucsrb,rxen // włączamy odbieranie
rjmp read
read:
sbis ucsra,rxc // czeka az odbierze znak
rjmp read
in r0,udr // czyta z UDR
rjmp wyslij
wyslij:
out udr,r0 //ładuje z powrotem otrzymany bajt
out portb,r0 // wyswietla na ledach wartość R0
sbi ucsrb,txen // wysyła bajt do PC
rjmp read // wraca do oczekiwania na nowy znak
Dodano po 55 [minuty]:
wyslanie na początku programu "0" do uddr tymczasowo rozwiązało problem, jednak dalej nie wiem co moze byc powodem taiego zachowania UART'u. Byc moze po resecie cos pozostaje w rejestrze udr.. Bede bardzo wdzieczny za wyjasnienie