EBRU
Es ist weiterhin möglich, die analogen Eingänge im Interruptbetrieb zu verarbeiten. Hierbei wird
ein Interrupt ausgegeben wenn der ADC eine Konversion beendet hat. Dies hat den Vorteil,
dass die Applikation nicht auf das Ende der Messung warten muss, sondern in der Zwischenzeit
andere Aufgaben erledigen kann.
Beginn
Analoge Eingänge
kalibrieren
Ist ein Fehler
aufgetreten ?
Analogeingangsinterrupt
und PCI-Interrupt
freigeben
Ist ein Fehler
aufgetreten ?
Applikation arbeitet
weiter
Sperren des
Analogeingangsinterrupt
und des PCI-Interrupts
Ende
Beginn
void Inthandler(void)
{
Karteninterrupt
einlesen
Hat der
Analogeingangsinterrupt
ausgelöst?
}
Analogwert
auslesen
Ende
PCIADIO – PCI Karte mit galv. getrennten analogen und digitalen IOs
pciadio-de-um-1v2.doc
...
unsigned char l_ucActIndex;
unsigned char l_ucCountsOfCalibration=10;/* Anzahl der Messungen */
unsigned char l_ucChannelNumber;
unsigned char l_ucRange;
unsigned char l_ucConversionState;
unsigned char l_ucIFBusy;
float l_fResult;
...
/* Übernehmen der Adresse der zu bedienenden Karte aus den Kartendaten */
l_ucActIndex=l_SummeryBuffer[0].BoardNumber;
/* Kalibrieren der analogen Eingänge*/
l_bReturn=pciadioAICalibrate(l_ucActIndex, l_ucCountsOfCalibration);
/* Funktion erfolgreich abgeschlossen ? */
if(l_bReturn==TRUE)
{
/* Interrupts freigeben */
l_bReturn= pciadioEnableIrq(l_ucActIndex,&Inthandler);
l_bReturn= pciadioSetIRQADCKonversion(BYTE a_ ucActIndex,1);
if(l_bReturn == FALSE)
{
/* Fehlertext auslesen */
pciadioGetErrorMsg(l_strErrorTxt);
}
/* Analog Eingang im Eingangsspannungsbereich messen */
l_bReturn= pciadioAIStartConversion(l_ucActIndex, ucChannelNumber ,
if(l_bReturn==TRUE)
{
/* Applikation kann etwas in der Zwischenzeit tun */
}
}
/* Interrupts sperren */
l_bReturn= pciadioSetIRQADCKonversion(BYTE a_ ucActIndex,1);
l_bReturn=pciadioDisableIrq(l_ucActIndex);
if(l_bReturn == FALSE)
{
/* Fehlertext auslesen */
pciadioGetErrorMsg(l_strErrorTxt);
}
/* Funktion erfolgreich abgeschlossen ? */
if(l_bReturn == FALSE)
{
/* Fehlertext auslesen */
pciadioGetErrorMsg(l_strErrorTxt);
}
Interrupthandler
unsigned char l_ucActIndex;
PCIADIO_INT_STATE l_Int_State;
...
/* Auslesen des Karteninterrupts *7
pciadioGetIrq(l_ucActIndex,& l_Int_State);
...
if((IntState.ADIRQ==0x02)
{
/* Ergebnis abholen */
pciadioAIGetResult(l_ucActIndex,&g_fResult);
}
pciadioResetIRQ(ucActIndex);
...
Benutzerhandbuch
06.06.2011
Rev. 1.2
/*Aktuell zu bedienende Karte */
/* Ausgewählter Kanal */
/* Ausgewählter Messbereich */
/* Konversionsstatus */
/* Interface in Verwendung */
/* Messergebnis
*/
l_ucRange);
Seite 31 von 75