mikrocontroller.net

Forum: Compiler & IDEs Problem mit INT0 und ADE7753


Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
www.twhosting.net/ade7753.tar.gz

Den Code gibts oben zum Download. Weiß einfach nicht was ich falsch 
gemacht habe...

vg

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?)

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.