Test

Dependencies:   mbed-dev-OS5_10_4

Committer:
kevman
Date:
Fri Aug 07 07:24:21 2020 +0000
Revision:
0:014fad4dfb9d
Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:014fad4dfb9d 1 /*
kevman 0:014fad4dfb9d 2 -------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 3 Programm Name: Dio.CPP
kevman 0:014fad4dfb9d 4 Version: 1.0
kevman 0:014fad4dfb9d 5 Sprache: C
kevman 0:014fad4dfb9d 6 Compiler: MBED
kevman 0:014fad4dfb9d 7 Autor: PS
kevman 0:014fad4dfb9d 8 Copyright: PS
kevman 0:014fad4dfb9d 9
kevman 0:014fad4dfb9d 10
kevman 0:014fad4dfb9d 11 Funktion: Digital In/Out auf LPC1768
kevman 0:014fad4dfb9d 12
kevman 0:014fad4dfb9d 13 Modified:
kevman 0:014fad4dfb9d 14
kevman 0:014fad4dfb9d 15 2016-06 UFa: Aenderungen aufgrund HW-Revision:
kevman 0:014fad4dfb9d 16 a) Anpassungen in Fkt "SetIRange"
kevman 0:014fad4dfb9d 17 b) Neue Funktionen (ersetzen z.T. entsp. Macros)
kevman 0:014fad4dfb9d 18 - SetWe()
kevman 0:014fad4dfb9d 19 - GeIstGe()
kevman 0:014fad4dfb9d 20 - ClearWeSchirm()
kevman 0:014fad4dfb9d 21 - SquareOffsetDown()
kevman 0:014fad4dfb9d 22
kevman 0:014fad4dfb9d 23 -------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 24 */
kevman 0:014fad4dfb9d 25 #include "Headers.h"
kevman 0:014fad4dfb9d 26
kevman 0:014fad4dfb9d 27 //#define Spi0IsMisoUp() (LPC_GPIOA->FIOPIN & 0x00020000)
kevman 0:014fad4dfb9d 28 //#define Spi0IsMisoDown() (LPC_GPIOA->FIOPIN & ~0x00020000)
kevman 0:014fad4dfb9d 29
kevman 0:014fad4dfb9d 30 BYTE Port;
kevman 0:014fad4dfb9d 31 #ifdef PGU_EDUCATION
kevman 0:014fad4dfb9d 32 DigitalOut SwPot(PTB20);
kevman 0:014fad4dfb9d 33 DigitalOut SwGal(PTC10);
kevman 0:014fad4dfb9d 34 DigitalOut SwGe(PTC11);
kevman 0:014fad4dfb9d 35 #endif
kevman 0:014fad4dfb9d 36 DigitalOut DoStatusLed(PTA1);
kevman 0:014fad4dfb9d 37
kevman 0:014fad4dfb9d 38
kevman 0:014fad4dfb9d 39 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 40 Initialisieren der Schaltkontakte
kevman 0:014fad4dfb9d 41 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 42 int InitDio(void)
kevman 0:014fad4dfb9d 43 {
kevman 0:014fad4dfb9d 44
kevman 0:014fad4dfb9d 45
kevman 0:014fad4dfb9d 46 #ifdef TOUCH_DISPLAY
kevman 0:014fad4dfb9d 47 TftDisp.nTagVWriteCounter = 0;
kevman 0:014fad4dfb9d 48 TftDisp.nTagVReadCounter = 0;
kevman 0:014fad4dfb9d 49 g_fInCalibrationMode = false;
kevman 0:014fad4dfb9d 50 #endif
kevman 0:014fad4dfb9d 51
kevman 0:014fad4dfb9d 52 #ifndef PGU_RPA
kevman 0:014fad4dfb9d 53 g_fCheckSpecial = false;
kevman 0:014fad4dfb9d 54 g_fSpzFktSwitchIRange = false;
kevman 0:014fad4dfb9d 55 g_fSpzFktSwitchNoiseGain = false;
kevman 0:014fad4dfb9d 56
kevman 0:014fad4dfb9d 57 Setk(4,0);
kevman 0:014fad4dfb9d 58 Setk(5,0);
kevman 0:014fad4dfb9d 59
kevman 0:014fad4dfb9d 60 printf("Now SwitchRanges.\n");
kevman 0:014fad4dfb9d 61
kevman 0:014fad4dfb9d 62 SwitchRangesOnStart();
kevman 0:014fad4dfb9d 63 printf("Now SetIRange.\n");
kevman 0:014fad4dfb9d 64 SetIRange(0,0);
kevman 0:014fad4dfb9d 65 #endif
kevman 0:014fad4dfb9d 66 #ifdef PGU_TOUCH
kevman 0:014fad4dfb9d 67 SetWe(0x00); //PS 10.12.16 ClearWe entfällt, es wird einfach der Bereich 0 für die WE gesetzt, damit ist die WE1 aktiv
kevman 0:014fad4dfb9d 68 SetGe(0);
kevman 0:014fad4dfb9d 69 SetWeSchirm(1); // auf 1 damit die Leitung offen ist und keinen Fehler verursacht
kevman 0:014fad4dfb9d 70
kevman 0:014fad4dfb9d 71 SetSinGainDefault(); // setzt die Verstärker auf Defaultwerte
kevman 0:014fad4dfb9d 72 SetNoiseGainDefault(); // damit werden auch die Cs Signale auf Default gesetzt
kevman 0:014fad4dfb9d 73
kevman 0:014fad4dfb9d 74 SetSquareOffset(0); // Setzt den Offset für Sinuns und Dreieck
kevman 0:014fad4dfb9d 75
kevman 0:014fad4dfb9d 76 SinGenOff(); // Setzt den AD9833 auf Reset und den Cs auf high
kevman 0:014fad4dfb9d 77 #endif
kevman 0:014fad4dfb9d 78
kevman 0:014fad4dfb9d 79 printf("Now Return.\n");
kevman 0:014fad4dfb9d 80 return(true);
kevman 0:014fad4dfb9d 81 }
kevman 0:014fad4dfb9d 82 /****************************************************************
kevman 0:014fad4dfb9d 83 * SetNoiseGainDefault:
kevman 0:014fad4dfb9d 84 *
kevman 0:014fad4dfb9d 85 * Setzt die Rauschverstärker Defaultwert. Default ist hier der
kevman 0:014fad4dfb9d 86 größte Wert, damit wird das Signal am Ausgang minimal. Je größer der
kevman 0:014fad4dfb9d 87 Wert vom X9C103, desto kleiner die Amplitude vom Sinus.
kevman 0:014fad4dfb9d 88 Die Position vom X9C103 ist 100, der Index von den Verstärkungsfaktoren
kevman 0:014fad4dfb9d 89 ist 0
kevman 0:014fad4dfb9d 90 ****************************************************************/
kevman 0:014fad4dfb9d 91 int SetNoiseGainDefault()
kevman 0:014fad4dfb9d 92 {
kevman 0:014fad4dfb9d 93 int i;
kevman 0:014fad4dfb9d 94
kevman 0:014fad4dfb9d 95 #ifdef ECN
kevman 0:014fad4dfb9d 96 SwHpZero = true; // erst mal kurzschließen, damit der nicht so ausschlägt
kevman 0:014fad4dfb9d 97 CsUNoiseGain = false;
kevman 0:014fad4dfb9d 98 CsINoiseGain = false;
kevman 0:014fad4dfb9d 99 DpUpDown = true;
kevman 0:014fad4dfb9d 100 short_delay(50); // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer
kevman 0:014fad4dfb9d 101
kevman 0:014fad4dfb9d 102 for(i=0;i<=100;i++)
kevman 0:014fad4dfb9d 103 {
kevman 0:014fad4dfb9d 104 DpIncrement = false;
kevman 0:014fad4dfb9d 105 short_delay(20); // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer
kevman 0:014fad4dfb9d 106 DpIncrement = true;
kevman 0:014fad4dfb9d 107 short_delay(20); // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer
kevman 0:014fad4dfb9d 108 }
kevman 0:014fad4dfb9d 109 GCount.nUNoisePos = 100;
kevman 0:014fad4dfb9d 110 GCount.nINoisePos = 100;
kevman 0:014fad4dfb9d 111 GCount.nUnGainItem = 0;
kevman 0:014fad4dfb9d 112 GCount.nInGainItem = 0;
kevman 0:014fad4dfb9d 113
kevman 0:014fad4dfb9d 114 CsUNoiseGain = true;
kevman 0:014fad4dfb9d 115 CsINoiseGain = true;
kevman 0:014fad4dfb9d 116 #endif
kevman 0:014fad4dfb9d 117 return(true);
kevman 0:014fad4dfb9d 118 }
kevman 0:014fad4dfb9d 119 /****************************************************************
kevman 0:014fad4dfb9d 120 * SetSinGainDefault:
kevman 0:014fad4dfb9d 121 *
kevman 0:014fad4dfb9d 122 * Setzt den Signalverstärker für Sinus auf Default. Default ist hier der
kevman 0:014fad4dfb9d 123 kleinste Wert, damit wird das Signal am Ausgang minimal. Je kleiner der
kevman 0:014fad4dfb9d 124 Wert vom X9C103, desto kleiner die Amplitude vom Sinus.
kevman 0:014fad4dfb9d 125 Die Position vom X9C103 ist 1, der Index von den Verstärkungsfaktoren
kevman 0:014fad4dfb9d 126 ist 4
kevman 0:014fad4dfb9d 127 ****************************************************************/
kevman 0:014fad4dfb9d 128 int SetSinGainDefault()
kevman 0:014fad4dfb9d 129 {
kevman 0:014fad4dfb9d 130 int i;
kevman 0:014fad4dfb9d 131
kevman 0:014fad4dfb9d 132 #ifdef SINE_GEN
kevman 0:014fad4dfb9d 133 CsSinGain = false;
kevman 0:014fad4dfb9d 134 DpUpDown = false;
kevman 0:014fad4dfb9d 135 short_delay(50); // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer
kevman 0:014fad4dfb9d 136
kevman 0:014fad4dfb9d 137 for(i=0;i<=100;i++)
kevman 0:014fad4dfb9d 138 {
kevman 0:014fad4dfb9d 139 DpIncrement = false;
kevman 0:014fad4dfb9d 140 short_delay(20); // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer
kevman 0:014fad4dfb9d 141 DpIncrement = true;
kevman 0:014fad4dfb9d 142 short_delay(20); // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer
kevman 0:014fad4dfb9d 143 }
kevman 0:014fad4dfb9d 144 GCount.nSinGainPos = 1;
kevman 0:014fad4dfb9d 145 GCount.nSinGainItem = 4;
kevman 0:014fad4dfb9d 146
kevman 0:014fad4dfb9d 147 CsSinGain = true;
kevman 0:014fad4dfb9d 148 #endif
kevman 0:014fad4dfb9d 149 return(true);
kevman 0:014fad4dfb9d 150 }
kevman 0:014fad4dfb9d 151
kevman 0:014fad4dfb9d 152 /****************************************************************
kevman 0:014fad4dfb9d 153 * ReadInput
kevman 0:014fad4dfb9d 154 *
kevman 0:014fad4dfb9d 155 * Liest das Inputbit des Tasters
kevman 0:014fad4dfb9d 156 ****************************************************************/
kevman 0:014fad4dfb9d 157 int ReadInput()
kevman 0:014fad4dfb9d 158 {
kevman 0:014fad4dfb9d 159 /* if(Spi0IsMisoUp())
kevman 0:014fad4dfb9d 160 if(ExtStart)
kevman 0:014fad4dfb9d 161 return true; //
kevman 0:014fad4dfb9d 162 else */
kevman 0:014fad4dfb9d 163 return false;
kevman 0:014fad4dfb9d 164 }
kevman 0:014fad4dfb9d 165 /****************************************************************
kevman 0:014fad4dfb9d 166 * SetBaVariablen:
kevman 0:014fad4dfb9d 167 * Wird von SetK aufgerufen und setzt die Variablen Mv[i].Circuit und Mv[i].BetriebsArt
kevman 0:014fad4dfb9d 168 * damit andeer Programmstellen wissen in welchem Mode die Kiste ist.
kevman 0:014fad4dfb9d 169 ****************************************************************/
kevman 0:014fad4dfb9d 170 int SetBaVariablen(int Nr, bool Level)
kevman 0:014fad4dfb9d 171 {
kevman 0:014fad4dfb9d 172
kevman 0:014fad4dfb9d 173 if(Nr == MVars.SwitchChn[0]) // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
kevman 0:014fad4dfb9d 174 {
kevman 0:014fad4dfb9d 175 if(Level == HIGH)
kevman 0:014fad4dfb9d 176 Mv[0].Circuit = 1;
kevman 0:014fad4dfb9d 177 else
kevman 0:014fad4dfb9d 178 Mv[0].Circuit = 0;
kevman 0:014fad4dfb9d 179 }
kevman 0:014fad4dfb9d 180 if(Nr == MVars.SwitchChn[1]) // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
kevman 0:014fad4dfb9d 181 {
kevman 0:014fad4dfb9d 182 if(Level == HIGH)
kevman 0:014fad4dfb9d 183 Mv[0].BetriebsArt = 1;
kevman 0:014fad4dfb9d 184 else
kevman 0:014fad4dfb9d 185 Mv[0].BetriebsArt = 0;
kevman 0:014fad4dfb9d 186 }
kevman 0:014fad4dfb9d 187 return(true);
kevman 0:014fad4dfb9d 188 }
kevman 0:014fad4dfb9d 189
kevman 0:014fad4dfb9d 190
kevman 0:014fad4dfb9d 191 /****************************************************************
kevman 0:014fad4dfb9d 192 * Setk
kevman 0:014fad4dfb9d 193 *
kevman 0:014fad4dfb9d 194 * Setzten eines Kontaktes. Die Betriebsart und Circuit wird hier auch gesetzt
kevman 0:014fad4dfb9d 195 ****************************************************************/
kevman 0:014fad4dfb9d 196 int Setk(int Nr, bool Level)
kevman 0:014fad4dfb9d 197 {
kevman 0:014fad4dfb9d 198 // uint8_t mask = 0x80;
kevman 0:014fad4dfb9d 199
kevman 0:014fad4dfb9d 200 #ifdef PGU_EDUCATION
kevman 0:014fad4dfb9d 201 // uint8_t mask = 0x80;
kevman 0:014fad4dfb9d 202 SetBaVariablen(Nr, Level);
kevman 0:014fad4dfb9d 203 if(Nr == 4) // I-Zelle
kevman 0:014fad4dfb9d 204 SwGe = Level;
kevman 0:014fad4dfb9d 205 else if(Nr == 5)
kevman 0:014fad4dfb9d 206 {
kevman 0:014fad4dfb9d 207 if(Level == false)
kevman 0:014fad4dfb9d 208 {
kevman 0:014fad4dfb9d 209 SwPot = true;
kevman 0:014fad4dfb9d 210 SwGal = false;
kevman 0:014fad4dfb9d 211 }
kevman 0:014fad4dfb9d 212 else // if(Level == false)
kevman 0:014fad4dfb9d 213 {
kevman 0:014fad4dfb9d 214 SwPot = false;
kevman 0:014fad4dfb9d 215 SwGal = true;
kevman 0:014fad4dfb9d 216 }
kevman 0:014fad4dfb9d 217 }
kevman 0:014fad4dfb9d 218 #endif
kevman 0:014fad4dfb9d 219 #ifdef PGU_POTI // wenn ein Potentiostat angeschlossen ist
kevman 0:014fad4dfb9d 220 if(Nr == MVars.SwitchChn[0]) // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
kevman 0:014fad4dfb9d 221 {
kevman 0:014fad4dfb9d 222 if(Level == HIGH)
kevman 0:014fad4dfb9d 223 {
kevman 0:014fad4dfb9d 224 g_nSendDisableTimer = 1000;
kevman 0:014fad4dfb9d 225 SetSwitchHpZero(0);
kevman 0:014fad4dfb9d 226 Mv[0].Circuit = 1;
kevman 0:014fad4dfb9d 227 SkIzUp();
kevman 0:014fad4dfb9d 228 if(IRange.AutoRange[0] < 2)
kevman 0:014fad4dfb9d 229 {
kevman 0:014fad4dfb9d 230 IRange.m_fCheckRange = true;
kevman 0:014fad4dfb9d 231 }
kevman 0:014fad4dfb9d 232 nSwitchDownCount[0] = EcmIni.DelayAfterSwitchUp; // beim Rauschen deutlich laenger
kevman 0:014fad4dfb9d 233 }
kevman 0:014fad4dfb9d 234 else
kevman 0:014fad4dfb9d 235 {
kevman 0:014fad4dfb9d 236 IRange.m_fCheckRange = false;
kevman 0:014fad4dfb9d 237 Mv[0].Circuit = 0;
kevman 0:014fad4dfb9d 238 SkIzDown();
kevman 0:014fad4dfb9d 239 }
kevman 0:014fad4dfb9d 240 }
kevman 0:014fad4dfb9d 241 if(Nr == MVars.SwitchChn[1]) // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
kevman 0:014fad4dfb9d 242 {
kevman 0:014fad4dfb9d 243
kevman 0:014fad4dfb9d 244 if(Level == HIGH)
kevman 0:014fad4dfb9d 245 {
kevman 0:014fad4dfb9d 246 Mv[0].BetriebsArt = 1;
kevman 0:014fad4dfb9d 247 PotGalUp();
kevman 0:014fad4dfb9d 248 }
kevman 0:014fad4dfb9d 249 else
kevman 0:014fad4dfb9d 250 {
kevman 0:014fad4dfb9d 251 Mv[0].BetriebsArt = 0;
kevman 0:014fad4dfb9d 252 PotGalDown();
kevman 0:014fad4dfb9d 253 }
kevman 0:014fad4dfb9d 254 }
kevman 0:014fad4dfb9d 255 #endif
kevman 0:014fad4dfb9d 256 return(true);
kevman 0:014fad4dfb9d 257
kevman 0:014fad4dfb9d 258 }
kevman 0:014fad4dfb9d 259 /****************************************************************
kevman 0:014fad4dfb9d 260 SetSwHpZero
kevman 0:014fad4dfb9d 261
kevman 0:014fad4dfb9d 262 Schaltet die Eingänge der Rauschverstärker auf Null, damit eine
kevman 0:014fad4dfb9d 263 Impuls durch das Umschalten eines Bereiches nicht den Hochpass
kevman 0:014fad4dfb9d 264 ausstuert
kevman 0:014fad4dfb9d 265 ****************************************************************/
kevman 0:014fad4dfb9d 266 void SetSwitchHpZero(int nType)
kevman 0:014fad4dfb9d 267 {
kevman 0:014fad4dfb9d 268 #ifdef ECN
kevman 0:014fad4dfb9d 269 g_fCheckSpecial = true;
kevman 0:014fad4dfb9d 270 if(nType == 0) // IRange Umschaltung
kevman 0:014fad4dfb9d 271 {
kevman 0:014fad4dfb9d 272 SwHpZero = true;
kevman 0:014fad4dfb9d 273 g_nSpzFktSwitchIRange = 2; // 2 steht für 500ms
kevman 0:014fad4dfb9d 274 g_fSpzFktSwitchIRange = true;
kevman 0:014fad4dfb9d 275 g_nSpzFktSwitchNoiseGain = 10; // 1/2Sekunde
kevman 0:014fad4dfb9d 276 g_fSpzFktSwitchNoiseGain = true;
kevman 0:014fad4dfb9d 277 }
kevman 0:014fad4dfb9d 278 else if(nType == 1) // Noise Gain Umschaltung
kevman 0:014fad4dfb9d 279 {
kevman 0:014fad4dfb9d 280 // g_nSpzFktSwitchNoiseGain = 50; // 1.5 Sekunde
kevman 0:014fad4dfb9d 281 // g_fSpzFktSwitchNoiseGain = true;
kevman 0:014fad4dfb9d 282 }
kevman 0:014fad4dfb9d 283 #endif
kevman 0:014fad4dfb9d 284 }
kevman 0:014fad4dfb9d 285
kevman 0:014fad4dfb9d 286 /****************************************************************
kevman 0:014fad4dfb9d 287 * WriteToRefPort
kevman 0:014fad4dfb9d 288 *
kevman 0:014fad4dfb9d 289 Schreibt SPI Daten an das Schieberegister über CsRef
kevman 0:014fad4dfb9d 290 ****************************************************************/
kevman 0:014fad4dfb9d 291 void WriteToSpiPort(unsigned char Pt)
kevman 0:014fad4dfb9d 292 {
kevman 0:014fad4dfb9d 293 uint8_t mask = 0x80;
kevman 0:014fad4dfb9d 294 uint8_t i;
kevman 0:014fad4dfb9d 295 Port = Pt;
kevman 0:014fad4dfb9d 296
kevman 0:014fad4dfb9d 297 for(i=0;i<8;i++)
kevman 0:014fad4dfb9d 298 {
kevman 0:014fad4dfb9d 299 DaSckDown();
kevman 0:014fad4dfb9d 300 g_nDelayCounter = 1;
kevman 0:014fad4dfb9d 301 g_nDelayCounter = 2;
kevman 0:014fad4dfb9d 302 g_nDelayCounter = 3;
kevman 0:014fad4dfb9d 303 g_nDelayCounter = 4;
kevman 0:014fad4dfb9d 304 if((Port & mask) == mask)
kevman 0:014fad4dfb9d 305 DaMosiUp();
kevman 0:014fad4dfb9d 306 else
kevman 0:014fad4dfb9d 307 DaMosiDown();
kevman 0:014fad4dfb9d 308 g_nDelayCounter = 1;
kevman 0:014fad4dfb9d 309 g_nDelayCounter = 2;
kevman 0:014fad4dfb9d 310 g_nDelayCounter = 3;
kevman 0:014fad4dfb9d 311 g_nDelayCounter = 4;
kevman 0:014fad4dfb9d 312 DaSckUp();
kevman 0:014fad4dfb9d 313 g_nDelayCounter = 1;
kevman 0:014fad4dfb9d 314 g_nDelayCounter = 2;
kevman 0:014fad4dfb9d 315 g_nDelayCounter = 5;
kevman 0:014fad4dfb9d 316 g_nDelayCounter = 6;
kevman 0:014fad4dfb9d 317 mask = (mask >> 1);
kevman 0:014fad4dfb9d 318 }
kevman 0:014fad4dfb9d 319 }
kevman 0:014fad4dfb9d 320
kevman 0:014fad4dfb9d 321 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 322 ChangeMittelValue: Ändert den Mittelwert und alles drumherum
kevman 0:014fad4dfb9d 323 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 324 int ChangeMittelValue()
kevman 0:014fad4dfb9d 325 {
kevman 0:014fad4dfb9d 326 m_fChangeMittelValue = false;
kevman 0:014fad4dfb9d 327 MVars.nMwMittelVal = MVars.m_nStoreMwIntervall; // nimmt jetzt das voreingstellte Intervall
kevman 0:014fad4dfb9d 328 MVars.nMwPerBlock = NsRate.nNewSendeRate / 2;
kevman 0:014fad4dfb9d 329 // printf("Neuer Mittelwert: %d Neuer Blockwert: %d\n",MVars.nMwMittelVal,MVars.nMwPerBlock);
kevman 0:014fad4dfb9d 330 m_fFallBack = NsRate.fFallBack;
kevman 0:014fad4dfb9d 331 nFallBackCounter = 0;
kevman 0:014fad4dfb9d 332 #ifdef PGU_POTI
kevman 0:014fad4dfb9d 333 if(NsRate.nNewAutoRange < 3)
kevman 0:014fad4dfb9d 334 {
kevman 0:014fad4dfb9d 335 if(NsRate.nNewAutoRange != IRange.AutoRange[0])
kevman 0:014fad4dfb9d 336 {
kevman 0:014fad4dfb9d 337 NsRate.nOldAutoRange = IRange.AutoRange[0];
kevman 0:014fad4dfb9d 338 IRange.AutoRange[0] = NsRate.nNewAutoRange;
kevman 0:014fad4dfb9d 339 }
kevman 0:014fad4dfb9d 340 }
kevman 0:014fad4dfb9d 341 if(NsRate.nNewRange != -1)
kevman 0:014fad4dfb9d 342 {
kevman 0:014fad4dfb9d 343 IRange.AktRange[0] = NsRate.nNewRange;
kevman 0:014fad4dfb9d 344 SetIRange(0,IRange.AktRange[0]);
kevman 0:014fad4dfb9d 345 }
kevman 0:014fad4dfb9d 346 #endif
kevman 0:014fad4dfb9d 347 return(true);
kevman 0:014fad4dfb9d 348 }
kevman 0:014fad4dfb9d 349 /****************************************************************
kevman 0:014fad4dfb9d 350 * SetWe
kevman 0:014fad4dfb9d 351 *
kevman 0:014fad4dfb9d 352 * Setzen verschied. WorkingElektroden
kevman 0:014fad4dfb9d 353 *
kevman 0:014fad4dfb9d 354 * WeSelect wäre & 0xE7 löscht die beiden Eingänge des Multiplexers und
kevman 0:014fad4dfb9d 355 setzt damit die WE 1 und | 0x18 setzt beide Eingänge auf high, das wäre die WE 4
kevman 0:014fad4dfb9d 356 ***************************************************************/
kevman 0:014fad4dfb9d 357
kevman 0:014fad4dfb9d 358 void SetWe(UINT8 WeRange)
kevman 0:014fad4dfb9d 359 {
kevman 0:014fad4dfb9d 360 #ifdef PGU_TOUCH
kevman 0:014fad4dfb9d 361 UINT8 Range;
kevman 0:014fad4dfb9d 362 Range = WeRange;
kevman 0:014fad4dfb9d 363
kevman 0:014fad4dfb9d 364 ReInitPtc16_17();
kevman 0:014fad4dfb9d 365 CsCurrentDown(); // low aktiv
kevman 0:014fad4dfb9d 366 #if defined REV_1B || defined REV_1D
kevman 0:014fad4dfb9d 367 MVars.nCurrentPort &= 0xE7;
kevman 0:014fad4dfb9d 368 #else
kevman 0:014fad4dfb9d 369 MVars.nCurrentPort &= 0xCF; // ist jetzt auf Bit 4 und Bit 5
kevman 0:014fad4dfb9d 370 #endif
kevman 0:014fad4dfb9d 371 MVars.nCurrentPort |= Range;
kevman 0:014fad4dfb9d 372 WriteToSpiPort(MVars.nCurrentPort);
kevman 0:014fad4dfb9d 373 CsCurrentUp(); // low aktiv
kevman 0:014fad4dfb9d 374 #endif
kevman 0:014fad4dfb9d 375 }
kevman 0:014fad4dfb9d 376
kevman 0:014fad4dfb9d 377
kevman 0:014fad4dfb9d 378
kevman 0:014fad4dfb9d 379 /****************************************************************
kevman 0:014fad4dfb9d 380 * GeIstGe
kevman 0:014fad4dfb9d 381 *
kevman 0:014fad4dfb9d 382 *
kevman 0:014fad4dfb9d 383 ***************************************************************/
kevman 0:014fad4dfb9d 384
kevman 0:014fad4dfb9d 385 void SetGe(UINT8 State)
kevman 0:014fad4dfb9d 386 {
kevman 0:014fad4dfb9d 387 UINT8 Value;
kevman 0:014fad4dfb9d 388 /* Schaltet den Ausgang GE auf den Schirm der WE. Das Signal WeSchirm hat nun den
kevman 0:014fad4dfb9d 389 Ausgang Gegenelektrode. Solange wie SwWeSchirm auf Low, hat das keinen Effekt
kevman 0:014fad4dfb9d 390 ist WeSchirm auf High, dann wird die Klemme, welche den WeSchirm nach aussen bringt,
kevman 0:014fad4dfb9d 391 auf die Ge geschaltet.
kevman 0:014fad4dfb9d 392 D.h. LPR mit CoulCount Sensor bedeutet:
kevman 0:014fad4dfb9d 393 SetGe(1); (SwGeWeSchirm auf high)
kevman 0:014fad4dfb9d 394 SwWeSchirm(1) (SwWeSchirm auf high)
kevman 0:014fad4dfb9d 395 Für CoulCount muss SwWeSchirm(0) gesetzt werden, sonst liegt der Schirm nicht auf GND
kevman 0:014fad4dfb9d 396
kevman 0:014fad4dfb9d 397 */
kevman 0:014fad4dfb9d 398 #ifdef PGU_TOUCH
kevman 0:014fad4dfb9d 399
kevman 0:014fad4dfb9d 400 ReInitPtc16_17();
kevman 0:014fad4dfb9d 401 CsCurrentDown(); // low aktiv
kevman 0:014fad4dfb9d 402 #if defined REV_1B || defined REV_1D
kevman 0:014fad4dfb9d 403 MVars.nCurrentPort &= 0xBF;
kevman 0:014fad4dfb9d 404 #else
kevman 0:014fad4dfb9d 405 MVars.nCurrentPort &= 0x7F;
kevman 0:014fad4dfb9d 406 #endif
kevman 0:014fad4dfb9d 407 if(State == 1)
kevman 0:014fad4dfb9d 408 {
kevman 0:014fad4dfb9d 409 #if defined REV_1B || defined REV_1D
kevman 0:014fad4dfb9d 410 Value = 0x40;
kevman 0:014fad4dfb9d 411 #else
kevman 0:014fad4dfb9d 412 Value = 0x80;
kevman 0:014fad4dfb9d 413 #endif
kevman 0:014fad4dfb9d 414 MVars.nCurrentPort |= Value;
kevman 0:014fad4dfb9d 415 }
kevman 0:014fad4dfb9d 416 WriteToSpiPort(MVars.nCurrentPort);
kevman 0:014fad4dfb9d 417 CsCurrentUp(); // low aktiv
kevman 0:014fad4dfb9d 418 #endif
kevman 0:014fad4dfb9d 419 }
kevman 0:014fad4dfb9d 420
kevman 0:014fad4dfb9d 421 /****************************************************************
kevman 0:014fad4dfb9d 422 * ClearWeSchirm
kevman 0:014fad4dfb9d 423 * Um den Ausgang des Summierverstärkers über IZelle auf die Gegenelektrode zu schalten,
kevman 0:014fad4dfb9d 424 muss SwGeWeSchirm auf Low sein.
kevman 0:014fad4dfb9d 425 Der Anschluss WeSchirm (Klemme K4 nach aussen) liegt auf GND, wenn SwWeSchirm auf Low ist. Damit
kevman 0:014fad4dfb9d 426 wirkt der Anschluss entweder als zusätzlicher Schirm oder er kann für die zweite Elektrode zur Strommessung verwendet
kevman 0:014fad4dfb9d 427 werden. Soll eine außenstromlose Messung mit zwei WE durchgeführt werden, dann ist SwWeSchirm vor der Messung auf high zu halten.
kevman 0:014fad4dfb9d 428 Entsprechend ist SwGeWeSchirm auf low zu halten, da sonst der Anschluss auf die Gegenelektrode gehen könnte (aber nur, wenn
kevman 0:014fad4dfb9d 429 SwIZelle = high, sonst hängt der Eingang in der Luft (soll er auch damit kein Strom fließt).
kevman 0:014fad4dfb9d 430
kevman 0:014fad4dfb9d 431 Ist SwWeSchirm auf High, dann ist der Eingang der WE-S zunächt offen, es sei denn, SwGeWeSchirm ist auch high. Dann ist die zweite
kevman 0:014fad4dfb9d 432 WE als GE geschaltet.
kevman 0:014fad4dfb9d 433 1. Die Gegenelektrode ist ganz normal an dem Ausgang des Summierverstärkers: SwGeWeSchirm ist auf low, SwWeSchirm auch low.
kevman 0:014fad4dfb9d 434 WeSchirm liegt auf GND. Ist eine Elektrode angeschlossen und eingetaucht, dann fließt sofort ein Kurzschlussstrom.
kevman 0:014fad4dfb9d 435 2. Die zweite WE ist offen (SwWeSchirm = high). Dann kann sie als Gegenelektrode genutzt werden, wenn SwGeWeSchirm auch auf high ist,
kevman 0:014fad4dfb9d 436 muss aber nicht.
kevman 0:014fad4dfb9d 437 Einstellungen für CoulCount:
kevman 0:014fad4dfb9d 438 - Vor Beginn der Messung muss SwWeSchirm auf high sein, damit der Anschluss offen ist. SwGeWeSchirm ist low, damit die Gegenelektrode da nicht
kevman 0:014fad4dfb9d 439 dran kann.
kevman 0:014fad4dfb9d 440 Wird die Messung gestartet, dann wird SwWeSchirm auf Low geschaltet. Damit wird der Strommesskreis kurzgeschlossen.
kevman 0:014fad4dfb9d 441 Einstellungen für LPR:
kevman 0:014fad4dfb9d 442 - Wird der gleiche Sensor wie für CoulCount auch für LPR genommen, dann ist SwWeSchirm und SwGeWeSchirm auf high zu schalten.
kevman 0:014fad4dfb9d 443 Mit Beginn des Polarisierens wird IZelle auf high gesetzt, damit wird die zweite WE des Sensors als GE geschaltet.
kevman 0:014fad4dfb9d 444
kevman 0:014fad4dfb9d 445 *
kevman 0:014fad4dfb9d 446 ***************************************************************/
kevman 0:014fad4dfb9d 447 void SetWeSchirm(UINT8 State)
kevman 0:014fad4dfb9d 448 {
kevman 0:014fad4dfb9d 449 #ifdef PGU_TOUCH
kevman 0:014fad4dfb9d 450 UINT8 Value;
kevman 0:014fad4dfb9d 451 // if State == low ZRA Messung, SwWeSchirm auf low
kevman 0:014fad4dfb9d 452
kevman 0:014fad4dfb9d 453 ReInitPtc16_17();
kevman 0:014fad4dfb9d 454 CsCurrentDown(); // low aktiv
kevman 0:014fad4dfb9d 455 #if defined REV_1B || defined REV_1D
kevman 0:014fad4dfb9d 456 MVars.nCurrentPort &= 0xDF;
kevman 0:014fad4dfb9d 457 #else
kevman 0:014fad4dfb9d 458 MVars.nCurrentPort &= 0xBF;
kevman 0:014fad4dfb9d 459 #endif
kevman 0:014fad4dfb9d 460 if(State == 1) // wird auf GE geschaltet, WE ist GE /
kevman 0:014fad4dfb9d 461 {
kevman 0:014fad4dfb9d 462 #if defined REV_1B || defined REV_1D
kevman 0:014fad4dfb9d 463 Value = 0x20;
kevman 0:014fad4dfb9d 464 #else
kevman 0:014fad4dfb9d 465 Value = 0x40;
kevman 0:014fad4dfb9d 466 #endif
kevman 0:014fad4dfb9d 467 MVars.nCurrentPort |= Value;
kevman 0:014fad4dfb9d 468 }
kevman 0:014fad4dfb9d 469
kevman 0:014fad4dfb9d 470 WriteToSpiPort(MVars.nCurrentPort);
kevman 0:014fad4dfb9d 471 CsCurrentUp(); // low aktiv
kevman 0:014fad4dfb9d 472 #endif
kevman 0:014fad4dfb9d 473 }
kevman 0:014fad4dfb9d 474
kevman 0:014fad4dfb9d 475 /****************************************************************
kevman 0:014fad4dfb9d 476 * SquareOffsetDown
kevman 0:014fad4dfb9d 477 * 0 setzt den Offset des Sinusgenerators auf Sinus und Dreieck.
kevman 0:014fad4dfb9d 478 um den Generator auf Recheck zusetzen, ist SwitchWaveForm auf true
kevman 0:014fad4dfb9d 479 zu setzen. Damit wird der Offset verschoben und an das Rechtecksignal
kevman 0:014fad4dfb9d 480 angepasst.
kevman 0:014fad4dfb9d 481 *
kevman 0:014fad4dfb9d 482 ***************************************************************/
kevman 0:014fad4dfb9d 483 void SetSquareOffset(int State)
kevman 0:014fad4dfb9d 484 {
kevman 0:014fad4dfb9d 485 #ifdef PGU_TOUCH
kevman 0:014fad4dfb9d 486 SwitchWaveForm = State;
kevman 0:014fad4dfb9d 487 #endif
kevman 0:014fad4dfb9d 488 }
kevman 0:014fad4dfb9d 489
kevman 0:014fad4dfb9d 490
kevman 0:014fad4dfb9d 491
kevman 0:014fad4dfb9d 492
kevman 0:014fad4dfb9d 493