Forum: Mikrocontroller und Digitale Elektronik Attiny85v Hardware interrupt unzuverlässig


von Christoph G. (chriska)


Angehängte Dateien:

Lesenswert?

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 ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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...

von Klaus2 (Gast)


Lesenswert?

...vor allem testet man sowas mal auf einem breadboard, bevor man da HW 
draus gießt. Man man man.

Klaus.

von Christoph G. (chriska)


Lesenswert?

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.

von Christoph G. (chriska)


Lesenswert?

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
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

von Christoph G. (chriska)


Lesenswert?

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
Noch kein Account? Hier anmelden.