Code voor TEA5767 3-Knops Radio
Proton (basic) of Amicus code voor de TEA5767 met PIC 18F25K22.
Een 2x 16 karakter display
Een TEA5767 I2C FM ontvangertje
3 druk kopjes ( +, _ en mode)
Een buzzer
5 modes:
1. Stations selecteren : Pre Set stations selecteren (zie uitleg)
2. Zender zoeken : “+” zoekt de eerste zender op hoger frequentie en “-” naar beneden
3. Frequentie stappen : met + en – in stappen van 50Khz de band op en af.
4. Set Station naam : Pre set stations namen aan frequenties koppelen en opslaan.
5. Set zoek level : Het ontvangstniveau voor zender zoeken instellen.
“Pre selectie stations namen” werkt als volgt:
Ga met het “mode” knopje naar “zoek zender”
Met de up/down (+/-) knopjes je zender zoeken.
Als die gevonden is met het “mode” knopje “Set Station Naam” selecteren.
Nu met de +/- knopjes door de lijst met stations namen doorlopen.
(dit is de lijst zoals onder in het programma (CData) te vinden is)
Wanneer de juiste naam gevonden is, even wachten tot “druk mode knop” tekst verschijnt.
Als dan de “mode” knop gedrukt wordt, wordt de huidige frequentie aan de gekozen naam gekoppeld.
De zo gekozen naam/frequentie combinaties kunnen dan als pre set stations geselecteerd worden.
In eerste instantie is dit dus leeg en kunnen er geen “pre set stations” (default +/- optie) geselecteerd worden.
Het schema met een PIC 18F25K22 op een 28PIC moederbordje en de TEA5767 module.
In het schema missen 2 pull-up weerstanden van 4K7 (naar VCC) voor de I2C lijnen SDA en SCL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 | '**************************************************************** '* Name : TEA5767 FM 3 knops Radio * '* Author : Knutselaar * '* Notice : Copyright (c) 2012 Knutselaar.eu * '* : All Rights Reserved * '* Date : 07/21/2012 versie 1.0 * '* 08/08/2012 versie 2.0 * '* Version : 2.0 * '* Notes : 2.0: Sations naam mogelijkheid toegevoegd * '* GOSUB stationUp, GOSUB stationDown * '* GOSUB stationSetNaamUp, GOSUB stationSetNaamDown * '* GOSUB stationOpslaan, GOSUB stationNaam * '**************************************************************** Device 18F25K22 CONFIG_START FOSC = INTIO67 ;Internal oscillator block, port function on RA6 and RA7 FCMEN = Off ;Fail-Safe Clock Monitor disabled IESO = Off ;internal external switchover mode ;PWRT = On ;power-up timer For 18F25K20 PWRTEN = On ;power-up timer For 18F25K22 BOREN = On ;brown-out reset ;BORV = 27 ;brown-out reset value (2,7V) For 18F25K20 BORV = 285 ;brown-out reset value (2,85V) for 18F25K22 WDTEN = Off ;watchdog timer WDTPS = 128 ;1:128 WDT prescalar PBADEN = Off ;analog port B<4:0> STVREN = On ;stack overflow reset LVP = Off ;low voltage programming XINST = Off ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode) Debug = Off ;no debug WRT1 = On WRT2 = On CONFIG_END XTAL 16 Symbol Speaker = PORTC.5 Symbol LEDGreen = PORTA.5 Symbol ButtonUp = PORTC.0 Input PORTC.0 Symbol ButtonLow = PORTC.1 Input PORTC.1 Symbol ButtonMode = PORTC.2 Input PORTC.2 Dim Frequentie As Word ;Werk frequentie Dim setFrequentie As Word ;Frequentie uit preset lijst (ERead 10 t/m 38 in stappen van 2 (word)) Dim Pll As DWord ;TEA5767 PLL Dim stereo As Byte ;TEA5767 stereo indicator (0/1, hoogste bit van 3e uitleesbyte) Dim receiveLevel As Byte ;TEA5767 receivelevel (0/15, hoogste 4 bits uit 4e uitlees byte) Dim receiveLevel2 As Byte ;hulp variable bij zender zoeken Dim receiveLevelStart As Byte ;hulp variable bij zender zoeken Dim var1 As Byte ;1e uitleesbyte Dim var2 As Byte ;2e uitleesbyte Dim var3 As Byte ;3e uitleesbyte Dim var4 As Byte ;4e uitleesbyte Dim var5 As Byte ;5e uitleesbyte Dim stationCount As Byte ;Preset stations naam teller (0/19) Dim stationSet As Byte ;Indicator voor naamselectie (1/0) Dim stationSetNaamCount As Byte ;Preset Naam teller bij naam instellen Dim selectStation As Byte ;Geselecteerd station uit naam lijst (CData) (0/19) Dim stationAdres As Byte ;ERead locatie van frequentie lijst Dim stationFound As Byte ;Indicator voor station zoeken (1/0) Dim x As Byte ;teller Dim y As Byte ;teller Dim mode As Byte ;+/- knopmode (0/4) Dim levelLimit As Byte ;TEA5767 Ontvangst level limiet bij zender zoeken Dim stationArray[16] As Byte ;Stations naam array voor display OSCCON = %01110000 ; 16Mhz intern osc 'OSCTUNE= %01000000 ; 4x PLL aan geeft 64Mhz ANSELA = %00000000 ; 18F25K22 poort A digitaal ANSELB = %00000000 ; 18F25K22 poort B digitaal ANSELC = %00000000 ; 18F25K22 Poort C digitaal ;ALL_DIGITAL TRUE ; Alle poorten digitaal voor 18F25K20 Clear ; wis geheugen ; ophalen laatst gebruikte instellingen Frequentie = ERead 0 If Frequentie < 8750 Or Frequentie > 10800 Then ; lege eeprom Frequentie = 10210 ; 102.1 Mhz (538 amstelveen) EWrite 18, [Frequentie] ; positie 4 "Radio 538 " End If levelLimit = ERead 2 If levelLimit < 7 Or levelLimit > 13 Then levelLimit = 9 ; lege eeprom Cls Sound Speaker , [115,20] GoSub printKnutselaar Print At 2, 1, "TEA5767 FM Radio" GoSub programTEA DelayMS 2000 GoSub printReceive loop: For x = 1 To 70 ; 3,5 seconden loop (70 x 50mS). If ButtonUp = 0 Then x = 1 If mode = 0 Then ;Station selecteren (pre set). findUpAgain: GoSub stationUp If stationFound = 0 Then GoTo findUpAgain ;verder zoeken End If If mode = 1 Then GoSub searchUp ;zender zoeken omhoog. If mode = 2 Then GoSub freqUp ;frequentie stap omhoog (50Khz). If mode = 3 Then GoSub stationSetNaamUp ;Stations naam selecteren uit lijst. If mode = 4 Then GoSub levelUp ;level instellen voor zender zoek. End If If ButtonLow = 0 Then x = 1 If mode = 0 Then ;Station selecteren (pre set). findDownAgain: GoSub stationDown If stationFound = 0 Then GoTo findDownAgain ;verder zoeken. End If If mode = 1 Then GoSub searchDown ;zender zoeken omlaag. If mode = 2 Then GoSub freqDown ;frequentie stap omlaag (50Khz). If mode = 3 Then GoSub stationSetNaamDown ;Stations naam selecteren uit lijst. If mode = 4 Then GoSub levelDown ;level instellen voor zender zoek. End If If ButtonMode = 0 Then x = 1 GoSub setMode End If DelayMS 50 If x = 35 Then GoSub programTEA ; Om met readTEA receiveLevel uit te kunnen lezen. If x = 65 And mode = 3 And stationSet = 1 Then GoSub stationOpslaan ;frequetie aan naam koppelen. Next x If mode = 2 Or mode = 3 Or mode = 4 Then mode = 0 ; level select mode terugzetten naar search mode. GoSub readTEA ;TEA5767 uitlezen voor ontvangst sterkte en mono/stereo. GoSub printReceive ;Ontvangst frequetie op display tonen. GoSub printKnutselaar ;"Knutselaar.eu " op display indien geen stations naam bekend is. GoSub stationsNaam ;Stationsnaam op display tonen indien bekend. GoTo loop printKnutselaar: Print At 1, 1, "Knutselaar.eu " Return printReceive: ;Ontvangst frequetie op display tonen. Print At 2,1,Dec Frequentie / 100,".",DEC2 Frequentie // 100," Mhz ", DEC2 receiveLevel, " " Return programTEA: ;TEA5767 frequentie instellen. Pll = Frequentie * 10000 + 225000 Pll = Pll * 4 / 32768 HBusOut %11000000,[Pll.BYTE1,Pll.BYTE0,%00010000,%00010000,%00000000] Return readTEA: ;TEA5767 uitlezen voor ontvangst sterkte en mono/stereo. HBusIn %11000000, [var1,var2,var3,var4,var5] receiveLevel = var4/16 stereo = var3/128 Return freqUp: ;Ontvangst frequentie met 50Khz stap ophogen. If mode = 0 Then Print At 1,1, "Freq. stap + " DelayMS 100 Frequentie = Frequentie + 5 If Frequentie > 10800 Then Frequentie = 10800 : Sound Speaker , [125,20] GoSub programTEA DelayMS 30 GoSub readTEA GoSub printReceive EWrite 0, [Frequentie] ;laatst gekozen frequentie onthouden GoSub stationsNaam Return freqDown: ;Ontvangst frequentie met 50Khz stap verlagen. If mode = 0 Then Print At 1,1, "Freq. stap -- " DelayMS 100 Frequentie = Frequentie - 5 If Frequentie < 8750 Then Frequentie = 8750 : Sound Speaker , [125,20] GoSub programTEA DelayMS 30 GoSub readTEA GoSub printReceive EWrite 0, [Frequentie] ;laatst gekozen frequentie onthouden GoSub stationsNaam Return searchUp: ;omhoog zoeken naar eerstvolgende station op niveau levelLimit. Print At 1,1, "Zender zoek + " DelayMS 300 Frequentie = Frequentie + 15 repeatUp: If ButtonLow = 0 Or ButtonMode = 0 Then DelayMS 200 : Return ;search onderbreken/omkeren. GoSub freqUp DelayMS 100 If receiveLevel < levelLimit And Frequentie < 10800 Then GoTo repeatUp ' eind van FM band. receiveLevelStart = receiveLevel GoSub freqUp ' 1 stap hoger. DelayMS 150 GoSub readTEA receiveLevel2 = receiveLevel GoSub freqUp ' 1 stap hoger. DelayMS 150 GoSub readTEA If receiveLevelStart > receiveLevel And receiveLevelStart > receiveLevel2 Then GoSub freqDown GoSub freqDown ' 2 stappen lager. End If If receiveLevel2 > receiveLevel Then GoSub freqDown ' 1 stap lager. End If DelayMS 300 GoSub programTEA :DelayMS 30 : GoSub readTEA If stereo = 0 Or receiveLevel < levelLimit Then GoTo repeatUp DelayMS 300 GoSub programTEA :DelayMS 30 : GoSub readTEA If stereo = 0 Or receiveLevel < levelLimit Then GoTo repeatUp Return searchDown: ;omlaag zoeken naar eerstvolgende station op niveau levelLimit. Print At 1,1, "Zender zoek -- " DelayMS 300 Frequentie = Frequentie - 15 repeatDown: If ButtonUp = 0 Or ButtonMode = 0 Then DelayMS 200 : Return ;search onderbreken/omkeren. GoSub freqDown DelayMS 100 If receiveLevel < levelLimit And Frequentie > 8750 Then GoTo repeatDown ' eind van FM band. receiveLevelStart = receiveLevel GoSub freqDown ' 1 stap lager. DelayMS 200 GoSub readTEA receiveLevel2 = receiveLevel GoSub freqDown ' 1 stap lager. DelayMS 150 GoSub readTEA If receiveLevelStart > receiveLevel And receiveLevelStart > receiveLevel2 Then GoSub freqUp GoSub freqUp ' 2 stappen hoger. End If If receiveLevel2 > receiveLevel Then GoSub freqUp ' 1 stap hoger. End If DelayMS 300 GoSub programTEA :DelayMS 30 : GoSub readTEA If stereo = 0 Or receiveLevel < levelLimit Then GoTo repeatDown DelayMS 300 GoSub programTEA :DelayMS 30 : GoSub readTEA If stereo = 0 Or receiveLevel < levelLimit Then GoTo repeatDown Return levelUp: ;instellen zoek levelLimit omhoog. Print At 1,1, "Zoek level + " DelayMS 300 levelLimit = levelLimit + 1 If levelLimit > 14 Then levelLimit = 14 : Sound Speaker , [125,20] Print At 2,1, "Zoek level = ", Dec levelLimit , " " EWrite 2, [levelLimit] Return levelDown: ;instellen zoek levelLimit omlaag. Print At 1,1, "Zoek level -- " DelayMS 300 levelLimit = levelLimit -1 If levelLimit < 6 Then levelLimit = 6 : Sound Speaker , [125,20] Print At 2,1, "Zoek level = ", Dec levelLimit , " " EWrite 2, [levelLimit] Return stationUp: ;selecteren preset stations omhoog. selectStation = selectStation + 1 If selectStation = 20 Then ; laatste stations naam. selectStation = 19 Sound Speaker , [125,20] stationFound = 1 ; stop verder zoeken. Return End If stationAdres = selectStation * 2 + 10 setFrequentie = ERead stationAdres If setFrequentie > 8750 And setFrequentie < 10800 Then Frequentie = setFrequentie EWrite 0, [Frequentie] ;laatst gekozen station (frequentie) onthouden GoSub programTEA GoSub stationsNaam stationFound = 1 DelayMS 400 Return Else stationFound = 0 ; verder zoeken. End If Return stationDown: ;selecteren preset stations omlaag. selectStation = selectStation - 1 If selectStation = 255 Then ; eerste station. selectStation = 0 Sound Speaker , [125,20] stationFound = 1 ; stop verder zoeken. Return End If stationAdres = selectStation * 2 + 10 setFrequentie = ERead stationAdres If setFrequentie > 8750 And setFrequentie < 10800 Then Frequentie = setFrequentie EWrite 0, [Frequentie] ;laatst gekozen station (frequentie) onthouden GoSub programTEA GoSub stationsNaam stationFound = 1 DelayMS 400 Return Else stationFound = 0 ; verder zoeken. End If Return stationSetNaamUp: ;Naam selectie omhoog voor preset toevoegen. stationSetNaamCount = stationSetNaamCount + 1 If stationSetNaamCount > 19 Then stationSetNaamCount = 19 : Sound Speaker , [125,20] stationSet = 1 stationCount = stationSetNaamCount GoSub printStationsNaam DelayMS 350 Return stationSetNaamDown: ;Naam selectie omlaag voor preset toevoegen. stationSetNaamCount = stationSetNaamCount - 1 If stationSetNaamCount = 255 Then stationSetNaamCount = 0 : Sound Speaker , [125,20] stationSet = 1 stationCount = stationSetNaamCount GoSub printStationsNaam DelayMS 350 Return stationOpslaan: ;Opslaan preset station naam/frequentie. (frequentie aan naam koppelen) Print At 1,1, "Druk Mode Knop " For x = 1 To 100 If x = 25 Then Print At 1,1, "Om op te slaan " If ButtonMode = 0 Then stationAdres = 2 * stationSetNaamCount + 10 EWrite stationAdres, [Frequentie] Sound Speaker , [125,20] x = 100 End If DelayMS 50 Next x stationSet = 0 Return stationsNaam: ; Stations naam zoeken bij frequentie. For stationCount = 0 To 19 stationAdres = 2 * stationCount + 10 setFrequentie = ERead stationAdres If Frequentie > setFrequentie - 6 And Frequentie < setFrequentie + 6 Then GoSub printStationsNaam GoSub printReceive selectStation = stationCount End If Next x Return setMode: ;mode selectie op display tonen. Print At 1,1, "Mode selectie " DelayMS 300 mode = mode + 1 If mode = 5 Then mode = 0 If mode = 0 Then Print At 2,1, "Select Station " If mode = 1 Then Print At 2,1, "Zoek zender " If mode = 2 Then Print At 2,1, "Stap frequentie " If mode = 3 Then Print At 2,1, "Set Station Naam" If mode = 4 Then Print At 2,1, "Set Zoek level " Return printStationsNaam: ;Stations naam op display tonen. For y = 0 To 15 stationArray[y] = CRead 10000 + y + (stationCount * 16) Next y Print At 1,1, Str stationArray Return Stop ;Lijst met stations namen. Org 10000 : CData "Radio 1 " Org 10016 : CData "Radio 2 " Org 10032 : CData "3 FM " Org 10048 : CData "Radio 4 " Org 10064 : CData "Radio 538 " Org 10080 : CData "SKY Radio " Org 10096 : CData "Radio VERONICA " Org 10112 : CData "Q-MUSIC " Org 10128 : CData "100% NL " Org 10144 : CData "SLAM! FM " Org 10160 : CData "BNR " Org 10176 : CData "ARROW JAZZ FM " Org 10192 : CData "Radio DECIBEL " Org 10208 : CData "Radio NL " Org 10224 : CData "Radio NH " Org 10240 : CData "Lokaal 1 " Org 10256 : CData "Lokaal 2 " Org 10272 : CData "Lokaal 3 " Org 10288 : CData "Lokaal 4 " Org 10304 : CData "Lokaal 5 " |
Vragen of sugesties voor deze pagina: pieter.knutselaar@gmail.com