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

[AVR] Licznik/Timer w C - proszę o wytłumaczenie

adam cs 03 Lis 2009 20:46 4074 8
  • #1 7211910
    adam cs
    Poziom 14  
    Witam.
    Dopiero zaczynam pogramowanie w C i tym razem postanowiłem pobawić się na początek licznikiem.
    Przykład jest na tej stronie Link

    
    // Testowanie licznika 0 (polling)
    
    #include <avr/io.h>                // dostęp do rejestrów
    
    uint8_t led;
    
    int main( void )
    {
      DDRC = 0xFF;        // PortC jako wyjścia
      TCNT0 = 0xFE;        // wartość początkowa T/C0
      TCCR0 = _BV(CS01)|_BV(CS02);
                    // T/C0 zlicza opadające
                    // zbocza na wejściu T0
      while(1)
      {
        loop_until_bit_is_set(TIFR,TOV0);
                    // ta pętla sprawdza bit przepełnienia
                    // w rejestrze TIFR
        TCNT0 = 0xFE;        // przeładuj T/C0
        PORTC = ~led++;         // wyślij ilość przepełnień na PortC
    
        sbi(TIFR,TOV0);
            // jeśli wpiszemy 1 do bitu TOV0
                // to ten bit zostanie skasowany
            // przy następnym przepełnieniu licznika 0
      }
    }
    

    Jeśli ktoś by mi wytłumaczył parę szczegółów byłbym wdzięczny, a więc do rzeczy:


    Nie wiem co oznacza to wyrażenie przypuszczam, że deklaracja zmiennej led na ośmiu bitach.
    Dalej w pętli while :
    loop_until_bit_is_set(TIFR,TOV0);

    Mam rozumieć, że dopóki w rejestrze TIFR, TOV0 ma stan wysoki (jest przepełnienie) to dalsze instrukcje nie są wykonywane?
    Dalej np.
    PORTC = ~led++;

    Ja to rozumię tak:
    jeśli nastąpiło przepełnienie to biorąc pod uwage, że występuje ono po dwóch impulsach zewnętrznych to trzeba dodać do zmiennej led 1 ?
    I jeszcze po co się ją neguje?
  • #3 7213674
    vectra96
    Poziom 12  
    uint8_t jest to liczba o następujących właściwościach. Liczba 8 bitowa, naturalna. Czyli można do niej zapisać liczbę z przedziału <0,255> bez podania znaku + -.
  • #4 7213687
    tmf
    VIP Zasłużony dla elektroda
    A BTW, jesli zaczynasz nauke to zainstaluj sobie najnowsza wersje AVR-gcc z najnowszym AVR-libc - bo uzywasz funkcji obsolete i po upgradzie twoje programy przestana dzialac.
  • #5 7215976
    adam cs
    Poziom 14  
    tmf napisał:
    A BTW, jesli zaczynasz nauke to zainstaluj sobie najnowsza wersje AVR-gcc z najnowszym AVR-libc - bo uzywasz funkcji obsolete i po upgradzie twoje programy przestana dzialac.


    tą wersję winavr pobrałem ze strony atmela jest to dokładnie:WinAVR-20090313 a jak kompiluje to takie błędy mi pokazuje:


    Compiling C: k.c
    avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./k.lst -std=gnu99 -MMD -MP -MF .dep/k.o.d k.c -o k.o
    k.c:3:58: warning: avr/timer.h: No such file or directory
    k.c: In function 'main':
    k.c:11: error: 'TCCR0' undeclared (first use in this function)
    k.c:11: error: (Each undeclared identifier is reported only once
    k.c:11: error: for each function it appears in.)
    k.c:22: warning: implicit declaration of function 'sbi'
    make.exe: *** [k.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:04

    Mam za stare biblioteki?? Bo już niewiem o co chodzi.
  • #6 7216292
    OldSkull
    Poziom 28  
    Wywala błędy, bo próbujesz operować na rejestrach, których nie ma. ATtiny2313 nie posiada portu C, a rejestr sterujący licznikiem nazywa sie trochę inaczej (i jest ich więcej). Popraw rejestry, albo zmień mikrokontroler.

    PORTC = ~led++; oznacza, że należy do lciznika przepełnień dodać 1, oraz wysłać jego negację na port C (kolejności nie kojarzę jaka jest).

    uint8_t led; oznacza deklarację zmiennej led typu uint_8. Typ ten jest zadeklarowany jako dokłądnie identycznei to samo co unsigned char (daltego też uważam, go za zbędny dodatek zaciemniający kod).
  • #7 7216344
    adam cs
    Poziom 14  
    Najmocniej przepraszam wiem ze Attiny nie ma portu C dlatego poprawiłem swój kod ale co teraz mi jest nie wiadome to ta linijka:
    k.c:11: error: 'TCCR0' undeclared (first use in this function)
    Wiem mniej więcej co to jest TCCR0 -jest to rejestr w którym ustawiamy 3 najmłodsze bity w celu skonfigurowania licznika/timera.
    Tylko jak to napisać w AVR-GCC ???!!!
  • Pomocny post
    #8 7216375
    mirekk36
    Poziom 42  
    A słyszał kolega kiedyś o czymś takim jak nota aplikacyjna PDF do procka?

    bez czytania tego - zawsze będzie kolega spędzał wiele dni i nocy nad rozwikłaniem tak prostej "zagadki"

    a wystarczy zajrzeć do noty procka ATtiny2313 (przecież jest w necie za free) - zajrzeć do interesującego cię rozdziału n/t Timera0 a dokładniej:

    8-bit Timer/Counter
    Register Description


    i zobaczyć jak się nazywa ten rejestr i dlaczego nie TCCR0 (a gwarantuję ci że wtedy nie będzie się trzeba o takie banalne błędy zgłaszane przez kompilator - pytać na forum nawet). Zobaczysz wtedy dlaczego czasem w jakichś opisach widać nazwy np:TCCR0x. Bo okazuje się, że ten sam rejestr dla Atmega8 i dla ATtiny2313 ma ciut inną nazwę ;) . Podobnie zawsze rób gdy korzystasz z innych wewnęrznych modułów procka - zawsze jest rozdział w PDF'ie z super dokładnym opisem nie tylko jak zobaczysz nazw rejestrów - ale też dokładne informacje i to z 1szej ręki n/t ich działania oraz funkcjonalności ich poszczególnych bitów.
  • #9 7217334
    mieczotronix
    Poziom 16  
    można jeszcze zajrzeć do pliku
    io2313.h (akurat ten dotyczy attiny2313)
    który się inkluduje z io.h dla tego procesora
REKLAMA