Цитата(kertis @ Jun 6 2006, 06:58)

Цитата(TamTam @ Jun 6 2006, 06:36)

Почему МК ресетится и как можно узнать из за чего ????
источник сброса можно узнать в специальном регистре.
в мастере начального кода CVAVR есть пунктик - сделать код для выяснения этого.
Это понятно но для AT90S2313 такой галки нет.
Цитата(andk @ Jun 6 2006, 06:52)

1. Запостить сюда исходник (Экстрасенсов тут нет)

Вот сурц, (сильно не пинать я только учусь)
Код
#define DEBUG
/*****************************************************
При первом включение
1. перед запуском установить перемычку между 1 и 2 контактом
2. каснуться ключом лузы (что приведет к стиранию всех ключей)
3. переставить перемычку на контакты 3 и 4 (добовление новых ключей)
4. мк перейдет в режим программирования новых ключей
5. поднести по очереди 1 до 4 ключей
6. убрать перемычку, устройство готово к работе.
*****************************************************/
#include <90s2313.h>
#include <1wire.h> // Функции однопроводной шины
#include <stdio.h> // Функции ввода вывода
#include <delay.h> // Функции задержек
#include <key.h>
#define DS1990_FAMILY_CODE 1 // Код симейства для DS1990 - 01
#define DS1996_FAMILY_CODE 0x0C // Код симейства для DS1990 - 0C
#define SEARCH_ROM 0xF0 // Команда поиска
#define MAX_DEVICES 1 // Макс. колличество устройств инф. о которых будет сохр.
unsigned char rom_code[MAX_DEVICES][9]; // Массив с инфомацией о ключах
#define TOCH_MEMORY_LED_ON PORTB |= (1<<0); // Включить индикатор (подключенный к PB0)
#define TOCH_MEMORY_LED_OFF PORTB &= ~(1<<0); // Выключить индикатор (подключенный к PB0)
#define TOCH_MEMORY_LED_INV PORTB ^= (1<<0); // Инверсия индекатора (подключенный к PB0)
//#define ALARM byte_read(127); // Посмотреть в каком состояние флаг тревоги.
#define CHANGE_ALARM byte_write(127, byte_read(127) ^ 0x01); // Инверсия флага тревоги
//#define ARMED byte_read(126); // Посмотреть в каком состояние флаг охраны.
//#define CHANGE_ARMMED byte_write(126, byte_read(126) ^ 0x01); // Инверсия флага постановки на охрану
//#define FIRST_RUN byte_read(125); // Посмотреть в каком состояние флаг первого запуска.
unsigned int call_time=0;
char call_count=0;
#define END_ALL_CALLS putsf("\x41\x54\x48\x30"); // ATH0 завершить звонок
// 1 Wire Bus functions
#asm
.equ __w1_port=0x12;PORTD
.equ __w1_bit=2
#endasm
void alarm(void);
void ind_code (unsigned char tick, unsigned char HI_AMPLITUD, unsigned char LO_AMPLITUD);
void call_to (void);
void alarm(void)
{
//SIREN_ALARM;
while (byte_read(127)==1) // будем выполнять пока чстановлен флаг тревоги
{
// SVET_ALARM_INV;
delay_ms(45);
// SVET_ALARM_INV;
delay_ms(15);
call_to();
#ifdef DEBUG
putsf("ALARM!!!!\n\r");
#endif
}
//SIREN_ALARM;
//SVET_ALARM_OFF;
//TOCH_MEMORY_LED_OFF;
}
void ind_code (unsigned char tick, unsigned char HI_AMPLITUD, unsigned char LO_AMPLITUD)
{
unsigned char i;
TOCH_MEMORY_LED_OFF;
for (i=0;i<=tick;i++)
{
TOCH_MEMORY_LED_ON;
delay_ms(HI_AMPLITUD);
TOCH_MEMORY_LED_OFF;
delay_ms(LO_AMPLITUD);
}
}
void call_to (void)
{
call_time++;
TOCH_MEMORY_LED_INV;
if (call_count>=0 && call_count<=2)
{
if (call_time==1) putsf("F");
if (call_time==3000) putsf("S");
if (call_time==7000) putsf("D");
// if (call_time==3000)// putsf("A");
// if (call_time==4000)// putsf("V");
if (call_time==65500)
{
call_time=0;
call_count++;
}
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
char i=0;
if (PIND.3==1) i++;
delay_ms(25);
if (PIND.3==1) i++;
delay_ms(25);
if (PIND.3==1) i++;
delay_ms(25);
if (PIND.3==1) i++;
delay_ms(25);
if (i>=3)
{
GIMSK=0x40;
MCUCR=0x00;
GIFR=0x40;
byte_write(127,1);
#asm("sei")
#ifdef DEBUG
putsf("ALARM!!!!\n\r");
#endif
alarm();
}
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char devices;
//#asm("cli")
delay_ms(50);
if (PINB.5==1) // Затираем все ключи в памяти
{
#ifdef DEBUG
putsf("START CLEAR KEY MEM !!!\n\r");
#endif
set_count(0);
}
else
{
devices=w1_search(SEARCH_ROM,&rom_code[0,0]);
if (devices!=0)
if (rom_code[0][0]==DS1990_FAMILY_CODE)
{
if (PINB.7==1) // Добавляем несуществующий ключь в память
{
#ifdef DEBUG
putsf("START ADD KEY TO MEM !!!\n\r");
#endif
if (add_key(&rom_code[0,0])==1)
{
ind_code(5,500,500);
#ifdef DEBUG
putsf("OK !!!\n\r");
#endif
}
else
{
ind_code(10,250,250);
#ifdef DEBUG
putsf("ERROR !!!\n\r");
#endif
}
}
if ((PINB.7==0) && (PINB.5==0)) // Проверяем валидность ключа
{
#ifdef DEBUG
putsf("START CHACK KEY IN MEM !!!\n\r");
#endif
#asm("wdr");
if (find_key_in_mem(&rom_code[0,0])==1)
{
#ifdef DEBUG
putsf("CHACK KEY IS TRUE !!!\n\r");
#endif
ind_code(20,300,300);
if ((byte_read(126)==1) && (byte_read(127)==1)) // если на охране и сработало
{ // то принять тревогу и оставить на охране
byte_write(127,0);
GIMSK=0xC0;
MCUCR=0x0C;
GIFR=0xC0;
TOCH_MEMORY_LED_ON;
#ifdef DEBUG
putsf("UNALARM ARMED !!!\n\r");
#endif
}
else // в противном случае
{
if (byte_read(126)==1) // если на охране и нет сработки
{ // то снять с охраны
byte_write(126,0);
GIMSK=0x40;
MCUCR=0x00;
GIFR=0x40;
TOCH_MEMORY_LED_OFF;
#ifdef DEBUG
putsf("UNARMED !!!\n\r");
#endif
}
else // в противном случае
{
if (byte_read(126)==0)
{ // тогда поставить на охрану
byte_write(126,1);
GIMSK=0xC0;
MCUCR=0x0C;
GIFR=0xC0;
TOCH_MEMORY_LED_ON;
#ifdef DEBUG
putsf("ARMED !!!\n\r");
#endif
}
}
}
}
else
{
#ifdef DEBUG
putsf("CHACK KEY IS FALSE OUT!!!\n\r");
#endif
ind_code(5,500,50);
}
}
};
}
#asm("sei")
}
void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=P State5=T State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x40;
DDRB=0x1F;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
GIMSK=0x40;
MCUCR=0x00;
GIFR=0x40;
// UART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// UART Receiver: Off
// UART Transmitter: On
// UART Baud rate: 19200
UCR=0x08;
UBRR=0x23;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
// WDTCR=0x0f;
// 1 Wire Bus initialization
w1_init();
#ifdef DEBUG
putsf("START BOOT PROGRAM !!!\n\r");
#endif
if (byte_read(0)==0xff) byte_write(0,0x00);
if (byte_read(0)==0)
{
#ifdef DEBUG
putsf("FIRST RUN !!!\n\r");
#endif
byte_write(126,0);
byte_write(127,0);
ind_code(10,500,500);
}
else
{
if (byte_read(126)==1) // если устройство стоит на охране
{
TOCH_MEMORY_LED_ON; // зажечь светодиод
#ifdef DEBUG
putsf("ARMED !!!\n\r");
#endif
if (byte_read(127)==1) // если флаг тревоги установлен то перешодим в состояние тревога
{
GIMSK=0x40; // тогда отключаем прерывание по сработке шлейфа
MCUCR=0x00;
GIFR=0x40;
#asm("sei")
#ifdef DEBUG
putsf("ALARM FROM BOOT!!!!\n\r");
#endif
alarm(); // и включаем тревогу
}
else // а елси не установлен тогда
{
GIMSK=0xC0; // разрешить все прерывания
MCUCR=0x0C;
GIFR=0xC0;
}
}
};
// Global enable interrupts
#asm("sei")
#ifdef DEBUG
putsf("PROGRAM IS LOAD !!!\n\r");
#endif
while (1)
{
#asm("wdr");
};
}
Реситится он тогда - когда в режиме тревоги происходит чтение ключа.