реклама на сайте
подробности

 
 
> почемуто в ходе выполнения прерывания
TamTam
сообщение Jun 6 2006, 02:36
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



МК иногда ресетится, пробывал в ПРОТЕУСЕ, ЗАЛИЛ в девайс тажа фигня, (собака выключена, но вставки для обнуления собаки в коде присудствуют)

Почему МК ресетится и как можно узнать из за чего ????
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TamTam
сообщение Jun 6 2006, 03:58
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



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

Почему МК ресетится и как можно узнать из за чего ????


источник сброса можно узнать в специальном регистре.

в мастере начального кода CVAVR есть пунктик - сделать код для выяснения этого.


Это понятно но для AT90S2313 такой галки нет.

Цитата(andk @ Jun 6 2006, 06:52) *
1. Запостить сюда исходник (Экстрасенсов тут нет) smile.gif


Вот сурц, (сильно не пинать я только учусь)
Код
#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");
   };
}


Реситится он тогда - когда в режиме тревоги происходит чтение ключа.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- TamTam   почемуто в ходе выполнения прерывания   Jun 6 2006, 02:36
- - andk   1. Запостить сюда исходник (Экстрасенсов тут нет)   Jun 6 2006, 02:52
|- - =AK=   Цитата(TamTam @ Jun 6 2006, 13:28) Ресити...   Jun 6 2006, 06:18
- - WHALE   Поставь VMLAB-он понимает еер и прогони в нем.   Jun 6 2006, 04:40
- - TamTam   Цитата(WHALE @ Jun 6 2006, 08:40) Поставь...   Jun 6 2006, 04:55
|- - haker_fox   Цитата(TamTam @ Jun 6 2006, 13:55) Цитата...   Jun 6 2006, 05:15
- - TamTam   ЦитатаВы поняли, что вообще написали??? Ну вообще...   Jun 6 2006, 06:27
|- - =AK=   Цитата(TamTam @ Jun 6 2006, 15:57) А поче...   Jun 6 2006, 06:49
|- - haker_fox   Цитата(TamTam @ Jun 6 2006, 15:27) Цитата...   Jun 6 2006, 06:57
- - TamTam   Цитата(haker_fox @ Jun 6 2006, 10:57) Цит...   Jun 6 2006, 07:25
|- - =AK=   Повторяю: по вочдогу ресетится, пока прерывание те...   Jun 6 2006, 07:46
- - haker_fox   Давайте начнем с того, что в этом форуме Вам никто...   Jun 6 2006, 07:57
- - andk   Вам абсолютно правильно сказали по поводу задержек...   Jun 6 2006, 08:12
- - TamTam   Цитата(andk @ Jun 6 2006, 12:12) Вам абсо...   Jun 6 2006, 08:42
- - TamTam   Простите дурака грешного что не хотел видеть очеви...   Jun 6 2006, 09:35
- - haker_fox   Цитата(TamTam @ Jun 6 2006, 18:35) Прости...   Jun 7 2006, 01:12
- - Woodoo   Цитата(TamTam @ Jun 6 2006, 11:35) Прости...   Jun 11 2006, 07:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 18:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016