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?
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
@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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.