PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8-Bit Timer Frage



jagdfalke
29.11.2005, 20:16
Hi,
wo das Tutorial versagt muss ich euch mal fragen:
1 . Fängt der Timer mit


TCCR0 |= (1<<CS00) | (1<<CS02);

bereits an zu laufen?

2.
Zitat aus dem Tutorial:


Bei jedem Überlauf von 255 auf 0 wird das Timer Overflow Flag TOV0 im Timer Interrupt Flag TIFR-Register getzt und, falls so konfiguriert, ein entsprechender Timer-Overflow-Interrupt ausgelöst und die daran gebundene Interrupt-Routine abgearbeitet.

Ok, erscheint mir logisch. Aber wie man das macht, dass ein Timer-Overflow-Interrupt ausgelöst und eine Routing abgearbeitet wird steht nicht dabei. Kann mir da jemand helfen?

3. Der aktuelle Wert steht ja in TCNT0. Aber wie bekomm ich die Zahl damit ich sie z.B. über uart ausgeben kann? Nem 8-Bit Integer zuweisen?

mfg
jagdfalke

fluchtpunkt
29.11.2005, 23:15
Hi,
wo das Tutorial versagt muss ich euch mal fragen:
1 . Fängt der Timer mit


TCCR0 |= (1<<CS00) | (1<<CS02);

bereits an zu laufen?

nein.
das richtige Bit in TIMSK muss auch gesetzt werden.
zusätzlich musst du noch Global Interrupt Enable im Statusregister setzen am besten mit sei();
mit cli(); werden die Interrupts wieder ausgeschaltet.

2.
Ok, erscheint mir logisch. Aber wie man das macht, dass ein Timer-Overflow-Interrupt ausgelöst und eine Routing abgearbeitet wird steht nicht dabei. Kann mir da jemand helfen?
SIGNAL (SIG_OVERFLOW0)
{
/* dein code */
}
SIG_OVERFLOW0 mit dem Interrupt ersetzen den du nutzen willst.
Statt SIGNAL kannst du auch INTERRUPT verwenden. Dann bleiben aber die Interrupts aktiviert während der Interrupt abgearbeitet wird. Kann zu Problemen führen => im Zweifel SIGNAL

3. Der aktuelle Wert steht ja in TCNT0. Aber wie bekomm ich die Zahl damit ich sie z.B. über uart ausgeben kann? Nem 8-Bit Integer zuweisen?
foo=TNCT0; sollte tun.

alles aus dem Gedächtnis, hoffe das stimmt so alles

HTH

jagdfalke
30.11.2005, 06:07
Achso die ganzen Register mit "0" hinten dran gehoren zusammen, und so unterscheidet signal() dann die Interrupts. aha !
Ok, danke für deine Antwort.

mfg
jagdfalke

jagdfalke
30.11.2005, 11:16
Also ich habe jetzt mal folgendes geschrieben:


#define F_CPU 8000000

#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#include "uart.h"

SIGNAL (SIG_OVERFLOW0)
{
uart_puts("Hallo", 5, 1);
}

int main (void) {
uart_init(1, 0);

sei();
TCCR0 |= (1<<CS02) | (1<<CS00);
TIMSK |= (1<<TOIE0);

while(1)
{

}
return 0;
}


Ist doch richtig so oder? Und der für den Timer ist ein 1024er Prescaler "aktiviert".
Was aber, wenn ich den Interrupt nur alle 10 Sekunden haben will ?? Es gibt ja keinen noch höheren Prescaler.

mfg
jagdfalke