www.mikrocontroller.net

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


Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}
///////////////////////////////////////////////////

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hiiilffeeeee ... :(

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke schonmal für alle Antworten!

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


Gruß R.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.