Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATmega32][C]przerwanie UART

aniasta 31 May 2009 13:42 4013 8
  • #1
    aniasta
    Level 10  
    Witam. Zwracam się do Was z prośbą o rozwiązanie problemu.
    Chcę wysyłać do mikrokontrolera przez RS232 jednocześnie 5 liczb.
    Zależy mi na tym, żeby odbieranie ich realizowane było w przerwaniu.

    Przerwanie obsługuje tak:

    
    SIGNAL(SIG_UART_RECV) 
    {
    i=UDR;
    }
    


    Mam tak, ale nie wiem, czy to dobrze:
    [code]

    volatile unsigned char tablica[5];

    SIGNAL(SIG_UART_RECV)
    {
    i=UDR;
    i=tablica[0];
    i=tablica[1];
    i=tablica[2];
    i=tablica[3];
    i=tablica[4];
    }
  • #2
    _Robak_
    Level 33  
    Prosze, moja mala biblioteczka do odbierania danych, wraz z buforem cyklicznym

    
    #define BUFF_SIZE	8
    volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter;
    
    // Zmienne globalne, reszta
    unsigned char a;
    
    ISR(USART_RXC_vect)
    {
    	
    	UARTBuffer[UARTCount] = UDR;
    	UARTCount++;
    	rx_counter++;
    	if ( UARTCount == BUFF_SIZE )
    	{
    		UARTCount = 0;		
    	}
    	   
    
    
    
    }
    
    void uart_init(void)
    {
    	UBRRL=25;
    	UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
    	UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);
    }
    
    void uart_putc(unsigned char ch)
    {
    	
      loop_until_bit_is_set(UCSRA,UDRE);
      UDR=ch;
      	
    }
    
    unsigned char uart_getc (void)
    {
    
    	if (UARTGet==BUFF_SIZE)
    	{
    		UARTGet = 0;		
    	}
    
    	rx_counter--;
    	return (UARTBuffer[UARTGet++]);
    
    }
    
    


    rx_counter okresla ile znakow jest do odebrania z bufora, a funkcja uart_getc() odbierasz dane z bufora. Oczywiscie wielkosc bufora mozesz zmeniac, ja daje zazwyczaj 128. Nie zabiera gigantycznych ilosci ramu a wieksze paczki mi sie nie zgubia :)
  • #3
    aniasta
    Level 10  
    Dobrze. Użyłam Twoich funkcji, bo moja metoda na nic się nie zadała.
    Niby Twoje rozwiązanie działa. Ale zastanawia mnie jeden fakt. Otóż ze zrobionej aplikacji w C++builder wysyłam 5 liczb na mikrokontroler, i odbijam je z powrotem do aplikacji. Poprawnie odebrane są tylko te liczby które są większe od 8. Nie rozumiem tego.
    Tak wysyłam z builera

    
    
    char tab[5];
     tab[0]=11 ;
     tab[1]=8;
      tab[2]=8 ;
     tab[3]=10;
      tab[4]=9 ;
     WriteUart(tab, 5);
     Sleep(1000);
       int odebrane;
    int a,b,c,d,e;
    
    char tablica[5]; 
    odebrane=ReadUart(tablica,5);
    a=tablica[0];
    b=tablica[1];
    c=tablica[2];
    d=tablica[3];
    e=tablica[4];
    
    Label2->Caption=IntToStr(a);
    Label4->Caption=IntToStr(b);
    Label5->Caption=IntToStr(c);
    Label6->Caption=IntToStr(d);
    Label7->Caption=IntToStr(e);
    Label3->Caption=IntToStr(odebrane);
    

    A to podprogram przerwania mikrokontrolera
    
     UARTBuffer[UARTCount] = UDR;
       UARTCount++;
       rx_counter++;
       if ( UARTCount == BUFF_SIZE )
       {
          UARTCount = 0;      
       }
         a= uart_getc();  //a jako char
         uart_putc(a);
    
    
    
  • #4
    _Robak_
    Level 33  
    U mnie odbija wszystkie ;) No i nie masz wyslac danych w przerwaniu!
    W petli glownej daj takie cos
    
    int main(void)
    {
    	[....]
    	while(1)
    	{
    		if (rx_counter>0) UART_putchar(UART_getchar());
    			
    	}
    
  • #5
    aniasta
    Level 10  
    Dziękuje za uwagę, ale niestety nadal jest tak samo, poprawnie odbierane są te liczby powyżej 8, jak jest mniej wyświetla dziwne liczby z minusem...
    Ah:/
  • #6
    _Robak_
    Level 33  
    Hehe :) Wszystkie zmienne (w obu programach) zadeklaruj jako unsigned, bedzie dobrze wtedy ;]
  • #7
    aniasta
    Level 10  
    Wiem o tym, jak zmieniłam z int na unsigned to np. liczbę 7 wyświetla jako 247...
  • Helpful post
    #8
    _Robak_
    Level 33  
    Jesli chodzi o C++ to niestety nie pomoge, pewnie funkcja wysiwetlajaca liczby interpretuje je jako signed i stad ten problem.
  • #9
    aniasta
    Level 10  
    W sumie wyświetlanie tych liczb to miała być tylko kontrola że dobrze odbiera wysyłanie liczby...Dziękuje barzdo za pomoc:)Pozdrawiam