Test
Dependencies: mbed-dev-OS5_10_4
MySources/AdRead.cpp@0:014fad4dfb9d, 2020-08-07 (annotated)
- Committer:
- kevman
- Date:
- Fri Aug 07 07:24:21 2020 +0000
- Revision:
- 0:014fad4dfb9d
Test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kevman | 0:014fad4dfb9d | 1 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 2 | Programm Name: AdRead.cpp |
kevman | 0:014fad4dfb9d | 3 | Version: 1.0 |
kevman | 0:014fad4dfb9d | 4 | Sprache: C++ |
kevman | 0:014fad4dfb9d | 5 | Compiler: mbed |
kevman | 0:014fad4dfb9d | 6 | Autor: PS |
kevman | 0:014fad4dfb9d | 7 | Copyright: PS |
kevman | 0:014fad4dfb9d | 8 | |
kevman | 0:014fad4dfb9d | 9 | |
kevman | 0:014fad4dfb9d | 10 | Funktion: Lese-Funktion für den A/D Wandlerzugriff |
kevman | 0:014fad4dfb9d | 11 | |
kevman | 0:014fad4dfb9d | 12 | 30.06.2017: |
kevman | 0:014fad4dfb9d | 13 | |
kevman | 0:014fad4dfb9d | 14 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 15 | #include "Headers.h" |
kevman | 0:014fad4dfb9d | 16 | |
kevman | 0:014fad4dfb9d | 17 | |
kevman | 0:014fad4dfb9d | 18 | // Membervariablen, die nur in dieser Datei verwendet werden |
kevman | 0:014fad4dfb9d | 19 | uint8_t m_AiMask, m_Rdy0Mask, m_Rdy1Mask, m_RdyStatus[8]; |
kevman | 0:014fad4dfb9d | 20 | |
kevman | 0:014fad4dfb9d | 21 | int g_nDelCount; |
kevman | 0:014fad4dfb9d | 22 | uint8_t AdcA0V1, AdcA0V2, AdcA0V3; |
kevman | 0:014fad4dfb9d | 23 | |
kevman | 0:014fad4dfb9d | 24 | long g_nChn1Counter = 0; |
kevman | 0:014fad4dfb9d | 25 | long g_nChn2Counter = 0; |
kevman | 0:014fad4dfb9d | 26 | long g_nFinishCounter = 0; |
kevman | 0:014fad4dfb9d | 27 | |
kevman | 0:014fad4dfb9d | 28 | uint16_t nTempCounter = 0; |
kevman | 0:014fad4dfb9d | 29 | |
kevman | 0:014fad4dfb9d | 30 | int g_Temp1, g_Temp2, g_Temp3, g_Temp4, g_Temp5, g_Temp6; |
kevman | 0:014fad4dfb9d | 31 | |
kevman | 0:014fad4dfb9d | 32 | Converter0 Conv0[2]; |
kevman | 0:014fad4dfb9d | 33 | |
kevman | 0:014fad4dfb9d | 34 | uint8_t g_nIRead; |
kevman | 0:014fad4dfb9d | 35 | |
kevman | 0:014fad4dfb9d | 36 | int nStatusCounter = 0; |
kevman | 0:014fad4dfb9d | 37 | |
kevman | 0:014fad4dfb9d | 38 | bool g_fDisableDataRead; |
kevman | 0:014fad4dfb9d | 39 | |
kevman | 0:014fad4dfb9d | 40 | /*----------------- INTERRUPT SERVICE ROUTINES --------------------------*/ |
kevman | 0:014fad4dfb9d | 41 | |
kevman | 0:014fad4dfb9d | 42 | void Rdy0Fall() |
kevman | 0:014fad4dfb9d | 43 | { |
kevman | 0:014fad4dfb9d | 44 | __disable_irq(); |
kevman | 0:014fad4dfb9d | 45 | g_fRdy0 = true; |
kevman | 0:014fad4dfb9d | 46 | Adc0ReadChn(); |
kevman | 0:014fad4dfb9d | 47 | __enable_irq(); |
kevman | 0:014fad4dfb9d | 48 | } |
kevman | 0:014fad4dfb9d | 49 | |
kevman | 0:014fad4dfb9d | 50 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 51 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 52 | void Rdy1Fall() |
kevman | 0:014fad4dfb9d | 53 | { |
kevman | 0:014fad4dfb9d | 54 | __disable_irq(); |
kevman | 0:014fad4dfb9d | 55 | g_fRdy1 = true; |
kevman | 0:014fad4dfb9d | 56 | Adc1ReadChn(); |
kevman | 0:014fad4dfb9d | 57 | __enable_irq(); |
kevman | 0:014fad4dfb9d | 58 | } |
kevman | 0:014fad4dfb9d | 59 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 60 | ReadConverter0: Lesen des ersten A/D Wandlers |
kevman | 0:014fad4dfb9d | 61 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 62 | void ReadConverter0() |
kevman | 0:014fad4dfb9d | 63 | { |
kevman | 0:014fad4dfb9d | 64 | unsigned char ChnStatus; |
kevman | 0:014fad4dfb9d | 65 | |
kevman | 0:014fad4dfb9d | 66 | g_fRdy0 = false; |
kevman | 0:014fad4dfb9d | 67 | if(g_fDisableDataRead == true) |
kevman | 0:014fad4dfb9d | 68 | return; |
kevman | 0:014fad4dfb9d | 69 | // m_Rdy0Status = ReadAdStatusRegister(0); // liest Statusregister von Wandler 0 |
kevman | 0:014fad4dfb9d | 70 | // m_Rdy0Mask = 0x01; |
kevman | 0:014fad4dfb9d | 71 | ChnStatus = Conv0[0].AdPart[3] >> 5; |
kevman | 0:014fad4dfb9d | 72 | if(ChnStatus >= 4) ChnStatus = 3; |
kevman | 0:014fad4dfb9d | 73 | |
kevman | 0:014fad4dfb9d | 74 | Conv0[0].AdPart[3] = 0x00; |
kevman | 0:014fad4dfb9d | 75 | MVars.dbAdSum[ChnStatus] += Conv0[0].AdComplete; |
kevman | 0:014fad4dfb9d | 76 | MVars.nChnAverage[(int)ChnStatus]++; |
kevman | 0:014fad4dfb9d | 77 | |
kevman | 0:014fad4dfb9d | 78 | } |
kevman | 0:014fad4dfb9d | 79 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 80 | ReadConverter0: Lesen des ersten A/D Wandlers |
kevman | 0:014fad4dfb9d | 81 | Der zweite Wandler wird mit den Idexen 4-7 verarbeitet |
kevman | 0:014fad4dfb9d | 82 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 83 | void ReadConverter1() |
kevman | 0:014fad4dfb9d | 84 | { |
kevman | 0:014fad4dfb9d | 85 | unsigned char ChnStatus; |
kevman | 0:014fad4dfb9d | 86 | |
kevman | 0:014fad4dfb9d | 87 | g_fRdy1 = false; |
kevman | 0:014fad4dfb9d | 88 | if(g_fDisableDataRead == true) |
kevman | 0:014fad4dfb9d | 89 | return; |
kevman | 0:014fad4dfb9d | 90 | // m_Rdy0Status = ReadAdStatusRegister(0); // liest Statusregister von Wandler 0 |
kevman | 0:014fad4dfb9d | 91 | // m_Rdy0Mask = 0x01; |
kevman | 0:014fad4dfb9d | 92 | ChnStatus = Conv0[1].AdPart[3] >> 5; |
kevman | 0:014fad4dfb9d | 93 | if(ChnStatus >= 4) ChnStatus = 3; |
kevman | 0:014fad4dfb9d | 94 | |
kevman | 0:014fad4dfb9d | 95 | Conv0[1].AdPart[3] = 0x00; |
kevman | 0:014fad4dfb9d | 96 | MVars.dbAdSum[ChnStatus *2 + 1] += Conv0[1].AdComplete; |
kevman | 0:014fad4dfb9d | 97 | MVars.nChnAverage[((int)ChnStatus + 4) + 1]++; |
kevman | 0:014fad4dfb9d | 98 | |
kevman | 0:014fad4dfb9d | 99 | } |
kevman | 0:014fad4dfb9d | 100 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 101 | CheckAnalogIn: Liest die Daten von den Wandlern |
kevman | 0:014fad4dfb9d | 102 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 103 | int CheckAnalogIn() |
kevman | 0:014fad4dfb9d | 104 | { |
kevman | 0:014fad4dfb9d | 105 | if(g_fRdy0 == true) |
kevman | 0:014fad4dfb9d | 106 | ReadConverter0(); |
kevman | 0:014fad4dfb9d | 107 | if(g_fRdy1 == true) |
kevman | 0:014fad4dfb9d | 108 | ReadConverter1(); |
kevman | 0:014fad4dfb9d | 109 | return(true); |
kevman | 0:014fad4dfb9d | 110 | } |
kevman | 0:014fad4dfb9d | 111 | |
kevman | 0:014fad4dfb9d | 112 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 113 | CheckDaAd: Schreibt zum AD und liest den AD |
kevman | 0:014fad4dfb9d | 114 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 115 | int CheckDaAd() |
kevman | 0:014fad4dfb9d | 116 | { |
kevman | 0:014fad4dfb9d | 117 | int i,Ret; |
kevman | 0:014fad4dfb9d | 118 | |
kevman | 0:014fad4dfb9d | 119 | // ReadAllChannels(); wird schon im Main aufgerufen |
kevman | 0:014fad4dfb9d | 120 | // In Grundstellung ist nAktMittelAfter=500, d.h. es wird über eine halbe Sekunde gemittelt |
kevman | 0:014fad4dfb9d | 121 | // Im Messmode ist nAktMittelAfter auf einen Wert von z.B. 10 bei 100 Werten pro Sekunde |
kevman | 0:014fad4dfb9d | 122 | Ret = CalculateAdBaseValues(); |
kevman | 0:014fad4dfb9d | 123 | if(Ret == false) // nicht alle Felder waren mit Werten gefüllt |
kevman | 0:014fad4dfb9d | 124 | { |
kevman | 0:014fad4dfb9d | 125 | g_nChn1Counter++; |
kevman | 0:014fad4dfb9d | 126 | g_nChn2Counter++; |
kevman | 0:014fad4dfb9d | 127 | if(g_nChn1Counter > 10) |
kevman | 0:014fad4dfb9d | 128 | { |
kevman | 0:014fad4dfb9d | 129 | Ad7739Stop(); // Erst mal stoppen, damit noch ein weiterer Zugriff passiert |
kevman | 0:014fad4dfb9d | 130 | Ad7739Start(0, 0,1); // neu starten |
kevman | 0:014fad4dfb9d | 131 | g_nChn1Counter = 0; |
kevman | 0:014fad4dfb9d | 132 | if(g_nChn2Counter >= 100 ) // hat 10 Mal versucht neu anzustossen |
kevman | 0:014fad4dfb9d | 133 | { |
kevman | 0:014fad4dfb9d | 134 | sprintf(HostIf.strErrorBuf,"%c#ER#A/D-Converter did not answer. 10 times restart without access %c\r\n", STX, ETX); // |
kevman | 0:014fad4dfb9d | 135 | HostIf.fSendError = true; |
kevman | 0:014fad4dfb9d | 136 | } |
kevman | 0:014fad4dfb9d | 137 | |
kevman | 0:014fad4dfb9d | 138 | } |
kevman | 0:014fad4dfb9d | 139 | return(false); |
kevman | 0:014fad4dfb9d | 140 | } |
kevman | 0:014fad4dfb9d | 141 | else |
kevman | 0:014fad4dfb9d | 142 | { |
kevman | 0:014fad4dfb9d | 143 | g_nChn1Counter = 0; |
kevman | 0:014fad4dfb9d | 144 | g_nChn2Counter = 0; |
kevman | 0:014fad4dfb9d | 145 | } |
kevman | 0:014fad4dfb9d | 146 | |
kevman | 0:014fad4dfb9d | 147 | g_nChn1Counter = 0; |
kevman | 0:014fad4dfb9d | 148 | // MVars.dbAdResult[g_nUChn[0]] = MVars.dbAdResult[g_nUChn[0]]; // - IrComp.dbKorrVoltage; |
kevman | 0:014fad4dfb9d | 149 | // CheckLimitValues(); |
kevman | 0:014fad4dfb9d | 150 | |
kevman | 0:014fad4dfb9d | 151 | SendAnalogValues(); |
kevman | 0:014fad4dfb9d | 152 | |
kevman | 0:014fad4dfb9d | 153 | MVars.nMwMittelCount = 0; |
kevman | 0:014fad4dfb9d | 154 | return(true); |
kevman | 0:014fad4dfb9d | 155 | } |
kevman | 0:014fad4dfb9d | 156 | |
kevman | 0:014fad4dfb9d | 157 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 158 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 159 | int AdReadChannels(uint8_t Chn, uint8_t Wandler, uint8_t MitStatus) |
kevman | 0:014fad4dfb9d | 160 | { |
kevman | 0:014fad4dfb9d | 161 | // ab hier ist der gewandelte Wert einzulesen |
kevman | 0:014fad4dfb9d | 162 | // #define AD7739_READ_OP(addr) (0x40 | addr) #define AD7739_CHANNEL(0x08, 0...3) (addr | ch) #define AD7739_ADDR_C_DATA 0x08 |
kevman | 0:014fad4dfb9d | 163 | // Ad7739OutWrite(AD7739_READ_OP(AD7739_CHANNEL(AD7739_ADDR_C_DATA, Chn)),Wandler); //0x48, die 0 legt die CS0 auf low |
kevman | 0:014fad4dfb9d | 164 | |
kevman | 0:014fad4dfb9d | 165 | // for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); |
kevman | 0:014fad4dfb9d | 166 | AdInRead(Wandler); |
kevman | 0:014fad4dfb9d | 167 | m_RdyStatus[Chn] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 168 | AdInRead(Wandler); |
kevman | 0:014fad4dfb9d | 169 | AdcA0V1 = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 170 | AdInRead(Wandler); |
kevman | 0:014fad4dfb9d | 171 | AdcA0V2 = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 172 | AdInRead(Wandler); |
kevman | 0:014fad4dfb9d | 173 | AdcA0V3 = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 174 | return(true); |
kevman | 0:014fad4dfb9d | 175 | } |
kevman | 0:014fad4dfb9d | 176 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 177 | Liest zuerst das Statusbyte und dann die Daten, welche in die Union Struktur gelesen werden |
kevman | 0:014fad4dfb9d | 178 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 179 | int Adc0ReadChn() |
kevman | 0:014fad4dfb9d | 180 | { |
kevman | 0:014fad4dfb9d | 181 | AdInRead(0); |
kevman | 0:014fad4dfb9d | 182 | Conv0[0].AdPart[3] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 183 | AdInRead(0); |
kevman | 0:014fad4dfb9d | 184 | Conv0[0].AdPart[2] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 185 | AdInRead(0); |
kevman | 0:014fad4dfb9d | 186 | Conv0[0].AdPart[1] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 187 | AdInRead(0); |
kevman | 0:014fad4dfb9d | 188 | Conv0[0].AdPart[0] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 189 | return(true); |
kevman | 0:014fad4dfb9d | 190 | } |
kevman | 0:014fad4dfb9d | 191 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 192 | Liest zuerst das Statusbyte und dann die Daten, welche in die Union Struktur gelesen werden |
kevman | 0:014fad4dfb9d | 193 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 194 | int Adc1ReadChn() |
kevman | 0:014fad4dfb9d | 195 | { |
kevman | 0:014fad4dfb9d | 196 | AdInRead(1); |
kevman | 0:014fad4dfb9d | 197 | Conv0[1].AdPart[3] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 198 | AdInRead(1); |
kevman | 0:014fad4dfb9d | 199 | Conv0[1].AdPart[2] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 200 | AdInRead(1); |
kevman | 0:014fad4dfb9d | 201 | Conv0[1].AdPart[1] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 202 | AdInRead(1); |
kevman | 0:014fad4dfb9d | 203 | Conv0[1].AdPart[0] = g_AReadTemp; |
kevman | 0:014fad4dfb9d | 204 | return(true); |
kevman | 0:014fad4dfb9d | 205 | } |
kevman | 0:014fad4dfb9d | 206 | |
kevman | 0:014fad4dfb9d | 207 | /*------------------------------------------------------------------------------- |
kevman | 0:014fad4dfb9d | 208 | //Liest das vorher selektierte Register des ersten A/D Wandler |
kevman | 0:014fad4dfb9d | 209 | -------------------------------------------------------------------------------*/ |
kevman | 0:014fad4dfb9d | 210 | void AdInRead(int Wandler) |
kevman | 0:014fad4dfb9d | 211 | { |
kevman | 0:014fad4dfb9d | 212 | // core_util_critical_section_enter(); |
kevman | 0:014fad4dfb9d | 213 | int i; |
kevman | 0:014fad4dfb9d | 214 | |
kevman | 0:014fad4dfb9d | 215 | m_AiMask = 0x80; |
kevman | 0:014fad4dfb9d | 216 | g_AReadTemp = 0x00; |
kevman | 0:014fad4dfb9d | 217 | |
kevman | 0:014fad4dfb9d | 218 | AdMosiDown(); // muss unten sein, da sonst der Continous Mode gestoppt werden kann |
kevman | 0:014fad4dfb9d | 219 | AdSckUp(); |
kevman | 0:014fad4dfb9d | 220 | |
kevman | 0:014fad4dfb9d | 221 | if(Wandler == 0) |
kevman | 0:014fad4dfb9d | 222 | { |
kevman | 0:014fad4dfb9d | 223 | Ad1CsUp(); |
kevman | 0:014fad4dfb9d | 224 | Ad0CsDown(); |
kevman | 0:014fad4dfb9d | 225 | } |
kevman | 0:014fad4dfb9d | 226 | else |
kevman | 0:014fad4dfb9d | 227 | { |
kevman | 0:014fad4dfb9d | 228 | Ad0CsUp(); |
kevman | 0:014fad4dfb9d | 229 | Ad1CsDown(); |
kevman | 0:014fad4dfb9d | 230 | } |
kevman | 0:014fad4dfb9d | 231 | for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); |
kevman | 0:014fad4dfb9d | 232 | for(i=0;i<8;i++) |
kevman | 0:014fad4dfb9d | 233 | { |
kevman | 0:014fad4dfb9d | 234 | AdSckDown(); |
kevman | 0:014fad4dfb9d | 235 | for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); |
kevman | 0:014fad4dfb9d | 236 | if(AdIsMisoUp()) |
kevman | 0:014fad4dfb9d | 237 | g_AReadTemp |= m_AiMask; |
kevman | 0:014fad4dfb9d | 238 | AdSckUp(); |
kevman | 0:014fad4dfb9d | 239 | for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++); |
kevman | 0:014fad4dfb9d | 240 | m_AiMask = (m_AiMask>>1); |
kevman | 0:014fad4dfb9d | 241 | } |
kevman | 0:014fad4dfb9d | 242 | |
kevman | 0:014fad4dfb9d | 243 | Ad0CsUp(); |
kevman | 0:014fad4dfb9d | 244 | Ad1CsUp(); |
kevman | 0:014fad4dfb9d | 245 | } |
kevman | 0:014fad4dfb9d | 246 |