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

[Atmega 16][C] Usart / przesyłanie danych stablicowanych

sevotharte 06 Lis 2010 23:59 2131 3
REKLAMA
  • #1 8711833
    sevotharte
    Poziom 10  
    Witam.

    Rozpoczynam z Uartem. Przesyłam dane w postaci jednego bajtu bezproblemowo, natomiast mam większe problemy jak chcę wysłać kilka zmiennych stablicowanych, a wysyłanie zrealizowałem w pętli. Oto kod jaki chciałem użyć, dla wysyłania i odbierania:

    Wysyłanie:
    
    void USART_Transmit(uint8_t adres, uint8_t dane)
    {
      unsigned int i; //zmienna inkrementująca
      unsigned int tx_wyslane=0; //ilość wysłanych pakietów
      unsigned int tx_licznik=4; //licznik wysłanych pakietów
      unsigned int dlugosc_ramki=5;
    
      //pakiety
      tx_buf[0]=0x55;
      tx_buf[1]=adres;
      tx_buf[2]=dane;
      tx_buf[3]=dlugosc_ramki;
      tx_buf[4]=0xaa;
      //pętla wysyłająca dane zapisane w buforze poprzez uart 
    
       while ((UCSRA & (1 << UDRE)) == 0); //zaczekaj aż do opróżnienia bufora danych
       for (i = 0; i < 5; i++)
       {
       UDR = tx_buf[i]; //umieść dane w buforze, wyślij dane
       tx_wyslane++;
       }
    }	
    

    Odbieranie:
    
    //funkcja obsługi przerwania USART_RXC
    ISR (USART_RX_vect)
    {
    	unsigned int i;
    	for (i = 0; i < 5; i++)
        {
    		UDR0 = rx_buf[i]; //umieść dane w buforze, wyślij dane
        }
    	
    	//sprawdź, czy jest to kod zaświecenia diody
    	if(rx_buf[2] == 0b00000101) PORTB |= _BV(0);
    	//sprawdź, czy jest to kod zgaszenia diody
    	if(rx_buf[2] == 0b00000001) PORTB &= ~(_BV(0));		
    }
    


    Wysyłanie jest realizowane na atmega 16, natomiast odbieranie na atmedze 88. Jeżeli chodzi o konfigurację portów to są one poprawne - wysyłanie jednej zmiennej (bez pętli i tablicy działa od razu). Dzięki za każdą odpowiedź

    Pozdrawiam
  • REKLAMA
  • #2 8711841
    tadzik85
    Poziom 38  
    A może poczekałbyś na wysłanie znaku? Tak patrząc odbierasz w przerwaniu po co więc ta pętla for? a jeśli już to od odczytaniu UDR czekaj na odebranie nowego znaku.
    Skoro chcesz wysyłać komendy ramką odczekać w przerwaniu na 5 znak ramki i dopiero sprawdzaj komendę.
  • REKLAMA
  • #3 8711861
    sevotharte
    Poziom 10  
    odbieram w przerwaniu. Myślałem, że jak odbieram to te dane idą po kolei i żeby były wpisane do odpowiednich punktów tablicy to muszę odbieranie dać w pętli i inkrementować po każdym odebranym pakiecie. Czy jak to powinno być zrealizowane?

    A co do czekania na wysłanie znaku - zwykły delay, czy może pętlą if (jak został wysłany to wyślij następny)?
  • #4 8711881
    tadzik85
    Poziom 38  
    od tego są flagi UARTU. Odbiór w przerwaniu odbierasz tylko znak, i instrumentujesz zmienna static oznaczająca ilość danych już odebranych, gdy odbierasz 0x55 (początek ramki - nigdzie indziej nie może zostać przypadkiem wysłana) zmienna ustawiasz na 0. dalej dekrementacja licznika dalej warunek końca ramki. sprawdzasz komendą i robisz co chcesz. Co i tak najlepiej przerzucić do pętli głównej jeśli to jakaś bardziej rozbudowana akcja.
REKLAMA