$lib "lcd4e2.lbx" 'ersetzt die Standard LCD Bibliothek $regfile = "m168def.dat" $crystal = 8000000 $hwstack = 160 $swstack = 160 $framesize = 24 'Display konfigurieren Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , E2 = Portd.0 , Rs = Portb.4 Config Lcd = 40 * 4 Config Lcdbus = 4 'ADC Deklaration Config Adc = Single , Prescaler = Auto 'SPI Deklaration 'Config Spi = Soft , Din = None , Dout = Portc.3 , Ss = None , Clock = Portb.6 'Pinkonfiguration Config Portb.7 = Output 'SPI enable Rechteck Config Portc.4 = Output 'SPI Enable Spannung Config Portc.5 = Output 'SPI enable Strom Config Portc.6 = Output 'Frequenz Config Portd.0 = Output Config Portd.1 = Output 'Funktionselect DC Config Portd.2 = Output 'Funktionselect Rechteck Config Pind.3 = Input 'Eingabetaste lo Config Pind.4 = Input 'Eingabetaste lu Config Pind.5 = Input 'Eingabetaste ro Config Pind.6 = Input 'Eingabetaste rm Config Pind.7 = Input 'Eingabetaste ru 'Variablendeklaration Dim Frequenz As Integer Dim Spannungswert As Single 'Anzeigewert Spannung Dim Rspannungswert As Single 'Anzeigewert Rechteckspannung Dim Stromwert As Single ' Anzeigewert Strom Dim Dc As Bit 'DC Mode =1 Rechteck =0 Dim Vspannung As Integer 'Vorwahlwert Spannung Dim Vstrom As Integer 'Vorwahlwert Strom Dim Vrspannung As Integer 'Vorwahlwert R Spannung Dim Spannung As Byte Dim Strom As Byte Dim Rspannung As Byte Dim Run As Bit Dim ___lcde As Byte 'Alias Erstellungen Lo Alias Pind.3 Lu Alias Pind.4 Ro Alias Pind.5 Rm Alias Pind.6 Ru Alias Pind.7 Frequenzout Alias Portc.6 'Frequenzausgang Spienablespannung Alias Portc.4 'enable Spannungspoti Spienablestrom Alias Portc.5 'enable Strompoti Spienablerspannung Alias Portb.7 'enable R Spannungspoti Dcmode Alias Portd.1 Rmode Alias Portd.2 'UnterprogrammDeklaration Declare Sub Einstellungen Declare Sub Dceinstellungen Declare Sub Reinstellungen Declare Sub Dcbetrieb Declare Sub Rbetrieb Declare Sub Mbetrieb 'Menüs '--------------------------------------------------------------- 'Herstellen der Startbedingungen 'Standard Modus DC 'Startfrequenz beim Anschalten = 50 Hz 'Spannung beim Einschalten 15 VDC = 1/2 Umax 'Strom beim Einschalten ca 0,35 A = 1/8 Imax` 'Spannung Rechteck ca 5 V Dc = 1 Frequenz = 50 Vspannung = 32 Vrspannung = 32 Vstrom = 16 ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 12 'Erzeugt den Startupbildschirm Lcd "Labor Netzgeraet" Locate 2 , 7 Lcd "H.Bohnsack/S.Doebel IKT 2010" ___lcde = 1 'unteren beiden Zeilen Cls Locate 2 , 13 Lcd "bitte warten..." Waitms 25000 Hauptprogramm: Do 'Hauptschleife endlos Spannungswert = 30 / 256 'Berechnung der Werte für Mode Anzeige Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 1024 Stromwert = Stromwert * Vstrom Rspannungswert = 30 / 256 Rspannungswert = Rspannungswert * Vrspannung ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 'Bildschirmausgaben Lcd "Hauptmenü" Locate 2 , 7 'Modeausgabe erstellen If Dc = 1 Then Lcd "DC " Locate 2 , 11 Lcd Spannungswert Locate 2 , 15 Lcd " V, " Locate 2 , 18 Lcd Stromwert Locate 2 , 22 Lcd " A" Elseif Dc = 0 Then Lcd "Rechteck 0 - " Locate 2 , 20 Lcd Rspannungswert Locate 2 , 24 Lcd " V, " Locate 2 , 28 Lcd Frequenz Locate 2 , 32 Lcd " Hz" End If ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 26 Lcd "Einstellungen>" Locate 2 , 32 Lcd "Betrieb>" If Rm = 1 Then Gosub Einstellungen End If If Ru = 1 Then If Dc = 1 Then Gosub Dcbetrieb 'DC= 1: DCBetriebsmenü sonst Rechteckbetriebmenü Elseif Dc = 0 Then Gosub Rbetrieb End If End If Loop '------------------------------------------------------------------ Sub Einstellungen 'Erzeugt das Einstellungsmenü ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 'Bildschirmausgaben Lcd "Einstellungen" Locate 1 , 33 Lcd "Zurück>" Locate 2 , 7 'Modeausgabe erstellen If Dc = 1 Then Lcd "DC " Locate 2 , 11 Lcd Spannungswert Locate 2 , 15 Lcd " V, " Locate 2 , 18 Lcd Stromwert Locate 2 , 22 Lcd " A" Elseif Dc = 0 Then Lcd "Rechteck 0 - " Locate 2 , 20 Lcd Rspannungswert Locate 2 , 24 Lcd " V, " Locate 2 , 28 Lcd Frequenz Locate 2 , 32 Lcd " Hz" End If ___lcde = 1 'untere beiden Zeilen Cls Locate 1 , 1 Lcd "" Do If Lu = 1 Then Gosub Reinstellungen 'Sprung ins Rechteck Einstellungsmenü End If If Ru = 1 Then Gosub Dceinstellungen 'Sprung in DC Einstellungsmenü End If If Ro = 1 Then Gosub Hauptprogramm 'Zurück ins Hauptprogramm End If Loop End Sub '-------------------------------------------------------------------- Sub Dceinstellungen 'Erzeugt das DC Einstellungsmenü ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 'Bildschirmausgaben Lcd "Gleichspannung" Locate 1 , 37 Lcd "OK>" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 1 Lcd "< -" Locate 1 , 37 Lcd "+ >" Locate 2 , 1 Lcd "< -" Locate 2 , 37 Lcd "+ >" Do 'Spannungseinstellung wenn Wert zwischen 0 und 255 bleibt While Lo = 1 If Vspannung >= 1 Then Vspannung = Vspannung - 1 End If Waitms 200 Wend While Rm = 1 If Vspannung <= 254 Then Vspannung = Vspannung + 1 End If Waitms 200 Wend 'Stromeinstellung wenn Wert zwischen 0 und 255 bleibt While Lu = 1 If Vstrom >= 1 Then Vstrom = Vstrom - 1 End If Waitms 200 Wend While Ru = 1 If Vstrom <= 254 Then Vstrom = Vstrom + 1 End If Waitms 200 Wend Spannungswert = 30 / 256 Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 256 Stromwert = Stromwert * Vstrom ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 17 'Werteausgabe Lcd Spannungswert , " V" Locate 2 , 17 Lcd Stromwert , " A" Loop Until Ro = 1 'bis OK Dc = 1 'DC Mode =1 Rechteck =0 Gosub Hauptprogramm 'Rücksprung ins Hauptmenü End Sub '----------------------------------------------------------------- Sub Reinstellungen 'Erzeugt das Rechteckeinstellungsmenü ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 'Bildschirmausgaben Lcd "Rechteckspannung" Locate 1 , 37 Lcd "OK>" Lcd "< -" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 37 Lcd "+ >" Locate 2 , 1 Lcd "< -" Locate 2 , 37 Lcd "+ >" Do 'Spannungseinstellung nur wenn Wert zwischen 0 und 255 bleibt While Lo = 1 If Vrspannung >= 1 Then Vrspannung = Vrspannung - 1 End If Waitms 200 Wend While Rm = 1 If Vrspannung <= 256 Then Vrspannung = Vrspannung + 1 End If Waitms 200 Wend 'Frequenzeinstellung wenn Wert größer als 0 bleibt While Lu = 1 If Frequenz >= 1 Then Frequenz = Frequenz - 1 End If Waitms 200 Wend ' While Ru = 1 Frequenz = Frequenz + 1 Waitms 200 Wend Rspannungswert = 30 / 256 Rspannungswert = Rspannungswert * Vrspannung ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 17 'Ausgabe der Werte Lcd Rspannungswert , " V" Locate 2 , 17 Lcd Frequenz , " Hz" Loop Until Ro = 1 'bis OK Dc = 0 'DC Mode =1 Rechteck =0 Gosub Hauptprogramm 'Rücksprung ins Hauptmenü End Sub '----------------------------------------------------------------- Sub Dcbetrieb 'Erzeugt DC Automatikbetrieb Dim Rueckspannung As Byte 'Spannungrückkopplung Dim Rueckstrom As Byte 'Stromrückkopplung Strom = Vstrom Spannung = Vspannung Dcmode = 1 'Relais an Ausgang legen und DC Betriebsled anschalten Do Spannungswert = 30 / 256 Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 256 Stromwert = Stromwert * Vstrom If Run = 0 Then ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 Lcd "Betrieb DC Auto STBY" Locate 1 , 33 Lcd "Zurück>" Locate 2 , 12 'Ausgabe der Werte Lcd Spannungswert , " V/" Locate 2 , 18 Lcd Stromwert , " A" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 34 Lcd "Start>" Do If Rm = 1 Then Run = 1 End If 'einschalten If Ro = 1 Then Dcmode = 0 End If Gosub Hauptprogramm 'rücksprung ins Hauptmenü Loop Until Run = 1 Elseif Run = 1 Then ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 Lcd "Betrieb DC Auto" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 1 'Ausgabe der Werte Lcd Spannungswert , " V/" Locate 1 , 6 Lcd Stromwert , " A" Locate 1 , 35 Lcd "Stop>" Locate 2 , 32 Lcd "Manuell>" Do 'Betriebsschleife 'SPI Befehle Spienablestrom = 1 Spiinit Spiout Strom , 1 'Stromwert senden Spienablestrom = 0 Spienablespannung = 1 'Spannungswert senden Spiout Spannung , 1 Spienablespannung = 0 'ADC Befehle Start Adc Rueckspannung = Getadc(1 ) Rueckstrom = Getadc(2) Stop Adc If Rm = 1 Then Run = 0 End If 'stopbedingung If Ru = 1 Then Gosub Mbetrieb 'sprung zum Manuellbetrieb End If 'Vergleicher und Anpassung If Rueckspannung < Vspannung Then Spannung = Spannung + 1 End If If Rueckspannung > Vspannung Then Spannung = Spannung - 1 End If If Rueckstrom < Vstrom Then Strom = Strom + 1 End If If Rueckstrom > Vstrom Then Strom = Strom - 1 End If Loop Until Run = 0 'bis Stop End If Loop End Sub '------------------------------------------------------------------- Sub Rbetrieb 'Erzeugt Rechteckbetrieb Rmode = 1 'Relais an Ausgang legen und RBetriebsled anschalten Dim Freqpause As Integer 'Variable zur Frequnezsteuerung Rspannung = Vrspannung Rspannungswert = 20 / 256 Rspannungswert = Rspannungswert * Vrspannung Do If Run = 0 Then ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 Lcd "Betrieb Rechteck STBY" Locate 1 , 33 Lcd "Zurück>" Locate 2 , 13 Lcd "0 - " , Rspannungswert , " V" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 24 Lcd "Start>" Do ' Frequenzeinstellung wenn Wert größer 0 bleibt While Lu = 1 If Frequenz >= 2 Then Frequenz = Frequenz - 1 End If Waitms 200 Wend While Ru = 1 Frequenz = Frequenz + 1 Waitms 200 Wend Locate 2 , 17 Lcd Frequenz , " Hz" If Rm = 1 Then Run = 1 'Einschalten End If If Ro = 1 Then Gosub Hauptprogramm 'Rücksprung Hauptmenü End If Loop Until Run = 1 Elseif Run = 1 Then ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 Lcd "Betrieb Rechteck" Locate 2 , 13 Lcd "0 - " , Rspannungswert , " V" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 25 Lcd "Stop>" Locate 2 , 1 Lcd "< -" Locate 2 , 37 Lcd "+ >" 'SPI Befehle Spienablerspannung = 1 'Spannungswert senden Spiout Rspannung , 1 Spienablerspannung = 0 Do 'Betriebsschleife If Rm = 1 Then Run = 0 'Stop Bedingung End If 'Frequenzeinstellung wenn Wert größer 0 bleibt If Lu = 1 Then If Frequenz >= 1 Then Frequenz = Frequenz - 1 End If End If If Ru = 1 Then Frequenz = Frequenz + 1 End If Locate 4 , 17 Lcd Frequenz , " Hz" Freqpause = 1 / Frequenz 'Berechnung der 1/2 Periodendauer in MS Freqpause = Freqpause * 500 Waitms Freqpause Frequenzout = 1 Waitms Freqpause Frequenzout = 0 'ADC Befehle Start Adc Rueckspannung = Getadc(3 ) Stop Adc 'Vergleicher und Anpassung If Rueckspannung < Vrspannung Then Rspannung = Rspannung + 1 End If If Rueckspannung > Vrspannung Then Rspannung = Rspannung - 1 End If Loop Until Run = 0 'bis Stop End If Loop End Sub '----------------------------------------------------------------- Sub Mbetrieb 'Erzeugt DC Manuell Betrieb ___lcde = 0 'oberen beiden Zeilen Cls Locate 1 , 1 Lcd "Betrieb DC MAN" ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 1 Lcd "< -" Locate 1 , 37 Lcd "+ >" Locate 2 , 1 Lcd "< -" Locate 2 , 37 Lcd "+ >" Do 'Spannungseinstellung nur wenn Wert zwischen 0 und 255 bleibt While Lo = 1 If Vspannung >= 1 Then Vspannung = Vspannung - 1 End If Wend While Rm = 1 If Vspannung <= 254 Then Vspannung = Vspannung + 1 End If Wend 'Stromeinstellung nur wenn Wert zwischen 0 und 255 bleibt While Lu = 1 If Vstrom >= 1 Then Vstrom = Vstrom - 1 End If Wend While Ru = 1 If Vstrom <= 254 Then Vstrom = Vstrom + 1 End If Wend Spannungswert = 30 / 256 Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 256 Stromwert = Stromwert * Vstrom ___lcde = 1 'unteren beiden Zeilen Cls Locate 1 , 17 'Ausgabe der Werte Lcd Spannungswert , " V" Locate 2 , 17 Lcd Stromwert , " A" Spiinit Spiout Strom , 1 'Stromwert senden Spienablestrom = 0 Spienablespannung = 1 'Spannungswert senden Spiout Spannung , 1 Spienablespannung = 0 'ADC Befehle Start Adc Rueckspannung = Getadc(1 ) Rueckstrom = Getadc(2) Stop Adc 'Vergleicher und Anpassung If Rueckspannung < Vspannung Then Spannung = Spannung + 1 End If If Rueckspannung > Vspannung Then Spannung = Spannung - 1 End If If Rueckstrom < Vstrom Then Strom = Strom + 1 End If If Rueckstrom > Vstrom Then Strom = Strom - 1 End If Loop Until Ro = 1 'bis zurück Gosub Dcbetrieb 'Rücksprung DC Betriebsmenü End Sub