Test
Dependencies: mbed-dev-OS5_10_4
MySources/AdRead.cpp
- Committer:
- kevman
- Date:
- 2020-08-07
- Revision:
- 0:014fad4dfb9d
File content as of revision 0:014fad4dfb9d:
/*------------------------------------------------------------------------------- Programm Name: AdRead.cpp Version: 1.0 Sprache: C++ Compiler: mbed Autor: PS Copyright: PS Funktion: Lese-Funktion für den A/D Wandlerzugriff 30.06.2017: -------------------------------------------------------------------------------*/ #include "Headers.h" // Membervariablen, die nur in dieser Datei verwendet werden uint8_t m_AiMask, m_Rdy0Mask, m_Rdy1Mask, m_RdyStatus[8]; int g_nDelCount; uint8_t AdcA0V1, AdcA0V2, AdcA0V3; long g_nChn1Counter = 0; long g_nChn2Counter = 0; long g_nFinishCounter = 0; uint16_t nTempCounter = 0; int g_Temp1, g_Temp2, g_Temp3, g_Temp4, g_Temp5, g_Temp6; Converter0 Conv0[2]; uint8_t g_nIRead; int nStatusCounter = 0; bool g_fDisableDataRead; /*----------------- INTERRUPT SERVICE ROUTINES --------------------------*/ void Rdy0Fall() { __disable_irq(); g_fRdy0 = true; Adc0ReadChn(); __enable_irq(); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ void Rdy1Fall() { __disable_irq(); g_fRdy1 = true; Adc1ReadChn(); __enable_irq(); } /*------------------------------------------------------------------------------- ReadConverter0: Lesen des ersten A/D Wandlers -------------------------------------------------------------------------------*/ void ReadConverter0() { unsigned char ChnStatus; g_fRdy0 = false; if(g_fDisableDataRead == true) return; // m_Rdy0Status = ReadAdStatusRegister(0); // liest Statusregister von Wandler 0 // m_Rdy0Mask = 0x01; ChnStatus = Conv0[0].AdPart[3] >> 5; if(ChnStatus >= 4) ChnStatus = 3; Conv0[0].AdPart[3] = 0x00; MVars.dbAdSum[ChnStatus] += Conv0[0].AdComplete; MVars.nChnAverage[(int)ChnStatus]++; } /*------------------------------------------------------------------------------- ReadConverter0: Lesen des ersten A/D Wandlers Der zweite Wandler wird mit den Idexen 4-7 verarbeitet -------------------------------------------------------------------------------*/ void ReadConverter1() { unsigned char ChnStatus; g_fRdy1 = false; if(g_fDisableDataRead == true) return; // m_Rdy0Status = ReadAdStatusRegister(0); // liest Statusregister von Wandler 0 // m_Rdy0Mask = 0x01; ChnStatus = Conv0[1].AdPart[3] >> 5; if(ChnStatus >= 4) ChnStatus = 3; Conv0[1].AdPart[3] = 0x00; MVars.dbAdSum[ChnStatus *2 + 1] += Conv0[1].AdComplete; MVars.nChnAverage[((int)ChnStatus + 4) + 1]++; } /*------------------------------------------------------------------------------- CheckAnalogIn: Liest die Daten von den Wandlern -------------------------------------------------------------------------------*/ int CheckAnalogIn() { if(g_fRdy0 == true) ReadConverter0(); if(g_fRdy1 == true) ReadConverter1(); return(true); } /*------------------------------------------------------------------------------- CheckDaAd: Schreibt zum AD und liest den AD -------------------------------------------------------------------------------*/ int CheckDaAd() { int i,Ret; // ReadAllChannels(); wird schon im Main aufgerufen // In Grundstellung ist nAktMittelAfter=500, d.h. es wird über eine halbe Sekunde gemittelt // Im Messmode ist nAktMittelAfter auf einen Wert von z.B. 10 bei 100 Werten pro Sekunde Ret = CalculateAdBaseValues(); if(Ret == false) // nicht alle Felder waren mit Werten gefüllt { g_nChn1Counter++; g_nChn2Counter++; if(g_nChn1Counter > 10) { Ad7739Stop(); // Erst mal stoppen, damit noch ein weiterer Zugriff passiert Ad7739Start(0, 0,1); // neu starten g_nChn1Counter = 0; if(g_nChn2Counter >= 100 ) // hat 10 Mal versucht neu anzustossen { sprintf(HostIf.strErrorBuf,"%c#ER#A/D-Converter did not answer. 10 times restart without access %c\r\n", STX, ETX); // HostIf.fSendError = true; } } return(false); } else { g_nChn1Counter = 0; g_nChn2Counter = 0; } g_nChn1Counter = 0; // MVars.dbAdResult[g_nUChn[0]] = MVars.dbAdResult[g_nUChn[0]]; // - IrComp.dbKorrVoltage; // CheckLimitValues(); SendAnalogValues(); MVars.nMwMittelCount = 0; return(true); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ int AdReadChannels(uint8_t Chn, uint8_t Wandler, uint8_t MitStatus) { // ab hier ist der gewandelte Wert einzulesen // #define AD7739_READ_OP(addr) (0x40 | addr) #define AD7739_CHANNEL(0x08, 0...3) (addr | ch) #define AD7739_ADDR_C_DATA 0x08 // Ad7739OutWrite(AD7739_READ_OP(AD7739_CHANNEL(AD7739_ADDR_C_DATA, Chn)),Wandler); //0x48, die 0 legt die CS0 auf low // for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); AdInRead(Wandler); m_RdyStatus[Chn] = g_AReadTemp; AdInRead(Wandler); AdcA0V1 = g_AReadTemp; AdInRead(Wandler); AdcA0V2 = g_AReadTemp; AdInRead(Wandler); AdcA0V3 = g_AReadTemp; return(true); } /*------------------------------------------------------------------------------- Liest zuerst das Statusbyte und dann die Daten, welche in die Union Struktur gelesen werden -------------------------------------------------------------------------------*/ int Adc0ReadChn() { AdInRead(0); Conv0[0].AdPart[3] = g_AReadTemp; AdInRead(0); Conv0[0].AdPart[2] = g_AReadTemp; AdInRead(0); Conv0[0].AdPart[1] = g_AReadTemp; AdInRead(0); Conv0[0].AdPart[0] = g_AReadTemp; return(true); } /*------------------------------------------------------------------------------- Liest zuerst das Statusbyte und dann die Daten, welche in die Union Struktur gelesen werden -------------------------------------------------------------------------------*/ int Adc1ReadChn() { AdInRead(1); Conv0[1].AdPart[3] = g_AReadTemp; AdInRead(1); Conv0[1].AdPart[2] = g_AReadTemp; AdInRead(1); Conv0[1].AdPart[1] = g_AReadTemp; AdInRead(1); Conv0[1].AdPart[0] = g_AReadTemp; return(true); } /*------------------------------------------------------------------------------- //Liest das vorher selektierte Register des ersten A/D Wandler -------------------------------------------------------------------------------*/ void AdInRead(int Wandler) { // core_util_critical_section_enter(); int i; m_AiMask = 0x80; g_AReadTemp = 0x00; AdMosiDown(); // muss unten sein, da sonst der Continous Mode gestoppt werden kann AdSckUp(); if(Wandler == 0) { Ad1CsUp(); Ad0CsDown(); } else { Ad0CsUp(); Ad1CsDown(); } for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); for(i=0;i<8;i++) { AdSckDown(); for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); if(AdIsMisoUp()) g_AReadTemp |= m_AiMask; AdSckUp(); for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); m_AiMask = (m_AiMask>>1); } Ad0CsUp(); Ad1CsUp(); }