Ich finde den Code relativ unübersichtlich.
Ich würde es nicht auf so viele Funktionen aufteilen. Ich würde Funktionen nur verwenden, wenn du es öfter als 1x benötigst oder wenn man diese Funktion auch in anderen Projekten genau so verwenden kann (dann würde ich es aber in eine eigenen Bibliothek geben). Das Problem wenn du es auf so viele Funktionen aufteilst ist, das du immer suchen musst.
Ich würde alle Funktionen direkt in der ISR machen. Was mir auch auffällt ist, das du in der Auswertung zuerst eine Zahl einer Variable zuweißt und anschließend diese Variable abfrägst. Ich würde z.B. "Ledxx_ein", Ledxx_aus,... direkt in die "If"-Abfrage schreiben.
Edit:
Wenn ich deinen Code richtig verstanden habe (Pinabfrage und Weiterverarbeitung) sollte dieser Teil das gleiche machen.
Man sollte, wenn es geht, auf >, >=, < oder <= Abfragen und nicht auf == wie du es bei dem 10ms Takt gemacht hast. Der Grund ist das du theoretisch den Wert auf z.B. 11 stellen kannst und dann wird weitergezählt bis der Zähler überläuft und zählt dann wieder bis 10. Wenn du eine Bytevariable hast zählt er 255ms zu lange.
Ich habe bei dem 10ms Takt "5" genommen, weil bei diesem Programm ca. alle 2ms ein INT ausgelöst wird, bei dir muss "10" stehen.
Mit der Variable "Eingang_Freigabe" kannst du bestimmen welche Eingänge abgefragt werden. Du kannst so darauf zugreifen wie ich es im main gemacht habe (nach dem "sei();").
In der "10ms-Abfrage" wird geprüft ob der Eingang freigegeben ist und ob der Eingang vom vorhergehendem Eingang geändert hat (wird ebenfalls mit der Eingangsfreigabe verknüpft).
Wenn das alles zutrifft wird der "Prellzeitzähler" um 1 erhöht, weicht er ab wird sofort der Zähler auf 0 gesetzt und der Durchlauf wird erneut gestartet. Sollte der Zähler den Maximalwert erreichen (Eingang ist konstant) werden die Aktionen ausgeführt. Bei meinem Beispiel steuert PB0 den Ausgang PB4 und PB2 den Ausgang PB5.
Solltest du das Programm nicht ganz verstehen, einfach melden.
Code:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char Prellzeit=0, Eingang_alt=0, Eingang_Freigabe=0, Takt_10ms=0;
#define Ledgn_ein PORTB |= (1<<PB4)
#define Ledgn_aus PORTB &= ~(1<<PB4)
#define Ledrt_ein PORTB |= (1<<PB5)
#define Ledrt_aus PORTB &= ~(1<<PB5)
ISR (TIMER0_OVF_vect)
{
if (Takt_10ms >= 5)
{
if ((PINB & Eingang_Freigabe) & (Eingang_alt & Eingang_Freigabe))
{
Prellzeit++;
if (Prellzeit >= 3)
{
if (Eingang_alt & (1<<PB0)) Ledgn_ein;
else Ledgn_aus;
if (Eingang_alt & (1<<PB2)) Ledrt_ein;
else Ledrt_aus;
}
}
else
{
Prellzeit = 0;
}
Eingang_alt = PINB;
Takt_10ms = 0;
}
Takt_10ms++;
}
int main(void)
{
TCCR0B |= (1<<CS00) | (1<<CS01);
TIMSK |= (1<<TOIE0);
sei();
Eingang_Freigabe = (1<<PB0) | (1<<PB2);
while (1)
{
}
}
MfG Hannes
Lesezeichen