Das sind doch schon mal gute Infos..Klaus hat geschrieben:Hi,
Ulrich verwendet nur den Timer2. Davon besser die Finger lassen. Die anderen Timer sind frei verfügbar.
Code: Alles auswählen
/************************************************* SENS *************/
/* Flankenerkennung (Trigger)
0101 Bitmuster bei vorheriger Abfrage
0011 Bitmuster bei aktueller Abfrage
0010 Bitmuster Steigende Flanke
0100 Bitmuster Fallende Flanke
*/
volatile uint8_t Sensors = 0; // Aktueller Eingabestatus
volatile uint8_t SensSFL = 0; // Steigende Flanke erkannt
volatile uint8_t SensFFL = 0; // Fallende Flanke erkannt
volatile uint16_t Counter1 = 0; // Beispielzähler
void sens_eingabe() // das wird natürlich die ISR vom TimerOVF
{
SensSFL = ~Sensors; // vorherigen Zustand merken für Flankenerkennung
SensFFL = Sensors;
Sensors ^= Sensors; // bits nullen für neuen Zustand
//!!und hier natürlich die tatsächlichen PINs oder den ganzen Port einlesen
Sensors |= ~(PINC & 0xf0); // 1 == Sensor aktiv
SensSFL &= Sensors; // Steigende Flanke erkennen
SensFFL &= ~Sensors; // Fallende Flanke erkennen
if(SensSFL & (1<<Pin an dem gezählt wird) > 0) then Counter1++;
}
Code: Alles auswählen
void timer_init (void)
{
#if EXTCLOCK==1
#if defined (__AVR_ATmega644__)
//Asynchroner Modus ein, Oszillator an TOSC1 und TOSC2 aktiv
ASSR |= (1<<AS2);
TCCR2B = 0x05;
while(ASSR & 0x11);
//Capture/Compare-Interrupt aktiv
TIMSK2 |= (1<<OCIE2A);
#else
//Asynchroner Modus ein, Oszillator an TOSC1 und TOSC2 aktiv
ASSR = (1<<AS2);
//CTC-Modus an (Clear Timer on Compare Match)
TCCR2 = (1<<WGM21);
//dieser Wert ergibt eine Sekunde Periodendauer
OCR2 = 31;
//lösche Prescaler 2
SFIE = (1<<PSR2);
//Starte Timer 2 mit Prescaler gleich 1/1024
TCCR2 |= (1<<CS22)|(1<<CS21)|(1<<CS20);
while(ASSR & 0x07);
//Capture/Compare-Interrupt aktiv
TIMSK = (1<<OCIE2);
#endif
#else
// hier wird ausgeführt. Weil ja EXTCLOCK=0 ist.
TCCR1B |= (1<<WGM12) | (1<<CS10 | 0<<CS11 | 1<<CS12);
TCNT1 = 0;
OCR1A = (F_CPU / 1024) - 1;
TIMSK |= (1 << OCIE1A);
#endif
return;
};
Es ist wohl vorgesehen, einen zusätzliche (Uhren-)Quarz am Webmodul zu betreiben.dreamon hat geschrieben:
Warum External clock Source on Tn pin. Clock on rising edge. (das ist keine Kritik!!-> ich möchte es verstehen). Habe die Datenblätter studiert. Aber das ist mir zuviel.
Edit(Beachte bitte auch die #if - #endif Anweisungen. Der Timer1 wird nur bei Einstellung (config.h) EXTCLOCK == 1 verwendet. Haste 'ne externe Clocke?)nehme ich zurück.Vielleicht könnt ihr mich in die richtige Richtung schupsen?
Laut o.a. Buch hat WGM12 eine Doppelbedeutung (CTC1) == Clear Timer 1 on Compare Match;dreamon hat geschrieben: Ich hab mit dieser Zeile ein Problem:
--> TCCR1B |= (1<<WGM12) | (1<<CS10 | 0<<CS11 | 1<<CS12);
...weil die 1024 unterm Bruchstrich steht..Uli setzt OCR1A ja auf (F_CPU/1024)-1 =( 16MHz/1024 ) -1 = 15624
Da er ja den Timer hernimmt um Sekundentakt zu erzeugen. Hab ich den Wert mal verändert.
Habe anstelle von 1024 mal 512 genommen. Sekunden sind nun doppelt so langsam.
Also 1Sekunde sind nun zu 2Sekunden. Wie leitet sich das her?
Code: Alles auswählen
TCCR1A |= (1<<COM1A0)