Hallo,
ich schlage mich rein experimentel mal mit den Timern rum.
Ich wollte über Timer 2 alle 1/10tel Sekunde einen Interrupt habe.
Aber alles möglich was mir die diversen Rechnungen mit Prescalern und Co so rauswarfen
lieferten nicht das richtige Ergebnis.
Also erst mal einfacher : Jede Millisekunde ein Int.
Ausgerechnet und auch ein Beispielprogramm gefunden das die selben Werte benutzte.
Daraus entstand Folgendes :
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Arduino.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define I2C_ADDRESS 0x27
LiquidCrystal_I2C lcd(I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7,3,POSITIVE); // Neuer Adapter
//LiquidCrystal_I2C lcd(I2C_ADDRESS, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE);
volatile uint16_t intCnt = 0;
void setup()
{
lcd.begin(16,2);
lcd.print("TIMERTESTER V1");
pinMode(7,OUTPUT);
digitalWrite(7,LOW);
cli();
TCCR2A &= ~((1<<WGM21) | (1<<WGM20)); // Prescaler auf 128
TCCR2B &= ~(1<<WGM22);
TIMSK2 &= ~(1<<OCIE2A);
// Overflow Interrupt erlauben
TIMSK2|=(1<<TOIE2);
TCNT2 = 131;
sei();
}
volatile uint32_t secs2 = 0;
ISR (TIMER2_OVF_vect)
{
intCnt++;
TCNT2 = 131;
//digitalWrite(7,!digitalRead(7));
// Interrupt Aktion alle
//(1000000/8)/256 Hz = 488,28125 Hz
//bzw.
//1/488,28125 s = 2,048 ms
}
uint32_t oldTime1 = 0;
uint32_t secs1 = 0;
uint8_t Buffer[16];
void loop()
{
if ((millis() - oldTime1) >= 1000)
{
oldTime1 = millis();
lcd.setCursor(0,1);
secs1++;
sprintf((char *) Buffer,"T1:%04ld",secs1);
lcd.print((char *) Buffer);
}
if (intCnt >= 1000)
{
secs2++;
intCnt = 0;
lcd.setCursor(8,1);
sprintf((char *) Buffer,"T2:%04ld",secs2);
lcd.print((char *) Buffer);
}
}
Aber das Ergebnis ist das der Zähler in dem Print bei T2 doppelt so schnell läuft wie
der den ich über "millis" update.
Wo ist mein Fehler.
Ich gehe schwer davon aus da mein Standard UNO mit 16Mhz läuft.
Ulli