Interuptgesteuertes Auslesen von ad7714 über SPI

Gast #525966
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?
Gast #525967
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.
Gast #526029
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
Gast #529043
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
Gast #529095
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
Gast #529157
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren