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 } ///////////////////////////////////////////////////
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.
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.
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ß.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.