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

zapętlenia przerwania SIGNAL(SIG_UART_RECV)

donelbaron 21 Cze 2009 14:52 2428 7
REKLAMA
  • #1 6684165
    donelbaron
    Poziom 15  
    dziwny problem mnie spotkał, nie wiem co tu zrobić , niby ustawiłem flagi na przerwania poczatku i końca transmisji, ale jak wyśle z komputera znak, to program wpada w pętle, i ciągle wysyła jedynki. Dlaczego?

    
    #include <avr/io.h>                // dostęp do rejestrów
    #include <util/delay.h>
    #include <avr\sfr_defs.h>
    #include <avr\interrupt.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    #define F_CPU      16000000    //częstotliwość zegara w Hz
    #define UART_BAUD   19200UL       //prędkość transmisji
    #define UART_CONST   (F_CPU/(16ul*UART_BAUD)-1) 
    
    void USART_Init ( unsigned int ubrr)
    {
    	UBRRH= (unsigned char)(ubrr>>8);
    	UBRRL= (unsigned char)(ubrr);
    
    	UCSRB= (1 << RXCIE) | (1<<TXCIE) | (1<< RXEN)|(1<<TXEN) ;
    
    	UCSRC= (1<<URSEL)|(3<<UCSZ0);
    
    	sei();
    }
    
    void USART_Transmit ( unsigned char data)
    {
    	while (!(UCSRA&(1<<UDRE)));
    
    	UDR = data;
    }
    
    int main(void)                        // program główny
    {
    	USART_Init( UART_CONST);
    	DDRB=0xFF;
    
    
    	 while(1)
    	 {
    	 }
    
    }
    
    
    SIGNAL(SIG_UART_RECV)
    	{
    	    PORTB=0x02;
    		USART_Transmit('1');
    
    	}
    


    Dodano po 1 [minuty]:

    prawdopodobnei coś z tymi flagami jest nie tak, ale co?
    UCSRB= (1 << RXCIE) | (1<<TXCIE) | (1<< RXEN)|(1<<TXEN) ;
  • REKLAMA
  • Pomocny post
    #2 6684222
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Włączasz przerwanie od TX Complete, a nigdzie go nie definiujesz. W związku z tym gdy tylko wystąpi TX Complete, to twój procek się resetuje i wszystko idzie od początku.

    4\/3!!
  • REKLAMA
  • #3 6684230
    donelbaron
    Poziom 15  
    SIGNAL(SIG_UART_RECV) to jest przerwanie od TX complete? to jakie powinein użyc? jak robie to ISR(UART_RX_vect) to mi sie cały komputer zawiesza.

    Dodano po 57 [sekundy]:

    albo jak powiniem go zdefinować, jakies sugestie, rady? dopiero zaczynam z przerwaniami.
  • REKLAMA
  • #4 6684242
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Przeczytaj to co napisałem raz jeszcze... Włączasz DWA przerwania, a zdefiniowałeś tylko jedno. No to chyba oczywiste, że coś jest nie tak... Albo wyłącz to którego nie używasz, albo napisz funkcję obsługi tego przerwania.

    4\/3!!
  • Pomocny post
    #5 6684269
    kuba989898
    Poziom 19  
    Skomentuję ten twój kod.
    
    #include <avr/io.h>                // dostęp do rejestrów
    #include <util/delay.h>
    #include <avr\sfr_defs.h>
    #include <avr\interrupt.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    #define F_CPU      16000000    //częstotliwość zegara w Hz
    #define UART_BAUD   19200UL       //prędkość transmisji
    #define UART_CONST   (F_CPU/(16ul*UART_BAUD)-1)
    
    void USART_Init ( unsigned int ubrr) // inicjalizacja UARTU
    {
       UBRRH= (unsigned char)(ubrr>>8); 
       UBRRL= (unsigned char)(ubrr);      //ustawienie prędkości transmisji
    
       UCSRB= (1 << RXCIE) | (1<<TXCIE) | (1<< RXEN)|(1<<TXEN) ; //uaktywnienie przerwań od odbioru i nadawania, uaktywnienie nadajnika i odbiornika UART. Tu trzeba usunąć (1<<TXCIE) lub dopisać do tego przerwania obsługę
    
       UCSRC= (1<<URSEL)|(3<<UCSZ0); //Ustawienie ilości danych i parzystości
    
       sei(); //zezwolenie na przerwania
    }
    
    void USART_Transmit ( unsigned char data) //podprogram do transmisji danych
    {
       while (!(UCSRA&(1<<UDRE))); 
    
       UDR = data;
    }
    
    int main(void)                        // program główny
    {
       USART_Init( UART_CONST);
       DDRB=0xFF;
    
    
        while(1)
        {
        }
    
    }
    
    
    SIGNAL(SIG_UART_RECV) //obsługa przerwania od odbiornika (bit RXCIE w UCSRB)
       {
           PORTB=0x02;
          USART_Transmit('1');
    
       }
    

    Należało by dopisać do twojego kodu jescze:
     
    
    
    SIGNAL(SIG_UART_TRANS) //obsługa przerwania od nadajnika (bit TXCIE w UCSRB)
       {
        //obsługa przerwania od TXCIE
       }
    
  • #6 6684335
    donelbaron
    Poziom 15  
    zrobilęm jak radziliście, właczyłem obydwa przerwania, obydwa zdefiniowałem, jednak problem pozostał, jeśli wyśle jeden znak, to przerwanie jak by się zapętłalo i cały czas wypłuwa mnustwo tych jedynek.

    Dodano po 3 [minuty]:

    wyłączyłem TXCIE, zakomentowałem definicje, i dalej to samo.

    Dodano po 9 [minuty]:

    dlaczego to przerwanei ciągle się wykonuje, czy trzeba jakoś czyscic UDR? chciałbym żeby się raz zrobiło i koniec.

    Dodano po 59 [sekundy]:

    czy jakoś flage wyłaczać że zostało wywołane przerwanie?
  • REKLAMA
  • Pomocny post
    #7 6684390
    Freddie Chopin
    Specjalista - Mikrokontrolery
    To dobry moment na poczytanie w końcu datasheeta, czyli zrobienie tak zwanego RTFM.

    Cytat:

    • Bit 7 – RXC: USART Receive Complete
    This flag bit is set when there are unread data in the receive buffer and cleared when the receive
    buffer is empty (i.e., does not contain any unread data). If the receiver is disabled, the receive
    buffer will be flushed and consequently the RXC bit will become zero. The RXC Flag can be
    used to generate a Receive Complete interrupt (see description of the RXCIE bit).

    Coś tam odbierasz, ale nigdy tego nie odczytujesz - bufor jest ZAWSZE pełny, przerwanie będzie występować ciągle.

    dopisz w przerwaniu odczyt bufora, to przestanie się zapętlać:

    
    char dummy=UDR;
    


    pozatym:

    #include <avr/io.h> - OK
    #include <util/delay.h> - po co, skoro nigdzie nie masz opóźnień
    #include <avr\sfr_defs.h> - po co w ogóle to komu?
    #include <avr\interrupt.h>
    #include <avr/interrupt.h> - no to ten slash w końcu w prawo czy w lewo? brakuje jeszcze tylko z "|" i z "-"
    #include <avr/signal.h> - albo używasz signal (które nie jest zalecane) albo interrupt.

    4\/3!!
  • #8 6684419
    donelbaron
    Poziom 15  
    to jest moj 4 dzien z atmegą, ale podejrzenia miałem słuszne. Dziękuję za wyjaśnienie.
REKLAMA