Hallo Leute!
Ich habe aus dem AVR-GCC-Tutorial die Entprell-Routine genommen und mir
ein Programm geschrieben, welches folgendes bezwecken soll:
Ich habe einen ATTiny25 in Verwendung, an dem 3 Taster angeschlossen
werden sollen.
Wenn Taster 0 gedrückt wird, soll die LED 500 ms leuchten,
Wenn Taster 1 gedrückt wird, 2000 ms leuchten
Wenn Taster 2 gedrückt wird, 3000 ms leuchten.
Die LED ist an PINB3 angeschlossen (siehe Quellcode).
Könntet ihr mir sagen, ob das Programm so funktionieren würde?
Hey,
das Problem ist, dass ich hier im Moment keine Möglichkeit habe,
Hardware aufzubauen.
Da die Steuerung einem Bekannten von mir gehört, die er bereits gelötet
hat und er mich "beauftragte", die Software zu schreiben, wollte ich
zunächst erfragen, ob das Programm soweit gut aussieht?!
Bevor ich etwas übergebe, was nicht funkioniert :)
Außerdem seit ihr ja quasi die besten Hardware-Emulanten und wisst wo
der Fehler liegt ;-)
Gruß
Andreas
Andreas schrieb:> entprellung( &PINB, (1<<PINB0) ); // ggf. Prellen abwarten> if( PINB & (1<<PINB0) ) // dann stabilen Wert einlesen
Da dreht sich mir der Magen um.
Du liest den Pin nur einmal ein, warum soll er ausgerechnet dabei stabil
sein?
Bist Du etwa Hellseher?
Die Entprellung machen indirekt nur Deine Monsterdelays >=500ms danach.
Eine zuverlässige Entprellung erreicht man nur durch Mehrfachabtastung
in beide Richtungen (drücken + loslassen). Und vorzugsweise im
Timerinterrupt, damit keine wertvolle CPU-Zeit unnütz verwartet wird.
Peter
Andreas schrieb:> Ähm wofür dient dann das Beispiel im Tutorial?
Welches denn?
Zeig mal den Link darauf.
Ich sehe da keines, welches den Typ void liefert.
Auch heißt es nicht, wenn etwas im Tutorial steht, daß es unbedingt
richtig ist oder wirklich gut funktioniert. Das Tutorial schreiben ja
auch nur Menschen.
Gerade beim Entprellen wird sehr viel Murks gemacht, weil der
Programmierer es nicht verstanden hat und es auch nicht merkt, solange
die Tasten neu sind.
Erst der Kunde merkt es mit der Zeit, wenn die Tasten ermüden und
oxydieren.
Auch Du kennst bestimmt Geräte mit schlecht entprellender
Tastensoftware.
Peter
Nun mach' ich es mit Hardware.
Diese unkommentierten kryptischen Codes mag ich nicht, da ist mir ein
Kondensator und ein Widerstand deutlich sympathischer und ich
verschwende dabei keine Ressourcen vom Mikrocontroller.
Hallo,
habe hier mal einen Schaltplan gezeichnet (Eagle).
Im Anhang findet ihr das PDF.
Könnte mal bitte jemand drüber schauen ob das so in Ordnung ist?
(Auch die Debounce-Schaltungen)
Vielen Dank!
Gruß
Joh
if(debounce(PINB,PB0))// wenn Taster 1 gedrückt...
66
{
67
PORTB|=1<<PB3;// Am Ausgang HIGH ausgeben
68
_delay_ms(500);// warten...
69
PORTB&=~(1<<PB3);// Ausgang auf LOW schalten
70
}
71
72
if(debounce(PINB,PB1))// wenn Taster 2 gedrückt...
73
{
74
PORTB|=1<<PB3;
75
_delay_ms(1000);
76
PORTB&=~(1<<PB3);
77
}
78
79
if(debounce(PINB,PB2))// wenn Taster 3 gedrückt...
80
{
81
PORTB|=1<<PB3;
82
_delay_ms(2000);
83
PORTB&=~(1<<PB3);
84
}
85
86
87
}
Ich habe nun die Taster direkt an 5 V gehängt und schalte somit beim
Drücken des Tasters 5 V auf den Eingang des Controllers.
Stimmt nun der Quellcode zum Entprellen (laut Tutorial)?
Danke!
Gruß
Andreas
Andreas schrieb:> Ich habe nun die Taster direkt an 5 V gehängt und schalte somit beim> Drücken des Tasters 5 V auf den Eingang des Controllers.
Dann ist die Preisfrage aber, was liegt an bei Losgelassen ???
Die Leute sind ja nicht blöd, die den Taster gegen GND legen und im AVR
den Pullup einschalten.
Peter