26 марта 2009
Honda Fit: перестройка магнитолы в российский диапазон,
прошивки микроконтроллера



Прошивка для обмана синтезатора LC72191
;-------------------------------------------------------------------------
.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
;-------------------------------------------------------------------------


Продолжение следует

В начало

Сайт управляется системой uCoz