multitasking

2000y 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 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 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 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 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

Reply

Name
eMail (not visible)
Subject (no text only in upper case; no HELP, URGENT...)
Text
HTML tags are not supported and links are generated automatically if they start with http or ftp.
Please submit long source code or log files as attachment (only registered users).
Please enter the number 3256