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

atmega162 usart0 1. problem z przerwaniem 2. BAUD RATE krzak

ja_fryta 09 Wrz 2009 19:42 1661 8
REKLAMA
  • #1 6999738
    ja_fryta
    Poziom 19  
    Witam
    Wiem ze temat byl walkowany miliony razy
    Miliony kombinacji tez juz probowalem ale nadal nie dziala
    Mianowicie mam problem z przerwaniem podczas odboiru danych
    
    .......
    #define F_CPU 1000000L
    #define UART_BAUD_RATE 4800
    #define MYUBRR F_CPU/16/UART_BAUD_RATE-1 
    .......
    ISR(SIG_USART0_RECV)
    {
    	flash_led();
    }
    ........
    void USART0_Init( unsigned int ubrr )
    {
    	/* Set baud rate */
    	UBRR0H = (unsigned char)(ubrr>>8);
    	UBRR0L = (unsigned char)ubrr;
    	/* Enable receiver and transmitter */
    	UCSR0B = (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);
    	/* Set frame format: 8data, 2stop bit */
    	UCSR0C = (1<<URSEL0)|(1<<USBS0)|(3<<UCSZ00);
    } 
    ........
    

    Wysylanie danych mi dziala chociaz tez nie do konca dobrze
    Przy 4800 wszystko dochodzi bez problemu a przy 9600 juz mam krzaki

    Wiekszym problemem jest to ze przerwanie nie jest wywolywane
    Funkcja flash_led() - zapalenie na 1s diody na porcie A
  • REKLAMA
  • #2 6999817
    mirekk36
    Poziom 42  
    a zajrzałeś chociaż sobie na ostatnią stronę rozdziału USART w PDF'ie do swojego procka - gdzie są tabelki w których jak byk masz przedstawione procenty błędów dla danych prędkości RS232 dla poszczególnych częstotliwości taktowania????

    wystarczy zobaczyć sobie na tabelkę pierwszą z pierwszych - kwarc 1MHz i prędkość 9600bps - żeby zobaczyć że w podstawowym trybie masz błąd aż -7% !!!! - można to zniwelować ustawiając U2X na 1 - albo wystarczy przestawić fusebity na 8MHz i już 9600 będzie ci śmigało

    Dodano po 2 [minuty]:

    jeśli chodzi o przerwania korzystaj z SIGNAL a nie ISR (a dlaczego? to już sobie sam doczytaj)

    poza tym, kto wie jak? i czy ty w ogóle prawidłowo inicjalizujesz to swoje przerwanie - skoro pokazałeś tylko kawałek kodu odnośnie RS232 a resztę pozostawiłeś dla wróżek
  • #3 6999863
    ja_fryta
    Poziom 19  
    dlaczego ze signal jak doczytywalem to wlasnie pisza zeby korzystac z isr
    signal tez juz probowalem i tez nie dzialalo
    co ci wiecej potrzeba odnosnie tego kodu masz moja funkcje init i przerwanie
  • REKLAMA
  • Pomocny post
    #4 7000275
    kwesoly
    Poziom 15  
    mirekk36 napisał:

    jeśli chodzi o przerwania korzystaj z SIGNAL a nie ISR (a dlaczego? to już sobie sam doczytaj)


    Wycinek z <avr/interrupt.h> z najnowszego AVR-GCC
    #if defined(__DOXYGEN__)
    /** \def SIGNAL(vector)
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Introduces an interrupt handler function that runs with global interrupts
        initially disabled.
    
        This is the same as the ISR macro without optional attributes.
        \deprecated Do not use SIGNAL() in new code. Use ISR() instead.
    */
    #  define SIGNAL(vector)


    Coś pomijam?

    Dodano po 9 [minuty]:

    ja_fryta napisał:

    
    ISR(SIG_USART0_RECV)
    {
    	flash_led();
    }
    


    Większym problemem jest to ze przerwanie nie jest wywoływane
    Funkcja flash_led() - zapalenie na 1s diody na porcie A

    Czy mnie wzrok myli czy też kolega wywołuje funkcje trwająca 1s w przerwaniu odpowiedzialnym za odbiór 1 bajtu? Próbujesz spowolnić UART do 8bps?:)
    Pamiętaj że dopóki nie odczytasz pobranego bajtu USART nie przyjmuje kolejnych danych, ustawia tylko bit DOR w UCSR0A.
    zakładam że po tym USART0_Init włączasz przerwania:


    Zdecydowanie nie jesteśmy wróżkami - jeśli się wstydzisz całości to popraw czytelność dla własnego dobra :)
  • #5 7000428
    mirekk36
    Poziom 42  
    ja_fryta napisał:
    dlaczego ze signal jak doczytywalem to wlasnie pisza zeby korzystac z isr

    ok - tu mi się pomerdało - więc chyba jest dobrze z tym ISR

    ja_fryta napisał:

    co ci wiecej potrzeba odnosnie tego kodu masz moja funkcje init i przerwanie


    co mi potrzeba??? nie mam żadnego twojego kodu .... i powiem wiecej podobnie uprzejmie jak ty, i mało mnie on interesuje, poza tym mi nic nie potrzeba - co za gościu?
  • REKLAMA
  • #6 7000600
    ja_fryta
    Poziom 19  
    do kwesoly
    tak w main mam sei() zaraz poz init uart
    kodu nie podawalem calego gdzy jest dosc dlugi i odpowiada glownie za klawiature 4x4 i operacje wykonywane na niej
    co do spowolnienia nie chodzi mi o to zeby to dzialalo szybko / to jest tylko test czy przerwanie dziala
  • #7 7001538
    ja_fryta
    Poziom 19  
    kwesoly jestes wielki
    dopiero teraz doczytalem twoj post i jak tylko zdjalem flage RXC w pierszej linijce przerwania ruszylo mi
    dzieki wilkie

    teraz moj mniejszy problem krzaki
    zmienilem f_cpu na 8MHz
    przy 19200 error powinno byc na poziomie 0.2%
    niestety ja mam dalej wiekszosc krzakow - chociaz i tak jest juz troche lepiej niz przy 1MHz
  • REKLAMA
  • #9 7001806
    ja_fryta
    Poziom 19  
    tak
    usunalem z F_CPU z pliku bo mi wyskakiwalo ze jest juz zadeklarowane w makefile i teraz tylko tam zmieniam

    moze zle ustawilem te 8MHz ?
    wygladalo to tak ze zmienilem F_CPU i odznaczylem CKDIV8 w ponyprog

    Dodano po 2 [godziny] 2 [minuty]:

    przy 1MHz i nawet przy U2X = 1 bledy mam i tak 100% - 80%
    dzieje sie tak tylko dla predkosci wiekszych niz 4800
    wtf ?
REKLAMA