Не получается работать с 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)