AT91SAM7X256 AD Wandlung liefert zuerst 0x00

Gast #2422533
Lesenswert?
• ▲
▼
Hallo,
ich schreibe gerade einen ADC-Treiber für den AT91SAM7X256. Woran kann 
es liegen, dass die ersten Wandlungen 0x00 sind und danach erst die 
richtigen Werte kommen?

In meinem Fall werden die Daten per DMA gespeichert. Beim Debuggen sind 
die ersten 3 Samples von Channel1 und Channel3 null und die Samples 4 
und 5 sind in Ordnung. Rufe ich die Funktion ein zweites Mal auf haben 
alle 5 Samples der beiden Channel den richtigen Wert.

Als ich das ganze ohne DMA und auf ein Minimum reduziert getestet habe 
ging es immer noch nicht. Beim schrittweise Debuggen ist komischerweise 
nur der Erste Sample.

///////////////////////////////////////////////////////
INIT:

  a_pPMC->PMC_PCER = (1 << AT91C_ID_ADC);

  //Software Reset
  a_pADC->ADC_CR = AT91C_ADC_SWRST;

  // Set maximum startup time and hold time
  a_pADC->ADC_MR = (
    (AT91C_ADC_TRGEN & AT91C_ADC_TRGEN_DIS) |      // Hardware triggers 
are disabled. Starting a conversion is only possible by software.
    (AT91C_ADC_TRGSEL & AT91C_ADC_TRGSEL_TIOA0 ) |  // TIOA Ouput of the 
Timer Counter Channel 0
    (AT91C_ADC_LOWRES & AT91C_ADC_LOWRES_10_BIT) |  // (ADC) 10-bit 
resolution
    (AT91C_ADC_SLEEP & AT91C_ADC_SLEEP_NORMAL_MODE) |  // (ADC) Normal 
Mode
    (AT91C_ADC_PRESCAL & 0x0F) |            // (ADC) Prescaler rate 
selection [PRESCAL = (MCK / (ADCClock * 2)) - 1]
    (AT91C_ADC_STARTUP & 0x1F) |            // (ADC) Startup Time 
[STARTUP = (Startup Time * ADCClock / 8) - 1]
    (AT91C_ADC_SHTIM & 0x0F));            // (ADC) Sample & Hold Time 
[SHTIM = Sample & Hold Time * ADCClock]



/////////////////////////////////////////////////////////////
do_conversion:

  a_pADC->ADC_RPR = (int)(adcp->ad_samples); //adcp->ad_samples ist 
natürlich ein Pointer auf mein Puffer

  a_pADC->ADC_RCR = 10;
  a_pADC->ADC_PTCR = AT91C_PDC_RXTEN;

  //Start conversion
  a_pADC->ADC_CR =  AT91C_ADC_START;

  while(!(a_pADC->ADC_SR & AT91C_ADC_ENDRX))
    // Start conversion
    a_pADC->ADC_CR = AT91C_ADC_START; //<-- hier setzte ich mein 
Breakpoint für das schrittweise debuggen




Gruß
Florian

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.