'**************************************************************** '* Name : OSD-Modul_V01a.bas * '* Author : Tomtom DL1MFK * '* Version : 1.0a 11 /2007 * '* Notes : Anzeige von Temperatur mittels LM75 Innen/Aussen) * '* : links oben und rechts Feldstärkebalken * '**************************************************************** '**************************************************************** ' Register-Deklarationen * '**************************************************************** $regfile = "M8def.dat" $crystal = 8867238 $baud = 19200 Config Adc = Single , Prescaler = Auto , Reference = Avcc ' ADC setup '**************************************************************** ' EEPromwerte beim Brennen speichern * '**************************************************************** Eepromdaten: $eeprom ' Byte 2 Byte1 !!!====!!! wenn Word gelesen werden dann in umgekehrter Reihenfolge !!!! Data 255 ' Erstes Byte nicht benutzen !!!! Data &B00001001 , &B10100000 ' COM 2 Vertikal 1mal so groß in 1. und 2. Zeile V Verschiebung 00_1001 Data &B00011010 , &B10110000 ' COM 3 Horizontal 1mal so groß in 1. und 2. Zeile H Verschiebung 01_1111 Data &B00000011 , &B11011100 ' COM 5 ... PAL ... Data &B00000010 , &B11100000 ' COM 6 Data &B00001010 , &B11110011 ' COM 10 LNC Farbe Einstellen Zeile1 Cyan Data &B00000001 , &B11110101 ' COM 12 $data '**************************************************************** ' Deklarationen * '**************************************************************** Dim Bytes As Word Dim Byte1 As Byte Dim Byte2 As Byte Dim Value As Bit ' für Datenausgabe Dim I As Byte Dim J As Byte Dim N As Byte Dim Text As String * 24 Dim T_i As Byte Dim Zeichen As String * 1 Dim Lin As Byte ' Zeilennummer Dim Col As Byte ' Spaltennummer 'LC74776 Steuerpins Config Pinb.0 = Output Config Pind.7 = Output Config Pind.6 = Output Config Pind.5 = Input Lc_dat Alias Portb.0 ' Daten (LC pin 11) Lc_clk Alias Portd.7 ' Clock (LC pin 10) Lc_ce Alias Portd.6 ' Enable (LC pin 9) Lc_sync Alias Pind.5 ' Sync detect ' I²C-Leitungen Config Pinc.4 = Output Config Pinc.5 = Output Config Scl = Portc.5 Config Sda = Portc.4 Dim Addr As Byte Dim Ival As Integer Dim Msb As Byte Dim Lsb As Byte Dim Kgrad As Byte Dim Grad As Byte Dim Pegel As Word Dim Temp As Word Dim Temp1 As Word Dim H_zaehler As Byte '**************************************************************** ' Command Strukturen * '**************************************************************** Dim Comx(7) As Word Dim Comd As Word Com2 Alias Comx(1) Com3 Alias Comx(2) Com5 Alias Comx(3) Com6 Alias Comx(4) Com10 Alias Comx(5) Com12 Alias Comx(6) '**************************************************************** ' Konstanten * '**************************************************************** Const Command0 = &B1000_0000_0000_0000 Const Lm75_addr = &B10010001 'Leseadresse A0=A1=A2=0 '**************************************************************** ' Initialisierung * '**************************************************************** Waitms 500 I2cinit Start Adc ' ADC Riemen auf die Orgel schmeißen Gosub Eeprom_lesen Gosub Osd_init Gosub Disp_an Lin = 10 : Col = 0 Text = "DL1MFK OSD-LOGO" Gosub Text_anzeigen Lin = 11 : Col = 0 Text = "V1C NOV. 2007" Gosub Text_anzeigen Wait 5 Gosub Osd_init Gosub Disp_an Gosub Temp_init '**************************************************************** ' Hauptschleife * '**************************************************************** Do If Lc_sync = 0 Then Bytes = &B1101_1101_0000_0011 ' COM 5 ... umschalten auf Internen Sync für Farbiges Bild ... Gosub Leitung Else Bytes = &B1101_1100_0000_0011 ' COM 5 ... umschalten auf Einblendung Gosub Leitung End If Gosub Balken_zeichnen If H_zaehler = 0 Then Gosub Temp_anzeigen End If Incr H_zaehler Loop ' '**************************************************************** ' OSD Initialisierung * '**************************************************************** Osd_init: Gosub Disp_aus Bytes = &B1100_0001_0000_0000 ' Com 4 Reset Gosub Leitung Bytes = &B1100_0100_0000_0000 ' Com 4 Ram löschen !!! Gosub Leitung Waitms 1 For I = 1 To 6 Bytes = Comx(i) Gosub Leitung Next Return '**************************************************************** ' EEProm auslesen * '**************************************************************** Eeprom_lesen: For I = 0 To 5 N = 2 * I N = N + 1 Readeeprom Comd , N Comx(i + 1) = Comd Next Return '**************************************************************** ' Text anzeigen * '**************************************************************** Text_anzeigen: Gosub Position Gosub Leitung Byte1 = &B1001_0000 For T_i = 1 To Len(text) Zeichen = Mid(text , T_i , 1) Byte2 = Asc(zeichen) Gosub Leitung2 Next Return '**************************************************************** ' Temperatur auslesen * '**************************************************************** Lese_lm75: I2cstart I2cwbyte Addr ' Lese-adresse ! If Err = 1 Then I2cstop ' kein ACK vom LM75 --> irgendein Fehler Ival = 9999 ' Zeichen, daß der Wert ungültig ist ! Else I2crbyte Msb , Ack I2crbyte Lsb , Nack I2cstop If Msb.7 = 1 Then Ival = Makeint(msb , &HFF) ' auffüllen mit den Vorzeichen bits Else Ival = Makeint(msb , &H00) ' positiv, also bleibt es so End If If Lsb.7 = 1 Then Kgrad = 5 ' fünf Zehntel Grad dazu Else Kgrad = 0 End If End If Return '**************************************************************** ' Temperatur Anzeige * '**************************************************************** Temp_anzeigen: For N = 0 To 1 J = N * 2 Addr = Lm75_addr Or J Lin = N ' Gosub Temp_anzeigen_1 Next Return Temp_anzeigen_1: Gosub Lese_lm75 Text = Str(ival) Select Case Len(text) Case 1 Text = " " + Text Case 2 Text = " " + Text Case 3 Case 4 Text = "ERR" End Select Col = 0 Gosub Text_anzeigen Col = 4 Text = Str(kgrad) Gosub Text_anzeigen Return Temp_init: For J = 0 To 1 Lin = J Col = 3 Text = "," Gosub Text_anzeigen Col = 5 Text = "'C" Gosub Text_anzeigen Next Return '**************************************************************** ' Balken Zeichnen * '**************************************************************** Balken_zeichnen: Pegel = Getadc(1) * 2 '60 Stufen * 17 = 1037 >10 Bit '^*2 bei 2,3V Vollaussteuerung If Pegel > 1019 Then Pegel = 1019 'Begrenzung damit kein Zeichenwirrwarr Temp = Pegel / 85 'Von unten volle Kästchen zeichnen Temp1 = 13 - Temp For I = 12 To Temp1 Step -1 Col = 23 Lin = I - 1 Gosub Position Byte1 = &B1001_0000 Byte2 = 126 Gosub Leitung2 Next 'Mit Leerzeichen nach oben auffüllen Temp1 = Temp1 - 2 'eins weiter obenanfangen For I = Temp1 To 1 Step -1 Col = 23 Lin = I - 1 Gosub Position Byte1 = &B1001_0000 Byte2 = 127 Gosub Leitung2 Next 'Zusatzzeichen anzeigen !!! Lin = Temp1 Gosub Position Temp1 = Pegel / 17 Temp = 5 * Temp Temp1 = Temp1 - Temp Byte1 = &B1001_0000 Select Case Temp1 Case 0 Byte2 = 127 Case 1 Byte2 = 192 Case 2 Byte2 = 26 Case 3 Byte2 = 3 Case 4 Byte2 = 2 End Select Gosub Leitung2 Return '**************************************************************** ' Daten auf die 3 Leitungen * '**************************************************************** Leitung: ' Byte1 und Byte2 aus Bytes Byte1 = High(bytes) Byte2 = Low(bytes) Leitung2: ' Byte1 und Byte2 einzeln gesetzt Lc_ce = 0 Waitus 3 Shiftout Lc_dat , Lc_clk , Byte1 , 2 Waitus 3 Shiftout Lc_dat , Lc_clk , Byte2 , 2 Waitus 3 Lc_ce = 1 Return '***************************************************************** ' Position aus Zeile und Spalte * '***************************************************************** Position: Lin = Lin ' 1. Zeile = 0 Col = Col ' 1. Spalte = 0 Bytes = Makeint(col , Lin) Bytes = Bytes Or Command0 Gosub Leitung Return '**************************************************************** ' Display An/Ausschalten * '**************************************************************** Disp_an: Bytes = &B1100_0000_0010_0001 ' Com4 Display angeschaltet mit Rand um Zeichen Gosub Leitung Return Disp_aus: Bytes = &B1100_0000_0010_0000 ' Com4 Display aus mit Hg Gosub Leitung Return