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

AVR Uart Atmega16 - AVR Uart resetuje mikroprocesor

TMEA 22 Lis 2012 09:49 1836 9
  • #1 22 Lis 2012 09:49
    TMEA
    Poziom 16  

    Witajcie

    Mam problem. Zrobiłem układ który wysyła do wyświetlacza TFT dane za pomocą funkcji opisanej w datascheet Atmegi16. Działa super:

    void USART_Transmit( unsigned int data )
    {
    while ( !( UCSRA & (1<<UDRE)));
    UCSRB &= ~(1<<TXB8);
    if ( data & 0x0100 )
    UCSRB |= (1<<TXB8);
    UDR = data;
    }

    zrobiłem też odbiór i tu się zaczynają schody:

    ISR(USART_RXC_vect)
    {
    tablet[tabint] = UDR; tabint++;

    if ((tablet[tabint]==0x3C) && (tablet[tabint-1] = 0xC3) && (tablet[tabint-2] = 0x33)&& (tablet[tabint-3] = 0xCC) ) {tabint=0;}
    }
    inicjacja tez a datascheet atmega16
    void USART_Init( unsigned int baud )
    {
    /* Set baud rate */
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* Enable receiver and transmitter */
    //UCSRB = (1<<RXEN)|(1<<TXEN); // to było
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXC);
    /* Format ramki: 8 bitów danych, 1 bit stopu */
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
    }

    tak jak pisałem wysyłanie danych przez mikroprocesor jest poprawne. Wysyłam czasem kilkanaście bajtów i żadnych problemów ale jak tylko chce odebrać daną przez przerwanie tu atmega często się resetuje. Wyświetlacz wysyła paczki danych po kilka bajtów (często zmienna ilość) dlatego w funkcji "ISR" jest znacznik końcowych bajtów które zawsze są identyczne czyli 0xCC,0x33,0xC3,0x3C. Dlaczego następują resety? 1 raz po uruchomieniu układu dana jest poprawnie wysłana a juz kolejny raz jest "zawias" albo reset atmegi. Męczę się już 3 dzień nad tym :D czy już nie widzę jakiegoś prostego błędu?

    Układ jest na kwarcu 12MHz. Wcześniej był na wewnętrznym generatorze 2MHz i takie same objawy. Zmiana prędkości też nic nie poprawiała.

    #define FOSC 12000000// Clock Speed
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1

    pozdrawiam :)

    0 9
  • #2 22 Lis 2012 10:09
    435758
    Użytkownik usunął konto  
  • #3 22 Lis 2012 10:13
    TMEA
    Poziom 16  

    Zawsze staram się aby program miał 0 Warningów i ma 0. Szczerze to nawet jak instrukcja if była taka: tablet[tabint] = UDR; tabint++;
    czyli dodawanie do tablicy bajtów to działo się tak samo. A co może być źle w tym moim "if" ? :)

    0
  • #4 22 Lis 2012 10:18
    435758
    Użytkownik usunął konto  
  • #5 22 Lis 2012 10:23
    TMEA
    Poziom 16  

    if ((tablet[tabint]==0x3C) && (tablet[tabint-1] == 0xC3) && (tablet[tabint-2] == 0x33)&& (tablet[tabint-3] == 0xCC) ) {tabint=0;}
    nic to niestety nie zmieniło. wydaje mi się ze nie tu jest problem tylko z jakimiś przepełnieniami czy coś. NIe trzeba czegoś więcej dopisać w tym przerwaniu? wyłączenia przerwania czy coś?

    0
  • #6 22 Lis 2012 10:45
    tehaceole

    Poziom 28  

    A pomyślałeś nad zabezpieczeniem programu na wypadek wyjścia indeksu "tabint" poza obszar tablicy?
    Co z tego, że Ty wysyłasz sobie ramkę danych zakończoną "0xCC,0x33,0xC3,0x3C".
    W przypadku, gdy nie zostanie poprawnie zdekodowana to zmienna "tabint" nie zostanie wyzerowana i kolejne bajty przychodzące spowodują wyjście indeksu poza tablicę. A wtedy:
    - jakieś dziwne przeskoki po programie albo
    - niekontrolowane restarty mikrokontrolera.

    0
  • #7 22 Lis 2012 10:48
    TMEA
    Poziom 16  

    wiesz co, masz rację chyba. Więc jak proponujesz to rozwiązać? bo ja jakoś nie mam pomysłu

    0
  • #8 22 Lis 2012 11:21
    tehaceole

    Poziom 28  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Generalnie zainteresuj się zagadnieniem bufora cyklicznego. Zerknij na kody udostępniane do książek Mirka. Tam ma on to ładnie ogarnięte. Bo w powyższym przykładzie możesz gubić "pakiety".

    0
  • #9 22 Lis 2012 18:42
    1428163
    Użytkownik usunął konto  
  • #10 22 Lis 2012 19:33
    TMEA
    Poziom 16  

    o Mistrzu _marku :) dziękuję CI. Układ zachowuje się znacznie lepiej. Teraz zawiesza się tylko jak za szybko naciskam przyciski to znaczy tak jakby za dużo danych leciało do uartu i nie mógł się wyrobić z przeliczeniem. Co proponujesz? A co mam wstawić w miejsce "mission complete"? :)

    0