Цитата(mempfis_ @ Aug 28 2010, 09:49)

Ему поможет ... минимальный внешний МК (типа тини13) для включения модема и контроля зависания.
Ваистену. У меня даже схемка (цепи питания не показаны) и программка соответствующие сохранились.
Код
#include "iotiny13.h"
#include <inavr.h>
#define bit(n) (1 << (n))
#define setbit(p,n) (p|=bit(n))
#define clrbit(p,n) (p&=~bit(n))
#define invbit(p,n) (p=p^bit(n))
#define tstbit(p,n) (p&bit(n))
#define MasterClock 9600000
#define delay_us(c) __delay_cycles(MasterClock/1000000*c)
#define delay_ms(c) __delay_cycles(MasterClock/1000*c)
volatile unsigned int SecondCounter = 0; // Счетчик секунд
#pragma vector = INT0_vect
__interrupt void INT0_vect_Interrupt(void)
{
SecondCounter = 0; // Пришел сигнал от GSM-модуля, обнуляем счетчик
}//INT0_vect_Interrupt
void main (void)
{
PORTB = 0x00; // Инициализация порта B
DDRB = 0x02;
CLKPR = 0x80; // Предделитель тактового генератора = 1
CLKPR = 0x00;
GIMSK=0x60;
MCUCR=0x01;
PCMSK=0x04;
GIFR=0x60;
WDTCR = 0x39; // Watchdog Timer Prescaler: OSC/1024k
WDTCR = 0x29;
asm ("sei"); // Разрешаем прерывания
// Запускаем модуль
setbit(PORTB, 1); // ON = 1
delay_ms(1000); // Задержка 1 с
__watchdog_reset(); // Сбрасываем WatchDog
clrbit(PORTB, 1); // ON = 0
delay_ms(2000); // Задержка 2 с
__watchdog_reset(); // Сбрасываем WatchDog
setbit(PORTB, 1); // ON = 1, так и оставляем
while (1)
{
delay_ms(1000); // Задержка 1 с
SecondCounter++;
__watchdog_reset(); // Сбрасываем WatchDog
if (SecondCounter > 3600) // Модуль завис
{
// Пытаемся перезапустить модуль
setbit(PORTB, 1); // ON = 1
delay_ms(1000); // Задержка 1 с
__watchdog_reset(); // Сбрасываем WatchDog
clrbit(PORTB, 1); // ON = 0
delay_ms(2000); // Задержка 2 с
__watchdog_reset(); // Сбрасываем WatchDog
setbit(PORTB, 1); // ON = 1, так и оставляем
SecondCounter = 0; // Обнуляем
}
}
}
Сейчас точно не помню, давно это было, возможно в начало main надо добавить
Код
GIMSK = 0x40; // Прерывание INT0 включено. Режим - реакция на любое изменение
MCUCR = 0x01;
GIFR = 0x40;