Forum: Mikrocontroller und Digitale Elektronik Expander für ältere ZF/NF-Karten für Stereo-TVs


von A. Fuchs (Gast)


Angehängte Dateien:

Lesenswert?

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.

von A. Fuchs (Gast)


Angehängte Dateien:

Lesenswert?

Hier verwendeten ICs

von A. Fuchs (Gast)


Angehängte Dateien:

Lesenswert?

Datenblatt des MC44130

von A. Fuchs (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.