Ich hatte folgende Idee. Leider fehlt mir der passende Quellcode dafür. Viele ICs von früher sind nicht oder kaummehr erhältlich und möchte mir einen Expander bauen der die I²C-Signale vom TDA6200 und MC44130 in die des TDA9852 umwandeln. Der Jumper JP1 soll gesetzt werden, wenn er die die Signale des TDA6200 umwandeln soll. Im Anhang sind einige Sätze plus Schaltbild meiner Idee enthalten.
Da ich die Schaltung auch testen möchte, frage ich mich ob man hier noch
die Steuerung des Expanders einbauen kann. µC ist ein AT89C2051.
; Anschluss der Tasten:
; P1. 7 6 5 4 3 2 1 0
; C/P + -
; P3. 7 5
; SDA SCL
t_cp equ p1.4 ; Taste C/P
t_plus equ p1.3 ; Taste Plus
t_minus equ p1.2 ; Taste Minus
sda equ p3.7
scl equ p3.5
i2c_ack_in equ 0 ; vom Slave gesendetes Acknowledge-Bit
i2c_ack_out equ 1 ; an den Slave zu sendendes Acknowledge-Bit
; jeweils 0=Ack, 1=kein Ack
prg equ 2 ; Flag fuer Channel/Program: 0->Ch., 1->Prg.
cc_nr equ 3 ; Flag fuer Sonderkanaele(CC): 0->Ch., 1->CC.
call ms100 ; Einschaltverzoegerung
setb i2c_ack_out
setb i2c_ack_in
mov r7,#1 ; Prg. Nr.
mov r6,#0 ; Ch. Nr.
setb prg
mov r0,#40
call i2c_start
mov a,#0a0h
call i2c_send
mov a,#0
call i2c_send
call i2c_start
mov a,#0a1h
call i2c_send
clr i2c_ack_out
init_prg:
call i2c_read
cjne a,#90,vgl ; wenn Ch.>89 dann Ch.=0
vgl:
jc vgl_end
clr a
vgl_end:
mov @r0,a
inc r0
cjne r0,#89,i1
setb i2c_ack_out
jmp init_prg
i1:
cjne r0,#90,init_prg
call i2c_stop
call get_ch
call disp_led
call tuner
abfrage:
call ms10
jnb t_minus,minus
jnb t_plus,plus
jnb t_cp,cp
jmp abfrage
minus:
jnb prg,chan_down
prg_down:
cjne r7,#0,r7_dec
mov r7,#49
jmp l1
r7_dec:
dec r7
l1:
call get_ch
call disp_led
call tuner
call ms10
minus_wait:
jnb t_minus,minus_wait
jmp abfrage
plus:
jnb prg,chan_up
prg_up:
cjne r7,#49,r7_inc
mov r7,#0
jmp l2
r7_inc:
inc r7
l2:
call get_ch
call disp_led
call tuner
call ms10
plus_wait:
jnb t_plus,plus_wait
jmp abfrage
chan_down:
cjne r6,#0,r6_dec
mov r6,#89
jmp l3
r6_dec:
dec r6
l3:
call save_ch
call disp_led
call tuner
call ms10
minus2_wait:
jnb t_minus,minus2_wait
jmp abfrage
chan_up:
cjne r6,#89,r6_inc
mov r6,#0
jmp l4
r6_inc:
inc r6
l4:
call save_ch
call disp_led
call tuner
call ms10
plus2_wait:
jnb t_plus,plus2_wait
jmp abfrage
cp:
jb prg,mode_ch
mode_prg:
setb prg
call store_eeprom
jmp cp_disp
mode_ch:
clr prg
cp_disp:
call disp_led
call ms10
cp_wait:
jnb t_cp,cp_wait
jmp abfrage
get_ch:
mov a,r7
add a,#40
mov r0,a
mov a,@r0
mov r6,a
cjne a,#70,cc_test
cc_test:
cpl c
mov cc_nr,c
ret
save_ch:
mov a,r7
add a,#40
mov r0,a
mov a,r6
mov @r0,a
cjne a,#70,cc_test2
cc_test2:
cpl c
mov cc_nr,c
ret
store_eeprom:
call i2c_start
mov a,#0a0h
call i2c_send
mov a,r7
call i2c_send
mov a,r6
call i2c_send
call i2c_stop
ret
disp_led:
mov dptr,#disp_tab
call i2c_start ; Daten auf Display schreiben
mov a,#70h ; Adresse SAA1064
call i2c_send
mov a,#0h ; Instructionbyte SAA1064
call i2c_send
mov a,#37h ; Controlbyte SAA1064
call i2c_send
jb prg,prg_nr
ch_nr:
mov a,r6
jnb cc_nr,d1
clr c
subb a,#69
jmp d1
prg_nr:
mov a,r7
d1:
mov b,#10
div ab
push acc
mov a,b
movc a,@a+dptr
call i2c_send
pop acc
movc a,@a+dptr
call i2c_send
jnb prg,ch_disp
pr_disp:
mov a,#17 ; "r"
movc a,@a+dptr
call i2c_send
mov a,#16 ; "P"
movc a,@a+dptr
call i2c_send
jmp d2
ch_disp:
jb cc_nr,cc_dis
mov a,#18 ; "h"
jmp dis
cc_dis:
mov a,#12 ; "C"
dis:
movc a,@a+dptr
call i2c_send
mov a,#12 ; "C"
movc a,@a+dptr
call i2c_send
d2:
call i2c_stop
ret
tuner:
call i2c_start
mov a,#0c2h ; Adresse PLL-Chip
call i2c_send
mov dptr,#freq_tab
mov a,r6 ; Channel-Nr.
rl a ; mit 2 multiplizieren
push acc
movc a,@a+dptr ; oberes Teilerbyte
anl a,#7fh
call i2c_send
pop acc
clr c
add a,#1
movc a,@a+dptr ; unteres Teilerbyte
call i2c_send
mov a,#10001110b ; charge-pump 50æA, normal operation
call i2c_send
cjne r6,#4,c1 ; Ermittlung des Bandes
vhf1:
mov a,#4 ; VHF I
jmp band_ende
c1:
jc vhf1
cjne r6,#12,c2
vhf3:
mov a,#2 ; VHF III
jmp band_ende
c2:
jc vhf3
cjne r6,#69,c3
uhf:
mov a,#1 ; UHF
jmp band_ende
c3:
jc uhf
jmp vhf3 ; CC1..20
band_ende:
orl a,#11111000b
call i2c_send
call i2c_stop
ret
i2c_start: ; Start I2C
setb sda
nop
setb scl
call ms001
clr sda ; Data auf 0 (Start)
call ms001
clr scl ; Clock auf 0
call ms001
ret
i2c_stop: ; Stop I2C
call ms001
setb scl ; Clock auf 1
call ms001
setb sda ; Data auf 1 (Stop)
call ms001
ret
i2c_send: ; 1 Datenbyte senden
mov r3,#8
i2c_sloop:
rlc a
mov sda,c
call ms001
setb scl
call ms001
clr scl
call ms001
djnz r3,i2c_sloop
setb sda
call ms001
setb scl
call ms001
mov c,sda ; Acknowledge-Bit lesen
mov i2c_ack_in,c
clr scl
call ms001
clr sda
call ms001
ret
i2c_read: ; 1 Datenbyte empfangen
mov r3,#8
clr a
setb sda
i2c_rloop:
call ms001
setb scl
mov c,sda
rlc a
call ms001
clr scl
djnz r3,i2c_rloop
call ms001
mov c,i2c_ack_out ; Acknowledge-Bit senden
mov sda,c
call ms001
setb scl
call ms001
clr scl
call ms001
clr sda
call ms001
ret
ms001: ; Verzoegerung 10 us (bei 12MHz)
push acc
mov a,#2
ms001_1:
djnz acc,ms001_1
pop acc
ret
ms100: ; Verzoegerung 100 ms (bei 12 MHz)
push acc
mov a,r0
push acc
mov a,r1
push acc
mov r0,#100
ms100_2:
mov r1,#100
ms100_1:
nop
nop
nop
nop
nop
nop
nop
nop
djnz r1,ms100_1
djnz r0,ms100_2
pop acc
mov r1,a
pop acc
mov r0,a
pop acc
ret
ms10: ; Verzoegerung 10 ms (bei 12 MHz)
push acc
mov a,r0
push acc
mov a,r1
push acc
mov r0,#10
ms10_2:
mov r1,#100
ms10_1:
nop
nop
nop
nop
nop
nop
nop
nop
djnz r1,ms10_1
djnz r0,ms10_2
pop acc
mov r1,a
pop acc
mov r0,a
pop acc
ret
freq_tab:
; CH 0...4
db 0h,0h,5h,2h,5h,72h,5h,0E2h,6h,52h
; CH 5...12
db
0Dh,62h,0Dh,0D2h,0Eh,42h,0Eh,0B2h,0Fh,22h,0Fh,92h,10h,2h,10h,72h
; CH 13...20
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; CH 21...27
db 1Fh,0E2h,20h,62h,20h,0E2h,21h,62h,21h,0E2h,22h,62h,22h,0E2h
; CH 28...34
db 23h,62h,23h,0E2h,24h,62h,24h,0E2h,25h,62h,25h,0E2h,26h,62h
; CH 35...41
db 26h,0E2h,27h,62h,27h,0E2h,28h,62h,28h,0E2h,29h,62h,29h,0E2h
; CH 42...48
db 2Ah,62h,2Ah,0E2h,2Bh,62h,2Bh,0E2h,2Ch,62h,2Ch,0E2h,2Dh,62h
; CH 49...55
db 2Dh,0E2h,2Eh,62h,2Eh,0E2h,2Fh,62h,2Fh,0E2h,30h,62h,30h,0E2h
; CH 56...62
db 31h,62h,31h,0E2h,32h,62h,32h,0E2h,33h,62h,33h,0E2h,34h,62h
; CH 63...69
db 34h,0E2h,35h,62h,35h,0E2h,36h,62h,36h,0E2h,37h,62h,37h,0E2h
; CC 1...7 (Sonderkanaele)
db 9h,2h,9h,72h,9h,0E2h,0Ah,52h,0Ah,0C2h,0Bh,32h,0Bh,0A2h
; CC 8...14
db 0Ch,12h,0Ch,82h,0Ch,0F2h,10h,0E2h,11h,52h,11h,0C2h,12h,32h
; CC 15...20
db 12h,0A2h,13h,12h,13h,82h,13h,0F2h,14h,62h,14h,0D2h
disp_tab: ; Code-Tabelle fuer Displayzeichen
; 0 1 2 3 4 5 6 7 8 9 A b C d E
f
db
3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h
; P r h
db 73h,50h,74h
END
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.