czwartek, 10 marca 2016

Komunikacja Darta z komputerem [Daj się poznać]

Jak wiadomo elektroniczna tarcza Darta nie jest połączona z komputerem w żaden sposób. Moje zadanie polega na tym aby to zrobić. Użyjemy do tego mikrokontrolera Atmega32 oraz interfejsu RS-232

              Nie będę omawiał tutaj dokładnie zasad komunikacji za pomocą tego interfejsu ponieważ chcę się skupić na praktycznych zastosowaniach. W bardzo dużym skrócie mogę powiedzieć, że RS-232 ma bardzo ważne dla nas piny RxD oraz TxD. Nie są to jego jedyne piny ale są one kluczowe do zrealizowania tego zadania. Atmega32 również posiada takie wyprowadzenia więc jeżeli chodzi o połączenie to będziemy wykorzystywali właśnie te dwa piny po obu stronach. Aby była możliwość podłączenia Atmegi do komputer poprzez wejście USB należy zakupić konwerter USB-RS232. W moim przypadku zakupiłem konwerter oparty o układ scalony FT232RL. Cena takiego układu to około 15 zł, natomiast Atmega32 wykorzystywana w tym projekcie to około 10zł. Tak więc do zrealizowania projektu DartVader poprzez komunikacją przewodową to koszt około 25zł plus oczywiście koszty elektronicznej tarczy do darta. 

           W przypadku RS-232 urządzenia łączy się krzyżowo, czyli w sposób przedstawiony poniżej na rysunku
                  

Tak też połączyłem swoją Atmege z konwerterem. Następnie należy sporządzić, krótki i nieskomplikowany kod w języku C. Kod ten piszę i wgrywam do Atmegi wykorzystując do tego środowisko Eclipse, w którym wgrane mam odpowiednie pluginy do obsługi mikrokontrolerów z rodziny Atmel AVR. Przejdźmy może teraz do szczegółowej analizy kodu, który napisałem. Jest tu wiele nowych rzeczy dla ludzi, którzy programują ale nigdy nie pisali programów na systemy wbudowane. Jestem początkowym blogerem i do tej pory jeszcze nie byłem wstanie wgrać jakiegoś skryptu, który wyróżniałby kod. Przepraszam za to i mam nadzieję, że niedługo się to zmieni :)

Kod programu: 

#include <avr/io.h> 
#include <avr/interrupt.h> 

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);


}
void uart_transmit (char *data)
{
for(int i=0 ; i<strlen(data); i++)
{
while (!( UCSRA & (1<<UDRE)));
UDR = data[i];
}
}



volatile unsigned char have_message = 0;
char data[]="WITAM W //DAJ SIE POZNANC// ! \n";
int main()
{


sei();
uart_init();
while(1)
{
if(have_message)
{
uart_transmit(data);
have_message=0;
}

}
return 0;
}

ISR (USART_RXC_vect )
{
   if(UDR=='S')
    have_message=1;
}


Pewnie ludzie, którzy od wielu lat programują w .NET oraz w innych wysokopoziomowych językach właśnie sobie przypomnieli co oznacza programowanie strukturalne. Przypomniały im się pierwsze programy w C gdzie funkcja main() to podstawa. Ale... do rzeczy. :)

     Na początku "includujemy" biblioteki, które pozwalają korzystać nam programować poszczególne rejestry naszej Atmegi. Co to jest rejestr ? Nie będę w tym poście omawiał dokładnie programowania mikrokontrolerów więc postaram się to wytłumaczyć najprościej jak się da. Rejestr to po prostu Bajt. Dlaczego Bajt ? Bo są to mikroprocesory 8 bitowe. Pewnie specjaliści od systemów wbudowanych nie zostawiliby na mnie suchej nitki za to co napisałem ale myślę, że na potrzeby tego posta to wystarczy. Programując odpowiednie rejestry poprzez wstawienie "0" lub "1" do poszczególnego bitu Atmega wykonuję odpowiednie instrukcje.
      

    Na dzisiaj tyle. Zostawiam ten kod nie opisany by ludzie, którzy nigdy nie widzieli takiego kodu mogli trochę pogłówkować. W następnym poście wyjaśnię kod oraz opowiem o USART, którym będziemy się posługiwali. Na ten czas Dobranoc :)
Pozdrawiam. 

Brak komentarzy:

Prześlij komentarz