www.mikrocontroller.net

Forum: Compiler & IDEs ATmega8 C- Programmierung AD- Wanlder


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich würde gerne einen ATmega8 in C-Sprache so porgrammieren, dass ich 
eine Spannung in den AD- Wandler einlese und diese anhand von LED´s 
anzeigen lassen will! Ich habe ein Programm geschrieben, welches aber 
nicht funktioniert. Könnte mir bitte jmd helfen?

MfG Martin



#include <avr/io.h>

void main(void)
{

int b;

DDRC = 0x00;
DDRD = 0xFF;

ADCSRA = 0xE6;

while(1)
{

b = ADCW;


if(b>51 && b<58)
PORTD = 0x01;

if(b>59 && b<64)
PORTD = 0x03;

if(b>65 && b<71)
PORTD = 0x07;

if(b>72 && b<77)
PORTD = 0x0F;

if(b>78 && b<83)
PORTD = 0x1F;

if(b>84 && b<90)
PORTD = 0x3F;

if(b>91 && b<96)
PORTD = 0x7F;

if(b>97 && b<102)
PORTD = 0xFF;


}
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht liest du dir das hier mal durch:

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Oliver

Autor: Gaast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lies mal das datenblatt vom atmega8 durch, dann findest du auch noch ein 
Beispiel...

Autor: F. Reiling (freiling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler liegt darin, dass du zwar den ADC ständig auslesen willst, 
aber nach einer fertigen Wandlung wird der ADC ja angehalten und du 
musst ihn wieder starten!
while(1)
{

ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 

b = ADCW;

...

}
}

damit sollte es funktionieren, sofern der Rest richtig initialisiert 
wurde.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
echt? ich hab ihn ja eig im free runing mode, deswegen denk ich dass er 
eig ständig läuft!
martin

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe ein Programm geschrieben, welches aber nicht funktioniert.

Denkst du daß "nicht funktioniert" eine sinnvolle Feherbeschreibung ist? 
Wie sieht der Testaufbau aus? Was passiert genau? Was hättest du 
erwartet? Ist ein Hardware-Fehler auszuschließen?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja des kann man jetzt auslegen wie man will, aber da das prgramm einen 
fehler enthält funktioniert es für mich nicht! die hardware stimmt und 
der grundaufbau vom programm auch! der fehler liegt eindeutig an der 
programmierung des AD- wandlers, aber ich weiß halt nicht woran! hab mir 
das datenblatt durchgelesen und schon diverse seiten und deshalb scuh 
ich hier hilfe!
mfg martin

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> ja des kann man jetzt auslegen wie man will, aber da das prgramm einen
> fehler enthält funktioniert es für mich nicht!

es ist immer hilfreich, nicht zu sagen, was nicht funktioniert, das 
macht das Helfen immer so einfach...

> die hardware stimmt und
> der grundaufbau vom programm auch!

das sagen sie immer...

> der fehler liegt eindeutig an der
> programmierung des AD- wandlers, aber ich weiß halt nicht woran! hab mir
> das datenblatt durchgelesen und schon diverse seiten und deshalb scuh
> ich hier hilfe!

und behälst alle grundlegenden Infos für dich, sehr schlau...

und sowas
ADCSRA = 0xE6;

macht man nicht!

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

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps schrieb:

> und sowas
>
>
> ADCSRA = 0xE6;
> 
>
> macht man nicht!

Genauer gesagt hält es mich (und wahrscheinlich viele andere ebenso) 
davon ab, auch nur einen Gedanken an Hilfe zu verschwenden.
Wenn du es absichtlich möglichst kryptisch schreibst, dann sieh zu wie 
du alleine zurecht kommst.

Das C-Motto "Es war schwer zu schreiben, es soll auch schwer zu lesen 
sein" ist längst allgemein ad acta gelegt worden :-)

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

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt vom Mega16 steht zb
(funktioniert beim Mega8 genau gleich. Das 16er hab ich aber gerade im 
anderen Fenster offen)

> Using the ADC Interrupt Flag as a trigger source makes
> the ADC start a new conversion as soon as the ongoing conversion
> has finished. The ADC then operates in Free Running mode,
> constantly sampling and updating the ADC Data Register. The
> first conversion must be started by writing a logical one to
> the ADSC bit in ADCSRA.

Da ich aber kein Interesse daran habe, dein 0xE6 auseinanderzudröseln, 
kann ich auch nicht sagen, ob du ADSC setzt oder nicht.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und sowas
>
>> ADCSRA = 0xE6;
>

>
> macht man nicht!


wie macht man es dann?

is doch egal ob ich des schreib oder:

ADCSRA = 0b11100110

mfg martin

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja gut macht sinn, so ist es leichter zu verstehen!
;-)
martin

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

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> und sowas
>>
>>> ADCSRA = 0xE6;
>>
>
>>
>> macht man nicht!
>
>
> wie macht man es dann?

So

  ADCSRA = ( 1 << ADEN )  |    // Enable
           ( 1 << ADSC )  |    // Start Conversion
           ( 1 << ADATE ) |    // Auto Trigger Enable
           ( 1 << ADPS2 ) |    // Prescaler 64
           ( 1 << ADPS0 );

und dann hat man auch ein paar Schlüsselwörter, mit denen man im 
Datenblatt suchen kann.

Zb. steht im Dtaenblatt bei ADATE

• Bit 5 – ADATE: ADC Auto Trigger Enable
When this bit is written to one, Auto Triggering of the ADC is enabled. 
The ADC will start a conversion on a positive edge of the selected 
trigger signal.

Wo machst du letzteres, bzw. wie stellst du sicher, dass so ein Trigger 
Signal kommt?

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> und sowas
>>
>>> ADCSRA = 0xE6;
>>
>
>>
>> macht man nicht!
>
>
> wie macht man es dann?
>
> is doch egal ob ich des schreib oder:
>
> ADCSRA = 0b11100110
>
> mfg martin

Die Kollegen wollen darauf hinaus, dass es selbsterklärend ist wenn man

ADCSRA = (1 << Bitname) schreibt.

Michael

Autor: hoschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das ist egal es ist beides Mist.

Schau doch mal ins TUT

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Da sind Beispiele wie man leserlich programmiert und sogar so ziemlich 
"out of the Box" funktionieren.

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

Bewertung
0 lesenswert
nicht lesenswert
Was passiert eigentlich, wenn du
* zuerst den ADC fertig konfigurierst
* und erst dann mittels ADSC die erste Konvertierung startest
  ADCSRA = ( 1 << ADEN )  |    // Enable
           ( 1 << ADATE ) |    // Auto Trigger Enable
           ( 1 << ADPS2 ) |    // Prescaler 64
           ( 1 << ADPS0 );


  ADCSRA |= ( 1 << ADSC )  |    // und los gehts!

Auch vermisse ich die Einstellung der Referenzspannung. Machst du 
nichts, dann hast du: AREF, Internal Vref turned off
Daher die Frage: Wie sieht deine ARef Beschaltung aus?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

>
> Zb. steht im Dtaenblatt bei ADATE
>
> • Bit 5 – ADATE: ADC Auto Trigger Enable


uhm, also in meinem Datenblatt zum Mega8 gibt es kein ADATE...

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm warum nicht den  ADC Complete ISR nutzen ^^

immer wenn der wert fetrig ist kommt ein interrupt
dann kann man auch schnell die LED setzen und fertig

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

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps schrieb:
> Karl heinz Buchegger schrieb:
>
>>
>> Zb. steht im Dtaenblatt bei ADATE
>>
>> • Bit 5 – ADATE: ADC Auto Trigger Enable
>
>
> uhm, also in meinem Datenblatt zum Mega8 gibt es kein ADATE...

Kram, kram, kram

Tatsächlich. Ds heißt beim Mega8 anders als im Mega16
OK. Dann nenn es ADFR

(Funktioniert auch ein wenig anders. Hätte doch wohl das Mega8 DB 
raussuchen sollen)

Ich würd es aber trotzdem mit der Variante:
"Zuerst fertig konfigurieren, dann starten" versuchen.
  ADCSRA = ( 1 << ADEN )  |    // Enable
           ( 1 << ADFR )  |    // Free running
           ( 1 << ADPS2 ) |    // Prescaler 64
           ( 1 << ADPS0 );


  ADCSRA |= ( 1 << ADSC )  |    // und los gehts!

Und die Frage nach der Referenzspannung bleibt natürlich auch noch

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Tatsächlich. Ds heißt beim Mega8 anders als im Mega16
> OK. Dann nenn es ADFR
>
> (Funktioniert auch ein wenig anders. Hätte doch wohl das Mega8 DB
> raussuchen sollen)

wenn es nur ein anderer Name gewesen wäre hätte ich schon nicht 
gemeckert ;c)

> Und die Frage nach der Referenzspannung bleibt natürlich auch noch

aber sein Hardware-Aufbau ist doch garantiert richtig und ein 
Geheimnis...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ja des kann man jetzt auslegen wie man will, aber da das prgramm einen
> fehler enthält funktioniert es für mich nicht!

Was ich damit ausdrücken wollte, war, daß "funktioniert nicht" keine
auch nur annähernd ausreichende Beschreibung des Verhaltens ist.
Was mir auffällt ist, daß nur in einem recht kleinen Bereich von 5% bis 
10% der AREF-Spannung überhaupt irgendwelche Ausgänge high-Pegel 
bekommen. Ob das so gehört, weiß ich nicht, da du es ja partout nicht 
verraten willst. Ohne zu wissen, welche Spannungen du an den Eingang 
anlegst, was an AREF angelegt ist und welche Ausgaben du darauf 
erwartest, glaube ich dir deshalb nicht einfach so, daß da kein Fehler 
sein kann.

> die hardware stimmt und der grundaufbau vom programm auch!

Hmm, und da bist du dir absolut 100%ig sicher?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> die hardware stimmt und der grundaufbau vom programm auch!

>Hmm, und da bist du dir absolut 100%ig sicher?

Ist doch klar: Der ATMega ist kaputt. Was anderes kann es ja gar nicht 
mehr sein, wo doch alles 100% in Ordnung ist, (ausser, daß es nicht 
funktioniert)

Das Programm ist es nämlich auch nicht. Das sollte das tun, was du da 
hingeschrieben hast.

Oliver

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spaetestens, wenn man mit sowas wie den AD-Wandlern spielen will, sollte 
man sich vieleicht erst eine gescheite Ausgabemoeglichkeit beschaffen 
(egal ob seriell oder Display).

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist doch klar: Der ATMega ist kaputt.

Nachtrag: Das wäre nicht der erste Mega, der sich mit VCC an AREF nach 
einer unbeabsichtigt aktivierten internen Spannungsreferenz sehr seltsam 
verhält.

Oliver

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
die AREF liegt bei meiner Hardware an der VCC.
Die VCC beträgt natürlich 5 Volt.
Und ich möchte gerne, dass 8 LED´s eine Spannung zwischen 1 und 2 Volt 
an einem Balken anzeigen! Die LED´s werden über ULN2803 Treiber 
angesteuert!
mfg martin

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

Bewertung
0 lesenswert
nicht lesenswert
OK.
Dann würde ich jetzt erstmal vorschlagen, die ADC Funktion aus dem 
gcc-Tutorial zu nehmen. Die ist getestet und funktioniert.
Von der den Wert auslesen lassen und den Wert ohne Modifikation direkt 
an den Port zuweisen. Wenn du dann an der Messpannung drehst (Poti?) 
muss sich das LED-Bild verändern. Wenn es das nicht tut hast du ein 
Hardwareproblem (oder den ADC bereits geschrotter, ohne Not hängt man 
den ARef nicht an Vcc)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die VCC beträgt natürlich 5 Volt.

So natürlich ist das nicht.

> Und ich möchte gerne, dass 8 LED´s eine Spannung zwischen 1 und 2 Volt
> an einem Balken anzeigen!

Dein Balken wird sich nicht verändern, solange deine Spannung über 0,5V 
liegt. Vielleicht ist dir entgangen, daß der ADC 10 Bit Auflösung hat.
Deine Werte würden stimmen, wenn er 8 Bit hätte.

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.