'**************************************************************** ' TX Steuerung mit PLL, Tonträger und OSD und Encoder * ' * ' -- Version 3c 25.12.2009 * ' - Kleinigkeiten behoben * ' * ' -- Version 3b 29.11.2009 * ' - wieder mit TT * ' * ' -- Version 3a 27.09.2009 * ' - Abgespeckt ohne TT ohne ZF * ' * ' -- Version 2f 26.09.2009 * ' - vorbereitung für minimal OSD * ' - Faktor und ZF-Einstellung hinzugefügt * ' * * ' -- Version 1b 06.09.2009 * ' - Strings aufgeräumt und Menüs erweitert * ' - * ' * * ' -- Version 1a 05.09.2009 * ' - erster Versuch alles fürs neue Board * ' - nur ein Tonträger ist möglich hier ohne EN-Leitung * ' * '**************************************************************** '**************************************************************** ' Prozessor relevante Einstellungen * '**************************************************************** $regfile = "M168def.dat" $crystal = 17734475 $baud = 19200 $hwstack = 50 ' default use 50 for the hardware stack $swstack = 25 ' default use 25 for the SW stack $framesize = 60 ' default use 60 for the frame '**************************************************************** ' EEPromwerte beim Brennen speichern * '**************************************************************** $eeprom Data 11548% , 33500% , 255 , 1 , 0 , 0 , 0 , 0 ' 10 Bytes Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ' 10 Bytes Data 0 , 0 , 0 , 0 , 0 , 0 ' 6 Bytes Data " 1. ZEILE " , 1 , 1 ' 26 Bytes für eine Zeile Data " 2. ZEILE " , 2 , 1 ' 26 Bytes für eine Zeile Data " 3. ZEILE " , 3 , 1 ' 26 Bytes für eine Zeile Data " 4. ZEILE " , 4 , 1 ' 26 Bytes für eine Zeile Data " 5. ZEILE " , 5 , 1 ' 26 Bytes für eine Zeile Data " 6. ZEILE " , 6 , 1 ' 26 Bytes für eine Zeile Data " 7. ZEILE " , 7 , 1 ' 26 Bytes für eine Zeile Data " 8. ZEILE " , 8 , 1 ' 26 Bytes für eine Zeile Data " 9. ZEILE " , 9 , 1 ' 26 Bytes für eine Zeile Data "10. ZEILE " , 10 , 1 ' 26 Bytes für eine Zeile Data "11. ZEILE " , 11 , 1 ' 26 Bytes für eine Zeile Data "12. ZEILE " , 12 , 1 ' 26 Bytes für eine Zeile Data "13. ZEILE " , 12 , 0 ' 26 Bytes für eine Zeile Data "14. ZEILE " , 12 , 0 ' 26 Bytes für eine Zeile Data "15. ZEILE " , 12 , 0 ' 26 Bytes für eine Zeile Data "16. ZEILE " , 12 , 0 ' 26 Bytes für eine Zeile Data "17. ZEILE " , 12 , 0 ' 26 Bytes für eine Zeile Data "18. ZEILE " , 12 , 0 ' 26 Bytes für eine Zeile $data '**************************************************************** ' LCD-Leitungen * '**************************************************************** Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.5 , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 Config Lcdbus = 4 Config Lcd = 16 * 2 '**************************************************************** ' Ein und Ausgänge * ' I²C-Leitungen * '**************************************************************** ' Tasten ' Ab Alias Pind.4 ' Auf Taste PD4 (pin 2) ' Auf Alias Pind.3 ' Ab Taste PD3 (pin 1) ' 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.2 ' Menu Taste PD2 (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.2 auf Flanke warten ' I²C-Leitungen Config Pinc.4 = Output Config Pinc.5 = Output Config Scl = Portc.5 Config Sda = Portc.4 ' Leitungen für MB5101 Config Pinb.3 = Output Config Pinb.2 = Output Config Pinb.1 = Output Tt_dat Alias Portb.1 ' TT-Daten PB1 (pin 13) Tt_clk Alias Portb.2 ' TT-Clock PB2 (pin 14) Tt_le Alias Portb.3 ' TT-Enable PB3 (pin 15) ' OSD-Leitungen Config Pind.5 = Input Config Pind.6 = Output Config Pind.7 = Output Config Pinb.0 = Output 'Portd.5 = 1 Osd_sync Alias Pind.5 ' kein Video detekt Osd_en Alias Portd.6 ' OSD Enable Osd_clk Alias Portd.7 ' OSD Clock Osd_dat Alias Portb.0 ' OSD Data '**************************************************************** ' Variable * '**************************************************************** Dim Plus As Bit ' als Interrupt flags Dim Minus As Bit Dim Dummy As Long 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 X_mal As Byte Dim I2c_sp(4) As Byte Dim Bytes As Word Dim Byte1 As Byte Dim Byte2 As Byte Dim Lin As Word ' Zeilennummer Dim Col As Word ' Spaltennummer Dim L As Word ' Zählvariablen Dim M As Word ' Zählvariablen Dim N As Word ' Zählvariablen Dim Z_position As Word ' Zählvariablen Dim Buchstabe As Byte Dim Z As Byte Dim I As Byte Dim A1 As Word Dim A3 As Word Dim N2 As Word Dim N3 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 Word Dim Menuenr As Byte Dim Zmenuenr As Byte Dim Tt(24)as String * 1 Dim Text As String * 24 Dim T As String * 1 Dim Osd_n As Word Dim Osd_flags As Byte Osd_an Alias Osd_flags.0 'Osd an aus Osd_call Alias Osd_flags.1 Osd_tx_qrg Alias Osd_flags.2 Osd_tt_qrg Alias Osd_flags.3 Osd_sync_en Alias Osd_flags.4 Osd_page Alias Osd_flags.5 Dim Zeile As Byte Dim Z_speicher(18) As String * 24 ' (zeilen Speicher) Dim Z_lin(18) As Byte Dim Z_an(18) As Byte '**************************************************************** ' 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 EEprom Adressen * '**************************************************************** Const Offset = 26 ' Zeilen offset im EEprom Const Zsatz = 27 ' Datensatz + 1 '**************************************************************** ' Konstanten für LC-OSD * '**************************************************************** Const Command0 = &B1000_0000_0000_0000 '**************************************************************** ' Konstanten für OSD * '**************************************************************** Const Maxmenue = 8 Const Zmaxmenue = 4 '12345567890123456 Const Zmenue1 = "Nummer" Const Zmenue2 = "Edit" Const Zmenue3 = "Position" Const Zmenue4 = "An/Aus" Const Zmenue0 = "Exit" '**************************************************************** ' Text-Konstanten * '**************************************************************** '12345567890123456 Const Menue0 = "Frequenzanzeige" Const Menue1 = "Schrittweite" Const Menue2 = "OSDAnzeige An/Aus" Const Menue3 = "Blau An/Aus" Const Menue4 = "Zeilen Menue" Const Menue5 = "Vervielfachung" Const Menue6 = "TX Anzeige An/Aus" Const Menue7 = "TT Anzeige An/Aus" Const Menue8 = "Tontraeger QRG" Const Mhz = "MHZ" Const Khz = "KHZ" Const Null = "0" Const Pkt = "." Const Leer = " " Const Ein = "EIN" Const Aus = "AUS" Const Titel = "TX STRG DL1MFK " Const Versionsnummer = "V3F 08/10 ATMEGA168" '**************************************************************** ' Initialisierung * '**************************************************************** Schrittweite = 1 ' Schrittweite = 125 kHz Menuenr = 0 Zmenuenr = 0 Zeile = 1 I2cinit Readeeprom Sp_pll , 0 ' Aktuellen PLL-Faktor aus dem EEProm lesen Gosub Write_sp5055 ' PLL setzen Readeeprom Tt_prog , 2 Gosub Leitung Readeeprom Osd_flags , 4 ' OSD AN/AUS etc. Readeeprom X_mal , 5 ' Faktor lesen 'Readeeprom Schrittweite , 6 ' Schrittweite For I = 0 To 17 ' 18 Zeilen aus dem EEprom laden N = I * Zsatz N = N + Offset Z = I + 1 Readeeprom Z_speicher(z) , N N = N + 25 Readeeprom Z_lin(z) , N N = N + 1 Readeeprom Z_an(z) , N Next Gosub Osd_init Col = 5 Lin = 1 Text = Titel Gosub Osd_text Gosub Disp_an Col = 5 Lin = 2 Text = Versionsnummer Gosub Osd_text Cursor Off Noblink Cls ' Clear LCD screen Lcd Titel ' Was zum lesen Lowerline Lcd Versionsnummer Enable Int1 Enable Interrupts On Int1 Isr1 Wait 3 ' für 3 Sekunden 'Gosub Osd_init '**************************************************************** ' Hauptprogramm * '**************************************************************** Main: Gosub Osd_clr Gosub Zeilen_anzeigen Gosub Tt_anzeigen Main_1: Gosub Write_sp5055 Writeeeprom Sp_pll , 0 ' geänderte Werte sichern Gosub Berechnen ' Berechnen und anzeigen der Frequenz Tasten_start: '**************************************************************** ' Tasten Schleife * '**************************************************************** Tastenschleife: Gosub Read_sp5055 If Osd_an = 1 Then Gosub Disp_an If Osd_sync = 0 And Osd_sync_en = 1 Then Bytes = &B1101_1101_0000_0111 ' COM 5 Pal, 625, Zeilen, interleaced, Cyan als HG, Interner Sync Gosub Osd_leitung Else Bytes = &B1101_1100_0000_0000 ' COM 5 Pal, 625, Zeilen, interleaced, Cyan als HG, Externer Sync Gosub Osd_leitung End If Else Gosub Disp_aus End If 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 > 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 Temp = 125 * Schrittweite Temp = Temp * X_mal 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 , 6 ' 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 '**************************************************************** '* OSD ein- und ausschalten * '**************************************************************** Umenue2: Osd_anzeige_u2: Waitms 50 Cls Lcd Menue2 Umschalten_u2: Lowerline ' 2. Zeile If Osd_an = 1 Then Lcd Ein Else Lcd Aus End If Osd_anzeige_1_u2: If Plus = 1 Then Toggle Osd_an Plus = 0 If Osd_an = 1 Then Gosub Disp_an Else Gosub Disp_aus End If Goto Umschalten_u2 End If If Minus = 1 Then Minus = 0 End If If Menu = 0 Then Writeeeprom Osd_flags , 4 ' geänderte Werte sichern Waitms 200 Goto Main End If Goto Osd_anzeige_1_u2 '**************************************************************** '' OSD Blau anzeigen ein aus * '**************************************************************** Umenue3: Waitms 50 Cls Lcd Menue3 Umschalten_u3: Lowerline ' 2. Zeile If Osd_sync_en = 1 Then Lcd Ein Else Lcd Aus End If Osd_anzeige_u3: If Plus = 1 Then Toggle Osd_sync_en Plus = 0 Goto Umschalten_u3 End If If Minus = 1 Then Minus = 0 End If If Menu = 0 Then Writeeeprom Osd_flags , 4 ' geänderte Werte sichern Waitms 200 Goto Main End If Goto Osd_anzeige_u3 '**************************************************************** '' OSD Zeilen-Menue * '**************************************************************** Umenue4: Zmenue: Cls Select Case Zmenuenr Case 1 Lcd Zmenue1 Lowerline Lcd Zmenue2 Case 2 Lcd Zmenue2 Lowerline Lcd Zmenue3 Case 3 Lcd Zmenue3 Lowerline Lcd Zmenue4 Case 4 Lcd Zmenue4 Lowerline Lcd Zmenue0 Case Else Lcd Zmenue0 Lowerline Lcd Zmenue1 End Select Do If Plus = 1 Then Incr Zmenuenr If Zmenuenr > Zmaxmenue Then Zmenuenr = 0 Plus = 0 Goto Zmenue End If If Minus = 1 Then Decr Zmenuenr If Zmenuenr > Zmaxmenue Then Zmenuenr = Zmaxmenue Minus = 0 Goto Zmenue End If If Menu = 0 Then Waitms 300 Select Case Zmenuenr Case 1 Gosub Osd_zeilen Case 2 Gosub Osd_edit Case 3 Gosub Zeile_position Case 4 Gosub Zeile_an_aus Case Else Goto Main End Select Waitms 200 Goto Zmenue End If Loop '**************************************************************** '' Auswahl Zeilen Nummer * '**************************************************************** Osd_zeilen: Waitms 50 Cls Lcd Zmenue1 Lowerline ' 2. Zeile Lcd "Zeile " ; Zeile Gosub Osd_clr Gosub E_zeile_anzeigen Osd_zeilen_1: If Plus = 1 Then Goto Zeile_auf If Minus = 1 Then Goto Zeile_ab If Menu = 0 Then Waitms 200 Return End If Goto Osd_zeilen_1 'Zeile Auswählen Zeile_auf: Plus = 0 Zeile = Zeile + 1 If Zeile > 18 Then Zeile = 1 Goto Osd_zeilen Zeile_ab: Minus = 0 Zeile = Zeile - 1 If Zeile < 1 Then Zeile = 18 Goto Osd_zeilen '**************************************************************** ' Zeile editieren * '**************************************************************** Osd_edit: Z_position = 1 Osd_edit_1: Cls Lcd Zmenue2 ; Zeile Lowerline Lcd "Position waehlen" ' 2. Zeile Gosub Osd_clr 'Blau ein/ausschalten je nach Sync !!! 'aktuelle Zeile ausgeben Gosub E_zeile_anzeigen For I = 1 To 24 Tt(i) = Mid(z_speicher(zeile) , I , 1) Next 'Zeichen aussuchen Z_wahl: 'Cursor anschalten erste Position Col = Z_position Lin = Z_lin(zeile) Gosub Position Byte2 = 126 Gosub Osd_string Waitms 100 Col = Z_position Lin = Z_lin(zeile) Gosub Position Byte2 = Tt(z_position) Gosub Osd_string If Plus = 1 Then Incr Z_position If Z_position > 24 Then Z_position = 1 Plus = 0 End If If Minus = 1 Then Decr Z_position If Z_position < 1 Then Z_position = 24 Minus = 0 End If If Menu = 0 Then ' wenn Menu lang gedrückt ist dann raus aus Untermenü Waitms 200 If Menu = 0 Then Do Loop Until Menu = 1 Gosub Zeile_speichern Return End If Buchstabe = Asc(tt(z_position)) Gosub Z_neu ' Sonst Zeichen ändern Tt(z_position) = Chr(buchstabe) Z_speicher(zeile) = "" For I = 1 To 24 Z_speicher(zeile) = Z_speicher(zeile) + Tt(i) Next Goto Osd_edit_1 End If Goto Z_wahl 'Neues Zeichen anzeigen Z_neu: Lowerline Lcd "Zeichen waehlen" ' 2. Zeile Col = Z_position Lin = Z_lin(zeile) Gosub Position Byte2 = Buchstabe Gosub Osd_string Z_neu_1: If Plus = 1 Then Incr Buchstabe If Buchstabe = 255 Then Buchstabe = 0 Plus = 0 Goto Z_neu End If If Minus = 1 Then Decr Buchstabe If Buchstabe = 0 Then Buchstabe = 255 Minus = 0 Goto Z_neu End If If Menu = 0 Then 'zurück Waitms 200 Return End If Goto Z_neu_1 '**************************************************************** ' Zeilen speichern * '**************************************************************** Zeile_speichern: L = Zeile - 1 M = L * Zsatz M = M + Offset Writeeeprom Z_speicher(zeile) , M M = M + 25 Writeeeprom Z_lin(zeile) , M M = M + 1 Writeeeprom Z_an(zeile) , M Return '**************************************************************** ' Zeilen Position * '**************************************************************** Zeile_position: Waitms 50 Cls Lcd Zmenue3 ; Zeile Gosub Osd_clr Gosub E_zeile_anzeigen Zeile_position_1: If Plus = 1 Then Goto Pos_auf If Minus = 1 Then Goto Pos_ab If Menu = 0 Then Gosub Zeile_speichern Waitms 200 Return End If Goto Zeile_position_1 '-------Zeile Position Pos_auf: Plus = 0 Z_lin(zeile) = Z_lin(zeile) - 1 If Z_lin(zeile) < 1 Then Z_lin(zeile) = 12 Goto Zeile_position Pos_ab: Minus = 0 Z_lin(zeile) = Z_lin(zeile) + 1 If Z_lin(zeile) > 12 Then Z_lin(zeile) = 1 Goto Zeile_position '**************************************************************** ' Zeile An Aus schalten * '**************************************************************** Zeile_an_aus: Waitms 50 Cls Lcd Zmenue4 ; Zeile Zeile_an_aus_1: Lowerline ' 2. Zeile If Z_an(zeile) = 0 Then Lcd Aus Else Lcd Ein End If Zeile_an_aus_loop: If Plus = 1 Then Plus = 0 Zeile_an_aus_k: If Z_an(zeile) = 0 Then Z_an(zeile) = 1 Else Z_an(zeile) = 0 End If Goto Zeile_an_aus_1 End If If Minus = 1 Then Minus = 0 Goto Zeile_an_aus_k End If If Menu = 0 Then Gosub Zeile_speichern Waitms 200 Return End If Goto Zeile_an_aus_loop '**************************************************************** ' Vervielfachungsfaktor-Menü * '**************************************************************** Umenue5: Cls Lcd "Faktor:" Lowerline ' 2. Zeile If X_mal < 10 Then Lcd Leer End If Lcd X_mal , "-fach" Faktor_einstellung_1: If Plus = 1 Then Goto X_rauf If Minus = 1 Then Goto X_runter If Menu = 0 Then Writeeeprom X_mal , 5 Goto Main ' zurück ins Unter-Menü End If Goto Faktor_einstellung_1 X_rauf: Plus = 0 X_mal = X_mal + 1 ' +1 If X_mal > 10 Then X_mal = 1 ' =1 Mal Goto Umenue5 X_runter: Minus = 0 X_mal = X_mal - 1 ' -1 If X_mal < 1 Then X_mal = 10 ' =10 Mal Goto Umenue5 '**************************************************************** '* OSD TX-QRG Einblendung ein- und ausschalten * '**************************************************************** Umenue6: Waitms 50 Cls Lcd Menue6 Umschalten_u6: Lowerline ' 2. Zeile If Osd_tx_qrg = 1 Then Lcd Ein Else Lcd Aus End If Osd_anzeige_u6: If Plus = 1 Then Toggle Osd_tx_qrg Plus = 0 Goto Umschalten_u6 End If If Minus = 1 Then Minus = 0 End If If Menu = 0 Then Writeeeprom Osd_flags , 4 ' geänderte Werte sichern Waitms 200 Goto Main End If Goto Osd_anzeige_u6 '**************************************************************** '* OSD TT-QRG Einblendung ein- und ausschalten * '**************************************************************** Umenue7: Waitms 50 Cls Lcd Menue7 Umschalten_u7: Lowerline ' 2. Zeile If Osd_tt_qrg = 1 Then Lcd Ein Else Lcd Aus End If Osd_anzeige_u7: If Plus = 1 Then Toggle Osd_tt_qrg Plus = 0 Goto Umschalten_u7 End If If Minus = 1 Then Toggle Osd_tt_qrg Minus = 0 Goto Umschalten_u7 End If If Menu = 0 Then Writeeeprom Osd_flags , 4 ' geänderte Werte sichern Waitms 200 Goto Main End If Goto Osd_anzeige_u7 '**************************************************************** ' Tontraeger_Einstellungen * '**************************************************************** Umenue8: Tontraeger_einstellung: Minus = 0 Gosub Tt_anzeigen Lcd Text 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 >= 36000 Then Tt_prog = 32000 ' =37 MHz entspricht 4MHz TT Tt_prog = Tt_prog + 10 ' +10 kHz Goto Tt_raus Tt_runter: Minus = 0 If 32000 >= Tt_prog Then Tt_prog = 36000 ' =43 MHz entspricht 10 MHz TT Tt_prog = Tt_prog - 10 ' -10kHz Tt_raus: Gosub Leitung Goto Tontraeger_einstellung '**************************************************************** ' Tontraeger_Anzeigen * '**************************************************************** Tt_anzeigen: Tt_mhz = Tt_prog / 1000 ' /1000 weil 1 khz ' Tt_mhz = Tt_mhz - 27 ' Oszillator ca 27MHz Tt_khz = Tt_prog Mod 1000 Cls Lcd Menue8 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 + Mhz 'Lcd Text If Osd_tt_qrg = 1 Then Lin = 11 : Col = 1 Gosub Osd_text End If 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_0010_0001 ' Com 4 Disp an Gosub Osd_leitung Bytes = &B1010_0000_0100_1001 ' COM 2 Vertikal 1mal so groß in 1. und 2. Zeile V Verschiebung 1, Osc = 4fsc Gosub Osd_leitung Bytes = &B1011_0000_0101_1010 ' COM 3 Horizontal 1mal so groß in 1. und 2. Zeile H Verschiebung 01_1111 Gosub Osd_leitung Bytes = &B1110_0000_0000_0010 ' COM 6 sync detect Gosub Osd_leitung Bytes = &B1101_1101_0000_0111 ' COM 5 Pal, 625, Zeilen, interleaced, Cyan als HG, Interner Sync Gosub Osd_leitung Gosub Disp_an Return '**************************************************************** ' Zeilen anzeigen * '**************************************************************** Zeilen_anzeigen: For I = 1 To 12 Zeile = I Gosub Zeile_anzeigen Next Return '**************************************************************** ' Display An/Ausschalten * '**************************************************************** Disp_an: Bytes = &B1100_0000_0010_0001 ' Com4 Display angeschaltet mit schwarzem Rand um Zeichen Gosub Osd_leitung Return Disp_aus: Bytes = &B1100_0000_0010_0000 ' Com4 Display aus Gosub Osd_leitung Return '**************************************************************** ' OSD löschen * '**************************************************************** Osd_clr: Gosub Disp_aus Bytes = &B1100_0100_0000_0000 ' Com 4 Ram löschen !!! Gosub Osd_leitung Waitms 1 Bytes = &B1100_0000_0010_0111 ' Com 4 Disp an Gosub Osd_leitung Return '**************************************************************** ' Zeilen einblenden * '**************************************************************** Zeile_anzeigen: ' Rufzeichen anzeigen: If Z_an(zeile) = 0 Then Return E_zeile_anzeigen: Lin = Z_lin(zeile) Col = 1 Text = Z_speicher(zeile) '**************************************************************** ' Text im OSD anzeigen * '**************************************************************** Osd_text: Gosub Position Byte1 = &B1001_0000 For Osd_n = 1 To Len(text) T = Mid(text , Osd_n , 1) Byte2 = T Gosub Osd_string Next Return '**************************************************************** ' String im OSD anzeigen * '**************************************************************** Osd_string: Byte1 = &B1001_0000 Gosub Leitung2 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 '**************************************************************** ' 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 Osd_dat , Osd_clk , Byte1 , 2 ' Mode 2 (LSB out first, clock falling edge) Waitus 3 ' Shiftout Osd_dat , Osd_clk , Byte2 , 2 Waitus 3 Osd_en = 1 Return '**************************************************************** ' Berechnen des Teilerfaktors * '**************************************************************** Berechnen: Dummy = Sp_pll * X_mal ' Teilungsfaktor * 125kHz Fkhz = Dummy Mod 8 Fkhz = Fkhz * 125 Dummy = Dummy / 8 '125:1000= 1/8 dann ist auf 1Mhz !!! Fmhz = Dummy '**************************************************************** ' 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 If Osd_tx_qrg = 1 Then Lin = 12 : Col = 1 Gosub Osd_text End If 'SchrittweitenAnzeige: Lowerline Lcd "Step " Temp = 125 * X_mal Temp = Temp * Schrittweite Lcd Temp Lcd Khz Return '**************************************************************** ' Daten auf die Leitung zur Tonträger-PLL MB1501 schicken * '**************************************************************** Leitung: N2 = Tt_prog / 64 ' Testteilung durch 64 A1 = Tt_prog Mod 64 ' Rest berechnen N3 = Tt_prog / 128 ' Testteilung durch 128 A3 = Tt_prog Mod 128 ' Rest berechnen If A3 < N3 Then ' Tt_n = N3 Tt_swallow = A3 * 2 ' 1 mal nach linksschieben um für das Tt_sw_ref = 0 ' Controlbit Platz zu schaffen Else Tt_n = N2 Tt_swallow = A1 * 2 ' 1 mal nach linksschieben um für das Tt_sw_ref = 1 ' Controlbit Platz zu schaffen End If Tt_16_ref = 13500 * 2 ' bei 13,5 MHz Ref = 13500 => 1kHz ' TT_16_Ref nach links schieben ' um Platz für das Referenz- ' Control-Bit zu bekommen Tt_c_ref = 1 ' für Referenz-Teiler Writeeeprom Tt_prog , 2 ' Teiler im EEProm sichern Shiftout Tt_dat , Tt_clk , Tt_16_ref , 0 Gosub Sr_lesen Tt_n_h = High(tt_n) Tt_n_l = Low(tt_n) Shiftout Tt_dat , Tt_clk , Tt_n_h , 0 , [ 3] Shiftout Tt_dat , Tt_clk , Tt_n_l , 0 Shiftout Tt_dat , Tt_clk , Tt_swallow , 0 Sr_lesen: Waitus 12 Set Tt_le Waitus 12 Reset Tt_le 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 '**************************************************************** '* Interrupt Services * '**************************************************************** Isr1: ' Encoder Auswertung If Pind.3 = 1 Then If Pind.4 = 1 Then Minus = 1 Plus = 0 End If If Pind.4 = 0 Then Plus = 1 Minus = 0 End If Else If Pind.4 = 1 Then Plus = 1 Minus = 0 End If If Pind.4 = 0 Then Minus = 1 Plus = 0 End If End If Waitms 1 Return End 'end program