Sparrow-Scan-Radio mit Mini-LCD
von
Hermann Nieder
Nachdem es mir gelungen war, Frequenz- und Lautstärkewerte von einem Scan-Radio mit einem KT0837
mithilfe eines ATtiny13 auslesen und von einem PC anzeigen
zu lassen, überlegte ich mir, ob es nicht möglich ist, die betreffenden
Werte durch einen solchen Mikrocontroller auf einem LCD-Modul
darzustellen. Da ein ATtiny13 ähnlich wie ein ATtiny25/45/85 nur
über wenige Portpins verfügt, musste eine Porterweiterung durch
einen zusätzlcihen Baustein erfolgen. Das Programm in Bascom AVR zum
Auslesen von Frequenz- und Lautstärkewerten und deren Übertragung an
einen PC war bereits entworfen und war für dieses Projekt hier
entsprechend zu erweitern. Es bot sich geradezu an, die
fehlenden Portpins mithilfe eines I2C-Bausteins PCF8574
bereitzustellen. Ich entwarf zuerst ein Programm in Bascom AVR für
einen ATtiny25.
Alle
acht Pins des PCF8574 sowie PB1 und PB0 des jeweiligen Mikrocontrollers
werden nach der Darstellung zur Steuerung eines üblichen LCD-Moduls
benötigt. Da es mir möglich war, mithilfe eines ATtiny25 und
eines PCF8574 die Frequenz- und Lautstärkewerte eines Scan-Radios
mit einem KT0837 auf einem LCD-Modul darzustellen, hatte mich der
Ehrgeiz gepackt, zumal dafür beim Attiny25 nur 56% des verfügbaren
Programmspeichers benötigt werden. Gelingt mit einem ATtiny13 trotz des
wesentlich kleineren Flash-Speichers nicht wenigstens die Anzeige
der Frequenzwerte auf dem LCD-Modul? Auf
eine Darstellung von Lautstärkewerten könnte ich bei
„Platzmangel“ auch verzichten. Das Programmlisting für einen
solchen Mikrocontroller musste auf jeden Fall gegenüber
demjenigen für einen ATtiny25 gekürzt werden.
Das
Bild zeigt, dass es mir schließlich doch gelungen ist, außer den
Frequenz- auch die Lautstärkewerte durch einen ATtiny13,
hier das Exemplar auf einer Sparrow-Platine, auf einem LCD-Modul
anzeigen zu lassen. Die anfängliche Lautstärkeeinstellung auf
einen kleineren Wert, die im Programm für einen ATtiny25
vorgesehen ist, entfällt. Der Flash-Speicher des verwendeten
ATtiny13 ist zu 99% gefüllt. Die Tasten S1 und S2 auf der
Sparrow-Platine haben in diesem Fall keine Funktion.
Download: Sp_kT0837_LCD.zip
'T13_KT0837_LCD07.bas
'In Anlehnung an Programmbeispiel I2C.BAS in
'"Messen-Steuern-Regeln mit dem C-Control/Basic-System" von B. Kainka
'LCD-Display im 8-Bit-Modus
$regfile = "attiny13.dat"
$crystal = 1200000
'T25-KT0837_LCD2.bas
$hwstack = 16
$swstack = 16
$framesize = 16
Declare Sub Read_reg()
Declare Sub Lcd_write()
Declare Sub Lcd_char()
Declare Sub Lcd_cmd()
Declare Sub Nullausbl()
'Dim Lcd_param As Byte
Dim Ziffer As Word
Dim Dat_byte As Byte
Dim R As Byte
Dim Hi As Byte
Dim F As Word
Dim Lo As Byte
Config Sda = Portb.4
Config Scl = Portb.3
Config I2cdelay = 40
I2cinit
E Alias Portb.0 'an Pin E des Displays
Rs Alias Portb.1 'an Pin RS des Displays
Config Portb.0 = Output
Config Portb.1 = Output
Lcd_init:
Reset E
Dat_byte = &H38
Lcd_cmd 'Initialisierung, zwei Zeilen
Dat_byte = &H0E ' Display ein, nicht blinkender Cursor
Lcd_cmd
Waitms 200
Do
R = &H13
Read_reg
'Frequenz
F = Hi * 256
F = F + Lo
F = F * 5
F = F + 6400
Ausgabe:
Dat_byte = 1 'Löschen
Lcd_cmd
Dat_byte = 2 'Cursor home
Lcd_cmd
Dat_byte = &H80 'Zeile1
Lcd_cmd
Ziffer = F \ 10000
Nullausbl
F = F Mod 10000
Ziffer = F \ 1000
Dat_byte = Ziffer + 48
Lcd_char
F = F Mod 1000
Ziffer = F \ 100
Dat_byte = Ziffer + 48
Lcd_char
F = F Mod 100
Dat_byte = 46 'Dezimalpunkt.
Lcd_char
Ziffer = F \ 10
Dat_byte = Ziffer + 48
Lcd_char
Dat_byte = 32 'Blank
Lcd_char
Dat_byte = 77 'M
Lcd_char
Dat_byte = 72 'H
Lcd_char
Dat_byte = 122 'z
Lcd_char
Dat_byte = 192 'in 2. Zeile wechseln
Lcd_cmd
Dat_byte = 32 'Blank
Lcd_char
Dat_byte = 76 'L
Lcd_char
Dat_byte = 58 ' Doppelpunkt
Lcd_char
R = &H04
'Lautstaerke
Read_reg
Ziffer = Lo \ 10 ' Wert für Lautstärke
Nullausbl
Ziffer = Lo Mod 10 ' Wert für Lautstärke
Dat_byte = Ziffer + 48
Lcd_char
Waitms 100
Loop
Sub Lcd_write()
I2cstart
'Adresse des PCF8574:64
I2cwbyte 64
I2cwbyte Dat_byte ' Auszugebende Daten
I2cstop
End Sub
Sub Read_reg()
I2cstart
I2cwbyte &H6E
I2cwbyte R
I2cstart
I2cwbyte &H6F
I2crbyte Hi , Ack
I2crbyte Lo , Nack
I2cstop
End Sub
Sub Nullausbl()
If Ziffer = 0 Then
Dat_byte = 32
Else
Dat_byte = Ziffer + 48
End If
Lcd_char
End Sub
Sub Lcd_cmd()
Reset Rs
'RW=0, da an GND
Lcd_write
Gosub Togglen
End Sub
Sub Lcd_char()
'RW=0, da an GND
Set Rs
Lcd_write
Gosub Togglen
End Sub
Togglen:
Set E
Reset E
Set E
Reset E
Return