Forum: Mikrocontroller und Digitale Elektronik Frage zu ADC und Gleichspannungsmessung


von Mike (Gast)


Lesenswert?

Hallo Zusammen,
wollte mal aus Spaß eine Aufgabe lösen und hab da ehrlich gesagt absolut 
keine Ahnung, was den ADC angeht. Absolut nicht ...


Der Mikrocontroller soll mit Hilfe des ADC eine Gleichspannungsmessung 
durchführen. Dazu soll, gesteuert von einem
Timer-Interrupt, der ADC gestartet werden. Das Erfassen der Messwerte 
geschieht in der Hauptschleife des
Hauptprogramms. Die dort eingelesenen Messwerte aus dem ADC sollen in 
einem Puffer (Länge 10 Messwerte)
abgelegt werden. In diesem Puffer soll anschließend immer der älteste 
Messwert durch einen neuen überschrieben
werden (Ringpuffer). Nach jeder neuen Messung soll der Mittelwert aller 
Messwerte gebildet und mit der Funktion
outuint() ausgegeben werden.
Hinweise und Hilfen:
· Nehmen Sie an, der ADC ist schon initialisiert und der 
Eingangsmultiplexer ist schon richtig gewählt
Der ADC wird gestartet, indem das Bit 6 des Ports ADCSRA gesetzt wird.
· Im Hauptprogramm muss gewartet werden, bis das oben genannte Bit 6 
nicht mehr gesetzt ist.
Dann kann aus den Registern ADCL und ADCH der neue 10Bit Messwert 
abgeholt werden.
ADCL muss zuerst ausgelesen werden und enthält die niederwertigen 8 Bits 
des Messwerts.
· Nehmen Sie an, der Timer-Interrupt sei schon richtig initialisiert. Er 
ruft die Interrupt-Service-Routine
ISR( TIMER) { /* Ihr Programmcode für die ISR */ } auf.
· Die Funktion void outuint(uint16_t) wird als vorhanden angesehen.



Vielleicht hat jemand ein paar Ideen. Würde mich einfach interessieren, 
welche Lösungsansetze es da gibt oder wie man da direkt vorgeht ...

von ... .. (docean) Benutzerseite


Lesenswert?

in isr:
passended Bit zum Starten des ADC setzen

in main:
auf das Bit warten
wenn nicht mehr gesetzt
  neuen Wert holen
  ältesten Wert aus puffer löschen
  neune Wert speichern

alle werte im speicher addieren und durch anzahl der werte teilen


fertig...

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Hallo Zusammen,
> wollte mal aus Spaß eine Aufgabe lösen und hab da ehrlich gesagt absolut
> keine Ahnung, was den ADC angeht. Absolut nicht ...

Brauchst du auch nicht.
Steht doch alles in der Angabe deiner Hausübung was du wissen musst.


> · Nehmen Sie an, der ADC ist schon initialisiert und der
> Eingangsmultiplexer ist schon richtig gewählt

Gut

> Der ADC wird gestartet, indem das Bit 6 des Ports ADCSRA gesetzt wird.

wie setzt man ein Bit?

   ADCSRA |= ( 1 << 6 );

> · Im Hauptprogramm muss gewartet werden, bis das oben genannte Bit 6
> nicht mehr gesetzt ist.

wie fragt man ab, ob ein Bit gesetzt ist?

   if( ADCSRA & ( 1 << 6 ) )

drehs um, und die hast die Abfrage ob das Bit nicht mehr gesetzt ist.

> Dann kann aus den Registern ADCL und ADCH der neue 10Bit Messwert
> abgeholt werden.
> ADCL muss zuerst ausgelesen werden und enthält die niederwertigen 8 Bits
> des Messwerts.

Register auslesen wirst du ja auch alleine hinkriegen

> Vielleicht hat jemand ein paar Ideen. Würde mich einfach interessieren,
> welche Lösungsansetze es da gibt oder wie man da direkt vorgeht ...

:-)
Wir sind nicht so blöd, wie du denkst. Wir durchschauen dich schon.
Mach deine Hausaufgaben selber, da hast du mehr davon.

Auf deinem Übungszettel steht eine Menge drauf und offenbar geht es in 
erster Linie um den Ringbuffer. Der ADC dient nur dazu, um
* irgendwelche Werte zu haben, die man in den Ringbuffer stellen kann
* du bei der Programmiererei in Übung bleibst.

von oldmax (Gast)


Lesenswert?

Hi
Mike schrieb:
> Vielleicht hat jemand ein paar Ideen. Würde mich einfach interessieren,
>
> welche Lösungsansetze es da gibt oder wie man da direkt vorgeht ...

Immer wieder erstaunlich, diese Fragen. Ich glaub dir nicht, das du dich 
dafür interessierst, wie MAN da direkt vorgeht, sondern wer deine Arbeit 
macht.
Einen Wert zu lesen hast du bestimmt gelernt, einen Ringpuffer zu 
beschreiben auch. Den Mittelwert zu berechnen ist Mathe 3. Klasse.
Wie man ein Programm schreibt ? Na ganz einfach. Anfangen ein 
Struktogramm zu malen, Eingabewerte Erfassen, Verarbeiten und Ausgeben. 
Großschreibung ist hier kein Fehler sondern ein Hinweis auf unsere 
allseits beliebte "EVA".
Na ja, ein wenig Verständnis hab ich denn dann doch noch: das Wetter ist 
zu schön, um in der Bude zu versauern.....
Gruß oldmax

von Mike (Gast)


Lesenswert?

Ich habe doch schon oben geschrieben, dass mich nur interessiert, wie 
man dabei vorgeht. Ich habe nicht um eine komplettlösung gebeten :-)

Der erste Beitrag auf meine Frage hin :
-------------------------------
in isr:
passended Bit zum Starten des ADC setzen

in main:
auf das Bit warten
wenn nicht mehr gesetzt
  neuen Wert holen
  ältesten Wert aus puffer löschen
  neune Wert speichern

alle werte im speicher addieren und durch anzahl der werte teilen
---------------------------------------


hilft mir sehr viel weiter. Damit kann ich versuchen den Code 
aufzustellen und dann bei Fragen nochmal hier zu posten. Eine 
komplettlösung bringt mich ja nicht weiter, da ich es nicht verstehen 
würde. Von daher habe ich auch keine Hintergedanken oder sonstige. Und 
es ist keine Hausarbeit ... mich hat es nur interessiert, da ich zu 
diesem Thema nie wirklich etwas in der Uni gemacht habe und somit auch 
nichts in der Hand hab, was mir weiter helfen könnte. Werde mir aber 
hier auf der webseite das durchlesen zum Thema ADC und dann hier mich 
nochmals mit einem Programm melden :-)

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Ich habe doch schon oben geschrieben, dass mich nur interessiert, wie
> man dabei vorgeht. Ich habe nicht um eine komplettlösung gebeten :-)
>
> Der erste Beitrag auf meine Frage hin :
> -------------------------------
> in isr:
> passended Bit zum Starten des ADC setzen
>
> in main:
> auf das Bit warten
> wenn nicht mehr gesetzt
>   neuen Wert holen
>   ältesten Wert aus puffer löschen
>   neune Wert speichern
>
> alle werte im speicher addieren und durch anzahl der werte teilen
> ---------------------------------------
>
>
> hilft mir sehr viel weiter.

Echt?

Das ist genau dasselbe was auch in deiner Aufgabe steht.
Nur anders angeordnet und überflüssige Füllwörter entfernt.

von A. K. (akks)


Lesenswert?

Wo hast du denn diese Aufgabe her?
Sind da noch mehr?
Das ist eine interessante Übungsgrundlage, bitte poste doch mal den Link 
dazu, oder die Angabe wo auch immer die her ist.

von Mike (Gast)


Lesenswert?

Das war eine Übung aus einem Arbeitsblatt hier. Wir arbeiten mit dem AVR 
und ehrlich gesagt hab ich diese ganze Registersache absolut nicht 
verstanden. Daher dachte ich, dass diese Übung eine gute Grundlage ist, 
da hier alles zusammenkommt, Register, schreiben, löschen, FUnktionen 
etc. ...

Nur verstehe ich oft die Aufgabenstellungen nicht wie z.B. ADCL muss 
zuerst ausgelesen werden und enthält die niederwertigen 8 Bits
des Messwerts.

Wie lese ich drauß? Einfach den ADCL einer Variablen zuweisen und dann 
diese Variable zum Vergleichen benutzen?

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:

> Nur verstehe ich oft die Aufgabenstellungen nicht wie z.B. ADCL muss
> zuerst ausgelesen werden und enthält die niederwertigen 8 Bits
> des Messwerts.
>
> Wie lese ich drauß? Einfach den ADCL einer Variablen zuweisen

ganz genau.

Für dein C Programm sind die ominösen 'Register' einfach nur eine Art 
'vordefinierte Variablen', die du von Haus aus zur Verfügung hast. 
Welche es gibt und was sie bedeuten steht im Datenblatt des Prozessors.

> diese Variable zum Vergleichen benutzen?

Fast.
Zuerst musst du aus den Werten von ADCL und ADCH einen 16-Bit Wert 
zusammenbauen.

   uint8_t lowByte;
   uint8_t highByte;
   uint16_t total;

   lowByte = ADCL;
   highByte = ADCH;


   total = 256 * highByte + lowByte;


glücklicherweise weiß das aber auch dein Compiler und definiert dafür 
ein Psuedoregister: ADC

   total = ADC;

und macht dann das zusammensetzen für dich.

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Das war eine Übung aus einem Arbeitsblatt hier. Wir arbeiten mit dem AVR
> und ehrlich gesagt hab ich diese ganze Registersache absolut nicht
> verstanden. Daher dachte ich, dass diese Übung eine gute Grundlage ist,
> da hier alles zusammenkommt, Register, schreiben, löschen, FUnktionen
> etc. ...

Das ist schon zuviel.

In einem Register ein Bit setzen, ein Bit löschen, ein Bit abfragen.
Das sind die absoluten Grundlagen.
Und solange das Schwierigkeiten macht, hat es keinen Sinn schwierigere 
Dinge in Angriff zu nehmen.

Allerdings: deine Aufgabenstellung, so wie sie formuliert ist, setzt die 
Beherrschung dieser grundlegendden Techniken schon vorraus.

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.