Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

programowanie atmega8 w WINAVR

aschamed 26 Oct 2006 17:59 5996 11
  • #1
    aschamed
    Level 11  
    Witam!

    Od niedawna zajmuje sie pisaniem programów do AVR. Język C znam dosyć dobrze, jednak mam problemy z napisaniem prostego programu. Jak narazie w sieci udało mi sie tylko wygrzebać taki, ktory steruje diodą. W związku z tym mam pytanie. Dysponuje może ktoś jakimś opisem poleceń które sterują pracą Atmega8? Oczywiście mam jego opis liczący ponad 300stron. Może ktoś wie jak wysłać liczbe na port powiedzmy PD, tak ażeby pojawiła sie ona w postaci binarnej na wyjściach od PD0 do PD7? Może zna jeszcze ktoś jakąś dobrą literature, która mogła by mnie zagłębić w tajniki programowania w/w AVRa?

    Pozdrawiam!!!
  • #2
    arcadioo997
    Level 12  
    Witam! dokładnie również nie znam programowania ATmega, ale miałem laborki i programowaliśmy w AVR studio. Ustawianie bitów to było jakoś np. PORTB=0b00000011, gdzie siedem ostatnich cyfr odpowiadało własnie stanom na wyjściach portu B. Była też jakaś komenda sbi (set bit) ale było to dosyć dawno i nie bardzo pamiętam...
  • #3
    M. S.
    Level 34  
    No właśnie. "C" to dopiero 1/3 drogi. Teraz trzeba studiować mikrokontrolery. Polecam książkę "Mikrokontrolery AVR AT MEGA w praktyce". Tam się kolega dowie o podstawowych elementach uC i przede wszystkim o jego rejestrach. Na początek powiem, że aby wystawić daną na port trzeba ja zapisać w rejestrze PORTx (x - nazwa portu - Mega8 ma port b, d i c niepełny). Zanim się cokolwek pojawi na końcówkach uC trzeba porty skonfigurować. Służy do tego rejestr DDRx - wartość 1 dla końcówki oznacza, że końcówka będzie wyjściem a 0 - wejściem. Stan końcówek ustawionych jako wejście można odczytać w rejestrze PINx. Wpisanie w PORTx jedynek dla końcówek ustawionych jako wejścia załącza rezystory podciągające, a 0 powodują stan wysokiej impedancji wejść.
    Nazwy rejestrów PORT, PIN, DDR należy traktować w programie jako zmienne bez ich deklarowania.
    Jest jeszcze "sto tysięcy" innych rejestrów odpowiedzialnych za pozostałe "funkcje" uC. Życzę miłej lektury na pozostałe 2/3 nauki.
  • #5
    Kubbaz
    Level 26  
    Witam

    Jeśli idzie o programowanie uC AVR, to jest to temat rzeka i na temat którego, można by zrobić wykład seminaryjny :D.
    Od czego napewno warto zacząć, to ściągnięcie sobie tzw. datasheeta ATMega8(L) i zerknąc na lewą kolumnę *.pdf'a, gdzie odrazu można zauważyć, że ATMega8 na na pokładzie:

    - 3 porty wejść lub / i wyjść B, C, D ,
    - wewnętrzny oscylator,
    - Fuse Bits - czyli ustawienia konfiguracyjne uC, m.in. po to aby ustawić zewnętrzny kwarc,
    - system rozpoznawania przerwań porty INT0, INT1,
    - trzy timery czy liczniki 8-bitowe i 16-bitowy
    - PWM czyli coś w rodzaju modulacji amplitudy sygnały,
    - wbudowany intarface SPI - m.in. do programowania uC (4 linie sygnałowe: MOSI, MISO, SCK, RESET),
    - USART, czyli wbudowany interface do komunikacji z drugim uC albo komputerem PC,
    - wbudowany interface I2C (TWI - two wire interface), do obsługi do 4-ech kości pamięci np. EEPROM.
    - komparator analodgowy, czyli coś w rodzaju "wzmacniacza" różnicowego,
    - przetwornik analogowo-cyfrowy,
    - bootloader,
    - pamięć 8kb i mnóstwo innych rzeczy .....

    Od czego zacząć ?? Wybór należy do ciebie :).
    Na zachętę dołączam maunal uC ATMega8(L) oraz własnej produkcji instrukcję "jak ugryźć obsługę przerwań" na uC ATMega8, dodaam - w języku angielskim ;).

    Pozdawiam. Kubbaz.

    Obsługa przerwań.
    https://www.elektroda.pl/rtvforum/download.php?id=192813
    Manual.
    https://www.elektroda.pl/rtvforum/download.php?id=142249
  • #6
    aschamed
    Level 11  
    Dzięki kolego Kubbaz za materiały dotyczące przerwań. Chciałem napisać program który by liczył małe częstotliwości (tzn. licznik by zliczał określoną liczbę impulsów, a timer pokazywał by czas w którym licznik zliczył te impulsy), jednak coś mi nie idzie. Jak by miał ktoś jakieś materiały dotyczące liczników i timerów w Atmega8 lub jakiś podobny program to byłbym wdzięczny za udostępnienie.

    Pozdrawiam!!!
  • #8
    aschamed
    Level 11  
    O coś takiego mi chodziło, tylko dobrze by byłogdyby przykładowe programy były napisane w C
  • #9
    Kubbaz
    Level 26  
    proszę bardzo:

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

    int liczba;

    SIGNAL (SIG_OVERFLOW0)
    {
       if(liczba++==675)
        {
          PORTC=~PORTC;
          liczba=0;
       }   
    }

    int main( void )
    {
       DDRC=0xFF;      // port C jako wyjście
       PORTC=0x00;;   // początkowy stan portu C - niski
     
       TCCR0=0x03;      // prescaler 64
       TCNT0=0x00;      // wartośc początkowa zliczania = 0
       TIMSK=0x01;      // Timer/Counter0 Overflow interrupt is enable
     
       sei();         // włączenie przerwań
     
       for (;;){}
       return(0);
    }
  • #10
    aschamed
    Level 11  
    No dobrze. A skąd będe wiedział ile mi timer czasu odmierzył?
  • #11
    Kubbaz
    Level 26  
    jest taki prosty wzór:
    Code:
    TOVck = (F_CPU/MAX.VAL)/PRESCALER

    gdzie:

    F_CPU - częstotliwość podłączonego kwarcu
    MAX.VAL - maxymalna wartość timera (dla 8-mio bitowego to 256)
    PRESCALER - wartość na jaką ustawiono prescaler przy pomocy odpowiedniego rejestru Timera (odsyłam do tabelki w manualu ;))
    i TOVck - to ilość przerwań na/w ciągu jednej sekundy na Timerze0, i wówczas następuje jego przepłenienie

    widzę, że albo bardzo szybko przeczytałeś te artykuły albo w ogóle..... bo w nich jest to po polsku i bardzo czytelnie przedstawione - to co wyżej pozwoliłem sobie napisać ;)

    pozdrawiam
  • #12
    aschamed
    Level 11  
    Teraz już dokładnie przeczytałem wszystko. Jak byś miał więcej artykułów dotyczących programowania AVR to jeszcze coś zapodaj na forum, albo na pw. W artykułach mowa była o zewnętrznym generatorze podłączonym do wejść TOSC1 i TOSC2. W ATmega8 jest też wejściem rezonatora kwarcowego. Jak zrobić żeby ten timer był sterowany z dowolnego wejścia mikroprocesora (np. PB1)?