FM-Radio KT0837 mit Ping-Pong-Anzeige
von Hermann Nieder
In einem anderen Beitrag
auf diesen Seiten wird beschrieben, dass sich die Frequenz- und
Lautstärkewerte eines Scan-Radios mit einem KT0837 auslesen und auf
einem LCD-Modul anzeigen lassen. Dies gelingt auch mit dem Atmega8 auf
einer Platine aus dem Ping-Pong-Bausatz, der z. B. noch von Conrad
lieferbar ist. An den von außen zugänglichen Pins der Platine
wurden Präzisionskontakte angelötet, damit die Leitungen wie im
Bild steckbar sind Das Radio wurde um eine I2C-Minischnittstelle
ergänzt, wie dies in einem anderen Beitrag erläutert wird. Es ist wie
in der Abbildung an die Ping-Pong-Platine angeschlossen. Nach dem
Einschalten beider erscheint zunächst für einige Sekunden die
Darstellung „Ukw“, um zu verdeutlichen, dass das Scan-Radio Sendungen
im Ukw-Bereich empfängt.
Darauf
werden die gerade eingestellte Empfangsfrequenz und die momentane
Laustärke auf dem LED-Display angezeigt. Sein Darstellungsbereich ist
dazu in zwei Teilbereiche unterteilt, von denen der obere mit den
Zeilen 1 bis 5 wie im Bild für die Frequenzanzeige verwendet wird,
während der untere mit den Zeilen 6 bis 10 zur Darstellung des
momentanen Lautstärkewertes dient. Mit bestimmten Tasten am Scan-Radio
kann man nun eine andere Empfangsfrequenz wählen und mit anderen Tasten
den Lautstärkewert ändern. Dieser ist durch den Mikrocontroller zu
Beginn des Programms über die I2C-Schnittstelle zunächst wie im Bild
auf einen Wert 8 eingestellt worden. Die Platine aus dem
Ping-Pong-Bausatz wird passend zum Scan-Radio mit 3V betrieben.
Anstelle der mittleren Mignonzelle ist im Bild der Einfachheit wegen im
Batteriehalter eine Leitung mit Krokodilklemmen angeschlossen.
Ein
Pin des Potis P1 im Bild unmittelbar rechts neben der Ping-Pong-Platine
ist mit Masse(GND), ein anderer mit dem Pluspol der Batterie aus zwei
Mignonzellen verbunden. Die Ausgangsspannung am Schleifkontakt von P1
lässt sich durch Drehen am Kopf verändern. Sie wird dem Analogeingang
ADC7 angeboten. In einer Endlosschleife (Do ...Loop) wird vom
Mikrocontroller die Spannung an ADC7 eingelesen und mit einem
vorgegegebenen Wert verglichen. Wird dieser durch Linksdrehung am
Potikopf unterschritten, erfolgt die Darstellung in der Abbildung. Es
leuchten nur wie im Bild die sechs LEDs des Displays. Dies führt zu
einer Verringerung der Stromstärke („Energiesparmodus“) auf etwa die
Hälfte des Wertes bei normalem Betrieb. Bei einer Drehung des
Potiknopfes im Uhrzeigersinn erscheint ab einer bestimmten Spannung an
ADC7 die „normale“ Anzeige von Frequenz- und Lautstärkewerten. Hat man
am Scan-Radio die gewünschte Empfangsfrequenz und die passende
Lautstärke eingestellt, lässt sich die Anzeige durch Drehen des
Potiknopfs von P1 entgegen dem Uhrzeigersinn wieder „abschalten“, wie
dies oben erläutert wird, um die Batterie aus zwei Mignonzellen zu
schonen. Außerdem ist dann ein leichtes fortwährendes Knackgeräusch
beim Hören einer Radiosendung, das von den Übertragungen an der
I2C-Schnittstelle verursacht wird, nicht mehr zu hören. Das zweite Poti
aus dem Ping-Pong-Bausatz dient der Lautstärkeeinstellung an einem
äußeren NF-Verstärker, von dem in den Bildern oben der
Übersichtlichkeit wegen nur der Lautsprecher zu sehen ist.
Die
Zeichen für die Darstellung auf dem LED-Display lassen sich mit dem
Programm Mustergenerator3 gestalten, wie es das Bild an einem Beispiel
für die unteren fünf Zeilen veranschaulicht. Wenn eines der 120 roten
Kontrollkästchen angeklickt wird, ändert links im Bildfeld die
zugehörige quadratische Figur ihre Farbe in rot, um zu verdeutlichen,
dass die betreffende Leuchtdiode „eingeschaltet“ wird. Bei erneutem
Drücken des Kontrollkästchens wird die betreffende Leuchtdiode wieder
„ausgeschaltet“. Ein ähnliches Mustergenerator-Programm findet man
einschließlich der Quelltexte unter (http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/super-mustergenerator).
Hat
man ein bestimmtes LED-Muster entworfen, so lassen sich für dieses wie
im Bild durch Betätigen einer Schaltfläche zwölf Programmzeilen
erstellen und diese mit einer anderen Schaltfläche zur Anzeige bringen.
Die Werte daraus kann man nun an den entsprechenden Stellen in sein
Programmlisting in Bascom AVR übertragen. Diejenigen Zahlenwerte, die
das Mustergeneratorprogramm für die ersten sechs Zeilen angibt, wurden
in das Unterprogramm Ls_dat übertragen. Außerdem wird dort, wenn der
augenblickliche Lautstärkewert kleiner als 10 (Dt_h1=0) ist, die Null
an der Zehnerstelle ausgeblendet. Leds7, Leds8 und Leds9 erhalten in
diesem Fall also den Wert 0. Hier ist ein Auszug aus dem Listing des
Unterprogramms Ls_dat:
…
Ls_dat:
Dt_h1 = Dat_byte \ 10
Dt_h2 = Dat_byte Mod 10
Zeichen_u = Dt_h1
Leds1u = 992 'Zeichen L
Leds2u = 512 ' ""
Leds3u = 512 ' ""
Leds4u = 0 'Space
Leds5u = 640
If Dt_h1 = 0 Then
Leds7u = 0
Leds8u = 0
Leds9u = 0
Else
Gosub Zeichen_zu
Leds7u = Splt1u
Leds8u = Splt2u
Leds9u = Splt3u
End If
Zeichen_u = Dt_h2
Gosub Zeichen_zu
Leds10u = Splt1u
Leds11u = Splt2u
Leds12u = Splt3u
Return
…
Bei
Lautstärkewerten größer als 9 erfolgt durch den Mikrocontroller bereits
zur Darstellung der ersten Ziffer (Zehnerstelle) ein Sprung nach
Zeichen_zu. Die dort gefundenen drei Werte werden nach Leds7u, Leds8u
sowie Leds9u übernommen. Ein erneuter Sprung nach Zeichen_zu sorgt
danach dafür, dass auch die zweite Ziffer(Einerstelle) korrekt
dargestellt werden kann. Diesmal werden die drei der entsprechenden
Ziffer zugehörigen Werte nach Leds10u, Leds11u sowie Leds12u
übertragen. Diejenigen Zahlenwerte für die Ziffern 0 und 1 in den
folgenden Zeilen Splt1u, Splt2u sowie Splt3u wurden dem Bild des
Mustergeneratorprogramms oben mit der Anzeige der Programmzeilen
übernommen.
...
Zeichen_zu:
'Zeichen in den Zeilen 6..10
Select Case Zeichen_u
'Fallunterscheidung für Muster der Zeichen 0..9 unten
Case 0:
Splt1u = 992
Splt2u = 544
Splt3u = 992
Case 1:
Splt1u = 64
Splt2u = 992
Splt3u = 0
…
In
ähnlicher Weise lassen sich mit dem oben erwähnten Programm die übrigen
Ziffern gestalten und die entsprechenden Werte in das Unterprogramm
Zeichen_zu (Case 2... Case 9) übernehmen.
Die
Ziffern zur Frequenzanzeige in den oberen fünf Zeilen des LED-Displays
sind unabhängig von denjenigen in den unteren Zeilen(Ziffern, L,
Doppelpunkt) entworfen worden. Keines der Kontrollkästchen in den
unteren fünf Reihen wurde in diesem Fall angeklickt, wie es das Bild
für die Darstellung der Ziffern 0, 1, 2 und 3 in den Zeilen 1 bis 5 des
Displays verdeutlicht.
Die vom Mustergeneratorprogramm
ausgegebenen Werte „erscheinen“ im Programmlisting im Unterprogramm
Zeichen_zo in den Fällen (Select … case) 0, 1, 2 und 3 jeweils in
Splt1o, Splt2o sowie Splt3o. Für die Ziffern 4 bis 9 lassen sich die
entsprechenden Werte nach ihrem Entwurf in ähnlicher Weise in das
Programmlisting übertragen.
...
Zeichen_zo:
'Zeichen in den Zeilen 1 ..5 oben
Select Case Zeichen_o
'Fallunterscheidung für Muster der Zeichen 0..9 oben
Case 0:
Splt1o = 31
Splt2o = 17
Splt3o = 31
Case 1:
Splt1o = 2
Splt2o = 31
Splt3o = 0
Case 2:
Splt1o = 29
Splt2o = 21
Splt3o = 23
Case 3:
Splt1o = 21
Splt2o = 21
Splt3o = 31
…
In
einer Endlosschleife (Do ...Loop) wird vom Atmega8 bei einem
eingelesenen Analogwert kleiner als 400 das Unterprgramm
Anzeige_min(„Energiesprarmodus“) aufgerufen mit einem nachfolgenden
Sprung zum Ende der Enlosschleife( Loop_end). Bei einem Wert größer als
500 liest der Mikrocontroller vom Scan-Radio die augenblicklichen Werte
für die Empfangsfrequenz und diejenigen für die Laustärke aus. Danach
erfolgt der Sprung nach Ls_dat und anschließend nach Dez_darst , damit
die entsprechenden Anzeigen auf dem LED-Display der Ping-Pong-Platine
erscheinen
…
Do
Ad_wert = Getadc(7)
If Ad_wert < 400 Then
Gosub Anzeige_min
Goto Loop_end
End If
R = &H13
Read_reg
'Frequenz
F = Hi * 256
F = F + Lo
F = F * 5
F = F + 6400
R = &H04
'Lautstaerke
Read_reg
L = Lo
If Ad_wert > 500 Then
Darstellen:
Dat_byte = L
'zuerst Darstellungswerte für Laustaerkeanzeige unten bestimmen
Gosub Ls_dat
'danach Darstellungswerte für Frequenzanzeige oben bestimmen
'und zu einer 'Gesamtanzeige zusammenfassen'
Dat = F
Gosub Dez_darst
End If
Loop_end:
Waitms 500
Loop
...
Bei
Frequenzwerten über 99,9 Mhz wird oben auf dem LED-Display wie im Bild
in den ersten beiden Spalten zusätzlich die Ziffer 1 eingeblendet. Im
Unterprogramm Dez_darst wird zunächst überprüft, ob der Frequenzwert
größer als 999 ist. Ist dies der Fall, dann ist eine Ziffer 1
darzustellen. Dies wirkt sich entsprechend auf den Inhalt der Variablen
Ziff1_1 und Ziff1_2 aus. Bei Frequenzwerten kleiner als 1000 erhalten
beide den Wert Null. Die betreffenden Leuchtdioden bleiben in diesem
Fall dunkel. Von Dez_darst aus verzweigt der Atmega8 darauf dreimal in
das Unterprogramm Zeichen_zo. Dort entnimmt er jeweils zur oben
darzustellenden Ziffer(Tausender, Hunderter, Zehner) die drei Werte
Splt1o, Splt2o sowie Splt3o.
...
Dez_darst:
'Zehntausender
Z_tausender = Dat \ 10000
'Print Z_tausender 'als Test
'Zeichen_o = Z_tausender
'nur bei Frequenzen ueber 99,9 MHz erfolgt eine vereinfachte Darstellung der '1'
'in den ersten beiden Spalten des Displays auf der Ping-Pong-Platine
If Z_tausender = 1 Then
Ziff1_1 = 2 ' Ziffer 1
Ziff1_2 = 31 ' Ziffer 1
Else
Ziff1_1 = 0 ' keine Anzeige
Ziff1_2 = 0 ' keine Anzeige
End If
Leds(1) = Ziff1_1 + Leds1u
Leds(2) = Ziff1_2 + Leds2u
Dat = Dat Mod 10000
Tausender = Dat \ 1000
'Print Tausender 'als Test
Zeichen_o = Tausender
Gosub Zeichen_zo
Leds(3) = Splt1o + Leds3u
Leds(4) = Splt2o + Leds4u
Leds(5) = Splt3o + Leds5u
Dat = Dat Mod 1000
Hunderter = Dat \ 100
Zeichen_o = Hunderter
'Print Hunderter 'Test
Gosub Zeichen_zo
Leds(6) = Splt1o + 0
Leds(7) = Splt2o + Leds7u
Leds(8) = Splt3o + Leds8u
Leds(9) = 16 + Leds9u 'Dezimalpunkt oben
Dat = Dat Mod 100
Zehner = Dat \ 10
'Print Zehner 'Test
Zeichen_o = Zehner
Gosub Zeichen_zo
Leds(10) = Splt1o + Leds10u
Leds(11) = Splt2o + Leds11u
Leds(12) = Splt3o + Leds12u
Return
…
Die
Inhalte von Leds(1)...Leds(12) legen schließlich fest, welche
Leuchtdioden in den Spalten 1 bis 12 gerade eingeschaltet sind, damit
ein „Gesamtbild“ mit der Anzeige des aktuellen Frequenz- und
Lautstärkewertes entsteht.
Vergleichsweise
einfach ist es, die Darstellung „Ukw“ im ersten Bild oben zu erhalten,
wie es dieses Bild für den Entwurf des zugehörigen LED-Musters
veanschaulicht.
Das
Mustergeneratorprogramm zeigt beim Drücken der entsprechenden
Schaltfläche die Programmzeilen für die Darstellung „Ukw“ an. Sie
können in diesem Fall unmittelbar in das Unterprogramm Ukw_anzg des
Programmlistings in Bascom AVR kopiert werden:
Dies sind die Programmzeilen dazu:
Ukw_anzg:
Leds(1) = 124
Leds(2) = 64
Leds(3) = 124
Leds(4) = 0
Leds(5) = 124
Leds(6) = 16
Leds(7) = 104
Leds(8) = 56
Leds(9) = 64
Leds(10) = 48
Leds(11) = 64
Leds(12) = 56
Return
…
Für die minimale LED-Anzeige im „Energiesparmodus“ lauten die Programmzeilen folgendermaßen:
Anzeige_min:
Leds(1) = 0
Leds(2) = 0
Leds(3) = 16
Leds(4) = 16
Leds(5) = 0
Leds(6) = 0
Leds(7) = 16
Leds(8) = 16
Leds(9) = 0
Leds(10) = 0
Leds(11) = 16
Leds(12) = 16
Return
Download: Mustergenerator3.zip Downlaod: Ping_Scanradio.zip