multitasking

2000y NoUser 2010-03-16 12:46:31 Link
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

Andreas Watterott User 2010-03-16 14:18:12 Link
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

2000y NoUser 2010-03-16 15:26:01 Link
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.

Andreas Watterott User 2010-03-16 15:47:08 Link
> 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

2000y NoUser 2010-03-16 17:39:27 Link
Vielen Dank Andreas, deine Idee funkt GRINS...  
um das Thema aber besser zu verstächen, werde mich mir der Library
auseinander setzen.

berni

Antworten

Name
eMail (wird nicht angezeigt)
Betreff (keinen Text nur mit Großbuchstaben; kein HILFE, HELP...)
Text
HTML Tags werden nicht unterstützt und Links werden automatisch erstellt, wenn sie mit http o. ftp beginnen.
Längeren Sourcecode oder Logdateien bitte als Dateianhang einfügen (nur registrierte Benutzer).
Bitte die Zahl eingeben 9494