mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC mit ATMEGA8


Autor: jenny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo Zusammen!

Ich bin gerade dabei herauszufinden, wie die AD Wandlund (Converter) des 
ATMEGA8 funktioniert..
Ich bin sozusagen ein C Neuling, beschäftige mich jetzt seit 1 Woche 
damit..
Wie kann ich am besten das Ergebnis der Wandlung mit LEDs anzeigen?
habe versucht den High-Teil des Ergebnisses direkt auf den Ausgangsport 
zu schieben. dieses zeigt mir jedoch nur PIN 3 hell und PIN4 ein 
bisschen hell. Das war bis jetzt immer das Zeichen, dass was nicht 
geht..
In der Anlage ist mein Versuch, vielleicht sieht einer von euch woran es 
liegt.
Achso; ich benutze AVR Studio 4.

Vielen Dank schonmal im Voraus!


Grüße Jenny

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jenny schrieb:

> Wie kann ich am besten das Ergebnis der Wandlung mit LEDs anzeigen?

Einfach am Port ausgeben.

> habe versucht den High-Teil des Ergebnisses direkt auf den Ausgangsport
> zu schieben.

Du holst dir das Ergebnis in die Variable i.
Warum benutzt du dann nicht auch i zur Ausgabe?

        ADCSRA = 0b11000101;

mach sowas nicht. Alle Helfer müssen jetzt im Datenblatt nachsehen, was 
du da eigentlich alles aktiviert hast und was nicht.

Hier
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
findest du eine ADC Routine, die funktioniert.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

In abhängigkeit von PDO wird mal ADCH oder mal 0xff ausgegeben.
Das könnte doch schonmal ein Grund sein, das Pin4 ein bißchen hell ist?

Gruß
Joachim

Autor: jenny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ kbuchegg

in dem tutorial stand, dass man das Ergebnis lesen muss, damit es die 
anderen Ergebnisse nicht verfälscht, deswegen nehme ich i. i besteht 
aber aus 16bit und ich kann nur 8bit mit meinen 8 leds ausgeben, ich 
dachte das geht vielleicht nich..

habe das programm jetzt nocheinmal anders geschrieben, mit einer 
interruptroutine. jetzt ist es so, dass die LEDs aus sind, aber die 
Ausgabe auch nicht funktioniert.. Leider.

achso; im tutorial steht ich muss das I-Bit im SREG setzten. Wie kann 
ich das machen?hab noch ein bisschen gesucht, wie das aussehen könnte, 
aber nicht wirklich was gefunden.
ich würde es jetzt so versuchen:
SREG |= (1<< I-BIT);
 Okay, das funktioniert so nich...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jenny schrieb:
> @ kbuchegg
>
> in dem tutorial stand, dass man das Ergebnis lesen muss, damit es die
> anderen Ergebnisse nicht verfälscht, deswegen nehme ich i. i besteht
> aber aus 16bit und ich kann nur 8bit mit meinen 8 leds ausgeben, ich
> dachte das geht vielleicht nich..

Wenn du dir die 16 Bit (von denen nur die unteren 10 Bit relevant sind) 
vor der Ausgabe zurecht schiebst, geht auch das. 10 Bit auf einem 8 Bit 
Port ausgeben geht nun mal nicht. Also muss man entscheiden wie man die 
10 Bit 'eindampft'.

10 Bit, das sind Zahlen von 0 bis 1023
8 Bit, das sind Zahlen von 0 bis 255

Wenn man daher die 10 Bit durch 4 dividiert, 'passt' der 10 Bit Bereich 
in 8 Bit. Man verliert dann zwar ein bischen Auflösung, aber die Zahlen 
von 0 bis 1023 werden sinnvoll auf den Bereich 0 bis 255 abgebildet.

> habe das programm jetzt nocheinmal anders geschrieben, mit einer
> interruptroutine.

Ach.
Wenns auf die einfache Methode nicht funktioniert, probieren wir die 
kompliziertere, vielleicht geht ja die :-)

Autor: jenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja... ;D
Mein Timer hat auch am besten mit Interrupt funktioniert :)

Also hab jetzt am Ende des ersten Programms (ohne Interrupt mit 
einmaliger AD-Wandlung per Tastendruck) das mit dem durch 4 teilen 
eingefügt. Das sieht jetzt so aus;
i = ADCW;
i /= 4;
PORTD = i;

Jetzt gibt mein Ausgangsport die ganze Zeit ne 0 aus (also alle LEDs 
leuchten)...das drehen an meinen angeschlossenen Potis (Potentiometern) 
- also angeschlossen an die Spannungseingänge- hat keinen Einfluss.

Vorhin hatte ich noch ein ganz witziges Phänomen (schreibt man das so?)
da veänderten sich die LEDs (sie flackerten und manche gingen aus oder 
wieder an), wenn man die hand über die Potis hielt :D


grüße von jenny

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal:

Ich hab jetzt ehrlich keine Lust deine Konfigurationsbits 
auseinanderzudröseln. Benutze die ADC Routine aus dem Tutorial. Die ist 
in 10 Sekunden per Cut&Paste übernommen. Ruf sie auf und du kriegst 
einen Wert zurück, diesen Wert, geteilt durch 4, gibst du am Port aus.
Wenns dann noch immer nicht funktioniert, hast du ein Hardwareproblem.


Deine main kann so einfach aussehen
int main(void)

{  
  DDRB = 0xff;   // dort hängen die LED

  while( 1 )
  {
    PORTB = ReadChannel( 0 ) / 4;
  }
}

(ReadChannel ist die Funktion aus dem Tutoroial)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW, weil ichs gerade sehe:
Was ist bei dir eigentlich wo angeschlossen?

int main(void)

{
  uint16_t  i;
  DDRB = 0x00;
  DDRD = 0xff;
  PORTD = 0xff;

Du konfigurierst Port B auf Eingabe, gibst dann aber über PORTB 
anscheinend auf die LED aus.
Du konfigurierst Port D auf Ausgabe, fragst dann aber von dort die 
Schalter ab.

Autor: jenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry wollte dir nich auf den keks gehen..
werds weiter versuchen, von mir aus auch mit dem programm aus dem 
tutorial.
ich muss es nur verstehen, deswegen nützt mir copy&paste nix..

müssen hier gerade neue µCBoxen bauen , die am besten mit C programmiert 
werden. keiner hat ahnung wie und ich hab die aufgabe bekommen das 
herauszufinden und wenns dann nich geht liegts an mir..

also trotzdem danke für deine hilfe!!!!!


liebe grüße jenny

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jenny schrieb:

> ich muss es nur verstehen, deswegen nützt mir copy&paste nix..

Ähm.
Im Tutorial gibt es auch Text, den man lesen kann. Der erklärt 
(hoffentlich) den dort gezeigten Code ausreichend genau, damit man, 
bewaffnet mit dem Datenblatt des Prozessors, den Code auch verstehen 
kann.

Autor: Hubert G. (hubertg)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So funktioniert es zumindest in der Simulation.
Du kannst ja mal vergleichen was ich geändert habe.

Autor: TEVA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,  kann mir Bitte jemand erklären was die Zeile bedeutet?
oder was passiert in dieser Zeile
ADCSRA = 0b11000101;

Lieben Gruß

TEVA

Autor: Mark P. (kellerkind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guckst Du Datenblatt Seite 207 von 308
ADC Control and Status Register A = ADCSRA...

da sind die einzeln Bits aufgedröselt!
Die ersten beiden sind für ADEN & ADSC und die letzten sind für den 
Prescaler. In diesem Fall steht 0bxxxxx101 für 1/32... weil

ADPS2 ADPS1 ADPS0 Division Faktor
  1     0     1        32

Autor: TEVA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort ich habe es aber nicht verstanden warum 
0b davor steht.

ich habe eine Frage und zwar sind die unteren beiden zeilen identisch?
 Wenn ja, warum steht  im Quellcode von Hubert G. 2 mal das selbe ??

ADCSRA= (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS0);

ADCSRA = 0b11000101;

Lieben Gruß

Teva

Autor: Mmmh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>sind die unteren beiden zeilen identisch?
Nein. Sie haben nur die gleiche Wirkung.

Autor: Oliver Henrichsen (olli_henri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde dir zusätzlich zu dem Tutorial und den Fragen hier im Forum 
noch ein Buch empfehlen. Mir hat das Buch sehr geholfen, gerade beim 
verstehen des ADC und der Interupts. Man muß nicht unbedingt alles 
nachbauen was der Autor da aufbaut und kann auch die Kapitel die einen 
besonders interessieren mit einem Mega8 nachspielen. Noch ein Vorteil 
ist das da eine menge Code mitgeliefert wird der sich dann wenn 
verstanden auch gut in eigene Projekte einbauen lässt. Und noch was: es 
ist nicht so dick und manches kann man querlesen oder später darauf 
zurückkommen.

Das Buch von Florian Schäffer, AVR, Hardware und C-Programmierung in der 
Praxis.

Mir hats jedenfalls viel geholfen und ich habe nichts mit dem Autor zu 
tun, ist nur mein tip

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Zeile ist auskommentiert
//  ADCSRA  = 0b11000101; //aktiviert ADC-Messung
0b ist für den Kompiler die Kennzeichnung für binär, 0x für Hexadezimal

Autor: TEVA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Danke nochmal für schnelle Antworten...

noch eine letzte Frage zu dem Quell-code..

was passiert in dieser Zeile??

while ((ADCSRA & (1<<ADSC)))

Lieben Gruß

Teva

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dieser Zeile wird gewartet bis das Bit ADSC im Register ADCSRA wieder 
0 ist. Dann ist die Konversion beendet und das Resultat steht im 
Register ADC und kann abgefragt werden.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In dieser Zeile wird gewartet bis das Bit ADSC im Register ADCSRA wieder
>0 ist. Dann ist die Konversion beendet und das Resultat steht im
>Register ADC und kann abgefragt werden.

Dazu fehlt noch das Semikolon am Ende der Zeile...

Autor: TEVA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich möchte die Werte, die der ADC umwandelt an mein PC schicken und es 
dort speichern. hat jemand Ahnung wie man vorgehen soll??

an meinem Board habe ich ISP und RS232 Anschluss.

ich habe schon einen Spannungsteiler am Eingang der ADC und will nur die 
umgewandelte Spannungswerte an PC schicken und speichern.

Lieben Gruß

TEVA

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, es ist hoch an der Zeit, auf das AVR-gcc-Tutorial hinzuweisen

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.