logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

UART i ATtiny2313 - błędna pierwsza transmisja danych przez RS232C?

Corni 09 Kwi 2007 14:07 1059 2
REKLAMA
  • #1 3769221
    Corni
    Poziom 11  
    Posty: 48
    Ocena: 3
    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 :D
  • REKLAMA
  • #2 3770065
    VanThor
    Poziom 19  
    Posty: 224
    Pomógł: 34
    Ocena: 5
    To spróbuj z takim, trochę przerobionym programem:

    
    .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc"
    
    .cseg
    .org 0x0000
    
    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
    
    // włączamy możliwość odbierania i wysyłania !
    ldi r16, (1<<RXEN)|(1<<TXEN)
    out UCSRB,r16
    
    read:
    
    sbis ucsra,rxc      // czeka az odbierze znak
    rjmp read
    
    in r0,udr             // czyta z UDR
    
    wyslij:
    out udr,r0        //ładuje z powrotem otrzymany bajt <- tu wysyłanie znaku się zaczyna
    out portb,r0      // wyswietla na ledach wartość R0
    
    //sbi ucsrb,txen    // wysyła bajt do PC <- za późno na włączenie możliwości nadawania
    rjmp read         // wraca do oczekiwania na nowy znak 
    


    To co robiłeś źle to włączenie możliwości wysyłania (TXEN) po wpisaniu znaku do wysłania do rejestru UDR. W rezultacie dopiero od drugiego odebranego i odsyłanego znaku mogło działać poprawnie (bo wtedy już bit TXEN jest ustawiony przed wpisem do UDR).
  • #3 3790655
    Corni
    Poziom 11  
    Posty: 48
    Ocena: 3
    Wielkie THX, myslałem ze to jest bit zezwolenia na wysłanie załadowanej juz wczesniej wartosci, teraz juz wszystko gra :) Pozdrawiam i dziękuję :)
REKLAMA