eine Frage an die Wahrsager: bei einem mega8 möchte ich mir das Ergebnis der AD-Wandlung per Interrupt geben lassen, in den Interrupt kommt er auch rein denn wenn ich die 2. Zeile mit 766 nicht auskommentiere krieg ich den Wert 766, wenn ich ADC lese immer den Wert 0 Hardware stimmt denn wenn ich nicht Interruptgesteuert sondern "zu Fuß" abfrage passen die Spannungswerte Initialsierung: ADCSR = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); Interruptroutine ISR (ADC_vect) { result = ADC; // hier wird result immer 0! // result = 766; } und so starte ich eine Conversion // ADC fuer angegebenen Kanal starten void StartADC(char channel) { ADMUX = channel; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung #ifdef ohneIRQ ADCSR |= (1<<ADSC); // eine ADC-Wandlung #else ADCSR |= (1<<ADSC) | _BV(ADIE); // eine ADC-Wandlung #endif } und hier die zu Fuß Variante die funktioniert uint16_t getADC(void) { #ifdef ohneIRQ while(!(ADCSR & (1<<ADIF))) // auf Abschluss der Konvertierung warten (ADIF-bit) ; result = ADC; #endif return result; } result ist übrigens volatile und die Zugriffe darauf erfolgen in Interrupts, d.h. es kann nicht durch einen IRQ zerfleddert werden (könnte auch nicht damit zu tun haben dass ich immer 0 kriege und mit 766 funktionierts auch alles) Habe ich was übersehen oder gibt es Tipps?
wenn keiner schreibt schreibe ich mir halt selber ;-) ich habe noch nach dem Fehler gesucht und dabei wohl was umgestellt, und jetzt: es geht, bitte nicht fragen wieso!
Hallo Bernd und alle anderen her im Forum. Ich habe hier einen AT91SAM7A2 liegen und verzweifle gerade mal wieder, diesmal am ADC. Es kommt bei mir immer 0 raus, fragt mich nicht wieso. So initialisiere ich den ADC:
1 | void InitAdc0(void) { |
2 | ADC0->ECR = ADC; // enable clock for adc |
3 | ADC0->CR = SWRST; // software reset |
4 | ADC0->MR = STARTUPTIME(0x78); // Startuptime to get 4µs (=120 period at 30Mhz cpu_clk) |
5 | //ADC0->MR = PRLVAL(0x30);
|
6 | ADC0->MR |= (0x03 << 2); // set PRVAL to 01100(00) = 48 -> ADC_CLK = 625KHz |
7 | ADC0->CR = ADCEN; // enable ADC |
8 | ADC0->MR = CONTCV; // Continuous Conversion |
9 | ADC0->CMR = CV1IN0; // Channel 1 - Inputline 0 |
10 | }
|
und so lese ich die Daten:
1 | unsigned int GetAdc0Data(void) { |
2 | unsigned int result; |
3 | // wait for end of convertion
|
4 | while(!(ADC0->SR = READY )); |
5 | UARTString("\n\r ADC0 ready... "); |
6 | while(!(ADC0->SR = EOC )); // wait for End of conversation |
7 | result = ADC0->DR; //read Data Register |
8 | UARTString("reading ADC0"); |
9 | return result; |
10 | }
|
Immer kommt als Ergebniss Null heraus, wie kann das sein? Bitte helft mir Gruß Chris
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.