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...