Forum: Mikrocontroller und Digitale Elektronik atmeg8 Timer / Counter - Verständnisfrage


von Patrick (Gast)


Lesenswert?

Hi Leute,

ich habe eine kleine Verständnisfrage...

wenn ich mit dem Atmega8 (8MHz) Impulse Zähle (in form eines Rechteck 
signals) mit dem Timer0 (8Bit), dann
würde an den PD4 Sensor hängen und bei jeder fallenden flanke zählt der 
Timer +1 bis er bei 256 ist dann wird der Overflow Interrupt ausgelöst, 
als Prescale wird mein eingansignal genommen, Soweit ich das im Tutorial 
verstanden.

Den Input Capture Mode verwendet man eigentlich für Zeit Berechnungen 
oder wäre der zum Zählen geeigneter ?

Der Code würde dann so stimmen oder ?
1
//Timer / Counter Overflow
2
ISR (TIMER0_OVF_vect)
3
{
4
    TCNT0 = 0;
5
    timerOverflow++;
6
}
7
8
int main()
9
{
10
    // Set PD4 as input
11
    DDRD = 1<<PD4;
12
13
    // Enable PD4 pull-up resistor
14
    PORTD = 1<<PD4;
15
16
    //Startwert
17
    TCNT0 = 0;
18
19
    // aktiviere timer interrupt
20
    TIMSK |= (1 << TOIE0);    
21
22
    // External Clock für fallende flanke
23
    TCCR0 |= (1 << CS02) | (1 << CS01); 
24
    sei();
25
}

von holger (Gast)


Lesenswert?

// Set PD4 as input
    DDRD = 1<<PD4;

Falsch, so ist es ein Ausgang.

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:

> Den Input Capture Mode verwendet man eigentlich für Zeit Berechnungen

genau

> oder wäre der zum Zählen geeigneter ?

Nein.
Der Sinn des Capture Mode ist es, den aktuellen Zählerstand bei einem 
externen Ereignis festzustellen. Und zwar möglichst verzögerungsfrei.

Eine Analogie wäre ein Rennen, bei dem der Auswertung nur eine Uhr mit 
Sekundenzeiger hat. Jedesmal wenn der Mann an der Ziellinie 'jetzt' 
schreit, liest man von der Uhr die Position des Sekundenzeigers ab 
('Capture!') und zieht dann aus den so notierten Zeiten seine Schlüsse.

> Der Code würde dann so stimmen oder ?
> //Timer / Counter Overflow
> ISR (TIMER0_OVF_vect)
> {
>     TCNT0 = 0;

Den brauchst du nicht auf 0 setzen.
Da hier ein Overflow statt gefunden hat, weisst du dass der Zähler 
sowieso schon auf 0 ist.

Generell solltest du erst mal enorm skeptisch sein, wenn in einer 
Timer-ISR am TCNT Register manipuliert wird. Es gibt zwar Fälle, in 
denen es nicht anders geht, aber 70% aller Fälle sind dergestalt, dass 
der Programmierer nicht weiß, wie es richtig geht.


> ....
>     // aktiviere timer interrupt
>     TIMSK |= (1 << TOIE0);
>
>     // External Clock für fallende flanke
>     TCCR0 |= (1 << CS02) | (1 << CS01);
>     sei();

hier fehlt die Hauptschleife.

Ein Programm auf einem AVR sieht immer so aus
1
int main()
2
{
3
   Initialisierungen
4
5
   gegebenenfalls ein sei()
6
7
    while( 1 ) {
8
      Hauptschleife
9
    }
10
}

Selbst wenn die Hauptschleife leer ist, ist sie trotzdem vorhanden. 
Immer.

von Patrick (Gast)


Lesenswert?

ok,danke mir gehts prinzipiell darum ob ich das mit dem Timer richtig 
verstanden habe der Code ist nur eine kleine Hilfe Stellung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.