Du stellst den Timer auf z.B. 10msec, zählst bis 10 mit und löst dann deine Aktion aus.
Druckbare Version
Du stellst den Timer auf z.B. 10msec, zählst bis 10 mit und löst dann deine Aktion aus.
sorry,
aber ich habe keine ahnung wie das Programm dafür aussehen muss.
Ich schreibe in C auf einen Mega32. Kannst du bitte das Grundgerüst, was du eben erklärt hast als Code hier reinstellen.
Danke!
Das ergibt ein blinken einer Led an PD5 im Sekundentakt.Code:#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned char time;
ISR(TIMER1_COMPA_vect){ /* ISR Timer1 Output Compare Match */
time++; /* Variable wird um 1 erhöht */
}
int main(void){
DDRD=0xff; /* Gesamtes PortD ist Ausgang */
OCR1A=625; /* Compare Match Wert, ergibt mit Prescaler einen 10msec Takt */
TIMSK=(1<<OCIE1A); /* Compare Match freigeben */
TCCR1B= (1<<WGM12)|(1<<CS12); /* Compare Match, Prescaler /256 */
sei();
for(;;){
if (time>=100){ /* Takt mal 100 ergibt 1sec */
PORTD^=(1<<PD5); /* PortD5 wird getoggled */
time=0; /* time auf 0 stellen */
}
}
}
Danke für deine Antwor!
Ich habe das Prinzip verstanden, aber ich verstehe nicht was Compare Match bedeutet und was es bewirkt. Der Prescaler ist doch der Teilungsfaktor?! Ich habe nur nach nicht verstanden wie ich den festlege. Könntest du das bitte mal an dem Beispiel für Prescaler 16 erklären?
Das wäre wirklich super.
Einen Prescaler 16 gibt es nicht. Der Prescler wird im Register TCCR1B ausgewählt. Schau dazu ins Datenblatt Seite 108.
Compare Match bedeutet das der Timer nicht bis ans Ende, also 65535 zählt, sondern nur bis zu dem im Register OCR1A angegebenen Wert. Dann löst er den Interrupt aus und beginnt er wieder von 0.
Also kann ich den Prescaler nur auf 1, 8, 64, 256, oder 1024 festlegen?
Gibt es auch noch eine andere Schreibweise als (1<<WGM12)|(1<<CS12); Das sieht so kompliziert aus. Wie würde TCCR1B bei einem Prescaler von 64 aussehen? Oder gibts irgendwo eine Tabelle in der man das nachlese kann? Im Datenblatt habe ich nichts gefunden.
Welches Datenblatt hast Du denn??? Im 8155A–AVR–06/08, das ist in meinen Unterlagen das Neueste zum m32, steht z.B. auf Seite 114 Table 16-5. Waveform Generation Mode Bit Description und gleich drunter sind die Bits für das TCCR1B genau und ausführlich beschrieben. Gleich danach, auf S 116 sind in Table 16-6. Clock Select Bit Description die Prescaler exakt aufgelistet . . . .Zitat:
Zitat von Mc Delta
Ich hatte tatsächlich ein anderes Datenblatt. (Mega 32L) Jetzt habe ich mir das von Mega 32 A runtergeladen und die von dir Beschriebene Tabelle gefunden.
Danke!
CS12 CS11 CS10 Description
0____0____0____No clock source (Timer/Counter stopped).
0____0____1____clkI/O/1 (No prescaling)
0____1____0____clkI/O/8 (From prescaler)
0____1____1____clkI/O/64 (From prescaler)
1____0____0____clkI/O/256 (From prescaler)
1____0____1____clkI/O/1024 (From prescaler)
1____1____0____External clock source on T1 pin. Clock on falling edge.
1____1____1____External clock source on T1 pin. Clock on rising edge.
Hallo nochmal,
Ich habe den Code von Hubert weitgehend übernommen und in den M32 geladen, doch es leuchtet nicht eine einzige LED. was kann ich machen? Findet vielleicht einer von euch irgendeinen Fehler?
PS: Es wurden auch keine Errors angezigt.Code:#ifndef MCU
#define MCU atmega32
#endif
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned char time;
ISR(TIMER1_COMPA_vect){ /* ISR Timer1 Output Compare Match */
time++; /* Variable wird um 1 erhöht */
}
int main(void){
DDRC=0b11111111; /* Gesamtes PortD ist Ausgang */
OCR1A=625; /* Compare Match Wert, ergibt mit Prescaler einen 10msec Takt */
TIMSK=(1<<OCIE1A); /* Compare Match freigeben */
TCCR1B= (1<<WGM12)|(1<<CS12); /* Compare Match, Prescaler /256 */
sei();
while(1)
{
if (time>=100)
{ /* Takt mal 100 ergibt 1sec */
PORTC=0b11111111; /* PortD5 wird getoggled */
time=0; /* time auf 0 stellen */
}
}
}