Forum: Mikrocontroller und Digitale Elektronik externer Interrupt zählt Flanke doppelt


von Maik (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

ich nutze den ext. Interrupt Eingang am ATmega328 um eine Flanke nach 
GND zu erkennen, und eine Variable hochzuzählen. Ich sehe aber, dass bei 
(fast) jedem Impuls immer zweimal gezählt wird.
Die INT0 Konfig steht auf fallende Flanke:
EICRA |=  ( 1 << ISC01 );
EICRA &= ~( 1 << ISC00 );   // falling edge of INT0
EIMSK |= ( 1 << INT0 );     // INT0 enable

Die Quelle des Impulses ist eigentlich zuverlässig (kein Prellen, laut 
Osz.). Impuls-Abklingzeit ist ca. 100µs - aber das dürfte ja egal sein.

Die Interrupt Routine ist maximal kurz:

ISR( INT0_vect )
{
  counts++;
}




Wie kann man das Verhalten erklären?

von Beardyman (Gast)


Lesenswert?

Die Abklingzeit ist zu hoch.

von Peter D. (peda)


Lesenswert?

Bei 20MHz F_CPU kann er 50ns sicher erkennen, 100000ns sind da ne 
Ewigkeit.

von Arduinoquäler (Gast)


Lesenswert?

Maik schrieb:
> um eine Flanke nach GND zu erkennen,

Wie dein schlaues Tektronix zeigt, hast du keine Flanke
nach GND sondern ein hundsmiserables Signal das etwa von
GND nach -0.5V geht. Es sei denn du kannst nicht messen
und hast die DC Kopplung ausgeschaltet. Dann kann es auch
noch sein dass dein Takstkopf auf 10:1 steht und dies
sich nicht korrekt in der Einstellung des Teks niederschlägt.

Damit (ein Signal von 0 nach -0.5V) einen AVR Eingang
zuverässig zu triggern kann eigentlich nicht funktionieren.

von Maik (Gast)


Lesenswert?

zugegeben, ja das ist nicht wirklich das Signal am INI Pin, sondern 
etwas vorher abgegriffen. Ein 4n7000 ist noch dazwischen. Ich werde 
nochmals korrekt messen.
Trotzdem; was die Abklingdauer mit der Flankenerkennung zu tun hat, ist 
mir schleierhaft.

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


Lesenswert?

Maik schrieb:
> Trotzdem; was die Abklingdauer mit der Flankenerkennung zu tun hat, ist
> mir schleierhaft.
Wenn die Spannung da so langsam und zudem evtl. nicht ganz so 
kontinuierlich ansteigt und noch einen kleinen Zappler drin hat...

Beim gezeigten Spannungsverlauf ist damit das Signal lange Zeit in einem 
undefiniertem Spannungsbereich.

von Thomas W. (Gast)


Lesenswert?

Maik schrieb:
> zugegeben, ja das ist nicht wirklich das Signal am INI Pin, sondern
> etwas vorher abgegriffen. Ein 4n7000 ist noch dazwischen. Ich werde
> nochmals korrekt messen.

Gute Idee. Es bringt nichts, hier irgendetwas zu zeigen, dass mit 
dem Signal nur entfernt etwas zu tun hat.

von Peter II (Gast)


Lesenswert?

Lothar M. schrieb:
>> Trotzdem; was die Abklingdauer mit der Flankenerkennung zu tun hat, ist
>> mir schleierhaft.
> Wenn die Spannung da so langsam und zudem evtl. nicht ganz so
> kontinuierlich ansteigt und noch einen kleinen Zappler drin hat...
>
> Beim gezeigten Spannungsverlauf ist damit das Signal lange Zeit in einem
> undefiniertem Spannungsbereich.

sollte da nicht ein gewissen Schmitt-Trigger verhalten vorhanden sein? 
Jedes Signal geht doch zwangsläufig durch den undefinierten Bereich. 
Kann mir nicht so recht vorstellen, das das wirklich ein Problem ist.

von Arduinoquäler (Gast)


Lesenswert?

Maik schrieb:
> zugegeben, ja das ist nicht wirklich das Signal am INI Pin, sondern
> etwas vorher abgegriffen. Ein 4n7000 ist noch dazwischen. Ich werde
> nochmals korrekt messen

Wie wärs mal mit einem kleinen Schaltplänchen damit "man" klar sieht?

von Maik (Gast)


Angehängte Dateien:

Lesenswert?

Arduinoquäler schrieb:
> Maik schrieb:
>> zugegeben, ja das ist nicht wirklich das Signal am INI Pin, sondern
>> etwas vorher abgegriffen. Ein 4n7000 ist noch dazwischen. Ich werde
>> nochmals korrekt messen
>
> Wie wärs mal mit einem kleinen Schaltplänchen damit "man" klar sieht?

soll natürlich "2n7000" heißen..

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


Lesenswert?

Peter II schrieb:
> sollte da nicht ein gewissen Schmitt-Trigger verhalten vorhanden sein?
Was sagt das Datenblatt?

> Jedes Signal geht doch zwangsläufig durch den undefinierten Bereich.
Geh einfach über die Autobahn. Einmal ganz schnell und einmal ganz 
langsam.

> Kann mir nicht so recht vorstellen, das das wirklich ein Problem ist.
Worauf stützt sich diese Vorstellung?

von Peter II (Gast)


Lesenswert?

Lothar M. schrieb:
> Peter II schrieb:
>> sollte da nicht ein gewissen Schmitt-Trigger verhalten vorhanden sein?
> Was sagt das Datenblatt?

gute frage, wonach müsste man da suchen?

> > Jedes Signal geht doch zwangsläufig durch den undefinierten Bereich.
> Geh einfach über die Autobahn. Einmal ganz schnell und einmal ganz
> langsam.
langsam und schnell ist relativ. In Zeiten von Ghz ist jedes Signal 
irgendwie langsam

> > Kann mir nicht so recht vorstellen, das das wirklich ein Problem ist.
> Worauf stützt sich diese Vorstellung?
nur meine privaten praktischen Erfahrungen mit so einer 
Flankenerkennung. Einfach ein Poti dran und rumgedreht - da gab es keine 
doppelte Auslösung. Und da war ich definitiv langsam. Klar kann Zufall 
gewesen sein.

von pull-up (Gast)


Lesenswert?

Einen internen Pull-Up über 10 KOhm auf Masse ziehen?

Schräger gehts nicht, oder?

Was wundert dich da eigentlich? Und wo ist der Kondensator?
Oder war das die falsche Schaltung? Mist ist sie auf alle Fälle.

von Amateur (Gast)


Lesenswert?

Bist Du Dir sicher, dass die Schaltung OK ist?

Ein FET, mitten in einem Spannungsteiler, ist es nach meiner Meinung 
nicht.

... aber irren ist Menschlich, sprach der Igel und stieg von der Bürste.

von Arduinoquäler (Gast)


Lesenswert?

Maik schrieb:
> soll natürlich "2n7000" heißen..

Du hast einen JFET gezeichnet, beim 2N7000 handelt es sich
aber offensichtlich um einen MOSFET.

Bei deiner Fehlerproblematik kommt es auch drauf an was der
MOSFET an seinem Gate sieht. Da hast du uns aber freundlicher-
weise unterschlagen .....

Also bei diesem Chaos soll mann dann herausfinden was los ist ....

von Peter II (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Bei deiner Fehlerproblematik kommt es auch drauf an was der
> MOSFET an seinem Gate sieht. Da hast du uns aber freundlicher-
> weise unterschlagen .....

nein, nur das hat er uns gezeigt

> zugegeben, ja das ist nicht wirklich das Signal am INI Pin, sondern
> etwas vorher abgegriffen.

von Maik (Gast)


Lesenswert?

ja er hat recht, die Info fehlt. Es liegen 9V am Gate an wenn der Impuls 
zuschlägt.

Der 10k am Source ist sicherlich nicht nach Lehrbuch. Ich wollte nochmal 
Strom sparen ;-)
-> komischerweise funktioniert das ganze ohne diesen R nicht - es kommt 
dann gar kein Impuls zum µC durch.

-> Welcher C fehlt wo?

von Norbert (Gast)


Lesenswert?

Lothar M. schrieb:
> Geh einfach über die Autobahn. Einmal ganz schnell und einmal ganz
> langsam.

Wenn genau zur richtigen Zeit ein 38-Tonner vorbeikommt, ändert sich mit 
der Laufgeschwindigkeit nur das Aufprallmuster am Kühlergrill;-)

von Peter II (Gast)


Lesenswert?

Maik schrieb:
> Der 10k am Source ist sicherlich nicht nach Lehrbuch. Ich wollte nochmal
> Strom sparen ;-)
> -> komischerweise funktioniert das ganze ohne diesen R nicht - es kommt
> dann gar kein Impuls zum µC durch.

dafür müsste man jetzt wirklich mal alle Pegel kennen? Warum kannst du 
nicht einfach den Oszi mal an das gate und an den Pin vom µC 
anschließen. (2Kanäle nutzen). Da könnte man bestimmt mehr sehen.

von Arduinoquäler (Gast)


Lesenswert?

Maik schrieb:
> komischerweise funktioniert das ganze ohne diesen R nicht - es kommt
> dann gar kein Impuls zum µC durch.

Du kapierst es offensichtlich nicht: du musst alles zeigen damit
die Pegelverhältnisse klar sind.

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


Lesenswert?

Norbert schrieb:
> Lothar M. schrieb:
>> Geh einfach über die Autobahn. Einmal ganz schnell und einmal ganz
>> langsam.
>
> Wenn genau zur richtigen Zeit ein 38-Tonner vorbeikommt, ändert sich mit
> der Laufgeschwindigkeit nur das Aufprallmuster am Kühlergrill;-)
Korrekt. Im ersteren Fall ist das aber weniger wahrscheinlich. Wie auch 
immer: ich würde rennen. So schnell wie möglich... ;-)

: Bearbeitet durch Moderator
von c-hater (Gast)


Lesenswert?

Peter II schrieb:

> sollte da nicht ein gewissen Schmitt-Trigger verhalten vorhanden sein?

Ist er.

> Jedes Signal geht doch zwangsläufig durch den undefinierten Bereich.

Ja.

> Kann mir nicht so recht vorstellen, das das wirklich ein Problem ist.

Dann stell dir einfach mal vor, dem Signal ist ein hochfrequentes 
Störsignal überlagert, dessen Amplitude zumindest gelegentlich die 
Trigger-Hysterese übersteigt...

Und nein, so ein Störsignal würdest du in deinem Oszi nicht unbedingt 
sehen können, dafür sorgen schon der unsinnig gewählten Meßpunkt und die 
ebenso unsinnig gewählten Oszi-Einstellungen. Die Frage ist außerdem, ob 
das Oszi überhaupt schnell genug wäre, das Problem sichtbar zu machen...

Ist aber eigentlich auch egal: Das Ergebnis zeigt doch bereits sehr 
eindeutig, daß das Problem existiert. Ob man es sich nun auch noch auf 
dem LC-Display eines Oszis angaffen kann oder nicht, spielt dann 
eigentlich schon keine Rolle mehr. Wäre höchstens insofern schick, als 
dass man daraus möglicherweise Rückschlüsse auf die Störquelle ziehen 
könnte.

von Peter II (Gast)


Lesenswert?

kann nun jemand sagen wie das verhalten definiert ist, wenn sie die 
Spannung langsam ändert?

Laut Datenblatt gibt es eine Hysteresis von 0.4mV.

Damit sollte die Langsamkeit kein Problem sein, sie darf nicht nicht 
wieder zurückgehen.

von Arduinoquäler (Gast)


Lesenswert?

Peter II schrieb:
> Laut Datenblatt gibt es eine Hysteresis von 0.4mV.
>
> Damit sollte die Langsamkeit kein Problem sein, sie darf nicht nicht
> wieder zurückgehen.

Eben schon.

Eine Rauschspannung von z.B. 1mV die dem eigentlichen Signal
überlagert ist würde bei dieser Spezifikation den Eingang
doppelt oder mehrfach triggern.

von Bastler (Gast)


Lesenswert?

Peda:      "der erkennt 50µs"
Peter II:  "Hysterese 0,4mV"

Also ein 20MHz Signal von 400µV oder 0,0004V kann den 2. Interrup 
triggern.
Selbst wenn es realistischer 400mV sind, je nach Aufbau (langer Draht 
direkt an hochomiges CMOS-Gate) bekommt man auch ein "Klingeln" von 
einem ½V hin. Und schon passiert "Rätselhaftes".
Symptome haben immer Ursachen. Manchmal auch solche, die man gerade 
nicht versteht. Dadurch werden sie (die Ursachen) aber nicht unwirksam.

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


Lesenswert?

Peter II schrieb:
> Laut Datenblatt gibt es eine Hysteresis von 0.4mV.
Das ist keine (brauchbare) Hysterese. Oder bist du beim Abschreiben um 
drei Zehnerpotenzen verrutscht?

Bastler schrieb:
> Selbst wenn es realistischer 400mV sind, je nach Aufbau (langer Draht
> direkt an hochomiges CMOS-Gate) bekommt man auch ein "Klingeln" von
> einem ½V hin. Und schon passiert "Rätselhaftes".
Z.B. dass der Fehler beim Messen "verschwindet"...

: Bearbeitet durch Moderator
von Thomas W. (Gast)


Lesenswert?

Maik schrieb:
> plan.png

>> Wie wärs mal mit einem kleinen Schaltplänchen damit "man" klar sieht?
>
> soll natürlich "2n7000" heißen..

Dann ist dein Schaltbild falsch. Ein 2N7000 ist bestimmt kein 
Verarmungs-FET.

Und hast du dir mal überlegt, wie deine komische Serienschaltung von 
zwei Widerständen und der DS-Strecke vom FET zu einem vernünftigen 
Signal am µC-Eingang führen soll? Stell dir den FET einfach mal als 
änderbaren Widerstand vor.

Die Ansteuerung vom FET solltest du nicht verheimlichen, weil die mit 
Ursache von deinem Problem sein könnte (Schaltbild, Oszibild).

von Joachim B. (jar)


Lesenswert?

TO du hast doch einen 2-Kanal Oszi.

Schalte doch im IRQ mal einen freien Port high und gleich wieder low und 
zeige beide Kanäle, dann siehst du doch wo der IRQ im Kanal 1 ausgelöst 
wird.

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Lothar M. schrieb:
> Peter II schrieb:
>> Laut Datenblatt gibt es eine Hysteresis von 0.4mV.
> Das ist keine (brauchbare) Hysterese. Oder bist du beim Abschreiben um
> drei Zehnerpotenzen verrutscht?

Das konnte ich jetzt auch nicht glauben. Von PICs bin ich es für 
Schmitttrigger Eingänge gewohnt 0,2*Vdd-0,8V*dd, also 0,6*Vdd für die 
Hysterese. Da musste ich jetzt doch mal nachschauen.
Wenn ich das Datenblatt richtig deute sollten es beim ATMega 0,05*Vcc 
sein. Also bei 5V VCC -> 0,25V. Kommt mir wenig vor, aber bestimmt weil 
ich es eben anders gewohnt bin.
(Kann auch sein, dass ich das Datenblatt falsch lese ;-)

von Arduinoquäler (Gast)


Lesenswert?

Joachim B. schrieb:
> TO du hast doch einen 2-Kanal Oszi.

Warum so ins Detail gehen, er schafft es ja nicht einmal klare
Verhältnisse zu schaffen, uns zu sagen wo er misst, welche
Einstelllungen am Oszilloskop er hat (Tastkopf? DC?) und wie
seine komplette Schaltung bezüglich seiner Problematik aussieht.

von Peter II (Gast)


Lesenswert?

Lothar M. schrieb:
>> Laut Datenblatt gibt es eine Hysteresis von 0.4mV.
> Das ist keine (brauchbare) Hysterese. Oder bist du beim Abschreiben um
> drei Zehnerpotenzen verrutscht?

würde ich zumindest so lesen, kam wir aber auch komisch vor.

http://www.atmel.com/Images/doc2466.pdf
Seite 317.

von Volker S. (vloki)


Lesenswert?

Peter II schrieb:
> würde ich zumindest so lesen, kam wir aber auch komisch vor.
>
> http://www.atmel.com/Images/doc2466.pdf
> Seite 317.

Tabelle 120, Seite 294 würde ich nehmen. Habe aber Null Ahnung von ATMEL 
...

von Wolfgang (Gast)


Lesenswert?

Peter II schrieb:
> würde ich zumindest so lesen, kam wir aber auch komisch vor.
>
> http://www.atmel.com/Images/doc2466.pdf
> Seite 317.

Da hat sich im Datenblatt wohl ein "m" zu viel eingeschlichen. Miss die 
Hysterese doch einfach mal nach, indem du ein Dreieck- oder Sinussignal 
auf den Eingang gibst und guckst, was der µC daraus liest. Dazu 
schreibst du einfach eine kleine Schleife, die den Pin ausliest und das 
Ergebnis auf einem anderen Pin raus gibt. Das guckst du dir dann 
zusammen mit dem Eingangssignal auf dem Oszi an, z.B. in xy-Darstellung.

von Maik (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Joachim B. schrieb:
>> TO du hast doch einen 2-Kanal Oszi.
>
> Warum so ins Detail gehen, er schafft es ja nicht einmal klare
> Verhältnisse zu schaffen, uns zu sagen wo er misst, welche
> Einstelllungen am Oszilloskop er hat (Tastkopf? DC?) und wie
> seine komplette Schaltung bezüglich seiner Problematik aussieht.

werde ich nachliefern.


ANdere Frage; ich will es umbauen. Also nicht mehr flankengetriggert 
sondern Level-Changed.
D.h. bei jedem Impuls soll das Ergebnis gekippt werden. L->H->L->... und 
dem Pin Change Interrupt am AVR zugeführt werden.
Wie mach ich das geschickter weise? Ich dachte zuerst an Flipflops ..

von Volker S. (vloki)


Lesenswert?

Volker S. schrieb:
> Tabelle 120, Seite 294 würde ich nehmen. Habe aber Null Ahnung von ATMEL
> ...

Ja, ist eigentlich für "Two-wire Serial Bus Requirements", aber die 
einzige Stelle im ganzen Datenblatt, mit Angaben zu einer "alternativen 
Pin-Funktion" (die dann Schmitttrigger ...)

von Ulrich F. (Gast)


Lesenswert?

Maik schrieb:
> ANdere Frage; ich will es umbauen. Also nicht mehr flankengetriggert
> sondern Level-Changed.
> D.h. bei jedem Impuls soll das Ergebnis gekippt werden. L->H->L->... und
> dem Pin Change Interrupt am AVR zugeführt werden.
> Wie mach ich das geschickter weise? Ich dachte zuerst an Flipflops ..

Umbauen ist generell eine gute Idee...
Aber in welche Richtung?
Bisher uns sind Eingangssignal und Zweck der Übung unbekannt.....
Da einen Rat zu geben.... naja....

Ich versuchs mal:
Es ist kein Fehler ein externes Signal aufzubereiten und den Eingang des 
µC zu schützen. Falls notwendig.

Dann, welche Flanke/Level auswerten?
Keine Ahnung....
Was willst du erreichen?
Wie sieht das Signal aus?

von S. Landolt (Gast)


Lesenswert?

In meinem Datenblatt lese ich unter 'Figure 31-311. ATmega328: I/O Pin 
Input Hysteresis vs. VCC' für Vcc= 5.0 V etwas über 0.5 V.

von Arduinoquäler (Gast)


Lesenswert?

Ulrich F. schrieb:
> Dann, welche Flanke/Level auswerten?
> Keine Ahnung....
> Was willst du erreichen?
> Wie sieht das Signal aus?

Das wenn er selbst wüsste ..... wäre er schon froh ....

von Peter II (Gast)


Lesenswert?

S. Landolt schrieb:
> In meinem Datenblatt lese ich unter 'Figure 31-311. ATmega328: I/O Pin
> Input Hysteresis vs. VCC' für Vcc= 5.0 V etwas über 0.5 V.

das klingt sinnvoller. Da hat wohl jemand im Datenblatt vom AtMega16 V 
und mV vertauscht.

von Wolfgang (Gast)


Lesenswert?

Peter II schrieb:
> das klingt sinnvoller. Da hat wohl jemand im Datenblatt vom AtMega16 V
> und mV vertauscht.

ACK

Wolfgang schrieb:
> Da hat sich im Datenblatt wohl ein "m" zu viel eingeschlichen.

von Wolfgang (Gast)


Lesenswert?

Maik schrieb:
> Wie mach ich das geschickter weise? Ich dachte zuerst an Flipflops ..

In der ISR die Wahl der Flanke umschalten.

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.