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
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.
Danke für die schnelle Antwort, damit ist mir schon geholfen. Der Brückengleichrichter ist schon vorhanden daher währe das so einfacher MfG
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.