;------------------------------------------------------------------------- .include "m8def.inc" ; Copyright (c) 2008 by Ozab ; Коррекция частоты магнитолы Honda Fit. ; Работаем на тактовой частоте 16MHz от внешнего кварца. ; Вешаемся в разрыв линий CL,DI и параллельно линии CE синтезатора Sanyo LC72191. ; PD0 <- DI ; PD1 <- CE ; PD2 <- CL (int0) ; PD3 <- CL (int1) ; PC0 -> DI синтезатора ; PC1 -> ; PC2 -> CL синтезатора ; PC3 -> .def a = r16 .def xx0 = r17 .def xx1 = r18 .def di = r19 .def adr = r20 .def b = r21 .equ cc0 = 0x68 ; сдвиг частоты, MHz*20, в нашем случае 18*20=360=0x0168 .equ cc1 = 0x01 ; (частота сравнения 25 кГц) ;------------------------------------------------------------------------- .cseg .org 0x0000 rjmp RESET rjmp INT_CL_DN rjmp INT_CL_UP ;------------------------------------------------------------------------- RESET: cli clr a out DDRB,a ; port b,d in out DDRD,a out PORTB,a out SPH,a ; стек ser a out DDRC,a ; port c out out PORTD,a ; подцепить pullup резисторы out SPL,a ; стек in a,MCUCR ori a,0b00001110 ; int0 по спаду, int1 по фронту andi a,0b11111110 out MCUCR,a in a,GICR ori a,0b10000000 ; int1 разрешен out GICR,a ldi xx0,cc0 ldi xx1,cc1 ldi adr,0xFF in di,PIND out PORTC,di sei ;------------------------------------------------------------------------- WORK: wdr sleep rjmp WORK ;------------------------------------------------------------------------- INT_CL_UP: in a,PIND mov di,a andi di,0b00000001 andi a, 0b00000010 ; CE? breq CE_DN CE_UP: ; CE=1, но наш ли адрес? cpi adr,0b00100000 breq OUR_ADR cpi adr,0b00010000 brne NOR_ADR OUR_ADR: ; адрес наш, побитно прибавляем константу ldi b,0 add xx0,di adc xx1,b mov di,xx0 clc ror xx1 ror xx0 rcall clo_pulse reti NOR_ADR: ; адрес не наш, транзит данных rcall clo_pulse reti CE_DN: ; CE=0, транзит, захват адреса rcall clo_pulse ror di ror adr andi adr,0b11110000 ldi xx0,cc0 ldi xx1,cc1 reti ;------------------------------------------------------------------------- clo_pulse: ; отрабатываем импульс CL для синтезатора andi di,0b00000001 out PORTC,di rcall noops ori di,0b00000100 ; 1->CLO out PORTC,di rcall noops andi di,0b00000001 out PORTC,di ; 0->CLO ret noops: ; тайминг очень важен, подобран методом тыка wdr nop nop nop nop nop nop nop nop ret ;------------------------------------------------------------------------- INT_CL_DN: ; CL\ reti ;-------------------------------------------------------------------------