$regfile = "m168def.dat" $crystal = 11095000 $lib "glcdKS108.lib" 'Display konfigurieren Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , 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 Run As Bit '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 '------------------------------------------------------------------ Sub Einstellungen 'Erzeugt das Einstellungsmenü 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 Locate 3 , 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 Goto Hauptprogramm 'Zurück ins Hauptprogramm End If Loop End Sub '-------------------------------------------------------------------- Sub Dceinstellungen 'Erzeugt das DC Einstellungsmenü Cls Locate 1 , 1 'Bildschirmausgaben Lcd "Gleichspannung" Locate 1 , 37 Lcd "OK>" Locate 3 , 1 Lcd "< -" Locate 3 , 37 Lcd "+ >" Locate 4 , 1 Lcd "< -" Locate 4 , 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 <= 1023 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 <= 1023 Then Vstrom = Vstrom + 1 End If Waitms 200 Wend Spannungswert = 30 / 1024 Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 1024 Stromwert = Stromwert * Vstrom Locate 3 , 17 'Werteausgabe Lcd Spannungswert , " V" Locate 4 , 17 Lcd Stromwert , " A" Loop Until Ro = 1 'bis OK Dc = 1 'DC Mode =1 Rechteck =0 Goto Hauptprogramm 'Rücksprung ins Hauptmenü End Sub '----------------------------------------------------------------- Sub Reinstellungen 'Erzeugt das Rechteckeinstellungsmenü Cls Locate 1 , 1 'Bildschirmausgaben Lcd "Rechteckspannung" Locate 1 , 37 Lcd "OK>" Lcd "< -" Locate 3 , 37 Lcd "+ >" Locate 4 , 1 Lcd "< -" Locate 4 , 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 <= 1023 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 / 1024 Rspannungswert = Rspannungswert * Vrspannung Locate 3 , 17 'Ausgabe der Werte Lcd Rspannungswert , " V" Locate 4 , 17 Lcd Frequenz , " Hz" Loop Until Ro = 1 'bis OK Dc = 0 'DC Mode =1 Rechteck =0 Goto Hauptprogramm 'Rücksprung ins Hauptmenü End Sub '----------------------------------------------------------------- Sub Dcbetrieb 'Erzeugt DC Automatikbetrieb Dim Strom As Integer 'Stromwert SPI Dim Spannung As Integer 'Spannungswert SPI Dim Rueckspannung As Integer 'Spannungrückkopplung Dim Rueckstrom As Integer 'Stromrückkopplung Dcmode = 1 'Relais an Ausgang legen und DC Betriebsled anschalten Do Spannungswert = 30 / 1024 Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 1024 Stromwert = Stromwert * Vstrom If Run = 0 Then 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" Locate 3 , 34 Lcd "Start>" Do If Rm = 1 Then Run = 1 End If 'einschalten If Ro = 1 Then Dcmode = 0 End If Goto Hauptprogramm 'rücksprung ins Hauptmenü Loop Until Run = 1 Elseif Run = 1 Then Cls Locate 1 , 1 Lcd "Betrieb DC Auto" Locate 3 , 1 'Ausgabe der Werte Lcd Spannungswert , " V/" Locate 3 , 6 Lcd Stromwert , " A" Locate 3 , 35 Lcd "Stop>" Locate 4 , 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 Rspannung As Integer 'Spannungswert SPI Dim Freqpause As Integer 'Variable zur Frequnezsteuerung Rspannungswert = 20 / 1024 Rspannungswert = Rspannungswert * Vrspannung Do If Run = 0 Then Cls Locate 1 , 1 Lcd "Betrieb Rechteck STBY" Locate 1 , 33 Lcd "Zurück>" Locate 2 , 13 Lcd "0 - " , Rspannungswert , " V" Locate 3 , 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 4 , 17 Lcd Frequenz , " Hz" If Rm = 1 Then Run = 1 'Einschalten End If If Ro = 1 Then Goto Hauptprogramm 'Rücksprung Hauptmenü End If Loop Until Run = 1 Elseif Run = 1 Then Cls Locate 1 , 1 Lcd "Betrieb Rechteck" Locate 2 , 13 Lcd "0 - " , Rspannungswert , " V" Locate 3 , 25 Lcd "Stop>" Locate 4 , 1 Lcd "< -" Locate 4 , 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 Cls Locate 1 , 1 Lcd "Betrieb DC MAN" Locate 3 , 1 Lcd "< -" Locate 3 , 37 Lcd "+ >" Locate 4 , 1 Lcd "< -" Locate 4 , 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 <= 1023 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 <= 1023 Then Vstrom = Vstrom + 1 End If Wend Spannungswert = 30 / 1024 Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 1024 Stromwert = Stromwert * Vstrom Locate 3 , 17 'Ausgabe der Werte Lcd Spannungswert , " V" Locate 4 , 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 '--------------------------------------------------------------- '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 = 256 Vrspannung = 128 Vstrom = 64 Locate 1 , 12 'Erzeugt den Startupbildschirm Lcd "Labor Netzgeraet" Locate 2 , 7 Lcd "H.Bohnsack/S.Doebel IKT 2010" Locate 4 , 13 Lcd "bitte warten..." Waitms 25000 Hauptprogramm: Do 'Hauptschleife endlos Spannungswert = 30 / 1024 'Berechnung der Werte für Mode Anzeige Spannungswert = Spannungswert * Vspannung Stromwert = 3 / 1024 Stromwert = Stromwert * Vstrom Rspannungswert = 30 / 1024 Rspannungswert = Rspannungswert * Vrspannung 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 Locate 3 , 26 Lcd "Einstellungen>" Locate 4 , 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 'end program