Forum: Compiler & IDEs GCC Problem mit ADC-Wanlder


von Kai H. (Gast)


Lesenswert?

Hallo,

ich habe Probleme mit meinem GCC Programm. Ich will einfach mit einem 
Poti den Analog-Digital-Converter PC0 meines Atmega8 ausprobieren. Dazu 
habe ich folgende Beschaltung verwendet:

http://www.mikrocontroller.net/wikifiles/9/9e/Adc_connection.png

Mein Programm ist folgendes:

#include <avr/io.h>

int main(void)
{
  int sample,i,value;
  DDRB=0xFF;   // PORTB als Ausgabeport
  DDRC=0x3E;
  DDRD=0xFF;
  ADMUX=0x00;  // ADC Ref auf Avcc, PC0 gewählt, normale Formatierung
  ADCSRA=0x85; // ADC eingeschaltet, Prescale 32
  while(1)
  {
    sample=0;
    for(i=0;i<100;i++)
    {
      ADCSRA=0x40;  //single conversion mode ein
      while(ADCSRA & (1<<ADSC));  //warten bis konvertierung 
abgeschlosen
      sample+=ADCW;  //aufsummierung der samplewerte
    }
    value=sample/32;  //aritmethisches mittel der samplewerte
    if (value<300)
      PORTB=0x01;  //schaltet rote LED ein
    else if (value>=300 && value<600)
      PORTB=0x02;  //schaltet gelbe LED ein
    else
      PORTB=0x04;  //schaltet grüne LED ein
    PORTD=0xFF;
  }
}

Die LEDs sollen dann je nachdem wie das Poti einstellt wird leuchten. 
Leider leuchtet nur die erste (<300); egal wie ich das Poti justiere.

Wer findet meinen Fehler?

von Klaus T. (gauchi)


Lesenswert?

und wo ist jetzt das poti angeschlossen? (auf dem bild ist keins)

wenn du nur 1 1/2 bit auflösung brauchst: warum der aufwand mit dem 
mitteln? normalerweise rauscht da eigentlich nur das niedrigste bit.

wenn du übrigens 100 Werte zwischen 0 und 1023 aufaddierst, könnte es 
passieren, dass dir ein normaler int überläuft.
es ergibt sich auch kein arithmetisches mittel, denn 100  != 32

von Vlad T. (vlad_tepesch)


Lesenswert?

@TO
wie wär es, wenn du die Makrodefinitionen der Bits benutzt?
ich für meinen Teil habe keinen Bock das Handbuch rauszukramen nur um 
deine Registerwerte in Bitnamen zu übersetzen.

Ansosnten ist das nix gcc-spezifisches, und auch kein GCC-, sondern ein 
AVR-Programm. somit gehört es in die µC-Ecke.
für Code gibt es außerdem c-Tags

An der falschen Division kann es nicht liegen, da wäre der Wert eher zu 
hoch, als zu niedrig.
Warscheinlich würde auch bei Überläufen (die ohne Frage auftreten 
können) hin und wieder mal die eine andere LED leuchten.


Ich geh ganz stark davon aus, dass der ADC nie gestartet wird.
Der Kommentar lässt vermuten, dass nur der Modus eingestellt, aber der 
ADC nicht gestartet wird. Da dort aber nur eine Hex-Kosntante steht und 
ich keinen Bock habe, dass Datenblatt zu laden und zu durchsuchen, kann 
ich nur raten.


edit:
Wenn der falsche Pin angeschlossen wäre und der echte Messpin floated 
würde sich im Mittel wohl auch ca 512 rauskommen und somit 1600, ergo 
grün rauskommen

von Kai H. (Gast)


Lesenswert?

wurst

von Karl H. (kbuchegg)


Lesenswert?

Kai H. schrieb:
> wurst


Nein, nicht wurst

>  ADMUX=0x00;  // ADC Ref auf Avcc, PC0 gewählt, normale Formatierung

Der Kommentar stimmt nicht. Du hast externe Referenzspannung 
eingestellt. Aber extern hast du keine Spannung an AREF angelegt.

Schau doch mal in s AVR-GCC-Tutorial.
Da gibt es erstens ein Kapitel über den ADC und zweitens sieht man dort 
auch, wie man das so schreiben kann, dass man auch zumindest ein wenig 
erkennen kann, wie du den ADC konfiguriert hast.

Das ist eben nicht "wurst". Es macht den Unterschied zwischen einem 
nachvollziehbar funktionierendem Programm und deinem Programm aus, das 
eben nicht funktioniert. Vlad erzählt dir doch nicht grundlos, warum du 
deinen Stil überarbeiten sollst.

von Richard T. (richard_t)


Lesenswert?

ADCSRA=0x40;
damit schaltest du den ADC  wieder aus
richtig ist
ADCSRA|=0x40;
mfg Richi

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.