Odpowiedz 
 
Ocena wątku:
  • 3 Głosów - 3.33 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie w języku C w środowisku AVR Studio4
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #22
RE: Programowanie w języku C w środowisku AVR Studio4
teraz Atmegowa "zerówka" dla tych , których przeraża obudowa Atmegi32 z 40-toma wyprowadzeniami i którzy nie są w stanie ogarnąć swoim umysłem o co chodzi w moich dotychczasowych lekcjach. Powinienem to wcześniej napisać, ale powiem wam jedno: NIE PODDAWAJCIE SIĘ. Atmega16/32/64 to bardzo przyjazny pająk.
Pinologię przewdstawia poniższy rysunek:
İmage
Na razie udawajcie że nie widzicie napisów w nawiasach - na tym etapie są nieistotne. Istotne dla was są natomiast Wyprowadzenia PORTÓW A, B, C i D.
Jak widzicie każdy port jest "8-mio bitowy" (ma 8 wyprowadzeń) bo Atmega to mikrokontroler 8-mio bitowy. Każde z tych wyprowadzeń może spełniać role wejścia logicznego lub wyjścia - w zależności jak ją zaprogramujecie. Port A posiada wyprowadzenia od PA0 do PA7. PORT B posiada wyprowadzenia od PB0 do PB7. PORT C od PC0 do PC7 no i PORT D już pewnie wiecie jak ...
Przypuśćmy że chcemy by wyprowadzenia portu A od PA0 do PA6 były wyjściami, a PA7 wejściem ...
w kodzie programu musimy zatem umieścić taką linijkę:
Kod:
DDRA = 0b01111111;
Po "0b" wstawiamy odpowiednio 0 lub 1 (0=wejście, 1-wyjscie) które reprezentują kolejno wyprowadzenia PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0. Wyjaśnia to poniższy rysunek
İmage
Analogicznie do powyższego przykładu ustawić można stan wyprowadzeń portu, poprzez przypisanie wartości do rejestru PORTA, np.:
Kod:
PORTA = 0b00001111;
powyższa linijka spowoduje że porty PA7, PA6, PA5, PA4 będą w stanie niskim, a porty PA3, PA2, PA1, PA0 będa w stanie wysokim. Już macie obcykany port A Smile Reszta portów czyli B, C, D działa analogicznie, musicie tylko zmienić literkę A na inną. Można powiedziec że jeśli to zrozumiecie to macie 32 wyprowadzenia Atmegi wytłumaczone zostaje 8 pinów, z których musicie tylko znać teraz dwa piny do zasilania, dwa do masy, dwa do generatora kwarcowego, jeden pin RESET, który po podaniu stanu niskiego (zwarciu do masy) resetuje nam Atmegę - potrzebne po zaprogramowaniu na płycie ewaluacyjnej. Zostaje nam ostatni PIN "AREF" - nie musicie nic wiedzieć na jego temat na tym etapie nauki. Mam nadzieję, że po takim prościutkim i króciutkim wprowadzeniu, Atmega nie jest już dla was "postrachem" lecz zaczyna być "znajomym kumplem".

lekcja 4
Kod:
/*  Jest to czwarta lekcja Kursu Programowania mikrokontrolera Atmega w języku C    
    Należy podłączyć 8 diód LED do Portu A, każdą poprzez rezystor 680 OHm (od 500 do 1k), druga noga każdej diody do masy.
    oraz przycisk (microswitch lub inny) do Wyprowadzenia B0 (PORT B wypr.0) - drugi biegun do masy.*/

/* zanim przejdziemy dalej przedstawię różne sposoby zapisu wartości, jeśli ktoś widzi to pierwszy raz to niech w internecie poszuka informacji na ten temat:

    zapis dziesiętny    zapis binarny    zapis hexadecymalny(szestnastkowy)
                 0     =      0b00000000     =    0x00
                 1     =      0b00000001     =    0x01
                10     =      0b00001010     =    0x0a
                16     =      0b00010000     =    0x10
               255     =      0b11111111     =    0xff (może byc też 0xFF)
   Jak pewnie zauważyliście do zapisu binarnego używany jest prefix "0b" a do szasnastkowego "0x" */

#include <avr/io.h>    
#include <util/delay.h>

int main(void)
    {
    DDRA = 0xff;        // (tożsame z: DDRA = 0b11111111)        
    DDRB = 0;            // mógłbym napisać 0x00
    PORTB= 1;            // to jest to samo co 0x01
    PORTA= 0b01010101;    // tam gdzie jedynka dioda świeci - zatem świeci co druga dioda (co drugie wyjście PORTU A ma stan wysoki)
                        // jak widzicie stosuje sobie taki zapis jaki jest mi wygodny kiedy chcę i gdzie chcę i to działa !!!
                        // bez względu na to czy podacie wartość szasnastkowo czy binarnie - kompilator sobie to przetłumaczy
    while(1)
        {
        if(bit_is_clear(PINB, 0))    // to musicie pamiętać z poprzedniej lekcji
            {
/* UWAGA! */PORTA=PORTA^3;             // zmieńcie liczbę poprawej stronie znaku "^" , następnie skompilujcie i zaprogramujcie Atmegę (dobry efekt jest jak wpiszecie 255)
            _delay_ms(160);    
            }  
        }
    }
/* komentarz do linijki z UWAGĄ:
wstawiajcie inne liczby zamiast jedynki, za każdym razem kompilujcie i wgrywajcie  hexa do atmegi
zobaczcie co sie zmienia po przyciśnięciu przycisku (lub po jego przytrzymaniu) - to bardzo ciekawy efekt
jeżeli ktoś tego nie zrozumie po kilku(nastu) próbach - ułatwieniem będzie zamiana tej liczby na 8 bitowy zapis binarny np. 0b00001111 */

/* autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lekcja 5
Kod:
/*  Jest to czwarta lekcja Kursu Programowania mikrokontrolera Atmega w języku C    
    Należy podłączyć 8 diód LED do Portu A, każdą poprzez rezystor 680 OHm (od 500 do 1k), druga noga każdej diody do masy.
    oraz przycisk (microswitch lub inny) do Wyprowadzenia B0 (PORT B wypr.0) - drugi biegun do masy.*/

#include <avr/io.h>    
#include <util/delay.h>

int main(void)
    {
    DDRA = 255;                
    DDRB = 0x00;            
    PORTB= 0x01;            
    PORTA= 0b01010101;
    while(1)
        {
        if(bit_is_clear(PINB, 0))
            {
/* UWAGA! */PORTA=(PORTA^255) & 0b00001111; // zmieńcie liczbę (poprzestawiajcie jedynki) poprawej stronie znaku "&" ,
                                            // następnie skompilujcie i zaprogramujcie Atmegę    
            _delay_ms(160);        
            }  
        }
    }
/* komentarz do linijki z UWAGĄ:
wyrażenie  "& 0b00001111" "nakłada maskę" na wcześniejsze wyrażenie w taki sposób, że pozwala na zaświecanie tylko tych diód (pojawienie sie stanu wysokiego na wyprowadzeniach portu),
które są "oznaczone" jedynką. Fachowo nazywa sie to koniunkcja (tak jak w bramce logicznej AND).
Działa to tak:

  0 1 0 1 0 1 0 1
&
  0 0 1 1 0 0 1 1
=
  0 0 0 1 0 0 0 1

autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lub w plikach poniżej

ps. następnym razem będziemy katować popularny wyświetlacz alfanumeryczny: 2linijki po 16 znaków na sterowniku HD44780, więc się zapoznajcie z jego budową i sposobem podłaczenia oraz z symulatorem który jest do pobrania poniżej. Człowiek, który go zrobił pozwala powielać i umieszczać na swojej stronie ten programik napisany w javie.
Ja właśnie z takiego symulatora wziąłem swoja umiejętność obsługi tego LCD

.zip  lekcja4.zip (Rozmiar: 11.26 KB / Pobrań: 913)
.zip  lekcja5.zip (Rozmiar: 10.51 KB / Pobrań: 944)
.zip  lcd.zip (Rozmiar: 96.94 KB / Pobrań: 951)
Napisał by ktos czy za trudne rzeczy wam wciskam w głowy czy moze za łatwe i się tak nudzicie, że straciliście zainteresowanie ???
Dla tych którzy się już nudzą to zapodaje programik który ma wyświetlić na wyswietlaczu alfanumerycznym tylko cztery litery "ABCD" (na początek, potem będzie weselej). Sposób zasilenia i podłączenia potencjometru kontrastu znajdźcie w sieci, może potem wkleje schemat ( jak znajdę/zrobię). Ci , którzy maja płytę ewaluacyjną maja z górki bo tam już wszystko jest przygotowane pod wyswietlacz.
Kod:
/*  Jest to szósta lekcja Kursu Programowania mikrokontrolera Atmega w języku C    
    Należy podłączyć Wyświetlacz alfanumeryczny do Portu A, w następujący sposób:

ATMEGA    <--> wyświetlacz
A7        -        D7
A6        -        D6
A5        -        D5
A4        -        D4
A3        -        RS
A2        -        E
4 młodze bity wy świetlacza podłaczone do masy (czyli D3, D2, D1, D0 do masy)

Program wyświetla cztery litery "ABCD" na wyświetlaczu */

#include <avr/io.h>
#include <util/delay.h>
unsigned char znak;

/* TO PONIŻEJ jest to funkcja o nazwie "bajt_lcd" wykonująca linie kodu zamknięte
   w nawias klamrowy. Wywołuje się nią pisząc "bajt_out(bajt_który_chcesz_wysłać_do_LCD)"
   np. "bajt_out(0x28);" lub "bajt_out(0b00100100);" - ujrzycie to w części głównej programu.
   Funkcja ta dzieli na pół bajt który chcemy wysłać(bo używamy 4-bitowego interfejsu)
   i przesyła najpierw 4 starsze bity, a potem 4 młodsze bity bajtu, który chcemy wysłać */

void bajt_lcd(unsigned char znak)
    {    
    PORTA = (PORTA&0x0f)|(znak&0xf0);
    _delay_ms(5);
    PORTA = PORTA|0b00000100;         //wyprowadzenie PA2 w stan wysoki = E=1
    _delay_ms(5);
    PORTA = PORTA&(~0b00000100);     //wyprowadzenie PA2 w stan niski  = E=0    
    _delay_ms(50);
    PORTA = (PORTA&0x0f)|(znak<<4);
    _delay_ms(5);
    PORTA = PORTA|4;                 //wyprowadzenie PA2 w stan wysoki = E=1
    _delay_ms(5);
    PORTA = PORTA&(~4);             //wyprowadzenie PA2 w stan niski  = E=0    
    _delay_ms(50);
    }

//zaczynamy część główną programu

int main(void)
    {
    DDRA = 0xfc;
    unsigned char  i;
    for(i=0;i<3;i++)                // zaleca się 3 x tą operację c.d.n.
        {
        PORTA = (PORTA&0x0f)|(0x30&0xf0);        // inicjalicacja 8bit
        _delay_ms(5);
        PORTA = PORTA | 4;             //wyprowadzenie PA2 w stan wysoki = E=1
        _delay_ms(5);
        PORTA = PORTA & ~4;         //wyprowadzenie PA2 w stan niski  = E=0
        _delay_ms(10);
        }
    PORTA = (PORTA&0x0f)|(0x20&0xf0);    // inicjacja według zaleceń c.d.
    _delay_ms(5);
    PORTA |= 4;                     //wyprowadzenie PA2 w stan wysoki = E=1
    _delay_ms(5);
    PORTA &= ~4;                     //wyprowadzenie PA2 w stan niski  = E=0
    _delay_ms(5);

    bajt_lcd(0x28);            // Interfejs 4-bit, Wyświetlacz dwuwierszowy, Matryca znaków 5x7
    bajt_lcd(0x01);            // czyszczenie i przesuniecie na poczatek LCD
    bajt_lcd(0x0e);            // włączenie wyświetlacza kursor widoczny niemrygający

    PORTA = PORTA|0b00001000;     //wyprowadzenie PA3 w stan wysoki = RS=1 (wyświetlanie znaków)

    bajt_lcd(0b01000001);        // wyświetlam literę A
    bajt_lcd(0x42);                // wyświetlam literę B
    bajt_lcd(67);                // wyświetlam literę C
    bajt_lcd('D');                // wyświetlam literę D
    }

/* autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lub plik z lekcją6
.zip  lekcja6.zip (Rozmiar: 14.48 KB / Pobrań: 899)
(Ten post był ostatnio modyfikowany: 18-01-2012 2:35 przez SP4EJT.)
17-01-2012 23:18
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 17-01-2012 23:18

Skocz do:


Użytkownicy przeglądający ten wątek: 3 gości