will analog Output überwachen, wenn Value > 500 soll das Ereignis
registriert werden also Zaehler++;
Leider benötigt LOOP Funktion durch LCD Ausgabe zu viel Zykluszeit, so das
der Zaehler nicht immer hoch zählt.
Habe bis jetzt mit Interrupt versucht aber er wird überhaupt funkt aber
nicht – sieht jemand den Fehler?
Beispiel:
////////////////////////////
ISR(TIMER2_OVF_vect) {
if(analogRead(1) > 500 )
z++:
}
void setup() {
lcd.begin(2, 16);
Serial.begin(9600);
}
void loop() {
// hier kommen noch paar Sachen die ca. 40 ms brauchen
lcd.clear();
lcd.print( z );
////////////////////////////
viel Dank -für jegliche Hilfe
multitasking
Welchen Datentyp hat "z"? Wenn die Variable in einem Interrupt verändert wird, dann muss sie zusätzlich als volatile deklariert sein, z.B. volatile unsigned int z; Gruß Andreas
Hi Andreas, die Zaehler Variable habe ich als int z = 0; deklariert – also soweit i.o.. Glaube das Problem liegt daran das der Interrupt überhaupt nicht gestartet ist. Grüße.
> die Zaehler Variable habe ich als int z = 0; deklariert – also soweit > i.o.. Das ist nicht ganz richtig - das volatile fehlt. Es sorgt dafür, dass die Variable nicht zwischengespeichert wird... > Glaube das Problem liegt daran das der Interrupt überhaupt nicht > gestartet ist. Du kannst entweder die Timer-Lib benutzen: http://www.arduino.cc/playground/Main/MsTimer2 oder hier ein Bsp. zur direkten Programmierung des Timers: (Für eine genauere Beschreibung siehe Datenblatt des AVR-Controllers.) volatile int value=0; ISR(TIMER2_OVF_vect) //overflow interupt { TCNT2 -= 250; //1000 Hz value++; } void setup() { //init Timer2 TCCR2B = (1<<CS22); //clk=F_CPU/64 (F_CPU = 16MHz) TCNT2 = 0x00; TIMSK2 |= (1<<TOIE2); //enable overflow interupt //interrupts on sei(); } void loop() { int tmp; tmp = value; lcd.clear(); lcd.print(value); } Gruß Andreas
Vielen Dank Andreas, deine Idee funkt GRINS... um das Thema aber besser zu verstächen, werde mich mir der Library auseinander setzen. berni


