mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC per Interrupt


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
void InitAdc0(void) {
  ADC0->ECR = ADC;       // enable clock for adc
  ADC0->CR  = SWRST;      // software reset
  ADC0->MR  = STARTUPTIME(0x78); // Startuptime to get 4µs (=120 period at 30Mhz cpu_clk)
  //ADC0->MR  = PRLVAL(0x30); 
  ADC0->MR  |= (0x03 << 2);   // set PRVAL to 01100(00) = 48 -> ADC_CLK = 625KHz
  ADC0->CR  = ADCEN;       // enable ADC 
  ADC0->MR = CONTCV;       // Continuous Conversion
  ADC0->CMR = CV1IN0;      // Channel 1 - Inputline 0
}

und so lese ich die Daten:
unsigned int GetAdc0Data(void) {
  unsigned int result;
  // wait for end of convertion
  while(!(ADC0->SR = READY ));
  UARTString("\n\r ADC0 ready... ");
  while(!(ADC0->SR = EOC ));  // wait for End of conversation
  result = ADC0->DR; //read Data Register
  UARTString("reading ADC0");
  return result;
}

Immer kommt als Ergebniss Null heraus, wie kann das sein?

Bitte helft mir
Gruß Chris

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.