Forum: Mikrocontroller und Digitale Elektronik dsPIC33C ADC Channel Interrupt Aufruf Synthax Problem


von Don (donluc)


Lesenswert?

Hallo mikrocontroller Community,

ich bin momentan ein wenig am Verzweifeln. Als Neuling im Bereich 
Mikrocontroller stehe ich aktuell vor einigen Herausforderungen, 
insbesondere bei der Syntax von Interrupts. Ich arbeite derzeit mit dem 
Digital Power Starter Kit, auf dem ein dsPIC33CK256MP505 verbaut ist.

Der Mikrocontroller bietet die Möglichkeit, bei jeder Konvertierung 
eines Kanals einen Interrupt aufzurufen. Leider bekomme ich vom Compiler 
Fehlermeldungen, die darauf hinweisen, dass ich etwas falsch mache.

Könnte mir jemand bitte weiterhelfen und erklären, wie ich dem Interrupt 
korrekt die ISR zuweise?

Vielen Dank im Voraus!


Zuerst die Funktion für die Interrupt Aufrufe aus der Header Datei des 
adc1.h:
1
/**
2
 * @ingroup    adcdriver
3
 * @brief      This function can be used to override default callback \ref ADC1_ChannelCallback
4
 *             and to define custom callback for ADC1 Channel event. 
5
 *             Read the conversion result of the corresponding channel in the custom callback.
6
 * @param[in]  callback - Address of the callback function.  
7
 * @return     none  
8
 */
9
void ADC1_ChannelCallbackRegister(void(*callback)(enum ADC_CHANNEL channel, uint16_t adcVal));
10
11
/**
12
 * @ingroup    adcdriver
13
 * @brief      This is the default callback function for all the analog channels. 
14
 *             This callback is triggered once the channel conversion is done for a
15
 *             channel and to read the conversion result of the corresponding channel
16
 * @param[in]  channel - conversion completed channel
17
 * @param[in]  adcVal - conversion result of channel  
18
 * @return     none  
19
 */
20
void ADC1_ChannelCallback(enum ADC_CHANNEL channel, uint16_t adcVal);




Und das ist mein Aufruf in der main.c Datei in der main- Funktion.

1
    ADC1_ChannelCallback(Channel_AN13,dings);    
2
    
3
    ADC1_ChannelCallback(Channel_AN18,dings2);


Definitionen was in der ISR passieren soll:
1
ADC1_ChannelCallback(Channel_AN13,dings)
2
{
3
    adc_vin = ADCBUF12;
4
    adc_vbuck = ADCBUF13;
5
    Buck_Controller_Update(&Buck_Controller);
6
//    Buck_Controller_PTermUpdate(&Buck_Controller);
7
    
8
}
9
10
ADC1_ChannelCallback(Channel_AN18,dings2)
11
{
12
//    adc_vin = ADCBUF12;
13
    adc_vboost = ADCBUF18;
14
    Boost_Controller_Update(&Boost_Controller); //Mit Pointer zum Boost_Voltage_Loop Control Object
15
//    Boost_Controller_PTermUpdate(&Boost_Controller);
16
}

von Frank K. (fchk)


Lesenswert?

Don schrieb:
> Und das ist mein Aufruf in der main.c Datei in der main- Funktion.
>
>
>
1
>     ADC1_ChannelCallback(Channel_AN13,dings);
2
> 
3
>     ADC1_ChannelCallback(Channel_AN18,dings2);
4
>

Und genau das ist das Problem. Du rufst die Callbacks nicht auf. 
Niemals. Das macht das System. Du must nur eine eigene Funktion 
schreiben, die aufgerufen werden, und Du musst diese registrieren.
1
void My_ADC1_Callback(enum ADC_CHANNEL channel, uint16_t adcVal)
2
{
3
  switch(channel)
4
  {
5
     case Channel_AN13:
6
       adc_vin = ADCBUF12;
7
       adc_vbuck = ADCBUF13;
8
       Buck_Controller_Update(&Buck_Controller);
9
       break;
10
     case Channel_AN18:
11
       adc_vboost = ADCBUF18;
12
       Boost_Controller_Update(&Boost_Controller);
13
       break;
14
     default:
15
       break;
16
  }
17
}

und dann in der main:
1
ADC1_ChannelCallbackRegister(&MyADC1_Callback);

So oder so ähnlich ist das gedacht.

fchk

von Don (donluc)


Lesenswert?

Vielen Dank für die schnelle Antwort, fchk. Jetzt funktioniert alles 
einwandfrei:)

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.