PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer benötigt Port???



05.09.2004, 10:44
folgender Quelltext:


#include <avr/io.h>
#include <avr/interrupt.h>
SIGNAL (SIG_OVERFLOW1)
{
overflows++;
if (overflows == 64000)
GetTime();
}

int main ()
{
sei ();
timer_enable_int (1 << TOIE2);
TCCR2 = 7;
TIMSK = 64;
TIFR = 64;
TCNT2 = 0;
}

Naja, und danach spinnen alle digital Ports.
Wie aktiviert man am besten einen Timer???(Atmega16)

05.09.2004, 11:06
Mit was programmierst du denn?

Was steht in der Variablen overflows?
Wie ist getTime initialisiert?

Ich schreibe, wenn ich Bits in Registern setze, diese auch explizit hin. So sieht man eher, was man mal gewollt hat. Mit TIFR= 64 kann ich ohne Datenblatt z.B. nichts anfangen. Schreibt man aber z.B.
TIMSK |= _BV(TOIE1);
dann weiß man sofort, was man gemacht hat.

Was ich grad sehe, unten hast du hauptsächlich den Timer2 "bearbeitet", die ISR bezieht sich aber auf Timer1.
Gib mal bitte ein paar mehr Infos zu den oben gestellten Fragen.

05.09.2004, 13:47
Ich programmiere mit den Grundeinstellungen von WinAVR.
Mit overflows wir gezählt, wie oft der Timer einen Interrupt auslöst.

Öhm, das mit den Registern ist beim Atmega16 irgendwie eine Katastrophe.
Manchmal bezieht sich eine 0 auf Timer 1, dann eine 1 (logisch) und dann eine 2!!!

05.09.2004, 15:59
Das glaube ich nicht. Habe mir grade mal des guten Willens halber das Datenblatt heruntergeladen:
- das Zählregister von Timer1 ist TCNT1
- genauso ist das Kontroll-Registers TCCR1A/B

Da du nen Prescaler von 1024 gewählt hast, wird deine Bedingung ja extrem selten erfüllt.
Bsp: 8 MHz --> die Bedingung ist alle 536870,912s wahr

Am besten, du machst dich erst nochmal über die Timer schlau.

Kjion
06.09.2004, 10:44
Naja, und danach spinnen alle digital Ports.

Was heißt denn die Ports spinnen ?? Da du sie ja nicht initialisiert hast können sie relativ zufällige Zustände annehmen...

MfG Kjion

TillHoffmann
06.09.2004, 15:00
Was heißt denn die Ports spinnen ?? Da du sie ja nicht initialisiert hast können sie relativ zufällige Zustände annehmen...
MfG Kjion
Die Ports fangen an zu pulsen.

Ich habe ja einen Atmega16 mit einer Taktgeschindigkeit von 8 MHz.
D.h. ein Takt dauert 125µs.
-> für eine ms brauche ich 8000 Takte.
Wenn ich den Prescaler auf 8 einstelle kriege ich innerhalb einer ms 1000/256 Overflows vom Timer. Da sich das aber so schlecht abfragen lässt, habe ich den Timer mit 156 vorgeladen.
-> ich kriege 1000/100 = 10 Overflows vom Timer pro ms.
In der Overflow Methode inkrementiere ich die Variabel Count.
Wenn Count 10 ist, schalte ich eine LED ein bzw. aus.

Nach der Berechnung müsste ein LED Takt 1s dauern. Es sind aber ungefähr 0,8s.