Hallo, ich baue gerade eine 433MHz Fernbedienung mit zwei Knöpfen. Diese wird von einem Attiny85v(8MHz) gesteuert. Leider funktioniert sie nicht sehr zuverlässig, manchmal klappt es ein andermal nicht. Ich habe den Schaltplan und meinen Code angehängt. Hier ein paar Erklärungen was ich mir dabei gedacht habe: Die beiden Taster lösen einen Pin Change Interrupt aus, der den Attiny aus dem Schlafmodus holt. Danach checke ich welcher Taster gedrückt wurde und mache das Licht an oder aus. Leider passiert manchmal gar nichts wenn ich den Taster drücke und manchmal muss ich den Taster sehr lange gedrückt halten bis etwas passiert. Ich bin mir nicht sicher woran das liegt, aber ich glaube meine Schaltung für die Taster hat einen Fehler. Vllt löst einer der Taster die ganze Zeit Interrupts aus sodass der andere dann beim Drücken nicht zum Zug kommt. Vllt findet ihr den Fehler? Ich ziehe die Pins 0 und 1 der Taster mit einem 2.2k Widerstand auf GND. Bei Betätigen des Tasters werden die Pins HIGH gezogen. Um ein "bouncing" der Buttons zu verhindern, habe ich parallel zum Taster einen 0.01uF Kondensator geschaltet. Ich habe versucht den Code einfach zu halten und gut kommentiert. Bitte schaut einmal drüber, vllt hat sich auch dort ein kleiner Fehler eingeschlichen? Vielen Dank schonmal ;)
Zwischen Vcc und GND des uCs gehört ein Entkoppelkondensator. Es wäre sinnvoll, wenn du die Taster vom uC-Pin nach GND schalten würdest, denn der uC hat ja eingebaute Pullups. Lies das Datenblatt der Bauteile, die du verwendest. Auch der uC hat ein solches Datenblatt... > Um ein "bouncing" der Buttons zu verhindern, habe ich parallel zum > Taster einen 0.01uF Kondensator geschaltet. Das ist nur eine lange Schreibweise für "Murks". Wenn man einen uC hat, macht man die Entprellung in der Software. > Vllt findet ihr den Fehler? Du solltest nicht ein *.pde File anhängen, sondern ein C-File. Ich hätte auch einen Interrupthandler für den PCINT1 erwartet...
...vor allem testet man sowas mal auf einem breadboard, bevor man da HW draus gießt. Man man man. Klaus.
Lothar Miller schrieb: > Zwischen Vcc und GND des uCs gehört ein Entkoppelkondensator. > > Es wäre sinnvoll, wenn du die Taster vom uC-Pin nach GND schalten > würdest, denn der uC hat ja eingebaute Pullups. Werde ich umsetzen. >> Um ein "bouncing" der Buttons zu verhindern, habe ich parallel zum >> Taster einen 0.01uF Kondensator geschaltet. > Das ist nur eine lange Schreibweise für "Murks". > Wenn man einen uC hat, macht man die Entprellung in der Software. Werde ich versuchen, ich meine nur mal gelesen zu haben das delays in interrupt Routinen nicht richtig funktionieren. > Ich hätte auch einen Interrupthandler für den PCINT1 erwartet... Beim Attiny85 werden alle pin change interrupts von der Routine pcint0_vect gehandelt, in diesem Punkt bin ich mir sicher.
Klaus2 schrieb: > ...vor allem testet man sowas mal auf einem breadboard, bevor man > da HW > draus gießt. Man man man. > > Klaus. Habe ich gemacht, da hat es auch funktioniert. Wie gesagt, manchmal geht es, manchmal nicht. Ich habe das Gefühl je länger der uC läuft um so wahrscheinlicher sind Fehler. Direkt nach dem Start geht normalerweise alles. Kann es sein das ich hier einen Fehler im Code habe, in der Setup Routine setze ich
1 | GIMSK = (1 << PCIE); //Enable Pin Change Interrupts |
Dann wird die ein erstes Mal die Loop ausgeführt bevor es in den Schlafmodus geht. Vor dem Schlafmodus wird noch
1 | GIMSK |= (1 << PCIE); //Enable Pin Change Interrupts |
ausgeführt. Kann es sein das ich es hier schon verbocke durch das "|="?
:
Bearbeitet durch User
Christoph G. schrieb: > Werde ich versuchen, ich meine nur mal gelesen zu haben das delays in > interrupt Routinen nicht richtig funktionieren. Man macht auch keine Delays in Interrupt-Routinen. Denn damit kann das Hauptprogramm nicht mehr weiter laufen und Dein µC ist für eine bestimmte Zeit absolut tot. Interrupts sind dafür gedacht, dass ein µC schnell reagieren kann. Mit Delays führst Du dieses Prinzip ad absurdum. Ergo kann sich da nur eine Schlussfolgerung ergeben: Taster (die von einem Menschen unendlich laaaaaangsam gedrückt werden) wertet man NICHT über einen Interrupt aus, sondern man pollt sie. Alles andere ist Unsinn. Hier die für Dich wichtige Lektüre: http://www.mikrocontroller.net/articles/Entprellung
Vielen Dank Euch allen für das wertvolle Feedback. Ich werde meine Fernbedienung noch mal komplett überarbeiten und Decoupling über Flags umsetzen. Da ich gerade meinen letzten Attiny85 zu Tode geflasht habe, wird das Ergebnis wohl noch etwas auf sich warten lassen. Sobald ich einen funktionierenden Prototyp habe werde ich die Ergebnisse hier mit euch teilen. Vielen Dank ;)
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.