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

[ATmega16] [C] counter na TC0

kwikam 02 Wrz 2008 22:39 1094 2
REKLAMA
  • #1 5501073
    kwikam
    Poziom 10  
    Chłopaki pomóżcie

    Dzisiaj cały dzień siedziałem nad problemem i zatoczyłem koło, wracając do:

    
    #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
      }
    }
    


    ze strony Link

    Zadaniem tego programiku jest zliczanie i wyświetlanie na ledach ilości zliczonych przez counter impulsów z zewnątrz (przycisk podpięty pod PB0 (T0) i masę). Po wgraniu program rozpala całą linijkę ledów i nie reaguje na przycisk.

    Jest jeden element, który w nim zmieniłem bo nie chciało mi kompilować. Zamieniłem:
     sbi(TIFR,TOV0);

    na:
     TIFR=1<<TOV0;


    Próbowałem to przerobić, żeby działało na przerwaniach i też lipa. Może coś nie tak jest z tym PORTC = ~led++; ?? Nigdy takiego czegoś nie używałem a już nie miałem siły sprawdzać, zwłaszcza, że programy z tej strony mi jako tako działały.

    Z góry dzięki za pomoc.
  • REKLAMA
  • #2 5501799
    HIOB
    Poziom 17  
    Witam,

    Proponuje takie rozwiązanie:

    
    int main( void )
    {
      PORTB |= (1 << PB0);  //wewnetrzny rezystor podciagajacy na T0
      
      DDRD = 0xFF;
      PORTD = 0xFF;  //wygaszenie diod
      
      TCNT0 = 0x00;
      TCCR0 = ((1 << CS01) | (1 << CS02));
      
      while(1)
      {
        PORTD = ~TCNT0;
      }
    }
    

    Powinno wszystko działać - nie trzeba zerować flagi od przepełnienia.
    Pamiętaj o odszumieniu drgających styków przycisku!

    Pozdrawiam, Hiob.
  • #3 5504655
    kwikam
    Poziom 10  
    Wielkie dzięki Hiob, wszystko działa poprawnie :)
REKLAMA