Hallo, habe einen Leistungsmess IC von Analog Devices (ADE7753) und wollte jetzt die von dem IC "produzierten" Interrupts auswerten. Dazu habe ich den INT0 auf der fallenden Flanke initialisiert. Das ganze funktioniert auch, aber meistens nur 1 oder 2 mal. dannach kommt nie mehr ein interrupt. Der pegel am irq pin liegt dann bei ca 1,4V (pull ups aktiviert) Ich habe eine Vermutung warum, das so ist: Der IRQ Pin bleibt so lange low, bis das passende Interruptstatus Register ausgelesen wurde. Tritt also ein Interrupt auf, während ich in der Interruptroutine bin, bekomme ich das nicht mit und lese daher auch nicht das Interruptstatusregister. Der PIN bleibt dann für immer LOW... Jetzt zu meiner Frage: War immer der Meinung, dass nach dem verlassen der IRQ Routine alle aufgetretenen Interrupts "nachgeholt" werden. Im Gcc-Artikel dieser Seite habe ich aber folgendes gelesen: Dieses Bit wird gesetzt, wenn am INT0-Pin eine Interrupt-Kondition, entsprechend der Konfiguration, erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen. Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert 1(!) eingeschrieben wird.A Flag wird also gelöscht!?! Wird der INT0 dann nach verlassen der ISR und dem automatischen reaktivieren der globalen Interrupts gleich wieder aufgerufen oder nicht???? Hat sonst wer Erfahrunge mit dem ADE? Evt. Beispielprogramm wie man mit dem IRQ arbeitet? Ansonsten funktioniert der IC einwandfrei... Für jede Hilfe bin ich sehr dankbar... mfg Dominik
www.twhosting.net/ade7753.tar.gz Den Code gibts oben zum Download. Weiß einfach nicht was ich falsch gemacht habe... vg
>Flag wird also gelöscht!?!
Ja. Das globale Interrupt Enable Flag wird gelöscht.
In dem Satz "Das Flag wird automatisch gelöscht, ..." bezieht sich "Das
Flag" auf das im vorhergehenden Satz genannte globale interrupt Flag,
nicht auf das Interrupt Flag von INT0.
Da ja der Interrupt Ausgang vom AD... erst wieder zurückgenommen wird,
wenn das letzte Bit vom Status gelesen wurde, kann ein neuer Interrupt
nur danach auftreten. Ob Du zu dem Zeitpunkt noch in der
Interruptroutine bist oder nicht, ist unwichtig, da der Interrupt
gespeichert wird. Wenn die Interruptroutine verlassen wird und das
globale interrupt Flag wieder freigegeben wird tritt der Interrupt
erneut auf.
Du brauchst Dir also keine Sorgen zu machen, das Du einen Interrupt
nicht mitbekommst.
Wichtig scheint mir vielmehr die Tatsache, das Du am Interrupt Pin 1,4V
misst. Der Interrupt Ausgang ist ein Open-Drain, sollte also bis auf GND
ziehen und nicht auf so einem komischen Pegel sein. Poste doch mal die
Schaltung.
Noch eine Frage aus persönlichem Interesse: Wie sieht eigentlich Deine
Stromsensorschaltung aus? Also der Teil der im Datenblatt als id/td
Schaltung gekennzeichnet ist. Kannst Du die bitte mal posten? (Falls Du
das nicht ohnehin schon wegen obiger Bitte getan hast?)
hallo, habe das ganze jetzt nochmal am oszi angeschaut. der pin war wirklich nur auf 1,4V im Ruhezustand und wurde dann immer auf 0 gezogen. habe den internen pullup des avrs verwendet. Dies scheint jedoch nicht zu gehen. mit einem externen pullup von 10k ist der pegel jetzt zwar immer noch erst auf 3v, aber es funktioniert jetzt. die externe strommesschaltung ist im moment einfach ein normaler shunt. also nichtss spezielles. wollte jetzt nur mal die software schreiben. werde dann die endversion mal als schaltplan veröffentlichen. danke für die hilfe mfg dominik
>Dies scheint jedoch nicht zu gehen. >mit einem externen pullup von 10k ist der pegel jetzt zwar immer noch >erst auf 3v, aber es funktioniert jetzt. Das würde ich an Deiner Stelle nicht auf die leichte Schulter nehmen. Es muss einen Grund geben, warum der Pegel nicht auf 5V geht (ich gehe davon aus, das der AVR mit 5V versorgt wird). Irgendwas ist da faul. Du solltest den Schaltplan doch mal zeigen. Die Hardware sollte in Ordnung sein bevor Du mit der Software fortfährst.
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.