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

Attiny2313 i USART w asemblerze

Adam Pyka 06 Kwi 2009 23:07 1925 5
REKLAMA
  • #1 6383036
    Adam Pyka
    Poziom 19  
    Witam!
    Próbuję uruchomić UARTA w trybie asynchronicznym w asemblerze.
    Debbuguję program i po wykonaniu linii:
    out UCSRC, R16

    zmienia mi się stan rejestru UBRRH z 0x00 na 0x26. Pytanie - dlaczego?
    Poniżej strzępki moich asemblerowskich myśli :)
    
    .INCLUDE "tn2313def.inc"
    ; kwarc 8MHz
    
    .equ BAUD=51 ;predkosc transmisji szeregowej 9600bps
    .list
    .cseg
    
    ;inicjalizacja stosu
        cli ;wylacz globalna obsluge przerwan
    	ldi R16, RAMEND ;laduje rejestr roboczy adresu konca pamieci SRAM
    	out SPL, R16 ;inicjalizuje wskaznik stosu      
        sei ;przywroc przerwania     
    
    Inicjacja: ;inicjacja interfejsu USART w trybie asynchroniznym
    	cli ;wylacz globalna obsluge przerwan
    	ldi R17, high(BAUD) ;laduje MSB do rejestru pomocniczego
    	ldi R16, low(BAUD) ;laduje LSB do rej. pomocn.
    	out UBRRH, R17 ;laduje wartosci do rejestrow
    	out UBRRL, R16 ;dla predkosci 9600bps
    	clr R16
    	out UCSRA, R16 ;zeruje wartosc rejestru funkcyjnego USART Control Status Register A
    	ldi R16, (1<<UCSZ1)|(1<<UCSZ0)
    	out UCSRC, R16 ;ustawienia ramki - slowo 8-bitowe, brak bitu parzystosci, 1 bit stopu
    	ldi R16, (1<<RXEN)|(1<<TXEN)|(1<<UDRIE)
    	out UCSRB, R16 ;wlacz nadajnik i odbornik i zezwol na przerwania od rejestru UDR
    	sei ;przywraca globalna obsluge przerwan
    
    Gotowosc_nadania: ;sprawdza gotowosc USARTu do nadawania
    	sbis UCSRA, UDRE ;pomija nastepny rozkaz, jesli flaga UDRE ustawiona (bufor nadawczy zajety)
    	rjmp Gotowosc_nadania ;czeka na wyzerowanie flagi
    
    Nadaj: ;nadaje slowo przez USART
    	ldi R16, 0xAB ;laduje rejestr pomocniczy wartoscia do nadania
    	out UDR,R16 ;i transmituje slowo
    
    Petla:
    	rjmp Petla ;nieskonczona petla
    

    Pozdrawiam,
    Adam Pyka
  • REKLAMA
  • #2 6384576
    Adam Pyka
    Poziom 19  
    Nie wiem przez kogo, ale usunięta została odpowiedź kolegi Atom1477, która brzmiała:
    Cytat:
    BO rejestry UCSRC i UBRRH mają ten sam adres.
    żeby zmienić UCSRC najstarszy bit w zapisywanym bajcie musi miec wartość 1.

    ldi R16, , 0xB6 //10000000b + 26h
    out UCSRC, R16

    I dlatego napisałem posta pod postem...

    No i faktycznie pomogło. Wpisałem tak:
    ldi R16, 0x86
    out UCSRC, R16

    Teraz mam inny problem - wszystko działa do linii:
    sbis UCSRA, UDRE ;pomija nastepny rozkaz, jesli flaga UDRE ustawiona (bufor nadawczy wolny)

    Po przejściu przez nią, program wraca do linii:
    out UBRRL, R16 ;dla predkosci 9600bps

    Pytanie - dlaczego?

    Pozdrawiam i dziękuję za zainteresowanie,
    Adam Pyka
  • REKLAMA
  • #3 6384692
    zumek
    Poziom 39  
    Adam Pyka napisał:
    Nie wiem przez kogo, ale usunięta została odpowiedź kolegi Atom1477, która brzmiała:
    Cytat:
    BO rejestry UCSRC i UBRRH mają ten sam adres.
    żeby zmienić UCSRC najstarszy bit w zapisywanym bajcie musi miec wartość 1.

    ldi R16, , 0xB6 //10000000b + 26h
    out UCSRC, R16

    Zapewne przez samego autora, ponieważ to co napisał, nie dotyczy ATTiny2313.
    Adam Pyka napisał:

    Teraz mam inny problem - wszystko działa do linii:
    sbis UCSRA, UDRE ;pomija nastepny rozkaz, jesli flaga UDRE ustawiona (bufor nadawczy wolny)

    Po przejściu przez nią, program wraca do linii:
    out UBRRL, R16 ;dla predkosci 9600bps

    Pytanie - dlaczego?

    Zapewne jakiś błąd w symulatorze - nie włączaj przerwań.
  • REKLAMA
  • Pomocny post
    #4 6385036
    Zaquadnik
    Poziom 27  
    Włączyłeś przerwanie zgłaszane po opróżnieniu rejestru UDR, a nie masz nigdzie procedury jego obsługi. Musisz ją zdefiniować dyrektywą .org adres aby została umieszczona pod odpowiednim adresem w pamięci, który przypisany jest do wektora tego przerwania. Jeśli przerwań nie obsługujesz nie ustawiaj bitu UDRIE. Chodzi o to, że po przepisaniu danej z UDR do rejestru przesuwnego UART zgłasza przerwanie i skacze pod adres jego obsługi.
  • REKLAMA
  • #5 6385212
    zumek
    Poziom 39  
    Zaquadnik napisał:
    Włączyłeś przerwanie zgłaszane po opróżnieniu rejestru UDR...

    No tak, nie zauważyłem tego, a już winę zwaliłem na symulator, który grzecznie skacze pod adres 0x0008 :cry:
  • #6 6397642
    Adam Pyka
    Poziom 19  
    Dziękuję Wszystkim za pomoc!
    Faktycznie - problem został rozwiązany po dopisaniu obsługi przerwania.
    Temat zamykam.

    Pozdrawiam,
    Adam Pyka
REKLAMA