16Bit Timer des Mega8 _normal_ benutzen

Hallo,

Ich möchte mit dem Mega 8 den 16-Bit Timer verwenden, um am Port LEDs blinken zu lassen um später mehr mit dem Code zu machen.

Sieht bei meinem bisherigen Code zufällig jemand auf einen Blick was da noch fehlt oder was falsch ist? Ich möchte einen stinknormalen Overflow haben und keinen PWM- und kein Comparemist. Einfach einen stinknormalen Timer der überläuft und eine Interruptroutine auslöst, welche vorerst nur die Bits invertiert. Das funktioniert mit unten aufgeführten Code nicht.

viele Grüße, Markus

PS: Und ja ich habe schon im Datenblatt alles bei den Timern durchgelesen. Damit komme ich aber nicht weiter.

#define F_CPU 8000000UL

#include #include #include

// ab avr-libc Version 1.2.0 möglich und empfohlen: #include // veraltet: #include

ISR( TIMER1_OVF_vect ) { PORTD ^= 0xFF; //PORTD = ~PORTD; }

int main (void) {

//Portkonfiguration

DDRD = 0b11111111; // Datenrichtung des Ports Bit im Register gesetzt //76543210 // (1) für Ausgang, Bit gelöscht // (0) für Eingang. Als Ausgang 0=GND 1=VCC

PORTD = 0b11101010; // Ausgang einiger Bits wird auf Masse gezogen (LED's eingeschaltet)

//16 Bit Timer // Die Bits: COM1a1 COM1a0 NA NA NA NA PWM11 PWM10 TCCR1A = 0b00000000; //PWM11 und PWM10 = 0 => PWM-Betriebsart nicht aktiviert - Timer1 arbeitet als normaler Timer/Zähler //COM1a1 und COM1a0 = 0 => OC1 wird nicht angesteuert

// Die Bits: ICNC1 ICES1 NA NA CTC1 CS12 CS11 CS10 // CTC1 CS12 CS11 // 0 0 0 angehalten // 0 0 1 CPU-Takt // 0 1 0 1/8 // 0 1 1 1/64 // 1 0 0 1/256 // 1 0 1 1/1024 TCCR1B = 0b00000001;

// Die Bits: TOIE1 OCIE1A NA NA TICIE NA TOIE0 NA TIMSK = 0b10000000; //TOIE1 = 1 => Timer Overflow 1 Interrupt wird ausgelöst

sei(); //Interrupts aktivieren

while(1) { //Hier später in Sleepmodus setzen so dass Interrupts aufwecken }

/* wird nie erreicht */ return 0; }

Reply to
Markus
Loading thread data ...

Moin,

In welchem Datenblatt ? AT90S8515 wahrscheinlich.

Falsche Verteilung der Bits in TIMSK für ATMega8.

Mach lieber das hier:

TIMSK |= (1

Reply to
holger klabunde

für mich sieht das wie "angehalten" aus, weil CS11, CS12 und CTC1 auf 0 sind.

Mfg Thomas Pototschnig

Reply to
Thomas Pototschnig

Nachtrag:

Wo hast du denn das her?

In meinem ATMEGA8 Datenblatt steht: TCCR1B: ICNC1 ICSE1 - WGM13 WGM12 CS12 CS11 CS10

Laut dem Atmega8 Datenblatt ist aber dann TCCR1B = 1 okay für Timertakt = CPU Takt.

Was aber nicht okay ist, ist das Bitmuster von TIMSK: TIMSK: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 TOIE0 und da ist dann Timer/Counter1 Overflow Enable bit 2 und nicht Bit 7.

Wo hast du denn die Codefetzen für einen anderen AVR her?

Mfg Thomas Pototschnig

Reply to
Thomas Pototschnig

Sorry - copy & paste fehler ... heißt natürlich: TIMSK: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0

Makus' Bitmuster ist trotzdem falsch ...

Mfg Thomas Pototschnig

Reply to
Thomas Pototschnig

Sowas kann man am besten im AVRStudio-Simulator ausprobieren! Da kannst du dann gucken, ob der Timer wirklich hochzählt und ob dein Interrupt aufgerufen wird..

--
thomas.kindler@gmx.de,
www.bredobrothers.de
www.microsoft-hellhounds.de
Reply to
Thomas Kindler

"holger klabunde"

Verdammt. Ich war doch tatsächlich so blind und hab die Daten aus einem Forum (vom falschen Mikrocontroller) abgetippt omg xD

Reply to
Markus

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.