Gast
#2711976
Hallo, ich habe das Problem dass sich der Controller ab einer Frequenz von ca.40kHz am Eingangspin aufhängt. Kann mir einer den Grund dafür erklären? Vielen Dank
|
Anzeige
|
Pin Change Interrupt - Controller hängt sich auf ab 40kHz - ATMega168
Gast
#2711976
Hallo, ich habe das Problem dass sich der Controller ab einer Frequenz von ca.40kHz am Eingangspin aufhängt. Kann mir einer den Grund dafür erklären? Vielen Dank ohne dass du uns sagtst wie schnell der controller ist nicht... und die Interruptroutine und deren Abarbeitungszeit wären auch nicht uninteressant... Joshi schrieb: > Kann mir einer den Grund dafür > erklären? Ja. Da ist ein Fehler in Deinem Programm. Peter
Gast
#2712035
Der Controller läuft mit 8MHz und die Interruptroutine sieht folgendermaßen aus:
Alle 20ms wird dann der Counter abgefragt und wieder auf Null gesetzt. Die Routine sieht folgendermaßen aus:
Gast
#2712043
lässt sich deutlich kürzer schreiben
Gast
#2712047
nicht "gast" schrieb: > PORTC = (PORTC & ~(1<<PC3 | 1<<PC4)) | PCINT_STATE++; PORTC = (PORTC & ~(1<<PC3 | 1<<PC4)) | PCINT_STATE++ << PC3; Hallo! Joshi schrieb: > Der Controller läuft mit 8MHz und die Interruptroutine sieht > folgendermaßen aus: Sicher, dass nicht das Fuse-Bit CKDIV8 auf 0 programmiert ist? In dem Fall würde dein Mikrocontroller nämlich mit 1 MHz laufen und den Fehler erklären.
Falls PCINT_count eine 16-Bit-Variable ist, braucht die Interruptroutine mehr als 50 Taktzyklen, wenn sie in C geschrieben ist. Genaueres siehst du, wenn du dir den generierten Code disassemblieren lässt. Mögliche Lösung: nimm Assembler, dann sind es 15 bis 17 Zyklen... Zum PCI: Denk dran, dass der bei jedem Flankenwechsel ausgelöst wird, also beim Wechsel von 1 auf und und beim Wechsel von 0 auf 1. Falls dir eine Flanke reicht, nimm den INT0. Joshi schrieb: > Alle 20ms wird dann der Counter abgefragt und wieder auf Null gesetzt. Warum nimmst du keinen Timer und taktest den extern über dein Signal? Da kannst du dann ohne Interruptlast zählen. Ich tippe mal darauf, dass der µC ab einer bestimmten Signalfrequenz ständig in der ISR hängt, weil bevor die abgearbeitet ist, das Interruptflag schon wieder gesetzt wird und gleich nach dem reti ein neuer Aufruf der ISR stattfindet. Gruß Oliver Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|