Hallo Leute, ich bin ein blutiger Anfänger und habe mir eine Schaltung mit ATtiny24A aufgebaut mit internen Oscilator. Am PIN10(ADC3) liegt eine Spannung von ca 3V an und diese möchte ich mit ADC auslesen und paar Ausgänge schalten. Mein Problem ist das Programm will irgendwie nicht. Kann mir jemand sagen was ich falsch mache? Ich kriege es einfach nicht raus, warum immer der ADC Wert nicht grösser Null ist!!! <code> int BattVoltage; int main(void) { IO_init(); DDRA &= ~(1<<PA3); while(1) { ADMUX = 0x03; // Kanal 3 wählen und VCC als Referenzspannung ADCSRA |= (1<<ADPS2) | (1<<ADPS1); // Frequenzvorteiler 64 ADCSRA |= (1<<ADEN); // ADC aktivieren ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ); // Einmal durchlaufen lassen _delay_ms(1); ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC)); // Abschluss der Konvertierung warten _delay_ms(1); BattVoltage= ADCW; if (BattVoltage > 0){ LS1_ON; LS2_ON; } LS1_OFF; LS2_OFF; } } </code>
ADC-Initialisierung im Main-Loop? würde ich raus nehmen (also nur einmal machen) Was sagt der Debugger/Simulator im AVR-Studio? Der Code sieht eigentlich gut aus... Ansonsten kannst du ja noch einen Blick hier hinein werfen... http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
der Initialisierungscode ist eigentlich auch ausserhalb der Main-Loop, ich wollte es eigentlich nur für die Problem suche kompakt haben. Der Simmulator läuft immer bei der Schleife while (ADCSRA & (1<<ADSC)); durch zum nächsten Breakpoint und zeigt aber am Ende den Wert Null an! Das ist denke ich normal oder? Und die Bits sind auch alle richtig gesetzt! Ich benutze AVR Studio 6!
Hi >Der Simmulator läuft immer bei der Schleife while (ADCSRA & (1<<ADSC)); >durch zum nächsten Breakpoint und zeigt aber am Ende den Wert Null an! >Das ist denke ich normal oder? Und die Bits sind auch alle richtig >gesetzt! Dann setze mal den Wert von BattVoltage manuell auf einen Wert>0. Mir kommt diese Passage > if (BattVoltage > 0){ > LS1_ON; > LS2_ON; > } > LS1_OFF; > LS2_OFF; spanisch vor. Könnte allerdings auch von meinen rudimentären C-Kenntnissen kommen. MfG Spess
Anfänger schrieb: > if (BattVoltage > 0){ > LS1_ON; > LS2_ON; > } > LS1_OFF; > LS2_OFF; Ich weiß nicht wie du LS1-ON auswertest, aber du stellst es sofort wieder auf OFF. Sehen kannst du da sicher nichts.
Hi, hast du mal versucht, einen anderen Input zu nehmen? z.b. die interne Referenz d.h. ADMX=0b00100001 Kommt da dann auch 0 raus? Außerdem solltest du die erste Wandlung nach ADEN=1 wegwerfen, da kommt schrott raus. Betrifft das aber nur die allererste Wandlung, folgende Wandlungen sollten dann passen.
Oh man, danke jungs das Problem war einfach diese Stelle!!! > if (BattVoltage > 0){ > LS1_ON; > LS2_ON; > } > LS1_OFF; > LS2_OFF; so ist richtig: > if (BattVoltage > 0){ > LS1_ON; > LS2_ON; > } > else{ > LS1_OFF; > LS2_OFF; > }
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.