Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Problem z UART-em i USART-em w atmega8 i at902313

29 Wrz 2003 19:30 2074 6
  • Poziom 12  
    Mam maly problem z komunikacja miedzy at902313 z atmega8. Prubuje wyslac z 2313 dane z predkoscia 1800 do atmegi i nic. Pisze w asm-ie i mam takze problem z dwoma rejestrami w atmega UBBRH i UCSRC. Majat en sam adres i jeden bit ktory decuduje o dostepie do tych rejestrow. W emulatorze nie moge sie osobno dostac do rejestrow. Z gury dziekuje za ewentualn apomoc
  • Poziom 15  
    Rejestry UBRRH i UCSRC faktycznie mają ten sam adres i dostęp do nich jest realizowany następująco:

    Podczas zapisu o przeznaczeniu zapisywanej wartości decyduje ostatni 7 bit jeżeli =1 to zapis do UCSRC, jeżeli =0 to zapis do UBRRH

    Odczyt jest bardziej skomplikowany. Normalnie jeżeli odczytujesz z pod tego adresu to odczytasz wartość rejestru UBRRH, jeżeli chcesz odczytać rejest UCSRC to musisz odczytać go dwukrotnie w ciągu dwóch kolejnych cykli. Przykład:
    in r16,UBRRH ;w r16 znajdzie się wartość UBRRH
    in r17,UCSRC ;w r17 znajdzie się wartość UCSRC, ale tylko pod warunkiem wykonania wcześniejszej instrukcji 1 cykl wcześniej

    Możliwe, że emulator, którego używasz nie odczytuje/zapisuje poprawnie tych rejestrów i stąd Twoje problemy.

    Mam nadzieję, że nie namieszałem Ci za bardzo :).
  • Poziom 12  
    Dzieki za odpowiedz. Nie namieszales mi. A emulator ktorego uzywam to AVR Studio 4. No itam sie dzieja dziwne rzeczy heh :). Musze jeszce pokombinowac z tym i czy "bedzie transmisja" miedzy nimi jak bezposrednio podlacze nozke Rx z Tx?
  • Poziom 15  
    Teoretycznie AVR Studio w najnowszej wersji (4.07) powinno symulować UART poprawnie, przynajmniej tak jest napisane w dokumentacji, ale nie sprawdzałem. Odpalałem UART w ATMega8 i 2313, działa bez pudła. Podeślij fragment programu, z którym masz problemy to będę mógł napisać coś więcej.
  • Poziom 19  
    Mam również problem z ATmega8L. Nie moge odczytać informacji z UARTa. Robię tak, jak jest to opisane w datasheet ale nie dziala - odczytuje "śmieci". Zastosowałem przerwanie które wywoływane jest przy RXC=1 czyli wtedy jeśli coś jest w buforze. Proszę o pomoc.
  • Poziom 28  
    Kawalek mojej procedury w asemblerze.
    Na poczatku programu:

    .ORG URXCaddr
    rjmp ObslugaOdbiornikaUSART

    Inicjalizacja:
    IcjalizacjaUSART:
    ldi rTemp1,0x00.........;tu wpisac porzadane wartosci
    out UBRRH,rTemp1
    ldi rTemp1,0x00.........;tu wpisac porzadane wartosci
    out UBRRL,rTemp1
    ldi rTemp1,(1<<RXCIE)|(1<<RXEN)
    out UCSRB,rTemp1
    sei

    Procedura obslugi:
    ObslugaOdbiornikaUSART:
    in rKopiaSREG,SREG
    in rTemp1,UDR
    out SREG,rKopiaSREG
    reti

    rTemp1 to r16 a rKopiaSREG to r4
    Procedura dziala na przerwaniach i po wyjsciu z niej w rTemp1 jest odebrana dana. Jezeli chcesz wypelniac jakis bufor to musisz sam go sobie dopisac.
    Pozdro
    Dexter
  • Poziom 12  
    Witam sprawdz czy dobrales dobrze baud-rate. Atmegi maja wlasny rezonator wewnetrzny ktory jest domyslnie wlaczony, nie jest on najdokladniejszy i wlasnie dlatego przy komunikacji miedzy dwoma prockami moga sie pojawiac smieci przy niedokladnym skalibrowaniu. Najlepej uzywac takich samych kwarcow w obydwoch prockach.