Forum: Compiler & IDEs interrupt routine haut nicht wirklich hin.


von r4m0n (Gast)


Lesenswert?

Hallo Community,

Kann mir Bitte einer helfen den Fehler in meinem Code zu finden..
Ich möchte nach einer Sekunde auf meinem LCD anzeigen wie oft ein 
Schaltvorgang stattgefunden hat. Mein Interrupt zählt nur eine variable 
t hoch mehr nicht. Diese Variable wird dann in CheckRPM() mit 1 
verglichen (1sek.) und die entsprechende Aktion ausgeführt.

Führe ich in diesem Zustand das Programm aus bekomme ich auf meinem LCD 
unsaubere Werte angezeigt. Wenn ich in CheckRPM() die Zeile if (t==1) 
auskommentiere funktioniert das Programm richtig. Für jeden 
Schaltvorgang wird meine Variable Counter um eins erhöht.

Hat jemand nen Tipp?

Gruß R.


///////////////////////////////////////////////////
#include <avr/io.h>
#include "lcd-routines.h"
#include <math.h>
#include <stdlib.h>
#include <avr/interrupt.h>

#ifndef F_CPU
#define F_CPU 8000000UL
#endif

volatile uint8_t t,zustand,counter;

void CheckSwitch()
{
   if ((zustand == 0) && (!(PINB & (1<<PB1))))   //switch on?
    {
        zustand = 1;
    }
  else if ((zustand == 1) && ((PINB & (1<<PB1))))   //switch off?
    {
    zustand = 2;
    }
  else if ((zustand == 2) && (!(PINB & (1<<PB1))))   //switch on?
    {
    counter++;
    zustand = 0;
    }
}

void CheckRPM()
{
if (t==1)
  {
    char Buffer[20];
    itoa(counter, Buffer, 10);
       set_cursor(0,1);
    lcd_string(Buffer);
    t=0; // reset timer
    counter=0;
  }
}

int main (void)
{
  DDRB |= (0 << PB1);
     PORTB |= (1 << PB1);
  TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
         TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
     TCCR1B |= (1 << CS12); // Start timer at Fcpu/256
  OCR1A  = 31249; // Set CTC compare value to 1s at 8MHz   sei(); // 
enable global interrupts / start timer

  lcd_init();

  for (;;)
  {
    CheckSwitch();
    CheckRPM();

  }
}

 ISR(TIMER1_COMPA_vect)
{
  t++; // count +1 for every interrupt at 1s
}
///////////////////////////////////////////////////

von r4m0n (Gast)


Lesenswert?

hiiilffeeeee ... :(

von Karl H. (kbuchegg)


Lesenswert?

Erklär erst mal, was 'unsaubere Werte' sein sollen.

Was sind das für Signale? Kannst du Tastenprellen ausschliessen? Wie 
schnell sind die Signale? Kannst du ausschliessen, dass dir während der 
Aufbereitung und Ausgabe des Wertes Pulse durch die Lappen gehen?

Hast du bedacht, dass du die Anzeige nur überschreibst?
Wenn du den Wert 100 mit dem Wert 99 überschreibst, steht auf dem 
Display 990.

von Klaus (Gast)


Lesenswert?

mach mal aus dem (t==1) ein (t>=1)


Ich vermute, dass bei dir manchmal 2 Interrupts zwischen 2 Aufrufen von 
CheckRPM() auftreten und dann dauerts ne Weile bis t wieder gleich 1 
ist.

von r4m0n (Gast)


Lesenswert?

hi,

unsaubere Werte sind wenn ich beispielsweise 1,2,4,7,9,13,15 usw.. 
anstatt 1,2,3,4,5 etc bekommme. Irgendwie zählt der bei meinem Taster 
bei eingeschaltetem Interrupt wahllos mehr Tastenschläge mit als ich 
tatsächlich ausführe. Prellung schließe ich aus da ich selbes Programm 
ohne interrupt abgleich (auskommentieren von t==1) ausnamslos ohne 
Springen auf dem LCD angezeigt bekomme.

Sollte mein Proggi unklar sein:

-Mein Interrupt zählt jede Sekunde eine Variable hoch.

-Im Main wird währenddessen solange wie t noch nicht 1 sek. die Anzahl 
der Tastenschläge in der Variable Counter gespeichert.

-Ist die Zeit-Variable bei 1 angelangt (t==1) im CheckRPM() wird die 
aktuelle Anzahl von Tastenschlägen im counter auf dem LCD angezeigt. 
Also praktisch soviele wie eben in einer Sekunde ausgeführt worden sind.

Mich wundert es halt nur wo diese Sprünge herkommen wenn ich den 
Interrupt auch tatsächlich nutze?!

Gruß.

von Stefan E. (sternst)


Lesenswert?

Es ist mit Sicherheit das Tastenprellen. Ohne das "if (t==1)" dauert 
jeder Aufruf der Funktion CheckRPM ziemlich lange (wegen der 
LCD-Ausgabe). Diese Verzögerung nach jedem Tastencheck wirkt wie ein 
Entprellen. Mit dem if ist die Funktion ruck-zuck fertig (außer halt es 
ist gerade eine Sekunde rum), und das Prellen schlägt durch.

von r4m0n (Gast)


Lesenswert?

ok danke schonmal für alle Antworten!

Werde mal eine vernünftige Entprellroutine einbauen und berichten wie es 
sich ausgewirkt hat.


Gruß R.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.