'************************************************************************* '* RX-Steuerung LAUFT !!! * '* * '*-- Version V02a * '* - Anpassungen an neues Board und an 1x16 LCD * '* * '************************************************************************* '************************************************************************* '*Allgemeine Definitionen * '************************************************************************* $regfile = "M168def.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 40 '************************************************************************* ' EEPromwerte beim Brennen speichern * '************************************************************************* $eeprom Data 1404% , 500% , 1 , 1 , 1 , 0 , 0 , 0 ' 10 Bytes '************************************************************************* '* LCD-Einstellungen * '************************************************************************* Config Lcdpin = Pin , Rs = Portb.6 , E = Portb.7 , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 Config Lcdbus = 4 Config Lcd = 16 * 1a '************************************************************************* '* ADC -Einstellungen * '************************************************************************* Config Adc = Single , Prescaler = Auto , Reference = Avcc Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 '************************************************************************* '* Timer -Einstellungen * '************************************************************************* Config Timer1 = Timer , Prescale = 8 'konfiguriere Timer1 Enable Timer1 'schalte Den Timer1 Overflow -interrupt Ein '************************************************************************* ' Ein und Ausgänge * ' IÝC-Leitungen * '************************************************************************* ' Tasten ' Ab Alias Pind.2 ' Auf Taste PD2 (pin 4) ' Auf Alias Pind.3 ' Ab Taste PD3 (pin 5) ' Auf / AB nicht deklariert, weil in der ISR das nicht funzt, nur mit direkten ' Registerangaben. Menue-Taste lässt sich direkt abfragen Menu Alias Pind.4 ' Menu Taste PD4 (pin 32) Config Pind.2 = Input Config Pind.3 = Input Config Pind.4 = Input Portd.2 = 1 ' Pullups einschalten Portd.3 = 1 ' Pullups einschalten Portd.4 = 1 ' Pullups einschalten Config Int1 = Change ' an Pind.3 auf Wechsel warten ' IÝC-Leitungen Config Pinc.4 = Output ' beim jetztigen Board noch vertauscht, damit Config Pinc.5 = Output ' ist nur SOFT IIC möglich Config Scl = Portc.4 Config Sda = Portc.5 Portc.4 = 1 ' Pullups einschalten Portc.5 = 1 ' Pullups einschalten ' Leitungen für ADF4001 Config Pinc.0 = Output Config Pinc.1 = Output Config Pinc.2 = Output Tt_le Alias Portc.2 ' TT-Enable Tt_dat Alias Portc.1 ' TT-Daten Tt_clk Alias Portc.0 ' TT-Clock ' Leitungen Config Pinc.3 = Input Config Pinb.4 = Output Config Pinb.5 = Output Mux Alias Portb.0 ' ADF4001 Ausgang Pol Alias Portb.5 ' Videopolarität Led Alias Portb.4 ' LCD - Beleuchtung '************************************************************************* '* Variable '************************************************************************* Dim Plus As Bit ' als Interrupt flags Dim Minus As Bit Dim Fmhz As Word ' MHz-Anteil der Frequenzausgabe Dim Fkhz As Word ' kHz-Anteil der Frequenzausgabe Dim Temp As Word Dim Sp_pll As Word Dim Pllstat As Byte Locked Alias Pllstat.6 Dim Schrittweite As Byte ' 1=125kHz, 2=250kHz, 4=500kHz, 8=1MHz ' 16=2MHz 32=4MHz, 64=8MHz Dim I2c_sp(4) As Byte Dim Tt_prog As Word ' 11 Bit Prog-Counter Dim Tt_prog1 As Word ' 11 Bit Prog-Counter Dim Tt_n As Word Dim Tt_mhz As Word Dim Tt_khz As Word Dim Flags As Byte Lock_bit Alias Flags.0 Polaritaet Alias Flags.1 Lcd_o_i Alias Flags.2 Dim Menuenr As Byte Dim Lcdtimer As Byte Dim Text As String * 16 '************************************************************************* ' Konstanten für SP5055 '************************************************************************* Const Addr1 = &HC2 ' %11000010=$C2 immer gültige I2C-Schreib-Adresse SP5055 Const Addr2 = &HC3 ' %11000011=$C3 immer gültige I2C-Lese-Adresse SP5055 '************************************************************************* ' Konstanten für ADF 4001 '************************************************************************* ' Init-byte ' 76543210 76543210 76543210 ' Inhalt : 00000000 00000000 10010111 ' I_Byte3 I_Byte2 I_Byte1 Dim I_byte3 As Byte Dim I_byte2 As Byte Dim I_byte1 As Byte I_byte3 = &B0000_0000 I_byte2 = &B0000_0000 I_byte1 = &B1001_0111 ' Func-byte ' gleicher Inhalt wie Initbyte , bis auf Control-Bits, werden hier nicht verwendet ' 76543210 76543210 76543210 ' Inhalt : 00000000 00000000 10010110 (neu) ' F_Byte3 F_Byte2 F_Byte1 'Const F_byte3 = 0 'Const F_byte2 = 0 'Const F_byte1 = 150 ' N-Count-byte ' 76543210 76543210 76543210 ' Inhalt: 000NNNNN NNNNNNNN 00000001 ' N_Byte3 N_Byte2 N_Byte1 Dim N_byte1 As Byte N_byte1 = &B0000_0001 ' Audio Teiler bei 10 MHz = 8000 5MHz = 4000 ' Ref-count_byte ' 76543210 76543210 76543210 ' Inhalt: 00000000 RRRRRRRR RRRRRR00 ' 10010110 000000 ' R_Byte3 R_Byte2 R_Byte1 ' R= Ref-Quarz(12MHz)/1,25kHz = 9600 Dim R_byte3 As Byte Dim R_byte2 As Byte Dim R_byte1 As Byte R_byte3 = &B0000_0000 R_byte2 = &B1001_0110 R_byte1 = &B0000_0000 '************************************************************************* ' Konstanten '************************************************************************* Const Maxmenue = 8 '12345567890123456 Const Menue0 = "Frequenzanzeige" Const Menue1 = "Schrittweite" Const Menue2 = "Tontraeger QRG" Const Menue3 = "Video Pos/Neg" Const Menue4 = "Lockbit" Const Menue5 = "AGC-Spannung" Const Menue6 = "LCD-Beleuchtung" Const Menue7 = " L E E R " Const Menue8 = " L E E R " Const Mhz = "MHZ" Const Khz = "KHZ" Const Null = "0" Const Pkt = "." Const Leer = " " Const Ein = "EIN" Const Aus = "AUS" Const Titel = "ATV-RX V03a" Const Versionsnummer = "DL1MFK 04/2011" Const Vpos = "Positiv" Const Vneg = "Negativ" '************************************************************************* '* Initialisierung: '************************************************************************* Cursor Off Noblink Cls ' Clear LCD screen Lcd Titel ' Was zum lesen ' Lowerline Waitms 500 Cls ' Lcd Versionsnummer Enable Int1 Enable Interrupts On Int1 Noble_encoder 'Isr1 'Noble_encoder On Timer1 Isr2 Wait 1 ' für 3 Sekunden Menuenr = 0 I2cinit Readeeprom Sp_pll , 0 ' Aktuellen PLL-Faktor aus dem EEProm lesen Gosub Write_sp5055 ' PLL setzen Readeeprom Tt_prog , 2 ' Tonträger lesen Gosub Leitung ' setzen Readeeprom Schrittweite , 4 ' Schrittweite einlesen Readeeprom Flags , 5 ' Div. Flags Pol = Polaritaet Led = Lcd_o_i Cls '************************************************************************* '* Hauptprogramm: '************************************************************************* Main: Main_1: Gosub Write_sp5055 Writeeeprom Sp_pll , 0 ' geänderte Werte sichern Gosub Berechnen ' Berechnen und anzeigen der Frequenz Do If Lock_bit = 1 Then Gosub Read_sp5055 Locate 2 , 8 If Locked = 1 Then Lcd "L" If Locked = 0 Then Lcd "X" End If If Plus = 1 Then Goto Rauf If Minus = 1 Then Goto Runter If Menu = 0 Then Waitms 200 Goto Menue End If Loop '**************************************************************** ' Rauf-Berechnung * '**************************************************************** Rauf: Plus = 0 Sp_pll = Sp_pll + Schrittweite If Sp_pll > 28000 Then Sp_pll = 3200 Goto Main_1 '**************************************************************** ' Runter-Berechnung * '**************************************************************** Runter: Minus = 0 Sp_pll = Sp_pll - Schrittweite If 3200 > Sp_pll Then Sp_pll = 28000 Goto Main_1 '**************************************************************** ' Menü * '**************************************************************** Menue: Cls Select Case Menuenr Case 1 Lcd Menue1 'Lowerline ' Lcd Menue2 Case 2 Lcd Menue2 'Lowerline 'Lcd Menue3 Case 3 Lcd Menue3 ' Lowerline ' Lcd Menue4 Case 4 Lcd Menue4 'Lowerline 'Lcd Menue5 Case 5 Lcd Menue5 'Lowerline 'Lcd Menue6 Case 6 Lcd Menue6 'Lowerline 'Lcd Menue7 Case 7 Lcd Menue7 'Lowerline 'Lcd Menue8 Case 8 Lcd Menue8 'Lowerline 'Lcd Menue0 Case Else Lcd Menue0 ' Lowerline ' Lcd Menue1 End Select Do If Plus = 1 Then Incr Menuenr If Menuenr > Maxmenue Then Menuenr = 0 Plus = 0 Goto Menue End If If Minus = 1 Then Decr Menuenr If Menuenr > Maxmenue Then Menuenr = Maxmenue Minus = 0 Goto Menue End If If Menu = 0 Then Waitms 200 Select Case Menuenr Case 1 Goto Umenue1 Case 2 Goto Umenue2 Case 3 Goto Umenue3 Case 4 Goto Umenue4 Case 5 Goto Umenue5 Case 6 Goto Umenue6 Case 7 Goto Umenue7 Case 8 Goto Umenue8 Case Else Goto Main End Select End If Loop '**************************************************************** ' Schrittweiten-Menü * '**************************************************************** Umenue1: Schrittweiter: Plus = 0 Cls ' Lcd Menue1 ' Lowerline Home Temp = 125 * Schrittweite Lcd Temp Lcd Khz Schrittweiter_1: If Plus = 1 Then Goto Sw_rauf If Minus = 1 Then Goto Sw_runter If Menu = 0 Then Writeeeprom Schrittweite , 4 ' geänderte Werte sichern Waitms 200 Goto Menue End If Goto Schrittweiter_1 Sw_rauf: Plus = 0 Schrittweite = Schrittweite * 2 If Schrittweite > 64 Then Schrittweite = 1 Goto Schrittweiter Sw_runter: Minus = 0 If Schrittweite = 1 Then Schrittweite = 128 Schrittweite = Schrittweite / 2 Goto Schrittweiter Goto Menue '**************************************************************** ' Tontraeger_Einstellungen * '**************************************************************** Umenue2: Tontraeger_einstellung: Minus = 0 Gosub Tt_anzeigen Tontraeger_einstellung_1: If Plus = 1 Then Goto Tt_rauf If Minus = 1 Then Goto Tt_runter If Menu = 0 Then Waitms 200 Goto Menue End If Goto Tontraeger_einstellung_1 Tt_rauf: Plus = 0 If Tt_prog >= 8000 Then Tt_prog = 4000 ' =10MHz TT Tt_prog = Tt_prog + 8 ' +10 kHz Goto Tt_raus Tt_runter: Minus = 0 If 4000 >= Tt_prog Then Tt_prog = 8000 ' =5 MHz TT Tt_prog = Tt_prog - 8 ' -10kHz Tt_raus: Gosub Leitung Goto Tontraeger_einstellung '**************************************************************** ' Video Pos/Neg * '**************************************************************** Umenue3: Waitms 50 Cls ' Lcd Menue3 Umschalten_u3: ' Lowerline ' 2. Zeile Home If Polaritaet = 0 Then Lcd Vneg Else Lcd Vpos End If Osd_anzeige_u3: If Plus = 1 Then Toggle Polaritaet Pol = Polaritaet Plus = 0 Goto Umschalten_u3 End If If Minus = 1 Then Toggle Polaritaet Pol = Polaritaet Minus = 0 Goto Umschalten_u3 End If If Menu = 0 Then Writeeeprom Flags , 5 ' geänderte Werte sichern Waitms 200 Goto Menue End If Goto Osd_anzeige_u3 '**************************************************************** ' Lock_Bit An/Aus * '**************************************************************** Umenue4: Waitms 50 Cls ' Lcd Menue4 Umschalten_u4: ' Lowerline ' 2. Zeile Home If Lock_bit = 0 Then Lcd Aus Else Lcd Ein End If Osd_anzeige_u4: If Plus = 1 Then Toggle Lock_bit Plus = 0 Goto Umschalten_u4 End If If Minus = 1 Then Toggle Lock_bit Minus = 0 Goto Umschalten_u4 End If If Menu = 0 Then Writeeeprom Flags , 5 ' geänderte Werte sichern Waitms 200 Goto Menue End If Goto Osd_anzeige_u4 '**************************************************************** ' AGC-Messung * '**************************************************************** Dim Messergebnis As Word Dim Volt As Single Umenue5: Start Adc Cls Umschalten_5: Messergebnis = Getadc(6) Volt = Messergebnis * Adc_multi Home Lcd Volt Lcd " V" Waitms 50 If Menu = 0 Then Stop Adc Waitms 200 Goto Menue End If Goto Umschalten_5 '**************************************************************** ' Hintergrundbeleuchtung Ein Aus * '**************************************************************** Umenue6: Waitms 50 Cls ' Lcd Menue4 Umschalten_u6: ' Lowerline ' 2. Zeile Home If Lcd_o_i = 0 Then Lcd Aus Led = 0 Else Lcd Ein Led = 1 End If Led_u6: If Plus = 1 Then Toggle Lcd_o_i Plus = 0 Goto Umschalten_u6 End If If Minus = 1 Then Toggle Lcd_o_i Minus = 0 Goto Umschalten_u6 End If If Menu = 0 Then Writeeeprom Flags , 5 ' geänderte Werte sichern Waitms 200 Goto Menue End If Goto Led_u6 '**************************************************************** ' Umenue * '**************************************************************** Umenue7: Goto Menue '**************************************************************** ' Umenue * '**************************************************************** Umenue8: Goto Menue '**************************************************************** ' Tontraeger_Anzeigen * '**************************************************************** Tt_anzeigen: Tt_mhz = Tt_prog / 800 ' /1000 weil 1 khz ' Tt_khz = Tt_prog Mod 800 ' Oszillator ca 27MHz Tt_khz = Tt_khz / 8 Cls ' Lcd Menue2 ' Lowerline Text = "" If Tt_mhz < 10 Then Text = Leer End If Text = Text + Str(tt_mhz) Text = Text + Pkt ' If Tt_khz < 100 Then ' Text = Text + Null ' End If If Tt_khz < 10 Then Text = Text + Null End If Text = Text + Str(tt_khz) Text = Text + Null Text = Text + Mhz Lcd Text Return '**************************************************************** ' Berechnen des Teilerfaktors * '**************************************************************** Berechnen: Fmhz = Sp_pll - 3836 ' 125/1000 = 8 Fmhz = Fmhz / 8 Fkhz = Sp_pll - 3836 ' Rest berechnen Fkhz = Fkhz Mod 8 Fkhz = Fkhz * 125 ' * 125 kHz '**************************************************************** ' Anzeigen der Frequenz * '**************************************************************** 'Anzeigen: Cls Text = "" If Fmhz < 1000 Then Text = Leer If Fmhz < 100 Then Text = Text + Leer If Fmhz < 10 Then Text = Text + Leer End If End If End If Text = Text + Str(fmhz) ' zeige MHz an Text = Text + Pkt ' zeige MHz an If Fkhz < 100 Then Text = Text + Null If Fkhz < 10 Then Text = Text + Null End If End If Text = Text + Str(fkhz) + Mhz ' zeige khz an Lcd Text ' Lcd " " ' Lcd Sp_pll 'SchrittweitenAnzeige: ' Lowerline ' Lcd "Step " ' Temp = 125 * Schrittweite ' Lcd Temp ' Lcd Khz Return '**************************************************************** ' Daten auf die Leitung zur Tonträger-PLL MB1501 schicken * '**************************************************************** Leitung: Writeeeprom Tt_prog , 2 ' Teiler im EEProm sichern Reset Tt_le Shiftout Tt_dat , Tt_clk , I_byte3 , 1 Shiftout Tt_dat , Tt_clk , I_byte2 , 1 Shiftout Tt_dat , Tt_clk , I_byte1 , 1 Gosub Sr_lesen Shiftout Tt_dat , Tt_clk , R_byte3 , 1 Shiftout Tt_dat , Tt_clk , R_byte2 , 1 Shiftout Tt_dat , Tt_clk , R_byte1 , 1 Gosub Sr_lesen Tt_prog1 = Tt_prog + 61 '=76,125kHz ZF Shiftout Tt_dat , Tt_clk , Tt_prog1 , 1 Shiftout Tt_dat , Tt_clk , N_byte1 , 1 Sr_lesen: Waitus 12 Set Tt_le Waitus 12 Reset Tt_le Return '**************************************************************** ' SP-I2C-Routinen * '**************************************************************** Write_sp5055: I2cstart I2cwbyte Addr1 Temp = High(sp_pll) I2cwbyte Temp Temp = Low(sp_pll) I2cwbyte Temp Temp = &HCE I2cwbyte Temp Temp = 0 I2cwbyte Temp I2cstop Return Read_sp5055: I2cstart I2cwbyte Addr2 I2crbyte Pllstat , Nack I2cstop Return '**************************************************************** '* Interrupt Services * '**************************************************************** Isr1: If Pind.3 = Pind.4 Then Minus = 1 Plus = 0 Else Plus = 1 Minus = 0 ' Flag setzen End If 'Waitms 1 Lcdtimer = 0 If Lcd_o_i = 1 Then Led = 1 Return Isr1s: ' Encoder Auswertung If Pind.2 = 1 Then If Pind.3 = 1 Then Minus = 0 Plus = 1 End If If Pind.3 = 0 Then Plus = 0 Minus = 1 End If Else If Pind.3 = 1 Then Plus = 0 Minus = 1 End If If Pind.3 = 0 Then Minus = 0 Plus = 1 End If End If Waitms 1 Lcdtimer = 0 If Lcd_o_i = 1 Then Led = 1 Return Isr1a: ' Encoder Auswertung If Pind.2 = 1 Then If Pind.3 = 1 Then Minus = 1 Plus = 0 End If If Pind.3 = 0 Then Plus = 1 Minus = 0 End If Else If Pind.3 = 1 Then Plus = 1 Minus = 0 End If If Pind.3 = 0 Then Minus = 1 Plus = 0 End If End If Waitms 1 Lcdtimer = 0 If Lcd_o_i = 1 Then Led = 1 Return Noble_encoder: 'um Zustände der Phasen zu speichern Dim Ph_b As Bit Dim Ph_a As Bit Dim Ph_b_alt As Bit 'mit Entprellen des Drehgebers über Software Flipflop If Pind.3 = 1 And Pind.2 = 1 Then Set Ph_b If Pind.3 = 0 And Pind.2 = 0 Then Reset Ph_b If Pind.3 = 0 And Pind.2 = 1 Then Set Ph_a If Pind.3 = 1 And Pind.2 = 0 Then Reset Ph_a 'Auswertung des Drehgebers If Ph_b <> Ph_b_alt Then If Ph_b = 1 And Ph_a = 1 Then Plus = 0 Minus = 1 End If If Ph_b = 0 And Ph_a = 1 Then Plus = 1 Minus = 0 End If Ph_b_alt = Ph_b End If 'Waitms 1 Lcdtimer = 0 If Lcd_o_i = 1 Then Led = 1 Return Isr2: ' Timer1 Auswertung Decr Lcdtimer If Lcdtimer = 0 Then Led = 0 End If Return End 'end program