Test
Dependencies: mbed-dev-OS5_10_4
MySources/Dio.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 | ------------------------------------------------------------------------------- |
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 |