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