Forum: Mikrocontroller und Digitale Elektronik Interuptgesteuertes Auslesen von ad7714 über SPI


von Michael (Gast)


Lesenswert?

Hallo,

ich versuche einen ad7714 mit 40Hz in C auszulesen. Der AD7714 
signalisiert neue Daten durch eine fallende Flanke am DRDY, was am 
ATMEGA128 einen Interupt auslöst. Dannach möchte ich die drei Byte 
(24-Bit-Wandler) über SPI einlesen. Der restliche 
Ablauf(LCD,Serial,Flasch) soll dadurch sowenig wie möglich gestört 
werden.
Wie mach ichs am besten?
-Alles im Interupt erledigen. Geht vemutlich nicht weil der SPI weitere 
Interupts auslöst.
-Im restlichen Ablauf oft pollen ob es was abzuholen gibt. Dazu muß ich 
die aufwendigen Codeteile erstmal identifizieren und mit Pollingaufrufen 
spicken.
-Den Interupthandler soweit aufbohren, daß er alle Registerinhalte 
sichert und nach getaner Arbeit wieder zurückholt. So wie bei einem 
preemtiven Multitasking-Kernel.

Wer weiß Rat?

von Kloberscht (Gast)


Lesenswert?

> Alles im Interupt erledigen. Geht vemutlich nicht weil der SPI weitere
> Interupts auslöst.

Kein Problem. Solange du in der ISR bleibst, wird diese nicht 
unterbrochen. Du kannst abgesehen davon die SPI-Interrupts auch komplett 
abschalten, da du sie nicht brauchst.

1) Interrupt DRDY
2) In der ISR die drei Byte abholen und speichern
3) ISR verlassen

4) Im Hauptprogramm holst du dir die Daten (interruptsicher) und machst 
damit, was du willst.

von Michael U. (Gast)


Lesenswert?

Hallo,

so, wie schon Kloberscht schreibt, würde ich es auch machen.

Dazu, je nach Deiner Anwendung, ein Flag vereinbaren.

in der ISR testen, ob das Flag gesetzt ist, wenn ja, dann nichts machen 
oder ADC lesen und die Daten wegwerfen, weil das Hauptprogramm die 
vorigen Daten noch nicht verarbeitet hat.

Sonst Daten vom ADC holen an am Ende der ISR Flag setzen.

Im Hauptprogramm dieses Flag passend abfragen, wenn gesetzt, die Daten 
verarbeiten und am Ende der Verarbeitung das Flag löschen.

So kann nichts unpassend überschrieben werden.

Gruß aus Berlin
Michael

von Michael (Gast)


Lesenswert?

Also alles in dien Interupthandler ist zu viel.
Jetzt mache ich es wie Ihr es vorgeschlagen habt.
Ich setze ein Flag im Interupthandler, in der Hauptschleife frage ich 
das Flag ab wenn gesetzt dann den AD-Wert verarbeiten.
Wenn jetzt zum Bsp. das LCD beschrieben wird vergeht zu viel Zeit bis 
ich wieder in der Hauptschleife bin und verliere dadurch ein paar 
AD-Werte.
Also muß ich in der LCD-Routine das Flag zusätzlich abfragen.
Irgenwie nicht ganz zufriedenstellend, gibt es noch andere 
Lösungsvorschläge?

Gruß Michael

von Andreas (Gast)


Lesenswert?

Du musst entscheiden, was dir (deinem Programm) wichtiger ist.
Lange Verarbeitung in LCD Routine und damit Verlust einiger ADC Werte.
=> evtl. nicht wichtig, da die Werte auf dem LCD angezeigt werden sollen
oder:
Jeden ADC Wert "erwischen", dafür aber die LCD Routine durch Interrupts 
unterbrechen.

Das vorgeschlagene ADC-Flag an verschiedenen Stellen im Hautprogramm und 
LCD-Routine abfragen würde ich nicht empfehlen, da ggf. zu 
unübersichtlich und damit fehleranfällig (wenn das Programm komplexer 
wird).

mfg
Andreas

von Michael (Gast)


Lesenswert?

Hallo Andreas,

mir ist es wichtiger alle Ad-Werte zu bekommen, die LCD-Ausgabe darf 
auch mal unterbrochen werden.
Muß ich die Berechnung mit den AD-Werten mit in den Interupthandler 
nehmen?
Da sind einige Berechnungen zu erledigen.

von Manuel K. (mkauf)


Lesenswert?

Hi,

bist du mittlerweile weitergekommen ?

wollte mir den ad7714 auch anschauen,

würdest du ev. deinen Code hier einstellen ?

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
Noch kein Account? Hier anmelden.