Sparrow-Scan-Radio mit Mini-LCD    

von Hermann Nieder                                 
Elektronik-Labor  Projekte  AVR           


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


Elektronik-Labor  Projekte  AVR