www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM LPC21xx ADC -> Interrupt


Autor: Ruprecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe das Problem, dass mein AD0 beim LPC2138 kein Interrupt auslöst. 
Habe ich irgendetwas vergessen? Die AD-Wandlung
funktioniert soweit. Wenn ich den IRQ weglasse läufts.
// AD-CONVERSION
VICVectCntl14 = 0x20 | 0x12;    // VICVectCnt# -> Slot14 (priority) 
                                // 0x20 -> this vectored IRQ slot is enabled 
                                // 0x12 -> bits 0..4 from the VICVectCntrl# define the IRQ you wish to turn on  from 0 to 31 -> AD0 
VICVectAddr14 = (unsigned long)isr_ad0;    // AD0 Interrupt -> Vector 14
VICIntEnable  = (1 << 18);                 // enables AD0 INT

AD0CR |= 0x00270600 | (1 << 0); 
                   // Bit 21 -> The A/D converter is operational.
                               // Bit 19,18,17 -> 011 = 8 clocks / 7 bits 
             // Bit 16   -> Burst Mode (!No Start Bit)
             // Bit 9,10 -> Clock Divider
             // Bit 0    -> Select AD0.0  

__irq void isr_ad0(void)
{
  static unsigned int tempadvalue=0;
  int i=0;

  for (i=0; i<MEASURMENTS_PER_VALUE; i++)
  { 
    tempadvalue = AD0DR0;                         // Read A/D Data Register           
    tempadvalue = (tempadvalue >> 6) & 0x03FF;        // Extract AIN0 Value 
    measured_values_float[VOLTAGE_1] += tempadvalue;
  }
}
Grüße

 Ruprecht

Autor: Ruprecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes habe ich wohl noch vergessen:
AD0INTEN = (1 << 0);  // ADC channel 0 will generate an interrupt
...geht aber trotzdem nicht :-(

Das Beispiel aus dem lpc-arm-book_srn.pdf bringt bei mir nur noch mehr 
Verwirrung.
int main(void) 
{ 
 VPBDIV = 0x00000002;  //Set the Pclk to 30 MHz 
 IODIR1 = 0x00FF0000;      // P1.16..23 defined as Outputs   
 ADCR   = 0x00270607;      // Setup A/D: 10-bit AIN0 @ 3MHz  
 
 VICVectCntl0 = 0x00000032;    // connect A/D to slot 0 
 VICVectAddr0 = (unsigned)AD_ISR;   // pass the address of the IRQ into the VIC  
            // slot 
 VICIntEnable = 0x00040000;  // enable interrupt 
 
 while(1) 
 { 
  ;     
 } 
} 
  
void AD_ISR (void) 
{ 
 unsigned val,chan; 
 static unsigned result[4]; 
 
 val = ADCR; 
 val = ((val >> 6) & 0x03FF);   // Extract the A/D result  
 chan = ((ADCR >>0x18) & 0x07); 
 result[chan] = val; 
} 

Was soll das " val = ADCR; " bewirken? Und wo ist AD0INTEN?

Autor: elbarto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was in deiner isr auf jeden fall fehlt, ist das acknowledge und reset, 
also

T0IR        = 1;                             
VICVectAddr = 0;


am ende deiner isr, sonst geht gar nix, oder besser es geht alles nur 
einmal...

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.