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.

schema 28PIC board met TEA5767 en PIC 18F25K22

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




Hit Counter by Digits