Forum: Mikrocontroller und Digitale Elektronik Interrupt durch Elektrogerät ausgelöst


von Manuel F. (manuelbi)


Lesenswert?

Hallo

ich habe festgestellt dass, wenn ich meinen Elektroherd anschalte, bei 
meinem Atmega der Interrupt, der eigentlich durch einen Taster ausgelöst 
wird, durch das einschalten des Herdes ebenso ausgelöst wird. Was kann 
das sein?

Danke schon mal
Manuel

von spess53 (Gast)


Lesenswert?

Hi

>Was kann das sein?

Üblicher Fehler: Taster mit Interrupt. Und wahrscheinlich auch noch mit 
internem Pull-Up-Widerstand.

MfG Spess

von Helmut L. (helmi1)


Lesenswert?

Und wahrscheinlich noch eine lange Leitung dran als Antenne.

Zeig mal deine Schaltung her.

von Karl H. (kbuchegg)


Lesenswert?

Und keine Blockkondensatoren

von Manuel F. (manuelbi)


Angehängte Dateien:

Lesenswert?

Hi,

habe folgende Schaltung(Anhang). Die Leitung ist ca. 10 cm lang. Was 
kann ich machen um dieses Problem zu beheben?

Danke Manu

von Karl H. (kbuchegg)


Lesenswert?

Manuel Findig schrieb:
> Hi,
>
> habe folgende Schaltung(Anhang). Die Leitung ist ca. 10 cm lang. Was
> kann ich machen um dieses Problem zu beheben?

Also mal wieder Tasten ganz anders angeschlossen als alle anderen.

Hast du den internen Pullup an diesem Pin aktiviert?
Bei deiner Schaltung sollte der "aus" sein!


Was hast du gegen Tastenprellen softwaremässig unternommen?

Tasten am Interrupt sind meistens keine so gute Idee. Eigentlich braucht 
man das nur, wenn die Taste den µC aus dem Sleep holen muss. Aber 
abgesehen von diesem Spezialfall funktioniert Tastenpolling in einem 
Timer-Interrupt genausogut wenn nicht sogar besser und durch die 
softwaremässige Entprellung filtert man dann auch viele Glitch-Fehler 
mit aus.

von Helmut L. (helmi1)


Lesenswert?

Manuel Findig schrieb:
> habe folgende Schaltung(Anhang). Die Leitung ist ca. 10 cm lang. Was
> kann ich machen um dieses Problem zu beheben?

Einen kleinen Kondensator parallel zu R1. Richtwert einige nF.
Damit werden schon mal Stoerimpulse abgefangen und dringen gar nicht bis 
zum uC vor.

Es gilt immer die Regel:

Nur so schnell schalten wie noetig nicht so schnell wie moeglich.

von devynf (Gast)


Lesenswert?

so. nu hab ich das schon so oft gelesen.
wieso, bitte, keine taster an den INT hängen? rein theoretisch ist das 
doch eine feine sache, wenn ein programm gerade in einer langen schleife 
beschäftigt ist, trotzdem die bedienbarkeit zu gewährleisten. ohne INT 
müsste ich doch erst warten bis die schleife vorüber ist.
und zur softwareentprellung: fühlt sich an wie ein klotz am bein. 
hardware klappt doch auch?
wie löst man denn sowas normalerweise?

von Manuel F. (manuelbi)


Lesenswert?

Hi

der interne Pull up ist nicht aktiviert.
Habe das mit der Arduino Ide programmiert

void irq_Svc0(){
  unsigned long act_irq0;
  act_irq0=millis();
  if(act_irq0 - last_irq0 > bounceTime){
      count++;
    }
    last_irq0=act_irq0;
}
.

Schönen Gruß

Manu

von troll (Gast)


Lesenswert?

devynf schrieb:
> rein theoretisch ist das
> doch eine feine sache, wenn ein programm gerade in einer langen schleife
> beschäftigt ist,
dann hat man schlampig programmiert.
> und zur softwareentprellung: fühlt sich an wie ein klotz am bein.
> hardware klappt doch auch?
Warum zusätzliche(!) Hardware wenn es auch in Software geht? Ohne 
zusätzliche Hardware prellt der Taster am Interrupteingang und löst so 
gleich mehrere Interrupts aus.
> wie löst man denn sowas normalerweise?
Taster an normalen Pin, interner Pullup, Abfrage und Entprellung im 
Timer-Interrupt

von Karl H. (kbuchegg)


Lesenswert?

devynf schrieb:
> so. nu hab ich das schon so oft gelesen.
> wieso, bitte, keine taster an den INT hängen?

weil es dir die Massnahmen zum Entprellen nicht erspart.
Es ist ein Trugschluss, dass Tasten am Interrupt mit Flankenerkennung 
einfacher wären. Das ist nicht einfacher. Siehe zb hier, wo wieder mal 
'Tastendrücke' ausgelöst werden, die eigentlich gar nicht existieren.

> rein theoretisch ist das
> doch eine feine sache, wenn ein programm gerade in einer langen schleife
> beschäftigt ist, trotzdem die bedienbarkeit zu gewährleisten.

Dasselbe erreichst du mit einem Timerinterrupt genausogut. Nur mit einem 
Unterschied: Der Timer sieht alle paar Millisekunden am Port nach. Alles 
was kürzer als diese Zeit ist, fällt somit schon mal unter den Tisch und 
dein Programm muss sich  nicht darum kümmern. Akzeptiert man einen 
Tastendruck nur dann, wenn sich im 5ms Abstand (ca., so genau sind die 
5ms nicht) 3 oder 4 mal hintereinander zeigt, dass die Taste gedrückt 
ist, dann hast du eine full-proof Tastenauswertung, mit der dir (fast) 
nichts mehr passieren kann.

Zeigt sich immer wieder hier im Forum.

> und zur softwareentprellung: fühlt sich an wie ein klotz am bein.

Die Danegger Entprellung verbraucht weniger als 0.1% Rechenzeit. Eine 
zuverlässige Tastenentprellung, die noch dazu diese Stückchen spielt, 
sollte einem das schon wert sein.

von fonsana (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> Einen kleinen Kondensator parallel zu R1. Richtwert einige nF.
> Damit werden schon mal Stoerimpulse abgefangen und dringen gar nicht bis
> zum uC vor.

Na prima, immer wen der C leer ist und jemand den Taster drueckt, gibt 
es einen Einbruch auf der Betriebsspannung, der auch den uC in den Reset 
schickt.
DAS ist untauglich.

fonsana

von Stefan (Gast)


Lesenswert?

Kondensator parallel zu R1 ist nicht so gut, denn wenn er leer ist und 
man dann den taster drückt, fließt ein Kurzschlußstrom, der die 
Stabilität der Stromversorgung beeinträchtigt.

Schalte den Kondensator lieber parallel zum Taster.

Am besten so:
1
                               10k                         
2
                         +---[===]-- GND
3
          /              |
4
+Vcc ----/  ---[===]-----+---||-----GND
5
              100 Ohm    |   100nF
6
                         |
7
                        AVR
Wenn Du die ganze schaltum umgekehrt gepolt anklemmst (also Taster 
erzeugt LOW Signal), kannst Du den internen Pull-Up des AVR anstelle des 
10k Wideratandes verwenden.

von Karl H. (kbuchegg)


Lesenswert?

Manuel Findig schrieb:
> Hi
>
> der interne Pull up ist nicht aktiviert.
> Habe das mit der Arduino Ide programmiert
>
> void irq_Svc0(){
>   unsigned long act_irq0;
>   act_irq0=millis();
>   if(act_irq0 - last_irq0 > bounceTime){
>       count++;
>     }
>     last_irq0=act_irq0;
> }

keine gute Entprellung.
Das filtert dir zwar die Prellpulse vom Taster (sofern bounceTime groß 
genug ist), aber kurze Pulse nach längerer inaktiver Zeit am Port werden 
dadurch nicht ausgefiltert. Und genau das scheint dann auch dein Problem 
zu sein: Das ein kurzer Puls 'durchschlägt'. Dein Code verhindert zwar, 
dass mehrere Pulse, die zu schnell kommen als mehrere Tastendrücke 
gewertet werden, aber er verhindert nicht, dass ein einzelner kurzer 
Puls als Tastendruck durchgeht. Eine zuverlässige Entprellung macht aber 
auch das: das WIssen einfliessen lassen, dass ein Mensch eine Taste 
nicht schneller als ein paar Hunderstelsekunden drücken und loslassen 
kann. Alles was kürzer ist, kann also kein Tastendruck gewesen sein.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

>> und zur softwareentprellung: fühlt sich an wie ein klotz am bein.
>
> Die Danegger Entprellung verbraucht weniger als 0.1% Rechenzeit. Eine
> zuverlässige Tastenentprellung, die noch dazu diese Stückchen spielt,
> sollte einem das schon wert sein.


Dazu kommt, dass die meisten ernstzunehmenden Programme (also nicht die 
Versionen aus Tutorien) meistens sowieso so etwas wie einen 
Heartbeat-Timer haben. D.h. das ist timermässig noch nicht einmal 
Zusatzaufwand. Die Handvoll zusätzlicher Anweisung in der Timer-ISR, die 
die PeDa Entprellung braucht, machen den Kohl dann auch nicht mehr fett.

von Bronco (Gast)


Lesenswert?

Ich finde an der Stelle das SPS-Konzept recht gut:

- Feste Zykluszeit, in der das Programm einmal durchlaufen wird.
- Zu Beginn des Zyklus' werden die Eingänge gesamplet
- Zum Ende des Zyklus' werden die Ausgänge gesetzt
- Alles muß innerhalb eines Zyklus' fertig werden (läßt sich sehr leicht 
überwachen)
- Interrupts nur dort, wo es wirklich gar nicht anders geht (UART, SPI 
etc)

von Helmut L. (helmi1)


Lesenswert?

fonsana schrieb:
> Na prima, immer wen der C leer ist und jemand den Taster drueckt, gibt
> es einen Einbruch auf der Betriebsspannung, der auch den uC in den Reset
> schickt.
> DAS ist untauglich.

Dann rechne mal nach.

Wenn dein Stuetzkondensator ca. 100nF .. 1uF hat und damit ein 
Kondensator von 1nF geladen wird um wieviel meist du denn bricht die 
Spannung ein.

Ich habe auch nix von 100nF parallel zum R1 gesagt sondern von wenigen 
nF.

von devynf (Gast)


Lesenswert?

>Dasselbe erreichst du mit einem Timerinterrupt genausogut. Nur mit einem
>Unterschied: Der Timer sieht alle paar Millisekunden am Port nach.

Darauf kann man natürlich auch kommen. klar. danke für den hinweis! 
super sache das...

von Tastenpreller (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> Ich habe auch nix von 100nF parallel zum R1 gesagt sondern von wenigen
> nF.

das ändert nix dran, daß das so Quatsch ist.
Neben den Spikes auf beiden Versorgungsleitungen wird der Taster auch 
noch ruiniert.

von Stefan (Gast)


Lesenswert?

> Wenn dein Stuetzkondensator ca. 100nF .. 1uF hat
> und damit ein Kondensator von 1nF geladen wird
> um wieviel meist du denn bricht die Spannung ein.

Du willst jetzt von mir 1% lesen? So einfach ist die Rechnung sicher 
nicht. Denn jedes Bauteil und jede Leiterbahn hat einen Innenwiderstand 
und eine Induktivität.

Mal angenommen, die Stromversorgung wäre (fälschlicherweise) nur mit 
einem 100yF Elko gestützt, dann kan ein kleiner 1nF Kondensator die 
Versorgungsspannung zum Total-Aussetzer bringen, weil der Elko eine hohe 
Induktivität hat. Und dabei hilft es nicht, dass der Elko 
verhältnismäßig riesen groß ist.

Kurzschlüsse würde ich grundsätzlich vermeiden, auch wenn sie nur kurz 
sind.

von P. M. (o-o)


Lesenswert?

devynf schrieb:
> wieso, bitte, keine taster an den INT hängen? rein theoretisch ist das
> doch eine feine sache, wenn ein programm gerade in einer langen schleife
> beschäftigt ist, trotzdem die bedienbarkeit zu gewährleisten. ohne INT
> müsste ich doch erst warten bis die schleife vorüber ist.
> und zur softwareentprellung: fühlt sich an wie ein klotz am bein.
> hardware klappt doch auch?

Dann nimm einen Timerinterrupt, der den Taster alle x Millisekunden 
abfragt. So hast du drei Fliegen auf eine Klappe: 1. Bedienbarkeit immer 
noch voll da. 2. Keine Entprellung in Software notwendig. 3. 
Hardware-Entprellung kann meist auch entfallen.

von Peter D. (peda)


Lesenswert?

Helmut Lenzen schrieb:
> Dann rechne mal nach.

Dazu muß man aber das Layout kennen, d.h. von jedem Leiterzug den 
Widerstand und die Induktivität.

Bestes Beispiel für falsche Entprellung ist das Pollin-Board:

Beitrag "design fehler am atmel evaluations-board - programm stuerzt ab"


Peter

von Manuel F. (manuelbi)


Lesenswert?

Hi

Vielen Dank an alle
ich habe das mit dem Timerinterrupt lösen können und das funktioniert 
einwandfrei.

Gruß Manu

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.