Не получается работать с mt8888. Подключил по схеме из датащита к mega16, на вход подаю сигнал с телефонной линии МГТС, через понижающий трансформатор и последовательно в первичной обмотке кондер 0.47мкф. После подачи питания на кварце частота 3.5мгц с амплитудой 1.8в., т.е. микруха запускается и выдает в течение трех секунд на выходе (D0,D1,D2,D3) значения 1 2 3, задерка перед инициализацией 8888 210мс. НО при подаче сигнала на вход на выходе ничего не меняется, на IRQ всегда лог1.
Библиотеку использую иносранца одного:
/*------------------------------------------------------------------+
-	File Name		: cm8888_drv.c									-
-	Module Name		: DTMF Detector Driver							-
-	Description		: define subroutines for DTMF Detector			-
-	Last Update		: 11/07/2005 - 2.1 (PINOUT REVISION)			-
- 					  06/07/2005 - 2.0								-
-	Author			: Daniel Widyanto (kunilkuda@yahoo.com)			-
-					  Ivan Christian (chris.ivan@gmail.com)			-
+------------------------------------------------------------------*/
#include "port.h"
void init_DTMF(void) {
	// 1st Init: after power up
	DDR_DTMF  = 0xFF;
	
	PORT_DTMF |= _BV(RS0) | _BV(N_RD) | _BV(N_WR);
	PORT_DTMF &= ~_BV(N_CS);
	PORT_DTMF &= ~_BV(D3) & ~_BV(D2) & ~_BV(D1) & ~_BV(D0);
	
	// 1. Read Status Register
	PORT_DTMF &= ~_BV(N_RD);
	asm("nop"::);
	PORT_DTMF |= _BV(N_RD);
	asm("nop"::);
	// 2. Select CRA
	PORT_DTMF &= ~_BV(N_WR);
	asm("nop"::);
	PORT_DTMF |= _BV(N_WR);
	asm("nop"::);
	// 3. Write CRA
	PORT_DTMF &= ~_BV(N_WR);
	asm("nop"::);
	PORT_DTMF |= _BV(N_WR);
	asm("nop"::);
	// 4. Select CRB
	PORT_DTMF |= _BV(D3);
	PORT_DTMF &= ~_BV(N_WR);
	asm("nop"::);
	PORT_DTMF |= _BV(N_WR);
	asm("nop"::);
	
	// 5. Write CRB
	PORT_DTMF &= ~_BV(D3);
	PORT_DTMF &= ~_BV(N_WR);
	asm("nop"::);
	PORT_DTMF |= _BV(N_WR);
	asm("nop"::);
	
	// 6. Read Status Register
	PORT_DTMF &= ~_BV(N_RD);
	asm("nop"::);
	PORT_DTMF |= _BV(N_RD);
	asm("nop"::);
	
	// 2nd Init: set up operating mode
	// Mode: IRQ enable, DTMF mode, Tone Off
	// (already set up on 1st Init. Do the change for other mode)
}
unsigned char read_stat(void){
	unsigned char result;
	
	DDR_DTMF = 0xF0;
	PORT_DTMF |= _BV(RS0) | _BV(N_RD) | _BV(N_WR);
	PORT_DTMF &= ~_BV(N_CS);
	
	PORT_DTMF &= ~_BV(N_RD);
	asm("nop"::);
	result = (PINC & 0x0F);
	asm("nop"::);
	PORT_DTMF |= _BV(N_RD);
	asm("nop"::);
	
	return result;
}
unsigned char scan_DTMF(void){
	unsigned char result;
	
	DDR_DTMF=0xF0;
	PORT_DTMF |= _BV(N_RD) | _BV(N_WR);
	PORT_DTMF &= ~_BV(N_CS) & ~_BV(RS0);
	PORT_DTMF &= ~_BV(N_RD);
	asm("nop"::);
	result = (PINC & 0x0F);
	asm("nop"::);
	PORT_DTMF |= _BV(N_RD);	
	asm("nop"::);
	
	switch (result) {
		case 0x0A : 
			result = '0';
			break;
		case 0x0B :
			result = '*';
			break;
		case 0x0C :
			result = '#';
			break;
		default :
			result += '0';
	}
	
	return result;
}
 
- 
	
- Сталкивался ли кто-нибудь с такой же проблемой? - Techmike(31.10.2008 13:28)