Forum: Mikrocontroller und Digitale Elektronik [AT91SAM7A2] Problem mit ADC und lesen vom DR


von Chris (Gast)


Lesenswert?

Hallo,
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?

EDIT: ich habe jetzt mal
1
result = ADC0->DR; //read Data Register
 in
1
result = DATA; //read Data Register
 umgeschrieben. Jetzt bekomme ich immer 1023 anstelle von 0. Auch nicht 
viel besser meiner Meinung nach. Ich weiss einfach nicht wie ich richtig 
auslesen, bzw. ob ich überhaupt das richtige register auslese :(


Bitte helft mir
Gruß Chris

von Chris (Gast)


Lesenswert?

okay... ein paar fehler sind beseitig... c is noch nicht so ganz 
meins...
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 -> CORECLK/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
}
1
unsigned int GetAdc0Data(void) {
2
  unsigned int result;
3
  // wait for end of convertion
4
  while(!(ADC0->SR & EOC ));  // wait for End of conversation
5
  UARTString("\n\r ADC0 ready... ");
6
  result = (ADC0->DR & DATA); //read Data
7
  UARTString("reading ADC0");
8
  return result;
9
}

leider passt es aber immernoch nicht. Er gibt mir immer 1023 aus :(

von Chris (Gast)


Lesenswert?

schön... ich weiss sowas könnte man wissen, aber wieso schreibt man 
sowas nicht einfach auch in die Dokumentation rein?

Der Pin VREFP0 muss zum Beispiel mit den 3,3V vom Nachbarpin verbunden 
sein!

Arg... fast 2 Wochen arbeit und rumprobieren die man sich hätte sparen 
können, und Olimex is auch nen *****verein. Die wollen einem glaube ich 
gar nicht helfen...

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
Noch kein Account? Hier anmelden.