.- _ _ -. / / \ \ ( ( (` (-o-) `) ) ) \ \_ ` -+- ` _/ / `- -+- -` _ ___ ___ ___ ___ -+- /_\ / __|/ __|_ _|_ _| _|_ / _ \\__ \ (__ | | | | .|/|, /_/ \_\___/\___|___|___| ./ |\|\ . _ _ . |/| . ___ _ _ ___| | (_) __ / /_\ . | '_| / _` | ( o_ | | | / \ . . |/ \| |_| .\__,_| \____/ \_| \__/ . |\_/| . . / |/ \| \ . , . , / |\_/| . . _,,i.;__,,/\: __.\__ ___HXHXH_____,\:,:i_,_ _/o__
Ascii Radio ist ein PLL UKW/MW Stereo Radio, dass via Computer gesteuert wird.
«-- zurück zur DL6MFJ Homepage
o-Wie-es-dazu-kam-o---o-Theorie---------o---o-Praxis----------o---o-Der-Empfang-----o---o-Die-Extras------o---o-Schaltplan------o---o-techn.-Daten----o---o-Code------------o
Jemand bringt einen DVD-Surround-Allesabspieler-mit-Radio-und-6Kanal-Endstufe. Er hatte es gerade vom Sperrmüll: Laufwerksschaden + Poti ins Gehäuse gedrückt. Die Entscheidung fiel ziemlich schnell: Schlachten, gar nicht erst mit dem Reparieren anfangen, zumal diese Plastik-Slimline-mit-viel-drauf-gedruckt-Geräte so gar nicht mein Fall sind. Unter der Beute fand sich, neben dem Schaltnetzteil, einer digitalen 6-Kanalendstufe, einem Inkrementalgeber auch ein komplettes Stereoradio im Zigarettenschachtel-Format. Weissblechgehäuse, direkt an die Rückwand geschraubt mit 75Ω Standardbuchse für UKW und Klemmansschlüssen für MW-Wurfantenne + GND. Auf der anderen Seite bloss ein 13pol. Anschluss für ein Flachbandkabel. Bedienung, Display, CPU waren auch für alle anderen Playerfunktionen und wurden eher nur mitbenutzt. Ein erster Blick in die Daten vom PLL-Chip und einen zweiten auf mein altes Radio (mit freilaufendem VFO) liesen mich aus Neugierde und ob der neuen Möglichkeiten die Sache angehen. Den Display und Bedienfeld-Kram vom DVD wollte ich nicht mehr, zumal mein Computer auch eine CPU, Display etc. hat.
|
|
Auf dem Blechgehäuse ist dünn ein "KS" eingeprägt und eine Modelnummer aufgeklebt. Eine Suchmaschine fand damit ein 2-seitiges PDF vom Hersteller "Kwang Sung" mit einer Tabelle für 10 Varianten "KST-MV000 SERIES" und den wichtigsten Eckdaten. Manche haben andere MW/UKW-Bandgrenzen, eine andere Deemphasis oder noch das LW Band. Sonst gab es noch eine Gehäuseskizze und die Belegung vom 13pol. Flachbandanschluss. Kein Wort darüber, wie man das Ding programmiert. Also Deckel abhebeln. Unter der Weissblechhaube verbergen sich ein LC1837 für die AM-, ZF-, Demod.- und Stereodecoder-Stufen sowie ein LC72131 in der PLL - beide von Sanyo. Die Datenblätter der ICs waren zu finden, sie enthalten knapp alle nötigen Infos und eine Beispielschaltung. Der LC1837 hat Schalteingänge für AM/FM, Mute, Stereo/Mono, die dann der LC72131 als frei verwendbare, teils bidirektionale, I/Os bereit stellt. Zur Kommunikation nach aussen enthält der LC72131 im wesentlichen ein 24Bit Schieberegister. Über einen Takt- und Data-Eingang schiebt man erst eine Adresse, die den Chip adressiert und einen Modus festlegt, legt dann einen Enable-Eingang hoch und schiebt die Nutzdaten hinterher. Der LC72131 fühlt sich von 3 Adressen angesprochen: 2 um Teiler- u. Vorteilerwerte, Modi etc. festzulegen und eine unter der man den ZF-Zähler u.a. auslesen kann. Wenn man ausliest, erscheinen nach dem Adressinput die Daten an einen Ausgang. Man muss also nur die Datenleitungen richtig "ansprechen", den fertigen Stereo-Output abgreifen und 12V bei knapp 100mA Versorgung bereit stellen, um das zum Laufen zu kriegen. Ausgänge für "tuned" u. "stereo" gibts auch noch. Achso eine Antenne wäre nicht schlecht, fast hätte ichs vergessen.
PLL und Deadzone
Um die Datenleitungen mit dem Compi zu schalten, kramte ich eine alte Platine mit einem RS232 UART hervor. Die hatte ich mal Anfang der 90er zusammen gestrickt, um damit irgendwas zu schalten - weis der Kuckuck was. Es ist ein dummer UART, d.h. die Parameter werden nicht per Register programmiert wie bei den 16450 Typen, sondern mittels fester Pegel an den Pins bestimmt, die Baudrate legt man durch einen Taktozillator fest. Auf einer kleinen Adapterplatine habe ich den Anschlussstecker vom Flachbandkabel (von der DVD-Hauptplatine ausgelötet), eine 3.5mm Audiobuchse und NF-Spannungsteiler Rs untergebracht. Dort gehen auch zunächst nur 3 Datenleitungen vom UART hin. Da mir nicht bekannt war, welche der Schaltausgänge vom LC72131 was schalten bzw. nicht zwingend die Beispielschaltung verwendet wird, bin ich mit der Lupe die Leiterbahnen abgegangen. Den alten Code, als ich die UART-Platine damals gebaut habe, könnte ich eventl. sogar noch finden ...bloss damals habe ich mit Turbo Pascal unter DOS/Win3.1 gecoded, also gar nicht erst suchen. Weil es einfach bleiben sollte, habe ich ANSI-C als Sprache gewählt und sonst nur einen Texteditor (Kate, sri vi-Fans. Kate ist irgendwie so herrlich intuitiv-treudoof) und natürlich gcc (von der Konsole aus) bemüht.
Shack mit dem Ascii Radio auf dem Terminal, neben dem Messschieber liegt der PLL-Tuner. |
Compi-Interface. Auf der Huckepackplatine sitzt ein serieller Flash-RAM, den ich einer alten (ISA) 3Com-NIC-Karte entrissen habe. |
|
Nachdem einige Routinen und Schleifen programmiert und gedebugged waren (auch die Hardware),
konnte ich dem Haufen endlich "Leben" einhauchen.
Vom guten Empfang (Zufallsdrahtant.) und vorallem super Sound war ich überrascht.
Mein altes Radio schaut auf einmal richtig alt aus.
Nach und nach kamen Stationsspeicher auf den F-Tasten,
viele VFO-Raster (AM u. FM je unabhängiger Soft-VFO), Mute und sonstige Sperenzchen dazu.
Das umständliche Abfragen der Keyboardtasten und den "manuellen" Screenaufbau habe ich relativ früh vereinfacht
- durch Einbinden der ncurses Bibliothek.
Das Auslesen der Daten vom Radio ist zur Funktion zwar nicht zwingend notwendig, aber insbesondere das Messen der ZF-Frequenz,
bei verschiedenen Torzeiten klang verlockend.
Also den Digi-Out vom Tuner flux an einen UART Eingang gelötet - bloss der UART ist dumm,
keiner sagt ihm, wann er senden soll.
Dazu wartet er an einem extra Pin auf eine Flanke. Die Flanke senden wir ihm einfach...
Einen freien Output über ein RC-Delay auf den TX-(Schmitt)Trigger-Input - fertig ...ähm bis auf den Code.
Das Delay braucht man, damit der Tuner Zeit hat die Daten sauber anzulegen.
Von einem anderen UART-Out bekommt der Tuner ebenfalls einen Takt.
Die Flanke, die das Anlegen der Tuner-Bits veranlasst, fällt sonst mit der TX-Trigger-Flanke vom UART zusammen.
Ein UART-Output muss also für "Organisatorisches" herhalten, dafür kann ich jetzt die Inputs pollen.
Das Programmieren vom Readout brauchte deutlich länger, funktionierte aber irgendwann - bis auf die ZF-Messung.
Keine Ahnung warum, die sonstigen Statusdaten kommen richtig an.
Eine Vorortbedienung/Anzeige wäre nicht schlecht,
schliesslich sind von den 8Bit Output des UARTs bis jetzt nur 4 verbraten.
Terminal unter DOS als "HMI", das eigentliche Programm läuft auf einer Tux-Box. |
Während der frühen Entwicklungsphase: Ascii-Radio auf KDE-Desktop und etwas Code in einem Terminal. (Das Wallpaperfoto habe ich 2004 in Sibirien aufgenommen.) |
--=---+---=-- \___ ---=---+-I-=--- |\ ---=----+----=--- | ^ Ascii Antennen Skizze: 3 ele. fullsize duoband Beam f. 80m+40m. Wie man sieht, mit Traps u. Gammamatch. |
Aus Schachteln, auf denen irgendwas von Display, LED oder LCD stand, angelte ich ein DL1416
LEDisplay. 4 Stellen, es kann ASCII-Zeichen darstellen (allerdings KEINE KLEINBUCHSTABEN).
Für die 6Daten- 2 Adress- und die Write-Leitungen vom Display braucht man natürlich ein paar Outputs mehr, als der UART jetzt noch frei hat.
Die kann man aus einem Schieberegister gewinnen.
Mit nur 2 Leitungen (Takt und Data) schiebt man Bits in das Register,
bis sich an den Parallel-Ausgängen vom Register ein Muster einstellt, dass als Steuerbitmuster fürs Display geeignet ist.
Die Daten übernimmt das Display mit 'runterziehen von dessen WR-Input, hierzu nimmt man einen weiteren UART-Out.
Beim kommunizieren mit der PLL macht man auch nix anderes, sodass man ein bisschen Code copy & pasten kann.
Es funktionierte nicht, das Display blieb dunkel. Wieder und wieder habe ich den Code geprüft und probiert: Nix.
Sogar das Oszi habe ich erstmals ausgepackt: Alles okay. Das Display selbst muss ein Treffer haben.
Es war nur kein gleiches mehr in den Schachteln.
An diesem Punkt hätte ich fast ein neues gekauft.
Es wäre das erste und einzige Teil gewesen, das ich gekauft hätte.
Doch dazu kam es nicht. Das LEDisplay ist nicht mehr lieferbar und auch nicht gerade billig.
Alternativ musste ein DL1414, von dem noch 3 "da" waren, ran.
Das DL1414 hatte ein Nachsehen und ist in hellem Rot erleuchtet.
Allerdings musste erst eine hässliche Adapterplatine her, weil nicht Pinkompatibel und viel kleiner.
Deswegen sieht das so unförmig aus, ohne die Adapterplatine wären die längeren Tasten mit dem DL1416 Display bündig.
Die Taster, mit Pullup-Rs und kleinen parallel Cs versorgt, gehen direkt auf die UART-Inputs.
Was erstaunlich gut funktioniert, kein Prellen (mit der Software habe ich nachgeholfen) und sehr seltene Aussetzer - auch bei nur 9.6Kb/s.
Damits nicht langweilig wird, sind die Tasterstellungen und das LEDisplay auf dem Compi-Bildschrim "gespiegelt".
Das ganze schreit natürlich nach Eigenintelligenz.
Die Bastelkiste wurde auf das Vorhandene/Machbare geprüft:
Viel old-school 8-Bit Teile. Ein Z80-Grab "so richtig mit Eprom", ist mir aber zu heftig und wohl auch nicht zeitgemäss.
Modernes wie PICs, Atmels, Basicbriefmarken etc. fanden sich nicht.
Ein paar alte Flash-RAMs waren dabei und ich erinnerte mich daran, dass es die auch seriell gibt.
Das wäre doch was für einen Onboard-Senderspeicher.
Auf einer alten Netzwerkkarte fand sich tatsächlich ein 93C46 und war die längste Zeit dort gewesen.
Wegen der SMD Ausführung wurde eine Adapterplatine geschnitzt und Huckepack auf den UART gesetzt, eine normale DIL-Version hätte eh keinen Platz mehr.
Das Schreiben und Lesen geschieht, wie bei der Anzeige und der PLL.
Damit sind auch die letzten Out- und Inputs vom UART belegt.
Die Clock- und Data-Leitungen muss sich der RAM mit der Anzeige teilen, die Write-Leitung ist extra, sonst kommt die Anzeige in die Quere.
Es wurden noch vollständige Routinen, geschrieben und getestet, um den Flash zu lesen und zu beschreiben, nur ohne diese auszunutzen.
Sprich das Ablegen von VFO-Einstellungen und Frequenzen im Flash habe ich nicht mehr realisiert.
Wegen einer QRL-Reise musste ich den Aufbau vom Tisch räumen, seitdem ist das Projekt akut vom Status einer Bastelleiche bedroht.
Gehäuse:
In der Bastelkiste findet sich eines aus Alu, Typ "TNC-Gehäuse", mit leichter Überlänge.
Dieses favorisiere ich z.Zt. am meisten, allerdings müsste die obere Deckplatte erneuert werden, da total verstanzt.
Mindestens die Displayplatine müsste dann auch noch neu designed werden, da zu hoch - habe ich aber eh vor.
Das Netzteil würde ich dann als externes Steckernetzteil ausführen.
Steht aber noch nicht fest.
Anzeige:
Die DL1414 lässt sich anreihen und ich habe ja insges. 3 St...
Das 9-Bit-Schieberegister müsste dazu erweitert werden, um mehr Bits für die Stellenadressierung zu gewinnen.
Wäre aber kein Problem:
Das Register ist aus einem 74xx164 (8-Bit Schieberegister) mit kaskadierten 74xx74 (2x D-Flipflop) realisiert und das letzte Flipflop ist noch unbeschaltet, damit wäen 2 Display-ICs, also 8 Stellen möglich. Diese Sache werde ich wohl umsetzen, mit mehr als mit 4 Zeichen sieht ein Stationsname einfach besser aus. Für das 3te Display-IC könnte man das '74 durch ein '164 ersetzen (ergibt 16Bit-Register).
NF-Output:
Eine richtige symmetrische Ausgangsstufe mit XLR-male Buchsen, wäre profihaft ...o.g. Gehäuse ist aber zu klein.
Ob der Bedrohung durch 3-facher Erdung (Antennen-, Computer-, Audioanlage) fände ich hier eine Trafo- statt OpAmpsymmetrierung sogar besser.
Wegen der galvanischen Trennung (die auch der RS232 gut stehen würde). Gute audiophile Übertrager sind zwar nicht gerade billig, aber die Sache wäre es wert.
Lautstärkeregelung:
Je nach Gehäuse werde ich wohl irgendwas vorsehen, sei es ein Poti vorne, ein Trimmer hinten und/oder wenigstens den in der Studiotechnik üblichen 0dB/+6dB Schalter.
Aus einem alten Flachbettscanner habe ich kürzlich 2 DA-Wandlerchips geschlachtet, damit könnte man eine soft gesteuerte Lautstärkeregelung realisieren.
Streng genommen sind es keine DA-Wandler sondern stufig schaltbare analoge Spannungsteiler.
Pro Chip 2 Teiler, die sich kaskadieren lassen.
Eine passende NF-Applikationsschaltung mit highendigen Daten habe ich sogar gefunden,
bloss der Stellbereich fällt mit 20dB nicht gerade gross aus (wobei man noch die Mute-Funktion hat).
Die Chips sind wohl eher für was anderes gedacht, daher und wg. dem Aufwand verworfen.
S-Meter:
Hätte ich gerne. Fehlt zur Zeit total.
Ich weiss nicht einmal, wo ich eine entsprechende Spannung abgreifen kann.
Sonstige HW Erweiterungen:
Wenn man das Schieberegister sagen wir 16Bit lang macht, könnte man z.B. die oberen 4 Bits nehmen und damit über einen Decoder die Write-Signale 4^2 verschiedenen 10-Bit breiten "Teilnehmern" zuteilen bzw. ausmaskieren.
Damit wäre dann viel möglich, wie schaltbare potentialfreie Kontakte (Z.B. bei Montage auf dem Dachboden: Rotor links/rechts, Vorverstärker ein/aus),
richtige AD-Wandler (S-Meter?!, Temperatur) oder z.B. weitere NF-Eingänge.
Das Schieberegister ist nicht das Problem, eher der Aufwand mit dem Decoder und den Gattern zum ausmaskieren.
Eigenintelligenz:
Schaltet man das Radio ein, ohne dass das Programm auf dem Compi läuft, hört man nix und im Display leuchten allenfalls 1-2 zufällige Segmente.
Irgendwie eine Anzeige, ob der Compi noch "on" ist, wäre für abgesetzten Betrieb nicht schlecht.
Das liese sich mittels eines Hardware Watchdogs machen, der eine extra LED bekommt und ggf. die NF muted.
Der UART hat einen Ausgang, der signalisiert wann ein Byte richtig empfangen wurde, den könnte man dazu auswerten.
Die absolute aber noch dumme Overkill-Anwendung wäre, mit ein paar Taktgeneratoren/Zählern und einem (seriellen?) Eprom einen Sorry-Text im Display erscheinen zu lassen.
Weil ich dazu aber eine extra Eurokarte und ein doppelt so grosses Netzteil bräuchte lasse ich das lieber.
Später kann man ja immer noch den UART rausziehen und mit einer Adapterplatine einen Atmel oderso einsetzen...
Parameterübergabe:
Wenn man dem Programm beim Aufruf sagen könnte, welchen Sender es einstellen soll, wäre das eine nützliche Funktion.
Da das Radio auch ohne das Programm weiter läuft, solange einmal der Sender eingestellt wurde und die PLL nicht aus dem Ruder läuft,
könnte es sich sogar gleich wieder beenden und nur einen Returnwert zurückgeben.
Wie wärs mit Radio hören als Batchjob?
Besser noch als Cronjob,
der anhand eines Hörfahrplans die Sender einstellt und noch gleich einen Festplattenrekorder anschmeisst.
Oder "nur" als Wecker dient.
GUI:
Eine KDE Anwendung oder Mausbedienung ist z.Zt. nicht geplant. Wozu auch? Abgesehen davon müsste ich dann das Projekt umbenennen.
Sonstige SW Erweiterungen:
Sendersuchlauf, Senderspeicher auf Platte etc. kann man programmieren,
kommt aber bestenfalls erst nachdem das Speichern auf dem Flash umgesetzt ist.
Ansonsten möchte ich die Software klein halten. Mehr Funktionen für die Vorort-Knöpfe sind aber vorgesehen.
Das Auslesen der ZF-Frequenz habe ich irgendwann zufällig hinbekommen, allerdings funktionierts nur während
die Mute-Funktion aktiv ist - stand nicht in der Doku.
| / | | | _+___________________________________________________________________________________________________+_ | | A | B | C | D | E | F | G | H | | |_+_______________________________________________________________________________________________+_| | | ____ | | | | __\__ COMPUTER CONTROLLED | | |7| ___\___ V V PLL AM/FM STEREO RADIO |7| | | " | | INTERFACE CIRCUIT | | |_| __"_____|_|_ www.dl6mfj.de |_| | | | FM AM |>----LEFT-------\ | | | | 12V---| ANTENNA |-----ANA GND-----====> STEREO AMPLIFIER | | |6| GND---| PLL |>----RIGHT------/ |6| | | | TUNER | | | /|_| ____________ __________ |_| | | || | | 4 DIGIT |<--A0,A1--<----------\-\ | | | | || | __________ | ASCII |<--D0-D6--<--\----\ | | | | |5| || /---CLK--<|DO0 DO5|>--WR-->o| LED DSPL | _|____|__|_|_ |5| | | || /---DIN--<|DO1 | __________ | Q0--Q6-Q7Q8 | | | |_| || /---EN---<|DO2 DO3|>---------------------o---CLK-->| 9-BIT SHIFT | |_| | | || /---DOUT->|DI0 DO4|>-------------------o-|---DI--->| REGISTER | | | | | |+-----TUNE->|DI1 | ________ | | _____________ | | |4| +------ST--->|DI2 DO7|>-->| TX_REQ | 5V | | |4| | | | TX_STRT|o<-<|RC_DELAY| | | | _____________ | | _|_| 5V__________ | | __._____ R | +---CLK-->| | |_|_ | | R R R R | U_A_R_T | . | +-----DI--->| 1Kbit | | | | | |--|--|--|--4 DI->|DI3- DO6|>----- . -------|---------WE-->o| FLASH RAM | | | |3| \ \ \ \ |-DI6 DI7|<----- . -------o---------DO---<| | |3| | | |__|__|__| | | . _________ _____________ | | |_| GND 4xBUTTON | TXD|o>---- . -------->| RS232 | |_| | | | RXD|o<---- . --------<| TRCVR |<===RS232===> HOST COMPUTER | | | | o------o------->|X_BAUD | . _________ | | O|2| | JMPR _._____.__ . ___________ |2| | | _o______o__ . . . 12V<---|12V REGUL | | | -|_| |9,6k|115,2k| ___._____.___ . 5V<---| 5V REGUL |<---15V<=== POWER SUPPLY |_| | | | OSC. + | | |....... GND<-o-|___________| | | O| | |__DIVIDER__| | AUX LOGIC | | | | |1| -|I|- XTAL _____________ _|__ |1| | | / / / | | |_+_______________________________________________________________________________________________+_| | | A | B | C | D | E | F | G | H | | |___________________________________________________________________________________________________| | dwg.no. | date 10.05.2005 | Karl Kuehn |rev. 01 | DL6MFJ | pg.001| |-------------+-----------------+-----------------+-----------|_______________| ASCII RADIO | _|_____________|___________________________________|___________|_______________|_____________________|_ | | | |
Wozu E-CAD Software, wenns jeder Texteditor/Schreibmaschine/vt100 auch tut?
Ein paar ausgesuchte Daten (aus dem Kwang Sung pdf abgeschrieben):
ZF | FM: 10.7MHz | AM: 450 kHz |
S/N Ratio | FM: 60dB | AM: 40dB |
Spiegelfreq. | FM: -70dB | AM: -30dB |
USABLE SENS | FM: 12dBu MAX | AM: 60dBu MAX |
FM ANTENNA INPUT IMPEDANCE | 75Ω UNBALANCED |
AM LOOP ANTENNA INPUCTANCE | 18μH (50Ω) |
VFO Freq. zu RX Freq. Lage | oberhalb |
o-ASCII-Radio-----o---o-Wie-es-dazu-kam-o---o-Theorie---------o---o-Praxis----------o---o-Der-Empfang-----o---o-Die-Extras------o---o-Schaltplan------o---o-techn.-Daten----o---o-Code------------o
«-- zurück zur DL6MFJ Homepage
(Hier unten ist nix Interessantes mehr)
Das Progamm ist in 3 Module unterteilt: Hauptprogramm, IO-Ebene, Bigdisplay (für das Terminal). Hier ein paar kleine Ausschnitte aus dem Hauptprogramm und das Headerfile des IO-Moduls:
long calc_Hzzf(char *rx_bit){ long lzf =0; long add_bin =524288; int z=0; for (z=0;z<=19;z++){ if (rx_bit[z+4] == 0) lzf += add_bin; add_bin /=2; } if ((inmode2.gt == 4) || (inmode2.gt == 8 ) || (inmode2.gt == 32) || (inmode2.gt == 64)){ lzf /= inmode2.gt;} else {printf("\n falsche Zaehler Gatetime %d setze default \n",inmode2.gt); inmode2.gt = 32;lzf =0; } return(lzf); } void update_all_disp(void){ qrg_mhz = calc_qrg(qrg_teiler,inmode1.ref); qrg_Hz = calc_Hzqrg(qrg_teiler,inmode1.ref); calc_qrg_display(qrg_mhz, akt_zeile); led_zeile_senden(akt_zeile); update_display(); } void step_up(void){ qrg_teiler += 1; if (akt_mode == 'A'){/* AM */ if ((qrg_teiler > 4096) ||(qrg_teiler < 4)) qrg_teiler = 5; } else{/* FM */ if ((qrg_teiler > 32000) ||(qrg_teiler < 272)) qrg_teiler = 272; } if (vfo_mode != 'V'){ vfo_mode ='V'; strcpy(akt_ascii, call_ascii); } if ((display_mode !=1)&&(display_mode !=2)) set_bigdisplay_mode(1); inmode1.pctr=qrg_teiler; mode1_senden(inmode1); update_all_disp(); }
Digitalpegel LC72131
Vom IO-Modul hier das ganze Headerfile:
/* IO routinen */ #include <sys/ioctl.h> /* TIOCMSET etc. */ #include <sys/termios.h> /* div. Konstanten wie u.a. */ #include <fcntl.h> /* div. Konstanten wie O_RDWR | O_NOCTTY | O_NDELAY u.a. */ int port; int nbyte; char buf[16]; /*fuers lesen */ char mode3_rx[24]; struct mode1{ int pctr; /* Teiler */ int sns; int dvs; int cte; int xs; int ref; }; struct mode2{ int ioc1;int ioc2; int io1; int io2;int bo1; int bo2;int bo3; int bo4; int doc0;int doc1;int doc2; int ul0; int ul1; char dzc; int gt; int tbc; int dlc; int ifs; }; struct mode1 am_mode1,fm_mode1; struct mode2 am_mode2,fm_mode2; char leer_ascii[10]; char mem1_ascii[10]; char mem2_ascii[10]; char mem3_ascii[10]; char mem4_ascii[10]; char mem5_ascii[10]; char mem6_ascii[10]; char mem7_ascii[10]; char mem8_ascii[10]; char mem9_ascii[10]; char mem10_ascii[10]; struct mem{ struct mode1 m1; struct mode2 m2; char stn_call[10]; }; struct mem membank[10]; void init_membank(void); /* RS232 */ int open_port(void); int close_port(int fd); /***** allgemeine low level EA Routinen*****/ /*int set_out_byte(void);*/ unsigned char set_out_byte(void); int out_ledzeile(char lz); /*int out_ledzeile(unsigned char lz)*/ int start_schreiben(void); int seg_adr_flanken(int seg); /**** MODE1-3 funktionen *******/ int mode1_senden(struct mode1 tx_mode1); /**** MODE2 funktionen *******/ int ioc_flanken(int ioc_1,int ioc_2); int outport_flanken(int io_1,int io_2,int bo_1,int bo_2,int bo_3,int bo_4); int dnc_flanken(void); int doc_flanken(int doc_0,int doc_1,int doc_2); int ul_flanken(int ul_0,int ul_1); int dzc_flanken(char dz_c); int ifctr_flanken(int g_t); int tbc_flanken(int t_b); int dlc_flanken(int dl_c); int ifs_flanken(int if_s); int test_flanken(void); int mode2_senden(struct mode2 tx_mode2); /**** MODE3 funktionen *******/ int clk_ansreq_flanken(void); int mode3_senden(void); /*int read_butt(int *b_top,int *b_bott,int *b_top_r,int *b_bott_r);*/ int read_butt(int *b_top_l,int *b_bott_l,int *b_top_r,int *b_bott_r, int *di_do, int *di_stereo, int *di_tuned, int * di_flash); /**** sonstige funktionen *******/ int in_ledzeile(char lz); void set_dauerbed(void); /**** LED Ausgabe Funktionen *******/ int zeichen_senden(int pos, char zei); int zeile_loeschen(void); /* int akt_zeile_senden(char puffer[]); */ int led_zeile_senden(char *puffer); int calc_qrg_display(long mhz, char *puffer); /**** Flash Speicher Funktionen ****/ void read_mem(unsigned char adr, unsigned char *byte1, unsigned char *byte0); void enable_mem(void); void write_mem(unsigned char adr, unsigned char byte1, unsigned char byte0); void erase_mem(unsigned char adr); void eraseall_mem(void); void disable_mem(void);
o-ASCII-Radio-----o---o-Wie-es-dazu-kam-o---o-Theorie---------o---o-Praxis----------o---o-Der-Empfang-----o---o-Die-Extras------o---o-Schaltplan------o---o-techn.-Daten----o---o-Code------------o