mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

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

Autor: Kloberscht (Gast)
Datum:

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

Autor: Michael U. (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

Autor: Manuel Kauf (mkauf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

bist du mittlerweile weitergekommen ?

wollte mir den ad7714 auch anschauen,

würdest du ev. deinen Code hier einstellen ?

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.