Forum: Mikrocontroller und Digitale Elektronik Atmega 8 ADC


von Ron S. (bast-lwastl)


Angehängte Dateien:

Lesenswert?

Hallo Forenteam,

ich versuche mich am ADC eines Atmega 8. Ich möchte beim erreichen eines 
digatelen Spannungswertes den Ausgang PORTB 0 auf 1 setzen.

Ich hab versucht mein Prog möglichst nah am Tutorial zu halten, da ich 
noch ein blutiger Anfänger bin. Ich habe versucht es auf den Atmega 8 
anzupassen.

vielleicht könnt ihr mir sagen wo ich müll geschrieben hab.

von H.Joachim S. (crazyhorse)


Lesenswert?

Das hab ich auch nie gesehen - einen Quelltext als jpeg...

von Der Weise (Gast)


Lesenswert?

Jetzt noch bitte in ein Excel-Dokument einfügen, einen Screenshot 
machen, und den in ein Word-Dokument einfügen, und dieses hochladen.
Pro Tip: Das ganze in ein Zip-File.

von Karl H. (kbuchegg)


Lesenswert?

Für das bischen Code braucht es noch nicht einmal ein Zip-File. Einfach 
das C-File als Attachment einfügen (das macht man bei "Dateianhang") und 
hochladen.

von Dussel (Gast)


Lesenswert?

Du bist Dipl. Ing.?

Da ich die ganzen Einstellungen nicht im Kopf habe und es spät ist, kann 
ich deinen Fehler so auf die Schnelle nicht finden, aber könntest du das 
nicht eventuell mit dem Analog Komparator lösen? Der ist einfacher zu 
bedienen und schneller.

von Karl H. (kbuchegg)


Lesenswert?

Ron S. schrieb:
> Hallo Forenteam,
>
> ich versuche mich am ADC eines Atmega 8. Ich möchte beim erreichen eines
> digatelen Spannungswertes den Ausgang PORTB 0 auf 1 setzen.
>
> Ich hab versucht mein Prog möglichst nah am Tutorial zu halten, da ich
> noch ein blutiger Anfänger bin.

Dann frag ich mich, wozu die die überhaupt abgeändert hast? Bis auf die 
Einstellung der Referenzspannung brauchst du erst mal nichts verändern. 
Dann würdest du auch nicht die dummen Fehler machen, die du gemacht 
hast.


PS: 0250
Ich denke nicht, dass du weißt, was du da geschrieben hast. Tip: Das ist 
keine Dezimalzahl. Eine Zahl, die mit 0 beginnt ist in C eine Oktalzahl.

von Ron S. (bast-lwastl)


Lesenswert?

Da manche mit einem Bild nicht klar kommen versuch ich es noch einmal 
so.
Die obere Liste mit Namen usw. lädt Das Prog "Sissy" selber rein. Ich 
bin kein Dipl. ing
#define F_CPU 3686400
#include <avr\io.h>
#include <inttypes.h>
#include <stdint.h>

void ADC_Init(void) {

  uint16_t result;

    ADMUX &= ~( (1<<REFS1) | (1<<REFS0) );  // Referenzsp. auf 5V
    ADCSRA = (1<<ADPS2) | (1<<ADPS0);      // Teiler auf 32
    ADCSRA = (1<<ADEN);              // ADC aktivieren
    ADCSRA = (1<<ADSC);              // eine Wandlung
  while (ADCSRA & (1<<ADSC) ) {
  }
    result = ADCW;
}

uint16_t ADC_Read( uint8_t Channel ){

       ADMUX = (ADMUX & ~(0x1F)) | (Channel & 0x0F);
       ADCSRA |= (1<<ADSC) ;
  while (ADCSRA & (1<<ADSC) ) {
 }
  return  ADCW;

}

int main (void)
{
   uint16_t adcval;
   ADC_Init();
   DDRB = 1;


   while (true) // Mainloop
 {

  adcval = ADC_Read(0);
  if (adcval > 0250) {
      PORTB =0x01;
      }

 }
return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

Ron S. schrieb:
> Da manche mit einem Bild nicht klar kommen versuch ich es noch einmal
> so.

Es geht nicht um klarkommen. Es geht darum, dass, wenn du Text postest 
(egal ob als eigenes File oder direkt im Beitrag), die Helfer mittels 
Cut&Paste Textstellen ausschneiden und für ihre Antwort benutzen können.
Du bist der der Hilfe braucht, also mach du es uns einfach dir zu 
helfen. Wenn ich dein Programm erst abtippen muss um daraus meine 
Antwort zu basteln, lass ich es lieber.

> Ich bin kein Dipl. ing
Auch als Nicht-Dipl.-Ing hat man kein Nachdenkverbot.

>     ADMUX &= ~( (1<<REFS1) | (1<<REFS0) );  // Referenzsp. auf 5V
>     ADCSRA = (1<<ADPS2) | (1<<ADPS0);      // Teiler auf 32
>     ADCSRA = (1<<ADEN);              // ADC aktivieren
>     ADCSRA = (1<<ADSC);              // eine Wandlung

Ganz schnell: Welchen Wert hat

   i = 5;
   i = 8;

nach all den Zuweisungen?
Und jetzt überleg mal, was diese Erkentniss für Auswirkungen auf ADCSRA 
in deinem Codestück hat.

von Ron S. (bast-lwastl)


Lesenswert?

Dann kann man das so auch so wie du einfach sagen und sich nicht lustig 
machen. Aber egal
Ich bin das stück für stück durch gegangen und hab es versucht zu 
verstehen.
Aber das mit der Null vor der 250 ist ja schon ein Anfang. Ich hab rum 
probiert auf was ich vergleichen kann.
Also sollte ich die Bits in ADCSRA besser in einer Zeile setzen?

von Karl H. (kbuchegg)


Lesenswert?

Ron S. schrieb:
> Dann kann man das so auch so wie du einfach sagen und sich nicht lustig
> machen. Aber egal

Aber so merkst du dirs. Beim nächsten Mal machst du es besser und alle 
sind zufrieden. (und sei mal ehrlich: auf so eine Idee, Programtext als 
Bild einzustellen, muss man erst mal kommen)

> Also sollte ich die Bits in ADCSRA besser in einer Zeile setzen?

Wäre eine Möglichkeit. Du kannst aber auch sukzessive eine 
Bitkombination nach der anderen in ADCSRA setzen.

Hier
1
uint16_t ADC_Read( uint8_t Channel ){
2
3
       ADMUX = (ADMUX & ~(0x1F)) | (Channel & 0x0F);
4
       ADCSRA |= (1<<ADSC) ;

hats du das ja auch hingekriegt, das einzelne Bit namens ADSC im 
Register ADCSRA zu setzen.

von Karl H. (kbuchegg)


Lesenswert?

> >     ADMUX &= ~( (1<<REFS1) | (1<<REFS0) );  // Referenzsp. auf 5V

Wie hast du auf einem Board den ARef Pin verschaltet?

von M. K. (sylaina)


Lesenswert?

Karl Heinz Buchegger schrieb:
> und sei mal ehrlich: auf so eine Idee, Programtext als
> Bild einzustellen, muss man erst mal kommen

So spontan fiele mir hierzu der Begriff "Screenshot" ein ;)

Karl Heinz Buchegger schrieb:
> Wie hast du auf einem Board den ARef Pin verschaltet?

Die gesamte Schaltung wäre sicherlich interessant aber ich denke doch 
erst wenn das Programm in Ordnung ist ;) :D

von Ben _. (burning_silicon)


Lesenswert?

> Die gesamte Schaltung wäre sicherlich interessant aber ich denke doch
> erst wenn das Programm in Ordnung ist ;) :D
Vor allem wenn ARef wie gerne mal gemacht auf AVcc geklemmt und dann 
eine interne Referenz benutzt wird... ;)

von Ron S. (bast-lwastl)


Lesenswert?

Als das ist ein Board von myAvr. Die haben den AREF auf die 5V, mit 
denen das Board arbeitet, gelegt und über Spule und kondensator in Reihe 
auf GND.

von Ron S. (bast-lwastl)


Lesenswert?

>Und jetzt überleg mal, was diese Erkentniss für Auswirkungen auf ADCSRA
>in deinem Codestück hat.

Alles Klar. Das war das ganze Prob. Zumindest funzt es jetzt wie ich es 
haben will.

PS: Zum Glück gibt es hier auch Leute die helfen und nicht nur dumme 
Antworten schreiben.

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.