FM-Radio KT0837 mit Ping-Pong-Anzeige        

von Hermann Nieder                    
Elektronik-Labor  Projekte  AVR 



Siehe Labortagebuch: FM-Radio KT0837

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


Elektronik-Labor  Projekte  AVR