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
Hi
>Was kann das sein?
Üblicher Fehler: Taster mit Interrupt. Und wahrscheinlich auch noch mit
internem Pull-Up-Widerstand.
MfG Spess
Und wahrscheinlich noch eine lange Leitung dran als Antenne. Zeig mal deine Schaltung her.
Hi, habe folgende Schaltung(Anhang). Die Leitung ist ca. 10 cm lang. Was kann ich machen um dieses Problem zu beheben? Danke Manu
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.
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.
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?
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
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
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.
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
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.
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.
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.
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)
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.
>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...
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.
> 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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.