Hallo, kann mir (neuer AVR User) helfen, ich möchte eine ad wandlung durchführen. das ist mein quellcode: //AD-Wandler #include <avr/io.h> #include <avr/interrupt.h> void initT0() { TCNT0 = 0xfd; // TimerReg. laden TIFR |= 0x01; // Overflag clr TCCR0 |= 0x03; // Teiler 64 eingestellt TIMSK |=0x01; // Overflow Interrupt aktiviert sei(); // Globaler Interrupt aktiviert } SIGNAL(SIG_OVERFLOW0) { initT0(); } void initPORT() { DDRB = 0xff; //PortB ist Ausgabe DDRC = 0xff; //PortC ist Ausgabe } void initADWandler() { ADCSRA |= 0x80; //ADEN = 1 --> Wandler einschalten ADCSRA |= 0x05; //ADPS2...ADPS0 0b101 --> Frequenzteiler auf 32 einstellen ADCSRA &= 0xdf; //ADFR = 0 --> Betriebsart --> Einzelbetrieb ADMUX |= 0xc0; //REF1/REF0 0b11 --> Ref.Spg. --> Interne Ref.Spg.=2,56V ADMUX |= 0x01; //MUX4..MUX0 0b0001 --> Kanal-Wandlung --> Kanal1 ADMUX &= 0xdf; //ADLAR = 0 --> Aussehen des Ergebnisses --> rechtsbündig ADCSRA |= 0xbf; //ADSC = 1 --> Wandlung findet statt (AD-Wandler AUS) } int main() { initPORT(); initADWandler(); ADCL = 0x01; while(1) { ADCSRA |= 0x40; //ADSC = 1 -> Wandlung wir gestartet while(ADCSRA & 0x40) //Wartet bis Wandlung fertig ist {} PORTB = ADCL; //ADCW --> Wandlungs-Ergebnis } } für kleine tips wäre ich sehr dankbar.
1 | SIGNAL(SIG_OVERFLOW0) |
2 | {
|
3 | initT0(); |
4 | }
|
Völliger Quatsch! (wird zum Glück auch nie ausgeführt. Aber vielleicht liegt es daran...)
1 | ADCSRA |= 0xbf; //ADSC = 1 --> Wandlung findet statt |
2 | (AD-Wandler AUS) |
Verwende bitte Makronamen. Und vermutlich hast du in der Zeile das | mit dem & verwechselt. Lektüre für dich: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial genauer: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29
Man muss jeweils beide ADC register lesen, also ADCH & ADCL, in bestimmter Reihenfolge. Und ADCSRA wurde nirgendwo initialisiert. Gleich mit ADCSRA |= 0x80; loszulegen ist unguenstig. rene
> Man muss jeweils beide ADC register lesen, also ADCH & ADCL, in > bestimmter Reihenfolge. Nicht ganz. Man muß ADCH lesen. Wenn man ADCL auch lesen will, muß man das davor tun. Übrigens, was soll ein
1 | ADCL = 0x01; |
bewirken? ADCL ist nicht beschreibbar.
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.