Forum: Mikrocontroller und Digitale Elektronik Interrupt Flankenerkennung


von Hans-J. A. (modellbahner71)


Lesenswert?

Hallo zusammen,
an meinen Atmega328p mit 16 MHz möchte ich am Externen Interrupt 1 – Pin
ein Datensignal mit steigender Flanke zum Interrupt nutzen. Das 
Rechteck-Signal ist +17V  40µs / -17V 40µs und wird mit Hilfe einer 
H-Brücke vom
Type TLE5206-2S erzeugt. In Folge wird das Signal über einen 
Brückengleichrichter und einen 47K-Ohm Widerstand dem µC zugeführt.

Die Frage die sich mir trotz des Datenblattes stellt ist: Schafft der
µC - Eingang es die steigende Flanke sauber zu erkennen ?
Quasi den Nulldurchgang des Signales in Form von +17V  0V  (Flanke) 
+17V.

Oder anders gefragt, wie lange (Takte) braucht µC
um High => Low und wieder High zu erkennen?

MfG

von m.n. (Gast)


Lesenswert?

Hans-J. A. schrieb:
> Oder anders gefragt, wie lange (Takte) braucht µC
> um High => Low und wieder High zu erkennen?

Aus dem Kopf heraus jeweils 2-3 Takte, was bei Deiner Anwendung völlig 
ohne Belang ist.
Wie verschaltest Du den Brückengleichrichter? Da die Schaltschwelle am 
Eingang bei ca. Vcc/2 liegt, würde ein einfacher Spannungsteiler 
ausreichen.

von Hans-J. A. (modellbahner71)


Lesenswert?

Danke für die schnelle Antwort,
damit ist mir schon geholfen.
Der Brückengleichrichter ist schon vorhanden daher währe das so 
einfacher

MfG

von c-hater (Gast)


Lesenswert?

Hans-J. A. schrieb:

> an meinen Atmega328p mit 16 MHz möchte ich am Externen Interrupt 1 – Pin
> ein Datensignal mit steigender Flanke zum Interrupt nutzen. Das
> Rechteck-Signal ist +17V  40µs / -17V 40µs und wird mit Hilfe einer
> H-Brücke vom
> Type TLE5206-2S erzeugt. In Folge wird das Signal über einen
> Brückengleichrichter und einen 47K-Ohm Widerstand dem µC zugeführt.

Das hört sich ziemlich schräg an. Brückengleichrichter: OK, verdoppelt 
die Frequenz, muss man also bei der Auswertung entsprechend 
berücksichtigen.

Aber danach nur ein einzelner Widerstand? Da stimmt definitiv irgendwas 
nicht im Schaltungskonzept, das sollten mindestens zwei Widerstände 
sein...

> Die Frage die sich mir trotz des Datenblattes stellt ist: Schafft der
> µC - Eingang es die steigende Flanke sauber zu erkennen ?

Das kommt natürlich auf den Takt an, mit dem der µC betrieben wird und 
auf die Software. Wenn's über einen Interrupt laufen soll, gibt der 
minimale Interuptframe den minimal erforderlichen Takt vor (bei dem 
allerdings noch keine Auswertung möglich ist, weil ja noch keine 
Nutzsoftware beschäftigt werden konnte). Der minimale Interruptframe 
beträgt 8 Takte, dazu kommt aber mindestens ein zwangsweise in main() 
verbrachter. Pro Interrupt braucht man also mindestens 9 Takte, um 
überhaupt jedes Ereignis mitkriegen zu können.

Deine Hardwareschaltung wird (zumindest nach ihrer Korrektur) alle 20µs 
einen Interrupt produzieren. D.h.: das absolute Minimum für den Takt 
ist:

1000000        _
------- = 5555,5 Hz
20 * 9

Das ist ziemlich wenig. Aber, wie schon gesagt, ist damit nur 
sichergestellt, dass jede einzelne Pegeländerung des Eingangs garantiert 
einen Interrupt (mit Minimal-ISR) auslöst, dieser bis zu Ende bearbeitet 
werden kann und das System rechtzeitig bereit ist, um auf die nächste 
Pegeländerung zu reagieren.

Wenn nun Nutzcode in deiner ISR ist, sieht das schon gleich ganz anders 
aus. Dann steht nämlich in der Formel statt der einfachen "9" ein
"(9 + x)", wobei das x der Zahl Takte entspricht, die deine ISR 
benötigt.

Bei diesem C-Scheissdreck kommt da als obsolutes Minimum für "x" 
schonmal eine "2" hin, denn es ist in C so gut wie unmöglich, nützlichen 
Code "in place" auf dem Interruptvektor unterzubringen. Sprich: dort 
steht nur eine Sprunganweisung, die bezüglich des gewünschten 
Ergebnisses keinerlei Nutzen bringt, die aber trotzdem schonmal zwei 
Takte kostet...

Den Rest für deinen C-Scheiss kannst du dem Assembler-Listing deiner ISR 
entnehmen. Einfach hier die Takte zählen, 2 addieren und den Wert für 
die Formel als "x" benutzen.

Das Ergebnis sieht dann sicher schon sehr viel weniger entspannt aus...

Dazu kommt aber noch: Das alles gilt nur, solange der PCINT der einzige 
Interrupt im System ist und es in main() keine cli/sei-Blöcke gibt. 
Treffen diese beiden Bedingungen nicht zu, wird es gleich nochmal sehr 
viel heftiger mit der Takte-Rechnerei. Dann mußt du nämlich zu "x" 
nochmal einiges hinzuaddieren...

von Hans-J. A. (modellbahner71)


Lesenswert?

Danke für die Ausfürliche Antwort c-hater.
Die Interrupt Routine macht insgesammt 38 Takte aus und ich habe 40µs 
Zeit bis zur nächsten Flanke. Der ein 47 K Ohm Widerstand war schon so 
vorgegeben.

MfG

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


Lesenswert?

c-hater schrieb:
> Bei diesem C-Scheissdreck
Ach komm, willst du auf diese Art Missionieren und Assembler zu einem 
nennenswerten Marktanteil verhelfen? Das wird nicht klappen, denn die uC 
werden für gleiches Geld immer schneller...

Hans-J. A. schrieb:
> Der ein 47 K Ohm Widerstand war schon so vorgegeben.
Die "altbewährte" Sparschaltung mit den Schutzdioden an den Pins. Mein 
Tipp bei dieser hochohmigen Schaltungsauslegung: schreib die Software 
so, dass sie gegen "spurious Interrupts" durch Störungen stabil ist.

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.