wtorek, 15 marca 2016

Komunikacja Darta z komputerem część 2 [Daj się poznać]

       W dzisiejszym poście powiem nieco więcej na temat kodu przedstawionego w poprzednim wpisie oraz pokaże fizyczny układ do testowania danego kodu wykorzystując studenckie Visual Studio 2013



      Jak zapowiedział w poprzednim poście dziś omówię w bardziej szczegółowy sposób kod napisany w języku C, który wgrałem do swojego mikrokontrolera AVR. Nie tracąc waszego czasu przejdę do konkretów. Pierwszą funkcją jaką napisałem jest funkcja inicjalizująca UART.
Dla przypomnienia:
void uart_init (void)
{
    #define BAUD 9600    
    #include <util/setbaud.h>
 UBRRH = UBRRH_VALUE;
 UBRRL = UBRRL_VALUE;
 #if USE_2X
  UCSRA |=  (1<<U2X);
 #else
  UCSRA &= ~(1<<U2X);
 #endif
    UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
    UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);


}


 Na początku funkcji zdefiniowaliśmy sobie BAUD na wartość 9600. Oznacza to, że ustawiliśmy prędkość portu UART na 9600 bodów. Bod jest to miara określająca prędkość transmisji sygnału. 9600 bodów oznacza, że sygnał w ciągu sekundy może zmienić się 9600 razy. Następnie dodaje bibliotekę AVR-lib. W pliku nagłówkowym <util\setbaund.h> zdefiniowane są przydatne makrodefinicję umożliwiające prawidłowe ustawienie działania interfejsu UART. Dzięki tej operacji możemy wpisać do rejestru UBRRH i UBRRL odpowiednie wartości bez wyliczania ich. W notach katalogowych odpowiednich mikrokontrolerów można znaleźć odpowiednie wartości tych rejestrów w zależności od częstotliwości taktowania. Taki kod przyjmuję, że dopuszczalna tolerancja różnic prędkości pomiędzy zadaną a możliwą do osiągnięcia przez procesor nie przekracza 2%. Jeśli byłoby to niemożliwe, następuje zdefiniowanie symbolu USE_2X, nakazującego nam ustawienie bitu U2X rejestru USCRA. Ustawienie odpowiednich bitów rejestru UCSRB nakazuje procesorowi włączeniu nadajnika (TXEN) , odbiornika (RXEN) i aktywacji przerwania związanego z odebraniem danych (RXCIE). W dużym skrócie przerwanie to fragment kodu, który ma się wykonać niezwłocznie po wystąpienia jakiegoś zdarzenia. W naszym przypadku w momencie odebrania jakiś danych. W kolejnej instrukcji funkcji definiujemy ramkę transmisji. Takie ustawienie bitów rejestru USCRC zdefiniowało ramkę o 8 bitach danych, jednym bitu stopu oraz braku parzystości. Ramka jest formatem danych wysyłanych i odbieranych. Każda ramka zaczyna się bitem startu, który nie podlega konfiguracji. Po bicie startu następuje 5-9 bitów danych. Następnie występuje bit parzystości a po nim dwa lub jeden bit stopu. 
                  

           Następną funkcją, którą chce omówić jest funkcja transmisji danych. Najważniejszą linijką, która może być niezrozumiana jest :
while (!( UCSRA & (1<<UDRE)));  oraz 
  UDR = data[i];
Powyższa funkcja sprawdza, czy bufor nadajnika jest gotowy na przyjęcie kolejnego bajtu. Jeśli tak, to umieszcza wartość z tablicy data w buforze nadajnika. Reszta kodu nie wymaga omawiania. 
     

         Kolejna funkcja wymagająca omówienia jest:
ISR (USART_RXC_vect )
{
   if(UDR=='S')
    have_message=1;
}
Jest to funkcja związana z przerwaniem. Argumentem funkcji jest wektor przerwań. USART_RXC_vect jest wektorem odpowiadającym przerwaniu związanym z otrzymaniem danych. Dane są przechowywane w rejestrze UDR. Jak można się łatwo domyśleć nasza funkcja przerwania powoduje ustawienie flagi have_message jeśli odebrany bajt równy jest "S". Flaga have_message powoduje wysłanie wiadomości "WITAM W //DAJ SIE POZNANC// ! \n".


   Obiecałem również, że pokaże rzeczywisty układ pozwalający mi testować napisany kod. Proszę bardzo, zdjęcie zrobione przed chwilą. 
                                        
                                              

  


  Tak w skrócie dla osób, którzy nigdy nie widzieli podobnych rzeczy. Czarny prostokąt to Atmega32 a czerwony prostokącik to konwerter UART - USB. 

Na koniec wstawiam krótki kod napisany w VisualStudio2013 w języku C# oraz wynik prostek aplikacji konsolowej. W następnym poście omówię napisany kod.

                     

  Na dzisiaj to tyle z mojej strony. Drugi tydzień z daj się poznać minął. Opublikowałem 4 posty i napiszę szczerze, że zaczęło mi się to nawet podobać. Mam nadzieję, że do końca konkursu będzie widać duży postęp w moich publikacjach oraz, że nie skończę pisać postów po zakończeniu konkursu.

Pozdrawiam wszystkich. 


Brak komentarzy:

Prześlij komentarz