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

odbiór znaku w USART poprzez przerwanie - SIGNAL

bisz 13 Lis 2010 22:29 1647 6
  • #1 8740338
    bisz
    Poziom 18  
    Witam. Tak czytam szukam, ale nie bardzo mogę znaleźć i zrozumieć. Widnieją w liście wektorów przerwań pozycje od skończenia odbierania danych. Jaka jest nazwa 'uchwytu' stosowanego w 'funkcji' SIGNAL jak np w obsłudze przerwania przetwornika A/C, aby obsłużyć wydarzenie jakim jest skonczenie odbierania znaku ? Chodzi mi to to aby program w pętli głównej robił co do niego należy, nie wiedząc kiedy ma spodziewac się znaku, jednakże cały czas byłby na to gotowy-aby go odebrać.
  • Pomocny post
    #2 8740384
    landy13
    Poziom 31  
    Jako że SIGNAL już się nie powinno używać, chodzi Ci zapewne o ISR(USART_RXC_vect)
  • #3 8741109
    bisz
    Poziom 18  
    Dlaczego sie nie używa ?
    SIGNAL(SIG_UART_RECV) też może być ?
  • #4 8741352
    tmf
    VIP Zasłużony dla elektroda
    Dlatego, że w nowych wersjach AVR-libc to wyleci i już tego nie będzie. Jeśli chcesz pisać niekompatybilny kod to oczywiście nikt ci tego nie zabroni.
  • Pomocny post
    #5 8741407
    ginar
    Poziom 21  
    Cytat:
    Dlaczego sie nie używa ?
    SIGNAL(SIG_UART_RECV) też może być ?

    niekoniecznie jest zły - bo nie podałeś jakiej wersji kompilatora używasz(jeśli najnowszej wersji to lepiej to zmień).
    Najlepiej:
    ....\WinAVR\doc\avr-libc
    odnajdź w tym pdf'ie <avr/interrupt.h>: Interrupts i tam sobie w tabeli sprawdź jak nazywa się uchwyt odb. znaku Uarta. Przy okazji dowiesz się dlaczego nie powinieneś używać SIGNAL (no chyba że masz wystarczająco starą wersje - to tak).
  • Pomocny post
    #6 8742684
    namlooc
    Poziom 15  
    bisz napisał:
    obsłużyć wydarzenie jakim jest skonczenie odbierania znaku ? Chodzi mi to to aby program w pętli głównej robił co do niego należy, nie wiedząc kiedy ma spodziewac się znaku, jednakże cały czas byłby na to gotowy-aby go odebrać.


    tak na szybko algorytm:
    
    volatile char bufor[50];
    volatile int ilosc_znakow;
    volatile char bufor_2[50];
    int wynik;
    ..
    ..
    ISR(USART1_RX_vect)  // przerwanie do odbioru znaku i zapisu do bufora
    {
    bufor[ilosc_znakow]=UDR1; ++ilosc_znakow;
    }
    ...
    ...
    int szukaj(char *wzorzec) // wyszukiwarka znakow w bufor_2
    {
    char *pozycja;
    pozycja=strstr((char*)bufor_2,wzorzec);
    return *pozycja;
    }
    ..
    ..
    int main()
    {
    UBRR1H = (unsigned char) (baud>>8);
    UBRR1L = (unsigned char) baud;       
    UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE1);
    UCSR1C = (0<<USBS1) | (3<<UCSZ10);
    sei(); //wlaczenie przerwania
    //niezaleznie co sie dzieje w programie, tablica 'bufor' jest wypelniana znakami ktore przyszly i nie dosc tego znasz jeszcze ilosc znakow
    while(0)
    {
    strcpy((char*)bufor,(char*)bufor_2); // kopiuje bufor do bufor_2
    wyczysc_zmienna_bufor(); // czyszcze bufor aby mogly przychodzic nowe znaki
    wynik=szukaj("ala ma kota"); // a w miedzy czasie obrabiam poprzednie dane
    if(wynik==0)
    {//nie znalazlem}
    else
    {//znalazlem}
    wynik=0;
    
    }
    }
    


    Do obslugi prostych zdarzen ok, do np. modemu gsm bardzo niedoskonale.
  • #7 8787219
    bisz
    Poziom 18  
    Zastosowałem SIGNAL(SIG_UART_RECV) i działa jak należy!
REKLAMA