'******************************************************************************* '* RDS_Scanner_ATMEL_Mega32 und FM1216_Tuner * '* Fehler: Umlaute in Lauftext werden falsch ausgegeben * '* Tunerumschaltung auf OIRT Rundfunk funktioniert noch nicht * '* OIRT/CCIR - Umschaltung soll über Doppeltaster erfolgen * '* Stand: 09.03.2014 Version 1.6 * '******************************************************************************* $regfile = "m32def.dat" $crystal = 4332000 $hwstack = 64 $swstack = 64 $framesize = 64 $prog &HFF , &HFF , &HD9 , &H00 'lock and fuse bytes für M32 'externer Quarz, JTAG disabled, 'Port C frei für Anwender 'Taster und Schalter '------------------- Portd = &B11001111 'interne PullUp's PD0,1,4,5,6,7 aktiv Config Pind.0 = Input 'Taster Ta3a OIRT Config Pind.1 = Input 'Taster Ta3b CCIR Config Pind.4 = Input 'Taster Ta1 Frequenz tiefer Config Pind.5 = Input 'Taster Ta2 Frequenz höher Config Pind.6 = Input 'Schalter S2 Scan/Hand Config Pind.7 = Input 'Schalter S3 Run/Skip Set Portd.0 'auf H=1 Set Portd.1 'auf H=1 Set Portd.4 'auf H=1 Set Portd.5 'auf H=1 Set Portd.6 'auf H=1=offen=Scan Set Portd.7 'auf H=1 'Initialisierung LCD '------------------- Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , _ Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 Config Lcd = 20 * 4a , Chipset = Ks077 'für Display EA DIP204-4NLED Cursor Off Cls 'Initialisierung Frequenzberechnung '---------------------------------- Dim Fin As Single 'Frequenz dezimal für Anzeige Dim Qrg As Word 'Frequenz für I2C-Tunerprogrammierung Dim Qrg_neu As Word Qrg = 1964 'Startwert 87.5 zuweisen Qrg_neu = Qrg 'Initialisierung FM1216_M3_I2C '----------------------------- Config Sda = Portc.1 'Pin 5 FM1216 M3 Config Scl = Portc.0 'Pin 4 FM1216 M3 Config I2cdelay = 10 Dim A As Byte 'High-Byte für I2C-Frequenz Dim B As Byte 'Low-Byte für I2C-Frequenz I2cinit Waitms 10 'Wichtig! Tuner erst in TV-Mode auf z.B. 471.25 MHz setzen und dann in FM-Mode, 'sonst kann es Probleme mit dem Anlauf der Ladungspumpe für die Abstimmspannung 'geben. '-------------------------------------------------------------------- I2cstart I2cwbyte &HC0 'I2C-Adresse, Tuner_Pin6 auf GND I2cwbyte &H1F I2cwbyte &HE2 I2cwbyte &H86 '62,5 kHz Abstimmschritte für TV I2cwbyte &H44 I2cwbyte &HA0 I2cstop Waitms 10 'ZF-Verstärker initialisieren '---------------------------- I2cstart I2cwbyte &H86 'ZF-Verstärker Adresse I2cwbyte &H00 'Sub-Adresse I2cwbyte &H4E '4E hohe Empfindlichkeit I2cwbyte &H10 'für 0dB NF-Verstärkung I2cwbyte &H40 'ZF-Verstärkung normal I2cstop Waitms 10 'Initialisierung RDS-Software-Decoder '------------------------------------ Dim Checksume(26)as Word Checksume(1) = &B1100011011 Checksume(2) = &B1110001111 Checksume(3) = &B1010100111 Checksume(4) = &B0011110111 Checksume(5) = &B0111101110 Checksume(6) = &B1111011100 Checksume(7) = &B1000000001 Checksume(8) = &B0110111011 Checksume(9) = &B1101110110 Checksume(10) = &B1101010101 Checksume(11) = &B1100010011 Checksume(12) = &B1110011111 Checksume(13) = &B1010000111 Checksume(14) = &B0010110111 Checksume(15) = &B0101101110 Checksume(16) = &B1011011100 Checksume(17) = &B0000000001 Checksume(18) = &B0000000010 Checksume(19) = &B0000000100 Checksume(20) = &B0000001000 Checksume(21) = &B0000010000 Checksume(22) = &B0000100000 Checksume(23) = &B0001000000 Checksume(24) = &B0010000000 Checksume(25) = &B0100000000 Checksume(26) = &B1000000000 Const Banka = &B1111011000 'Senderkennung Const Bankb = &B1111010100 Const Bankc = &B1001011100 Const Bankc1 = &B1111001100 Const Bankd = &B1001011000 Dim Empfang As Long Dim Empfang_neu As Long Dim Ergebnis As Word Dim Neue_daten As Bit Dim I As Byte Dim E As Byte Dim T As Byte Dim Txt2a As String * 21 Dim Txt As String * 2 Dim Txt0a As String * 8 Dim N0a As Byte Dim N0p As Byte Dim N2a As Byte Dim N2b As Byte Dim Blk As Byte Dim M As Byte Dim L As Byte Dim Rds As Long Dim Bit_zaehler As Byte Dim Synchron As Bit Dim Berechnen As Bit Config Portd.2 = Input 'RDCL von TDA7330 Set Portd.2 Config Portd.3 = Input 'RDSA von TDA7330 Set Portd.3 Rdsdata Alias Pind.3 On Int0 Int2_isr Enable Int0 Config Int0 = Falling N2a = 0 N2b = 0 'Scan-Timer configurieren '--------------------------- Const Timer1reload = 11000 'Verweildauer auf Frequenz Config Timer1 = Timer , Prescale = 1024 Load Timer1 , Timer1reload On Ovf1 Timer1_isr Enable Timer1 Start Timer1 Enable Interrupts 'Startanzeige auf LCD '-------------------- Locate 1 , 1 Lcd "RDS V1.6 DL3JIN" Locate 2 , 1 Lcd " 87.50 MHz" Do 'Beginn Hauptschleife If Pind.0 = 0 Then Qrg_neu = 1964 'mit CCIR=87.5 geht es weiter End If ' If Pind.1 = 0 Then ' Qrg_neu = 1530 'mit OIRT=65.8 geht es weiter ' End If If Pind.6 = 0 Then 'Schalter Scan/Hand auf Scan Enable Timer1 'Taktgeber einschalten If Pind.7 = 0 Then 'Schalter Skip/Run 'im OIRT-Bereich sind keine Ortssender auszublenden! If Qrg_neu = 1966 Then 'MDR Figaro beginnt zu splattern Qrg_neu = Qrg_neu + 6 '300 kHz überspringen End If If Qrg_neu = 1980 Then 'MDR Figaro2 beginnt zu splattern Qrg_neu = Qrg_neu + 6 '300 kHz End If If Qrg_neu = 1992 Then Qrg_neu = Qrg_neu + 2 '100 kHz überspringen End If If Qrg_neu = 2008 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2020 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2032 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2068 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2082 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2090then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2108 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2112 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2144 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2152 Then 'DLF 97.7 und drum herum Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2160 Then Qrg_neu = Qrg_neu + 16 End If If Qrg_neu = 2198 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2212 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2232 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2250 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2254 Then Qrg_neu = Qrg_neu + 4 '200 kHz überspringen End If If Qrg_neu = 2264 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2268 Then Qrg_neu = Qrg_neu + 6 End If If Qrg_neu = 2298 Then Qrg_neu = Qrg_neu + 4 End If If Qrg_neu = 2320 Then Qrg_neu = Qrg_neu + 4 End If If Qrg_neu = 2332 Then Qrg_neu = Qrg_neu + 2 End If If Qrg_neu = 2338 Then Qrg_neu = Qrg_neu + 4 End If If Qrg_neu = 2352 Then Qrg_neu = Qrg_neu + 2 End If End If Else Disable Timer1 'Taktgeber ausschalten If Pind.4 = 0 Then 'Taster Frequenz tiefer Qrg_neu = Qrg - 2 'Abstimmschrittweite 2=100kHz, 1=50kHz Waitms 200 'Entprellen Taster Down End If If Pind.5 = 0 Then 'Taster Frequenz höher Qrg_neu = Qrg + 2 Waitms 200 'Entprellen Taster Up End If End If 'Umrechnung QRG in Eingangsfrequenz Fin und Anzeige '-------------------------------------------------- If Qrg_neu = 2376 Then Qrg_neu = 1964 '108.10MHz -> 87.50 MHz If Qrg_neu = 1962 Then Qrg_neu = 2374 '87.40 MHz -> 108.00MHz ' If Qrg_neu = 1528 Then Qrg_neu = 1694 '65.70 MHz -> 74.00 MHz ' If Qrg_neu = 1696 Then Qrg_neu = 1530 '74.10 MHz -> 65.80 MHz If Qrg <> Qrg_neu Then 'neue Frequenz? Fin = Qrg_neu / 20 'zeitaufwändig -> Decodierfehler möglich Fin = Fin - 10.7 Locate 2 , 1 'neue Frequenz auf LCD ausgeben If Fin < 100 Then Lcd " " ; Fusing(fin , "##.##") ; " MHz" Else Lcd Fusing(fin , "###.##") ; " MHz" End If A = High(qrg_neu) 'neue Frequenz in Tuner schreiben B = Low(qrg_neu) I2cstart I2cwbyte &HC0 'I2C-Adresse, Tuner_Pin6 auf GND I2cwbyte A 'High-Teil I2cwbyte B 'Low-Teil I2cwbyte &H88 '50kHz Abstimmschritte I2cwbyte &H59 '59=Mono CCIR -> 41=Mono OIRT I2cwbyte &H00 I2cstop Qrg = Qrg_neu End If 'Frequenzänderung abgeschlossen 'RDS-Software-Decoder Programmcode '--------------------------------- If Synchron = 0 Then Empfang = Rds Bit_zaehler = 0 Berechnen = 1 Else Empfang = Empfang_neu Neue_daten = 0 End If If Berechnen = 1 Then For I = 0 To 25 If Empfang.i = 1 Then E = I + 1 Ergebnis = Ergebnis Xor Checksume(e) End If Next I M.0 = Empfang.10 M.1 = Empfang.11 M.2 = Empfang.12 M.3 = Empfang.13 M.4 = Empfang.14 M.5 = Empfang.15 M.6 = Empfang.16 M.7 = Empfang.17 L.0 = Empfang.18 L.1 = Empfang.19 L.2 = Empfang.20 L.3 = Empfang.21 L.4 = Empfang.22 L.5 = Empfang.23 L.6 = Empfang.24 L.7 = Empfang.25 Select Case Ergebnis Case Banka Locate 3 , 3 ' Sender Kennung anzeigen Lcd Hex(l) ; Hex(m) Synchron = 1 Case Bankb Synchron = 1 Blk = &H00 Blk.3 = L.3 Blk.4 = L.4 Blk.5 = L.5 Blk.6 = L.6 Blk.7 = L.7 Select Case Blk Case &B00100000 'Type 2A N2a = 1 Case &B00000000 'Type 0A N0a = 1 Blk = &H00 Blk.0 = M.0 Blk.1 = M.1 Select Case Blk Case &B00000000 N0p = 1 Case &B00000001 N0p = 3 Case &B00000010 N0p = 5 Case &B00000011 N0p = 7 End Select Case &B01000000 'Type 4A End Select Case Bankc Synchron = 1 If N2a = 1 Then Txt2a = Txt2a + Chr(l) + Chr(m) If Len(txt2a) > 20 Then Txt2a = Right(txt2a , 20) End If Case Bankc1 Synchron = 1 N0a = 0 N2a = 0 N2b = 0 Case Bankd Synchron = 1 If N2a = 1 Then Txt2a = Txt2a + Chr(l) + Chr(m) If Len(txt2a) > 20 Then Txt2a = Right(txt2a , 20) Locate 4 , 1 'Laufschrift ab hier anzeigen Lcd Txt2a N2a = 0 End If If N0a = 1 Then Txt = Chr(l) + Chr(m) Mid(txt0a , N0p , 2) = Txt Locate 3 , 8 'Sendername anzeigen Lcd Txt0a N0a = 0 End If If N2b = 1 Then N2b = 0 Case Else Synchron = 0 N0a = 0 N2a = 0 N2b = 0 End Select Ergebnis = &B0000000000000000 If Neue_daten = 0 Then Berechnen = 0 End If Locate 3 , 1 '* bei RDS anzeigen If Synchron = 1 Then Lcd "*" Else Lcd "-" Loop End Int2_isr: Shift Rds , Left If Rdsdata = 1 Then Rds.0 = 1 Else Rds.0 = 0 Incr Bit_zaehler If Synchron = 1 Then If Bit_zaehler = 26 Then Empfang_neu = Rds Neue_daten = 1 Berechnen = 1 Bit_zaehler = 0 End If End If If Bit_zaehler = 27 Then Bit_zaehler = 1 Return Timer1_isr: Load Timer1 , Timer1reload Qrg_neu = Qrg + 2 'Scanschritt 100 kHz aufwärts Return