Atmega 8 ADC

OP #2539112
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.
Angehängte Dateien:
Gast #2539137
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.
#2539138
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.
OP #2539141
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;
}
#2539148
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.
OP #2539163
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?
#2539166
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.
#2539239
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren