'**************************************************************** ' UNI-PLL mit Tastern * ' * ' -- Version 1r 17.09.2007 * ' - Encoder eingebaut und OSD funzt jetzt richtig * ' - neue Menueführung wird eingebaut * ' * * ' -- Version 1a 16.10.2006 * ' - Portiert auf Bascom ATMega8 * ' * ' * '**************************************************************** '**************************************************************** ' Prozessor relevante Einstellungen * '**************************************************************** $regfile = "M8def.dat" $crystal = 8000000 $baud = 19200 '**************************************************************** ' EEPromwerte beim Brennen speichern * '**************************************************************** Eepromdaten: $eeprom Data 11548% , 3950% , 3250% , 3300% , 3350% , 3400% , 12% , 19% $data '**************************************************************** ' LCD-Leitungen * '**************************************************************** 'in order for simulation to work correct, you need to specify the used pins 'for lcd4.lbx, the pins are fixed 'Rs = PortB.0 'RW = PortB.1 we dont use the R/W option of the LCD in this version so connect to ground 'E = PortB.2 'E2 = PortB.3 optional for lcd with 2 chips 'Db4 = PortB.4 the data bits must be in a nibble to save code 'Db5 = PortB.5 'Db6 = PortB.6 'Db7 = PortB.7 Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 Config Lcdbus = 4 Config Lcd = 16 * 2 '**************************************************************** ' Ein und Ausgänge * ' I²C-Leitungen * '**************************************************************** ' Tasten Ab Alias Pind.2 ' Auf Taste RA3 (pin 2) 'Auf Alias Pind.3 ' Ab Taste RA4 (pin 3) Menu Alias Pind.4 ' Menu Taste RB0 (pin 6) Config Pind.2 = Input Config Pind.3 = Input Config Pind.4 = Input 'Pullups einschalten Portd.2 = 1 Portd.3 = 1 Portd.4 = 1 Config Int1 = Change ' an Pind.2 auf Flanke warten ' I²C-Leitungen Config Pinc.4 = Output Config Pinc.5 = Output Config Scl = Portc.5 Config Sda = Portc.4 ' Enable-Leitungen für MB5101 Config Pinb.6 = Output Config Pinb.7 = Output Config Pind.5 = Output Config Pind.6 = Output Config Pind.7 = Output Config Pinc.0 = Output Config Pinc.1 = Output Config Pinc.2 = Output Config Pinc.3 = Output T_o_dat Alias Portc.0 ' TT-Daten RB1 (pin 23) T_o_clk Alias Portc.1 ' TT-Clock RB2 (pin 124) Tt_le_1 Alias Portc.2 ' TT0-Latch-Enable Tt_le_2 Alias Portb.6 ' TT1-Latch-Enable RA2 (pin 1) Tt_le_3 Alias Portb.7 ' TT2-Latch-Enable RA6 (pin 15) Tt_le_4 Alias Portd.5 ' TT3-Latch-Enable RA7 (pin 16) Tt_le_5 Alias Portd.6 ' TT4-Latch-Enable RB1 (pin 7) Tt_le_6 Alias Portd.7 ' TT5-Latch-Enable RB1 (pin 7) Osd_en Alias Portc.3 ' OSD Enable '**************************************************************** ' Variable * '**************************************************************** Dim Plus As Bit ' als Interrupt flags Dim Minus As Bit Dim Dummy As Single Dim Fmhz As Long ' MHz-Anteil der Frequenzausgabe Dim Fkhz As Word ' kHz-Anteil der Frequenzausgabe Dim Fxa As Long 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 Cnt As Byte Dim A1 As Word Dim A2 As Word Dim A3 As Word Dim A4 As Word Dim B As Byte Dim N2 As Word Dim N3 As Word Dim Ma As Word Dim Tt_16_ref As Word ' 16 Bit Referenz-Teiler Tt_sw_ref Alias Tt_16_ref.15 ' SW-Bit 1=64 0=128 Referenz Vor-Teiler Tt_c_ref Alias Tt_16_ref.0 ' Controlbit 1 = Referenz-Teiler Dim Tt_swallow As Byte ' 7 Bit Swallow-Teiler Tt_c_prog Alias Tt_swallow.0 ' 0 = Prog-Teiler Dim Tt_prog As Word ' 11 Bit Prog-Counter Dim Tt_n As Word Dim Tt_n_h As Byte Dim Tt_n_l As Byte Dim Tt_mhz As Word Dim Tt_khz As Long Dim Tt_nr As Byte Dim Tt_qrg(5) As Word ' Array der Tonträger Frequenzen Dim I2c_sp(4) As Byte Dim Bytes As Word Dim Byte1 As Byte Dim Byte2 As Byte Dim Lin As Byte ' Zeilennummer Dim Col As Byte ' Spaltennummer Dim Cal_lin As Byte Dim Cal_col As Byte Dim N As Byte ' Zählvariable Dim Menuenr As Byte Dim Text As String * 16 Dim T As String * 1 Dim Osd_an As Bit '**************************************************************** ' 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 Tonträger Module * '**************************************************************** Const Max_tt = 6 ' Maximal 4 Tonträger Module '**************************************************************** ' Konstanten für LC-OSD * '**************************************************************** Const Command0 = &B1000_0000_0000_0000 '**************************************************************** ' Konstanten für OSD * '**************************************************************** Const Maxmenue = 7 '**************************************************************** ' Text-Konstanten * '**************************************************************** '12345567890123456 Const Menue0 = "Frequenzanzeige" Const Menue1 = "Schrittweite" Const Menue2 = "Tontraegerfrequenz" Const Menue3 = "Tontraeger Nummer" Const Menue4 = "OSD-Anzeige" Const Menue5 = "Position Call" Const Menue6 = "Alle Zeichen OSD" Const Mhz = "MHZ" Const Khz = "KHZ" Const Titel = "Uni-PLL DL1MFK" Const Versionsnummer = "Version 1r TT" '**************************************************************** ' Initialisierung * '**************************************************************** Schrittweite = 1 ' Schrittweite = 125 kHz Osd_en = 1 Waitms 100 ' Pause damit sich LCD resetten kann I2cinit Reset Pinc.0 Readeeprom Sp_pll , 0 ' Aktuellen Faktor aus dem EEProm lesen Gosub Write_sp5055 For Tt_nr = 1 To Max_tt ' Alle Tonträger-Module Cnt = 2 * Tt_nr Readeeprom Tt_prog , Cnt ' Teiler aus dem EEProm lesen Tt_qrg(tt_nr) = Tt_prog Gosub Leitung ' Modul einstellen Next Tt_nr = 1 Menuenr = 0 Osd_an = 0 Cursor Off Noblink Cls ' Clear LCD screen Lcd Titel ' Was zum lesen Lowerline Lcd Versionsnummer 'Print "Losgeht's!" Readeeprom Cal_lin , 13 Readeeprom Cal_col , 14 Gosub Osd_init Gosub Rufz_anzeigen Wait 2 ' für 2 Sekunden Enable Int1 Enable Interrupts On Int1 Isr1 '**************************************************************** ' Hauptprogramm * '**************************************************************** Main: Gosub Write_sp5055 Writeeeprom Sp_pll , 0 ' geänderte Werte sichern Tasten_start: Gosub Berechnen ' Berechnen und anzeigen der Frequenz '**************************************************************** ' Tasten Schleife * '**************************************************************** Tastenschleife: Gosub Read_sp5055 Locate 1 , 15 If Locked = 1 Then Lcd "L" If Locked = 0 Then Lcd "X" If Plus = 1 Then Goto Rauf If Minus = 1 Then Goto Runter If Menu = 0 Then Waitms 200 Goto Menue End If Goto Tastenschleife '**************************************************************** ' Rauf-Berechnung * '**************************************************************** Rauf: Plus = 0 Sp_pll = Sp_pll + Schrittweite If Sp_pll >= 21201 Then Sp_pll = 4000 Goto Main '**************************************************************** ' Runter-Berechnung * '**************************************************************** Runter: Minus = 0 Sp_pll = Sp_pll - Schrittweite If 3999 >= Sp_pll Then Sp_pll = 21200 Goto Main '**************************************************************** ' 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 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 < 1 Then Menuenr = Maxmenue Minus = 0 Goto Menue End If If Menu = 0 Then Waitms 300 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 Else Goto Main End Select End If Loop '**************************************************************** ' Tontträger-Menü * '**************************************************************** Umenue3: Tt_menue: Minus = 0 Cls Lcd "TT Nr " Lcd Tt_nr Tt_menue1: If Plus = 1 Then Goto Plus_tt_nr If Minus = 1 Then Goto Minus_tt_nr If Menu = 0 Then Waitms 200 Goto Menue End If Goto Tt_menue1 '**************************************************************** ' Tontraeger_Nummer_Einstellungen * '**************************************************************** Plus_tt_nr: Plus = 0 Tt_nr = Tt_nr + 1 If Tt_nr > Max_tt Then Tt_nr = 1 Goto Tt_menue Minus_tt_nr: Minus = 0 Tt_nr = Tt_nr - 1 If Tt_nr < 1 Then Tt_nr = Max_tt Goto Tt_menue '**************************************************************** ' Tontraeger_Einstellungen * '**************************************************************** Umenue2: Tontraeger_einstellung: Minus = 0 Tt_prog = Tt_qrg(tt_nr) ' Aktuelle TT-Frequenz Tt_mhz = Tt_prog / 100 ' / 100 weil 10 khz ' Tt_khz = Tt_mhz * 100 ' *100 weil 10 kHz Tt_khz = Tt_prog - Tt_khz Cls Lcd "Tontraeger:" Lcd Tt_nr Tt_mhz = Tt_mhz - 33 ' Oszillator ca 39MHz Tt_khz = Tt_khz * 10 ' Step bei 10kHz Lowerline If Tt_mhz < 10 Then Lcd " " End If Lcd Tt_mhz Lcd "." If Tt_khz < 100 Then Lcd "0" End If If Tt_khz < 10 Then Lcd "0" End If Lcd Tt_khz Lcd " MHz" 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 >= 4300 Then Tt_prog = 3300 ' =37 MHz entspricht 4MHz TT Tt_prog = Tt_prog + 1 ' +10 kHz Goto Tt_raus Tt_runter: Minus = 0 If 3300 >= Tt_prog Then Tt_prog = 4300 ' =43 MHz entspricht 10 MHz TT Tt_prog = Tt_prog - 1 ' -10kHz Tt_raus: ' Teiler im Array sichern Gosub Leitung Goto Tontraeger_einstellung '**************************************************************** ' Schrittweiten-Menü * '**************************************************************** Umenue1: Schrittweiter: Plus = 0 Cls Lcd "Schrittweite:" Lowerline Dummy = 500 * Schrittweite Lcd Dummy Lcd " kHz " Schrittweiter_1: If Plus = 1 Then Goto Sw_rauf If Minus = 1 Then Goto Sw_runter If Menu = 0 Then 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 '**************************************************************** ' Berechnen des Teilerfaktors * '**************************************************************** Berechnen: Dummy = Sp_pll * 500 ' Teilungsfaktor * 125kHz Fmhz = Dummy / 1000 ':1000 dann ist auf 1Mhz !!! Fxa = Fmhz * 1000 Fkhz = Dummy - Fxa '**************************************************************** ' Anzeigen der Frequenz * '**************************************************************** 'Anzeigen: Cls Text = Str(fmhz) + "." ' zeige MHz an If Fkhz < 100 Then Text = Text + "0" If Fkhz < 10 Then Text = Text + "0" End If End If Text = Text + Str(fkhz) + " MHZ" ' zeige khz an Lcd Text Gosub Osd_qrg 'SchrittweitenAnzeige: Lowerline Lcd "Step " Dummy = 500 * Schrittweite Lcd Dummy Lcd " kHz " Return '**************************************************************** ' Daten auf die Leitung zur Tonträger-PLL MB1501 schicken * '**************************************************************** Leitung: N2 = Tt_prog / 64 ' Testteilung durch 64 A2 = 64 * N2 ' Ergebnis merken A1 = Tt_prog - A2 ' Rest berechnen N3 = Tt_prog / 128 ' Testteilung durch 128 A4 = 128 * N3 ' Ergebnis merken A3 = Tt_prog - A4 ' Rest berechnen If A3 < N3 Then ' Tt_n = N3 Tt_swallow = A3 Ma = 128 End If If A1 < N2 Then Tt_n = N2 Tt_swallow = A1 Ma = 64 End If Tt_16_ref = 1650 ' bei 16,5 MHz Ref = 1650 => 10kHz Tt_16_ref = Tt_16_ref * 2 ' TT_16_Ref nach links schieben ' um Platz für das Referenz- ' Control-Bit zu bekommen If Ma = 64 Then Tt_sw_ref = 1 Else Tt_sw_ref = 0 End If Tt_c_ref = 1 ' für Referenz-Teiler Shiftout T_o_dat , T_o_clk , Tt_16_ref , 0 Waitus 120 ' aus Latches übernehmen Select Case Tt_nr Case 1 Set Tt_le_1 Case 2 Set Tt_le_2 Case 3 Set Tt_le_3 Case 4 Set Tt_le_4 Case 5 Set Tt_le_5 Case 6 Set Tt_le_6 End Select Waitus 12 Select Case Tt_nr Case 1 Reset Tt_le_1 Case 2 Reset Tt_le_2 Case 3 Reset Tt_le_3 Case 4 Reset Tt_le_4 Case 5 Reset Tt_le_5 Case 6 Reset Tt_le_6 End Select Tt_swallow = Tt_swallow * 2 ' 1 mal nach linksschieben um für das ' Controlbit Platz zu schaffen Tt_c_prog = 0 ' Für Prog Teiler Tt_n_h = High(tt_n) Tt_n_l = Low(tt_n) ' Prog-Teiler stellen Shiftout T_o_dat , T_o_clk , Tt_n_h , 0 , [ 3] Shiftout T_o_dat , T_o_clk , Tt_n_l , 0 Shiftout T_o_dat , T_o_clk , Tt_swallow , 0 Waitus 12 Select Case Tt_nr Case 1 Set Tt_le_1 Case 2 Set Tt_le_2 Case 3 Set Tt_le_3 Case 4 Set Tt_le_4 Case 5 Set Tt_le_5 Case 6 Set Tt_le_6 End Select Waitus 12 Select Case Tt_nr Case 1 Reset Tt_le_1 Case 2 Reset Tt_le_2 Case 3 Reset Tt_le_3 Case 4 Reset Tt_le_4 Case 5 Reset Tt_le_5 Case 6 Reset Tt_le_6 End Select Cnt = 2 * Tt_nr Writeeeprom Tt_prog , Cnt ' Teiler im EEProm sichern Tt_qrg(tt_nr) = Tt_prog Return '**************************************************************** ' SP-I2C-Routinen * '**************************************************************** Write_sp5055: I2c_sp(1) = High(sp_pll) I2c_sp(2) = Low(sp_pll) I2c_sp(3) = &HCE I2c_sp(4) = 0 I2csend Addr1 , I2c_sp(1) , 4 Return Read_sp5055: I2creceive Addr1 , Pllstat Return '**************************************************************** ' OSD Initialisierung * '**************************************************************** Osd_init: Gosub Disp_aus Bytes = &B1100_0001_0000_0000 ' Com 4 Reset Gosub Osd_leitung Bytes = &B1100_0100_0000_0000 ' Com 4 Ram löschen !!! Gosub Osd_leitung Waitms 1 Bytes = &B1100_0000_0000_0111 ' Com 4 Disp an Gosub Osd_leitung Bytes = &B1010_0000_0000_1001 ' COM 2 Vertikal 1mal so groß in 1. und 2. Zeile V Verschiebung 1ßßß Gosub Osd_leitung Bytes = &B1011_0000_0101_1010 ' COM 3 Horizontal 1mal so groß in 1. und 2. Zeile H Verschiebung 01_1111 ' LC-Oszillator als Dot-clock Gosub Osd_leitung Bytes = &B1101_0000_0000_0000 ' COM 5 ... NTSC ... Gosub Osd_leitung Bytes = &B1110000000000000 ' COM 6 Gosub Osd_leitung Bytes = &B1111000001100010 ' COM 7 Gosub Osd_leitung Bytes = &B1111010100000001 Gosub Osd_leitung Bytes = &B1100000000000111 Gosub Disp_an Return '**************************************************************** ' Rufzeichen einblenden * '**************************************************************** Rufz_anzeigen: ' Rufzeichen anzeigen: Lin = Cal_lin : Col = Cal_col Gosub Position Gosub Osd_leitung Byte1 = &B1001_0000 Byte2 = "D" Gosub Leitung2 Byte2 = "L" Gosub Leitung2 Byte2 = "1" Gosub Leitung2 Byte2 = "M" Gosub Leitung2 Byte2 = "F" Gosub Leitung2 Byte2 = "K" Gosub Leitung2 Return '**************************************************************** ' Frequenz im OSD anzeigen * '**************************************************************** Osd_qrg: Lin = 12 : Col = 1 Gosub Position Gosub Osd_leitung Byte1 = &B1001_0000 For N = 1 To Len(text) T = Mid(text , N , 1) Byte2 = T Gosub Osd_str Next Return '**************************************************************** ' einen Buchstaben anzeigen * '**************************************************************** Osd_str: Byte1 = &B1001_0000 Gosub Leitung2 Return '**************************************************************** ' Daten auf die 3 Leitungen * '**************************************************************** Osd_leitung: ' Byte1 und Byte2 aus Bytes Byte1 = High(bytes) Byte2 = Low(bytes) Leitung2: Osd_en = 0 Waitus 3 Shiftout T_o_dat , T_o_clk , Byte1 , 2 ' Mode 2 (LSB out first, clock falling edge) Waitus 3 ' Shiftout T_o_dat , T_o_clk , Byte2 , 2 Waitus 3 Osd_en = 1 Return '***************************************************************** ' Position aus Zeile und Spalte * '***************************************************************** Position: Lin = Lin - 1 ' 1. Zeile = 0 Col = Col - 1 ' 1. Spalte = 0 Bytes = Makeint(col , Lin) Bytes = Bytes Or Command0 Return '**************************************************************** ' Display An/Ausschalten * '**************************************************************** Disp_an: Bytes = &B1100_0000_0010_0001 ' Com4 Display angeschaltet mit Hg unter Zeichen 'Bytes = &B1100_0000_0000_0001 ' Com4 Display an ohne Hg Gosub Osd_leitung Return Disp_aus: Bytes = &B1100_0000_0010_0000 ' Com4 Display aus mit Hg 'Bytes = &B1100_0000_0000_0000 ' Com4 Display aus ohne Hg Gosub Osd_leitung Return '**************************************************************** ' Call Position * '**************************************************************** Cal_auf: Plus = 0 Cal_lin = Cal_lin + 1 If Cal_lin > 12 Then Cal_lin = 0 Writeeeprom Cal_lin , 13 ' geänderte Werte sichern Goto Osd_main Cal_ab: Minus = 0 Cal_col = Cal_col + 1 If Cal_col > 24 Then Cal_col = 0 Writeeeprom Cal_col , 14 ' geänderte Werte sichern Goto Osd_main '**************************************************************** ' OSD schleife * '**************************************************************** Umenue5: Osd_main: Waitms 50 Cls Lcd "OSD-Menue" Lowerline ' 2. Zeile Lcd "Ab=ab Auf=rechts" Gosub Osd_init Gosub Rufz_anzeigen Osd_main_1: If Plus = 1 Then Goto Cal_auf If Minus = 1 Then Goto Cal_ab If Menu = 0 Then Waitms 200 Goto Main End If Goto Osd_main_1 '**************************************************************** '' AlleZeichen Schleife * '**************************************************************** Umenue6: Alle_zeichen: Bytes = &B1000_0000_0000_0000 ' Pos: Line 0, Col 0 Gosub Leitung2 Byte1 = &B1001_0000 For N = 0 To 255 Byte2 = N Gosub Leitung2 Next Goto Main '************************************************************************* '* OSD Navigation an/ausschalten * '************************************************************************* Umenue4: Osd_anzeige: Waitms 50 Cls Lcd "OSD-Menue anzeigen" Umschalten: Lowerline ' 2. Zeile If Osd_an = 1 Then Lcd "AN " Else Lcd "AUS" End If Osd_anzeige_1: If Plus = 1 Then Toggle Osd_an Plus = 0 Goto Umschalten End If If Minus = 1 Then Toggle Osd_an Minus = 0 Goto Umschalten End If If Menu = 0 Then Waitms 200 Goto Main End If Goto Osd_anzeige_1 '************************************************************************* '* Interrupt Services * '************************************************************************* Isr1: ' Encoder Auswertung If Pind.3 = Ab Then Minus = 1 Else Plus = 1 ' Flag setzen End If Waitms 1 Return End 'end program