Test

Dependencies:   mbed-dev-OS5_10_4

Revision:
0:014fad4dfb9d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Dio.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,493 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: Dio.CPP
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+                 
+
+Funktion:      Digital In/Out auf LPC1768
+
+Modified: 
+
+2016-06  UFa: Aenderungen aufgrund HW-Revision:
+               a) Anpassungen in Fkt "SetIRange"
+               b) Neue Funktionen (ersetzen z.T. entsp. Macros)
+                - SetWe()
+                - GeIstGe()
+                - ClearWeSchirm()
+                - SquareOffsetDown()
+                                    
+-------------------------------------------------------------------------------
+*/
+#include "Headers.h"
+
+//#define Spi0IsMisoUp()  (LPC_GPIOA->FIOPIN & 0x00020000)
+//#define Spi0IsMisoDown()  (LPC_GPIOA->FIOPIN & ~0x00020000)
+
+BYTE Port; 
+#ifdef PGU_EDUCATION
+DigitalOut SwPot(PTB20);
+DigitalOut SwGal(PTC10);
+DigitalOut SwGe(PTC11);
+#endif
+DigitalOut DoStatusLed(PTA1);
+
+
+/*-------------------------------------------------------------------------------
+Initialisieren der Schaltkontakte
+-------------------------------------------------------------------------------*/
+int InitDio(void)
+{
+    
+    
+#ifdef TOUCH_DISPLAY    
+    TftDisp.nTagVWriteCounter = 0; 
+    TftDisp.nTagVReadCounter = 0; 
+    g_fInCalibrationMode = false;
+#endif    
+
+#ifndef PGU_RPA
+    g_fCheckSpecial = false;
+    g_fSpzFktSwitchIRange = false;
+    g_fSpzFktSwitchNoiseGain = false;
+    
+    Setk(4,0);
+    Setk(5,0);
+    
+	printf("Now SwitchRanges.\n");
+
+	SwitchRangesOnStart();
+	printf("Now SetIRange.\n");
+	SetIRange(0,0);
+#endif
+#ifdef PGU_TOUCH
+    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
+    SetGe(0);
+    SetWeSchirm(1); // auf 1 damit die Leitung offen ist und keinen Fehler verursacht
+    
+    SetSinGainDefault();  // setzt die Verstärker auf Defaultwerte
+    SetNoiseGainDefault(); // damit werden auch die Cs Signale auf Default gesetzt
+
+    SetSquareOffset(0);  // Setzt den Offset für Sinuns und Dreieck
+    
+    SinGenOff();  // Setzt den AD9833 auf Reset und den Cs auf high
+#endif
+
+	printf("Now Return.\n");
+     return(true);
+}
+/****************************************************************
+ * SetNoiseGainDefault:
+ *
+ * Setzt die Rauschverstärker Defaultwert. Default ist hier der 
+   größte Wert, damit wird das Signal am Ausgang minimal. Je größer der 
+   Wert vom X9C103, desto kleiner die Amplitude vom Sinus. 
+   Die Position vom X9C103 ist 100, der Index von den Verstärkungsfaktoren
+   ist 0
+ ****************************************************************/
+int SetNoiseGainDefault()
+{
+    int i;
+    
+#ifdef ECN
+    SwHpZero = true;  // erst mal kurzschließen, damit der nicht so ausschlägt
+    CsUNoiseGain = false;
+    CsINoiseGain = false;
+    DpUpDown = true;
+    short_delay(50);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    
+    for(i=0;i<=100;i++)
+    {
+        DpIncrement = false;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+        DpIncrement = true;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    }
+    GCount.nUNoisePos = 100;
+    GCount.nINoisePos = 100;
+    GCount.nUnGainItem = 0;
+    GCount.nInGainItem = 0;
+    
+    CsUNoiseGain = true;
+    CsINoiseGain = true;
+#endif	
+    return(true);
+}
+/****************************************************************
+ * SetSinGainDefault:
+ *
+ * Setzt den Signalverstärker für Sinus auf Default. Default ist hier der 
+   kleinste Wert, damit wird das Signal am Ausgang minimal. Je kleiner der 
+   Wert vom X9C103, desto kleiner die Amplitude vom Sinus. 
+   Die Position vom X9C103 ist 1, der Index von den Verstärkungsfaktoren
+   ist 4
+ ****************************************************************/
+int SetSinGainDefault()
+{
+    int i;
+    
+#ifdef SINE_GEN
+    CsSinGain = false;
+    DpUpDown = false;
+    short_delay(50);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    
+    for(i=0;i<=100;i++)
+    {
+        DpIncrement = false;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+        DpIncrement = true;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    }
+    GCount.nSinGainPos = 1;
+    GCount.nSinGainItem = 4;
+    
+    CsSinGain = true;
+#endif	
+    return(true);
+}
+
+/****************************************************************
+ * ReadInput
+ *
+ * Liest das Inputbit des Tasters
+ ****************************************************************/
+int ReadInput()
+{
+/*     if(Spi0IsMisoUp())
+    if(ExtStart)
+        return true;  // 
+    else */
+        return false;
+}
+/****************************************************************
+ * SetBaVariablen:
+ * Wird von SetK aufgerufen und setzt die Variablen Mv[i].Circuit und Mv[i].BetriebsArt
+ * damit andeer Programmstellen wissen in welchem Mode die Kiste ist. 
+ ****************************************************************/
+int SetBaVariablen(int Nr, bool Level)
+{
+
+    if(Nr == MVars.SwitchChn[0])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        if(Level == HIGH)
+            Mv[0].Circuit = 1;
+        else
+            Mv[0].Circuit = 0;
+    }
+    if(Nr == MVars.SwitchChn[1])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        if(Level == HIGH)
+            Mv[0].BetriebsArt = 1;
+        else
+            Mv[0].BetriebsArt = 0;
+    }
+    return(true);
+}
+
+
+/****************************************************************
+ * Setk
+ *
+ * Setzten eines Kontaktes. Die Betriebsart und Circuit wird hier auch gesetzt
+ ****************************************************************/
+int Setk(int Nr, bool Level)
+{
+//    uint8_t mask = 0x80;
+
+#ifdef PGU_EDUCATION
+//    uint8_t mask = 0x80;
+    SetBaVariablen(Nr, Level);
+    if(Nr == 4) // I-Zelle
+        SwGe = Level;
+    else if(Nr == 5)
+    {
+        if(Level == false)
+        {
+            SwPot = true;
+            SwGal = false;
+        }
+        else // if(Level == false)
+        {
+            SwPot = false;
+            SwGal = true;
+        }
+    }
+#endif
+#ifdef PGU_POTI		// wenn ein Potentiostat angeschlossen ist
+    if(Nr == MVars.SwitchChn[0])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        if(Level == HIGH)
+        {
+            g_nSendDisableTimer = 1000;
+            SetSwitchHpZero(0);
+            Mv[0].Circuit = 1;
+            SkIzUp();
+            if(IRange.AutoRange[0] < 2) 
+            {
+                    IRange.m_fCheckRange = true;
+            }
+            nSwitchDownCount[0] = EcmIni.DelayAfterSwitchUp;  // beim Rauschen deutlich laenger
+        }
+        else
+        {
+            IRange.m_fCheckRange = false;
+            Mv[0].Circuit = 0;
+            SkIzDown();
+        }
+    }
+    if(Nr == MVars.SwitchChn[1])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        
+        if(Level == HIGH)
+        {
+            Mv[0].BetriebsArt = 1;
+            PotGalUp();
+        }
+        else
+        {
+            Mv[0].BetriebsArt = 0;
+            PotGalDown();
+        }
+    }
+#endif	
+    return(true);
+
+}
+/****************************************************************
+SetSwHpZero
+
+Schaltet die Eingänge der Rauschverstärker auf Null, damit eine 
+Impuls durch das Umschalten eines Bereiches nicht den Hochpass 
+ausstuert
+****************************************************************/
+void SetSwitchHpZero(int nType)
+{
+#ifdef ECN
+    g_fCheckSpecial = true;
+    if(nType == 0)  // IRange Umschaltung
+    {
+        SwHpZero = true;    
+        g_nSpzFktSwitchIRange = 2;  // 2 steht für 500ms 
+        g_fSpzFktSwitchIRange = true;
+        g_nSpzFktSwitchNoiseGain = 10;  // 1/2Sekunde
+        g_fSpzFktSwitchNoiseGain = true;
+    }
+    else if(nType == 1)  // Noise Gain Umschaltung
+    {
+//        g_nSpzFktSwitchNoiseGain = 50;  // 1.5 Sekunde
+//        g_fSpzFktSwitchNoiseGain = true;
+    }
+#endif	
+}
+
+/****************************************************************
+ * WriteToRefPort
+ *
+ Schreibt SPI Daten an das Schieberegister über CsRef
+****************************************************************/
+void WriteToSpiPort(unsigned char Pt)
+{
+    uint8_t mask = 0x80;
+    uint8_t i;
+    Port = Pt;
+    
+    for(i=0;i<8;i++)
+    {
+        DaSckDown();
+        g_nDelayCounter = 1;
+        g_nDelayCounter = 2;
+        g_nDelayCounter = 3;
+        g_nDelayCounter = 4;
+        if((Port & mask) == mask)
+        	DaMosiUp();
+        else
+        	DaMosiDown();
+        g_nDelayCounter = 1;
+        g_nDelayCounter = 2;
+        g_nDelayCounter = 3;
+        g_nDelayCounter = 4;
+        DaSckUp();
+        g_nDelayCounter = 1;
+        g_nDelayCounter = 2;
+        g_nDelayCounter = 5;    
+        g_nDelayCounter = 6;
+        mask = (mask >> 1);
+    }
+}
+
+/*-------------------------------------------------------------------------------
+ChangeMittelValue: Ändert den Mittelwert und alles drumherum
+-------------------------------------------------------------------------------*/
+int ChangeMittelValue()
+{
+    m_fChangeMittelValue = false;
+    MVars.nMwMittelVal = MVars.m_nStoreMwIntervall; // nimmt jetzt das voreingstellte Intervall
+    MVars.nMwPerBlock = NsRate.nNewSendeRate / 2;
+//    printf("Neuer Mittelwert: %d Neuer Blockwert: %d\n",MVars.nMwMittelVal,MVars.nMwPerBlock);
+    m_fFallBack = NsRate.fFallBack;
+    nFallBackCounter = 0;
+#ifdef PGU_POTI    
+    if(NsRate.nNewAutoRange < 3)
+    {
+        if(NsRate.nNewAutoRange != IRange.AutoRange[0])
+        {
+            NsRate.nOldAutoRange = IRange.AutoRange[0];
+            IRange.AutoRange[0] = NsRate.nNewAutoRange;
+        }
+    }
+    if(NsRate.nNewRange != -1)
+    {
+        IRange.AktRange[0] = NsRate.nNewRange;
+        SetIRange(0,IRange.AktRange[0]);
+    }
+#endif    
+    return(true);
+}
+/****************************************************************
+ * SetWe
+ *
+ * Setzen verschied. WorkingElektroden
+ *
+ *   WeSelect wäre  & 0xE7 löscht die beiden Eingänge des Multiplexers und
+ setzt damit die WE 1  und | 0x18 setzt beide Eingänge auf high, das wäre die WE 4 
+***************************************************************/
+
+void SetWe(UINT8 WeRange)
+{
+#ifdef PGU_TOUCH
+    UINT8 Range;
+    Range = WeRange;
+
+    ReInitPtc16_17();
+    CsCurrentDown();  // low aktiv
+#if defined REV_1B || defined REV_1D
+    MVars.nCurrentPort &= 0xE7;
+#else
+    MVars.nCurrentPort &= 0xCF; // ist jetzt auf Bit 4 und Bit 5
+#endif
+    MVars.nCurrentPort |= Range;
+    WriteToSpiPort(MVars.nCurrentPort);
+    CsCurrentUp();  // low aktiv
+#endif
+}
+
+
+
+/****************************************************************
+ * GeIstGe
+ *
+ * 
+***************************************************************/
+
+void SetGe(UINT8 State)
+{
+    UINT8 Value;
+/*  Schaltet den Ausgang GE auf den Schirm der WE. Das Signal WeSchirm hat nun den 
+ Ausgang Gegenelektrode. Solange wie SwWeSchirm auf Low, hat das keinen Effekt
+ ist WeSchirm auf High, dann wird die Klemme, welche den WeSchirm nach aussen bringt, 
+ auf die Ge geschaltet. 
+ D.h. LPR mit CoulCount Sensor bedeutet: 
+ SetGe(1); (SwGeWeSchirm auf high)
+ SwWeSchirm(1)   (SwWeSchirm auf high)
+ Für CoulCount muss SwWeSchirm(0) gesetzt werden, sonst liegt der Schirm nicht auf GND
+ 
+ */
+#ifdef PGU_TOUCH
+     
+    ReInitPtc16_17();
+    CsCurrentDown();  // low aktiv
+	#if defined REV_1B || defined REV_1D
+		MVars.nCurrentPort &= 0xBF;
+	#else
+		MVars.nCurrentPort &= 0x7F;
+	#endif
+		if(State == 1)  
+		{
+	#if defined REV_1B || defined REV_1D
+			Value = 0x40;
+	#else
+			Value = 0x80;
+	#endif
+        MVars.nCurrentPort |= Value;
+    }    
+     WriteToSpiPort(MVars.nCurrentPort);
+    CsCurrentUp();  // low aktiv
+#endif	
+}
+
+/****************************************************************
+ * ClearWeSchirm
+ * Um den Ausgang des Summierverstärkers über IZelle auf die Gegenelektrode zu schalten, 
+ muss SwGeWeSchirm auf Low sein. 
+ Der Anschluss WeSchirm (Klemme K4 nach aussen) liegt auf GND, wenn SwWeSchirm auf Low ist. Damit 
+ wirkt der Anschluss entweder als zusätzlicher Schirm oder er kann für die zweite Elektrode zur Strommessung verwendet
+ werden. Soll eine außenstromlose Messung mit zwei WE durchgeführt werden, dann ist SwWeSchirm vor der Messung auf high zu halten.
+ Entsprechend ist SwGeWeSchirm auf low zu halten, da sonst der Anschluss auf die Gegenelektrode gehen könnte (aber nur, wenn 
+ SwIZelle = high, sonst hängt der Eingang in der Luft (soll er auch damit kein Strom fließt).
+ 
+ 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 
+ WE als GE geschaltet. 
+ 1. Die Gegenelektrode ist ganz normal an dem Ausgang des Summierverstärkers: SwGeWeSchirm ist auf low, SwWeSchirm auch low. 
+    WeSchirm liegt auf GND. Ist eine Elektrode angeschlossen und eingetaucht, dann fließt sofort ein Kurzschlussstrom.
+2.  Die zweite WE ist offen (SwWeSchirm = high). Dann kann sie als Gegenelektrode genutzt werden, wenn SwGeWeSchirm auch auf high ist,
+    muss aber nicht. 
+Einstellungen für CoulCount: 
+- Vor Beginn der Messung muss SwWeSchirm auf high sein, damit der Anschluss offen ist. SwGeWeSchirm ist low, damit die Gegenelektrode da nicht
+  dran kann.
+  Wird die Messung gestartet, dann wird SwWeSchirm auf Low geschaltet. Damit wird der Strommesskreis kurzgeschlossen. 
+Einstellungen für LPR: 
+- Wird der gleiche Sensor wie für CoulCount auch für LPR genommen, dann ist SwWeSchirm und SwGeWeSchirm auf high zu schalten. 
+  Mit Beginn des Polarisierens wird IZelle auf high gesetzt, damit wird die zweite WE des Sensors als GE geschaltet. 
+  
+ * 
+***************************************************************/
+void SetWeSchirm(UINT8 State)
+{
+#ifdef PGU_TOUCH
+    UINT8 Value;
+//  if State == low     ZRA Messung, SwWeSchirm auf low    
+
+    ReInitPtc16_17();
+    CsCurrentDown();  // low aktiv
+	#if defined REV_1B || defined REV_1D
+    MVars.nCurrentPort &= 0xDF;
+	#else
+    MVars.nCurrentPort &= 0xBF;
+	#endif
+    if(State == 1)  // wird auf GE geschaltet, WE ist GE / 
+    {
+	#if defined REV_1B || defined REV_1D
+        Value = 0x20;
+	#else
+        Value = 0x40;
+	#endif
+        MVars.nCurrentPort |= Value;
+    }    
+
+    WriteToSpiPort(MVars.nCurrentPort);
+    CsCurrentUp();  // low aktiv
+#endif	
+}
+
+/****************************************************************
+ * SquareOffsetDown
+ * 0 setzt den Offset des Sinusgenerators auf Sinus und Dreieck. 
+ um den Generator auf Recheck zusetzen, ist SwitchWaveForm auf true 
+ zu setzen. Damit wird der Offset verschoben und an das Rechtecksignal 
+ angepasst. 
+ * 
+***************************************************************/
+void SetSquareOffset(int State)
+{
+#ifdef PGU_TOUCH
+    SwitchWaveForm = State;
+#endif	
+}
+
+
+
+
+