AT91SAM7 ADC mit Interrupt

Gast #796319
Lesenswert?
• ▲
▼
Hallo,

ich bin gerade dabei, das ADC Modul mit Multichannel, Softwaretriggerung 
und Interrupt zu programmieren.
Nachfolgend mal der Quellcode:
1
unsigned int adc_Init(void)
2
{
3
  // reset
4
  AT91F_ADC_SoftReset(AT91C_BASE_ADC);
5

6
  // enable peripheral clock ADC
7
  AT91F_ADC_CfgPMC();
8

9
  // config timing of ADC 55Mhz mainclock, ADC clock 5MHz
10
  AT91F_ADC_CfgTimings(AT91C_BASE_ADC, 
11
                       55     /*MHz   MCK*/, 
12
                       5      /*MHz   ADCCK*/,
13
           20     /*uSec  startup time*/, 
14
                       700    /*nSec  sample and hold*/);
15

16
  // enable channels to measure
17
  // channel 0
18
  // channel 1
19
  // channel 2
20
  // channel 3
21
  AT91F_ADC_EnableChannel(AT91C_BASE_ADC,
22
                          (AT91C_ADC_CH0 | AT91C_ADC_CH1 | AT91C_ADC_CH2 | AT91C_ADC_CH3));
23
        
24
  
25
  // enable interrupt of the last ADC channel 3
26
  AT91F_ADC_EnableIt(AT91C_BASE_ADC, (AT91C_ADC_CH3));
27
  
28
  // configure AIC
29
  AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, 
30
                        AT91C_ID_ADC,
31
                        AT91C_AIC_PRIOR_HIGHEST,
32
      AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 
33
                        adc_ISR);
34
  
35
  // enable AIC
36
  AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_ADC);
37

38
  return 0;
39
}
40

41
static void adc_ISR(void)
42
{
43
  unsigned int uiStatus   = 0;
44
  
45

46
  // read status register
47
  uiStatus = AT91C_BASE_ADC->ADC_SR;
48
  uiStatus = uiStatus;
49

50
  if(uiStatus & AT91C_ADC_CH3)
51
  {
52
    // read ADC value
53
    ui_ValueCH0 = AT91F_ADC_GetConvertedDataCH0(AT91C_BASE_ADC);
54
    ui_ValueCH1 = AT91F_ADC_GetConvertedDataCH1(AT91C_BASE_ADC);
55
    ui_ValueCH2 = AT91F_ADC_GetConvertedDataCH2(AT91C_BASE_ADC);
56
    ui_ValueCH3 = AT91F_ADC_GetConvertedDataCH3(AT91C_BASE_ADC);
57
    
58
    // set valid
59
    adc_bool_Conversation_Valid = TRUE;
60

61
  }
62
 
63
  // clear interrupt
64
  AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_ADC);
65
}
66

67
unsigned int adc_StartConversation(void)
68
{
69
  adc_bool_Conversation_Valid = FALSE;
70
  AT91F_ADC_StartConversion(AT91C_BASE_ADC);
71
  return 0;
72
}

Der Anstoss für die ADC erfolgt asynchron durch einen Softwaretrigger.
Mein Problem ist jetzt, dass die ADC genau einmal sauber funktioniert. 
Bei allen weiteren 
Softwaretriggers(AT91F_ADC_StartConversion(AT91C_BASE_ADC)) wird die ISR 
nicht mehr ausgeführt.

Hat jemand eine Idee woran das liegen kann?

Danke Nobbie
Gast #1612334
Lesenswert?
• ▲
▼
Ich weiß dass ich zu spät dran bin, aber was solls :-)

Damit schaltest du den Interrrupt wieder aus:
1
AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_ADC);

Du musst ihn wieder einschalten
1
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_ADC);

oder den Interrrupt eingeschaltet lassen ...

Bitte,

Carsten

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.