Hallo Community,
ich habe, aufbauend auf einem Beispielcode von Karl Heinz Buchegger, nur
noch eine Funktion zu implementieren und es dann echt geschafft - aber
die bereitet mir momentan probleme:
Ich möchte über einen hardwareentprellten taster und dem INT0 Interrupt
bestimmen, ob der µC die Funtion "signal_event" in der mainschleife
ausführt oder nicht. Zum wechseln ob ja oder nein, dachte ich an die
if-bedingungen im ISR und eine globale boolvariable.
Bei meinem Code wird über den INT0 immer nur der zweite teil der
ifbedingung ausgeführt, das heißt die bool ändert sich nicht.
Könnt ihr mir sagen, was ich falsch mache? Sehr viel mehr code passt
nicht rein, bin momentan bei ca 88%.
Die Initialisierung der Flanker-IRQ ist falsch, so daß u.U. der
angenommene Zusammenhang zwischen fallender Flanke und on nicht besteht.
#1 die betreffende IRQ ist inaktiv
#2 Gewünschte Flanke einstellen
#3 IRQ-Flag löschen
#4 betreffende IRQ aktivieren
@maxx: die 20ms sind keine "echten" 20ms, was vielleicht am sleep mode
des µCs liegt? die fusebits sind auf 9,6MHz intern gesetzt, trotzdem
blinkt die led bei 2ms im delay ca 1s auf.
Korrekt, die soll auch erst nach ablaufen des timers ausgeführt (bzw
nicht ausgeführt) werden - ich überprüfe momentan das "funktionieren"
der ISR daran, dass eigentlich jedes zweite mal die led 2mal blinken
sollte, was sie aber nicht tut.
@Johann: sorry, verstehe ich nicht genau. was ist falsch? Die MCUCR
-registersetzung?
Die ISR wird auf jeden fall bei fallender flanke ausgeführt, das sehe
ich ja an der (einmal) leuchtenden led. aber diese leuchtet eben immer
nur einmal, wo sie doch jedes zweite mal zweimal blinken soll. Wo genau
soll ich etwas ändern?
die ganze geschichte mit dem timer(und seinen interrupts) funktioniert
bereits einwandfrei (inklusive der zugehörigen funktionen).
Blos der externe Interrupt INT0 und alles was dazugehört
(also die bool on, ISR(INT0_vect), sowie die bezügliche Registersetzung
in ioinit()) machen faxen.
noch eine (vielleicht unnötige) korrektur fürs verständnis: Der
kommentar neben der Definition #define MEDIAN ist falsch, momentan ist
es eine ("1")minute.
ich sitze hier echt auf dem trockenen.. wenn ich die boolesche in
ioinit() mit true initialisiere, wird NUR NOCH der erste teil der
schleife in der ISR(INT0_vect) aufgerufen, aber auch das immer. Es
scheint also so, als ob die boolesche nicht (innerhalb der schleife)
verändert wird/werden kann.
Ich nehme mal an die delays in der ISR sind nur zum debuggen, trotzdem
wuerde ich da empfehlen mal zwei Leds an unterschiedlichen Pins, eine
fuer jeden If-Zweig zu benutzen.
Wie "gut" ist denn der Taster hardwaremaessig entprellt?
Interrupts sind sehr sensibel.
Versuch das mal in Software zu machen. Mindestens einen Zaehler und erst
ab einer bestimmten Zaehler-Schwelle on umschalten.
Ju
> Wie "gut" ist denn der Taster hardwaremaessig entprellt?>> Interrupts sind sehr sensibel.>> Versuch das mal in Software zu machen. Mindestens einen Zaehler und erst> ab einer bestimmten Zaehler-Schwelle on umschalten.
Hallo Jürgen,
also ich hatte noch kein oszi dran, wenn ich den taster aber gedrückt
halte wird kein interrupt ausgelöst, bis ich loslasse, ich würde also
davon ausgehen, dass die entprellung passt. entprellt ist mit 33kOhm
parallel zu 330nF zu ground.
Mit softwareentprellung habe ich so gar keine erfahrung, kann mir da
jemand ein beispiel nennen, das hier sinnvoll ist? (auch in hinblick auf
den verbleibenden sehr geringen flashspeicher - ich weiß dass es
hunderte beiträge irgendwo gibt, aber das ist ja gerade das problem -
was passt hier?)
Die zweite led wird jetzt angeschlossen..
Mit dieser Überprüfung ergibt sich, dass die variable geändert wird
(denn es blinkt dreimal, wenn die else schleife aufgerufen wird). Danach
ist sie dann aber wieder auf dem vorherigen wert! wo wird sie
zurückgesetzt? Was ist da bei der µC programmierung gnadenlos an mir
vorbei gegangen?