Forum: Mikrocontroller und Digitale Elektronik Probleme mit EMV


von Thomas (Gast)


Lesenswert?

Hallo ich verwende einen ATMEGA32 und habe an dem Pin PD3 ein ca. 3m 
langes Kabel angeschlossen. Vorher hatte ich zu testzwecken den Interupt 
immer durch einen unmittelbar an der Platine angeschlossenen Taster 
ausgelöst.
Nun habe ich das Problem das der Interupt durch andere Geräte ausgelöst 
wird. z.B. durch das Einschalten oder Abschalten des Lötkolbens. Das 
Kabel ist extra schon geschirmt...
Kann ich den Fehler irgendwie durch eine Zeile Code ausbügeln ?! Bin 
ziehmlicher Programmieranfänger.
Bisher hatte ich als Code:

SIGNAL(SIG_INTERRUPT0)
{
  alarm = 1;

}



Vielen Dank schonmal !

von Klaus R. (klaus2)


Lesenswert?

-> Tutorial, Tastenentprellung.

Zusätzlich "kann" ein Kerko helfen.

Klaus.

von Thomas (Gast)


Lesenswert?

Ich habe zunächst an folgenden Code gedacht...


SIGNAL(SIG_INTERRUPT0)
{
  timer_wait(1000);
  if(PD2==0)
  alarm = 1;

}


da der Kontakt am anderen ende des Kabels ohnehin mehrere sec. 
geschlossen wird.
Aber das dann bekomm ich komischerweise gar keinen Interupt mehr?

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


Lesenswert?

1
SIGNAL(SIG_INTERRUPT0)
2
{
3
  timer_wait(1000);
Mit einem Interrupt hat man schnellstmöglich fertig zu sein.
Irgendwelche Sleeps und Waits haben da nichts zu suchen.

Du hast auf der Hardwareseite ein Problem. Willst du jetzt rumwürgen und 
das mit Software glattbügeln? Mach den Eingang niederohmig und ein 
RC-Glied davor, dann brauchst du das Softwaregebastel nicht.

von Matthias L. (Gast)


Lesenswert?

>Du hast auf der Hardwareseite ein Problem

Falsch. Das Problem ist hier die Software, bzw. dessen Konzept.


>angeschlossenen Taster
>SIGNAL(SIG_INTERRUPT0)

Das ist Murks.

Ein Taster selbs, fragt man nie als externen Interrupt ab!
Das macht man in einem Timerinterrupt. DOrt muss dann eine 
Entprellroutine ablaufen.

Siehe COdesammlung:
http://www.mikrocontroller.net/forum/codesammlung?filter=Taste+entprellen

von Thomas (Gast)


Lesenswert?

Das Hauptprogramm macht zu der Zeit eh nichts anders als den Taster 
abzufragen...aber das wird wohl trotzdemd die beste Lösung sein.

Aber woher weiß ich die Dimensionierung von RC? weiß ja nicht aus 
welchen Frequenzen die Störung besteht?

von Thomas (Gast)


Lesenswert?

@Matthias

Warum macht man sowas nicht über einen externen Interrupt...?
Das ganze schickt bei Tastendruck eine SMS raus....dann kann ich den 
Taster doch über einen externen Interrupt abfragen?

...aber ich könnte doch von diesem Interrupt auf eine Entprellfunktion 
übergeben oder?

von Matthias L. (Gast)


Lesenswert?

Warum man das nicht so macht, hast du doch eben gemerkt...

Taster fragt man regelmäßig alle 1 oder 10 Millisekunden ab, wird der 
dabei als gedrückt erkannt, so wird eine Varaible erhöht. Ist der Taster 
nicht gedrückt, so wird die Variable genullt.
Wenn die Varaible einen Grenzwert überschreitet (also eine Zeit x 
permanent gedrückt ist), dann wird ein Flag (bei dir alarm=1) gesetzt 
und in main irgendwas damit gemacht.

Siehe die von mir geposteten Links. Dort gibts weitere Erklärungen

von Thomas (Gast)


Lesenswert?

alles klar Vielen Dank!

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


Lesenswert?

> Falsch. Das Problem ist hier die Software, bzw. dessen Konzept.
Irgendwie hört sich die Hardware für mich trotzdem auch falsch an:
>> habe an dem Pin PD3 ein ca. 3m langes Kabel angeschlossen
;-)

> Aber woher weiß ich die Dimensionierung von RC?
> weiß ja nicht aus welchen Frequenzen die Störung besteht?
Irgendwas ist besser als gar nichts.
Geh davon aus, dass die Störung aus allem bestehen kann,
und schirm dich so gut es geht dagegen ab.
1
      +5V         +5V
2
       o           o
3
       |           |
4
  .----o---.      .-.
5
  |        |      | |
6
  | uC     |      | | 1k
7
  |        |      '-'
8
  |        |       |
9
  |        |       |     ___
10
  |    In  o-------o----|___|-----------------------------------.
11
  |        |       |        47R                                 |
12
  |        |       |                                            o
13
  |        |      ---                                           '\
14
  '----o---'      --- 100n                   lange Leitung        \
15
       |           |                                            o  \
16
       |           |                                            |
17
       o-----------o--------------------------------------------'
18
       |
19
      ---

von Thomas (Gast)


Lesenswert?

so habe das Problem jetzt auf eine andere art und weise gelöst:
und zwar mit einer einfachen Diode. nun kann ich beispielsweise den 
nebenstehenden Lötkolben so oft an und ausschalten wie ich will und es 
passiert nichts.

      +5V
       o
       |
  .----o---.
  |        |
  | uC     |
  |        |
  |        |            |   |
  |        |            ||. |
  |    In  o-------o-------.|-----------------------------------.
  |        |            ||. |                                   |
  |        |            |   |                                   o
  |        |                                                    '\
  '----o---'                                 lange Leitung        \
       |                                                        o  \
       |                                                        |
       o--------------------------------------------------------'
       |
      ---

von Matthias L. (Gast)


Lesenswert?

Die Lösung ist trotzdem nicht sauber. Aber lass es ruhig so (mit 
Interupt).

Irgendwann wirst du es verstehen.

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.