Например TDA7294

Форум РадиоКот • Просмотр темы - WatchDog Timer Сторожевой таймер в AVR
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт окт 03, 2025 06:37:55

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 231 ]    , , 3, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Пн май 06, 2013 16:43:57 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: 0
Первый раз пытаюсь применить такую "жирную" микросхему, однако засада...

Код сгенерирован автоматически, пытаюсь проверить как сработает Watchdog.
Для этого закомментировал строчку // #asm("wdr")
и ничего ((((( , ранее это на меге 8 работало. .....
Подскажите что для этого МК нужно делать чтобы работал Watchdog
Спойлер
Код:
/*****************************************************
CodeWizardAVR V2.05.3 Standard
Chip type               : ATmega32A
AVR Core Clock frequency: 4,000000 MHz

*****************************************************/

#include <mega32a.h>

#include <delay.h>

// I2C Bus functions
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// 1 Wire Bus interface functions
#include <1wire.h>                                                     
#include <ds18b20.h>       

// Alphanumeric LCD functions
#include <alcd.h>
#include <stdio.h>                                                       
unsigned char devices;                                                 
int temp;                                                                     
unsigned char lcd_buffer[16];
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here

}

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here

}

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here

}



// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x80;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x6B;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x45;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;



// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// I2C Bus initialization
// I2C Port: PORTC
// I2C SDA bit: 5
// I2C SCL bit: 6
// Bit Rate: 50 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// 1 Wire Bus initialization
// 1 Wire Data port: PORTB
// 1 Wire Data bit: 0
// Note: 1 Wire port settings are specified in the
// Project|Configure|C Compiler|Libraries|1 Wire menu.
w1_init();
 devices=w1_init(); 
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 6
// RD - PORTD Bit 5
// EN - PORTD Bit 4
// D4 - PORTC Bit 0
// D5 - PORTC Bit 1
// D6 - PORTC Bit 2
// D7 - PORTC Bit 3
// Characters/line: 20
lcd_init(16);
                              lcd_gotoxy(0,0);     
                         lcd_putsf("Perezagruzka?");
                         lcd_gotoxy(0,1);
                         lcd_putsf("Perezagruzka?");
                          delay_ms(5000);        //задержка надписи     

          lcd_clear(); 
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
WDTCR=0x0F;

// Global enable interrupts
#asm("sei")

while (1)
      {   
//        #asm("wdr") 
              temp=ds18b20_temperature(0);                                   
              if (temp>1000){                                                       
              temp=4096-temp;                                                     
              temp=-temp;                                                           
            }
              sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);       
              lcd_clear();                                                               
              lcd_puts(lcd_buffer);                                                   
              delay_ms(500);   
      }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Пн май 06, 2013 17:47:10 
Говорящий с текстолитом
Аватар пользователя

Карма: 11
Рейтинг сообщений: 143
Зарегистрирован: Пт дек 28, 2012 21:56:46
Сообщений: 1518
Откуда: St. Petersburg
Рейтинг сообщения: 0
На вид все верно, должен раз в 2 секунды перезагружаться. Вы код в симуляторе запускаете?

_________________
Изображение only pure true norwegian blackx Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Пн май 06, 2013 18:24:18 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: 0
Да в протеусе, опыта симулирования не много но до этого времени протеус не подводил не думаю что в нем проблема...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Пн май 06, 2013 18:41:41 
Говорящий с текстолитом
Аватар пользователя

Карма: 11
Рейтинг сообщений: 143
Зарегистрирован: Пт дек 28, 2012 21:56:46
Сообщений: 1518
Откуда: St. Petersburg
Рейтинг сообщения: 0
Я в протеусе не работал никогда, но может вы просто тех двух секунд не дожидаетесь? Я не знаю с какой скоростью протеусовский симулятор работает. Попробуйте заменить WDTCR=0x0F; на WDTCR=0x08;. Это должно уменьшить интервал примерно до 20 мс.

_________________
Изображение only pure true norwegian blackx Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Пн май 06, 2013 20:16:03 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Да уж прот сильно медленно воспроизводит все. Там внизу слева строка нужно по ней ориентироваться сколько в реальном времени что занимает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Пн май 06, 2013 21:40:39 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: 0
Да нет симуляция загрузка 67% время реальное без разницы WDTCR=0x0F; или WDTCR=0x08; не перегружается и все.
Тут еще такое дело CodeVisionAVR V2.05.3 с "просторов интернета" может это что то значит?


Вложения:
Комментарий к файлу: Проект в протеусе
Exe.rar [13.46 KiB]
Скачиваний: 411
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 09:27:14 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 1
И не дождетесь...

Цитата:
void delay_ms(unsigned int n)

generates a delay of n milliseconds.
This function automatically resets the watchdog timer every 1ms by generating the wdr instruction.


Надо оставить пустой while(1);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 13:33:02 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: 0
uk8amk это понятно что не дождусь, тем более как я писал для сборки проекта пользуюсь автоматической генерацией проекта, не могу соблюсти формальности использования функций, пользуюсь только результатом , типа как в пословице "или шашечки или ехать"...
как это оставить пустым while(1); в смысле код там не писать, так смысл тогда этой программы....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 13:47:30 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
не используйте библиотечную функцию delay_
напишите свою функцию задержки, если есть в ней необходимость.

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 14:00:35 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Смысл собачьего таймера не в том, чтобы он всегда срабатывал, а только когда Мк завис.
Так что можно не заморачиваться насчет стандартной задержки. Если есть желание проверить правильность настройки можно и оставить пустым цикл while(1), что и было предложено товарищем uk8amk


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 17:25:33 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: 0
Извините товарищи, но я вас совсем как-то не пойму:-\.
Если позволите я еще раз попробую объяснить с чем я тут столкнулся...
Сделал проект , по моим меркам "громадный" в нем уже 1950 строк кода.
И он даже прекрасно )) работает в железе, но иногда он имеет такой глюк (раз в 2 а то и 5 дней) у температуры происходит сбой показаний (на ЖКИ отображает -0.1С), МК в это время работает. дальше ВКЛ - ВЫКЛ сетью и все опять нормально....
Так вот, хотел я, по этому событию ( с задержкой по -0.1С) делать reset для МК , подключил для этого watchdog , а тут странность он в моем коде reset для МК не делает никак.
Я вот взял упростил код до минимума ( ясное дело в листинге 2000 строк , никто голову ломать ни будет че там боком стоит...)
так вот упростил код до минимума , и на этом примитиве сброса Мк все равно нет!.
К сообщению приложил этот примитив с исходником и протеусом, комплимируется в CodeVisionAVR V2.05.3 .
Как я уже писал, ранее на меге 8 я делал программно Watchdog, работало , проверял просто закоментировал строчку // #asm("wdr") и видно что все активно , а тут вот никак.....


Вложения:
67_W.rar [107.33 KiB]
Скачиваний: 394
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 17:50:49 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
Скачал Ваш проект
- проходим в директорию и открываем файл list/0x08_mega32A.asm
- нажимаем Ctrl+F
- вводим "wdr" и жмем Enter
находит два места во всем файле:
1) #asm("wdr"), но эта строчка закоментирована
2) в теле функции _delay_ms

- нажимаем опять Ctrl+F
- вводим "_delay_ms", изучаем результаты на возможный вызов функции (ключевые слова "jmp" "rjmp" "call" icall")
- находим строчку "JMP _delay_ms" в теле функции SUBOPT_0x3
- смотрим функцию полностью с целью выяснения ее предназначения
- в самом начале функции строчка "CALL __lcd_write_data"
Вас ни на какую мысль не наводит?

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 18:27:28 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: 0
Ого, я в такие директории не ходок, мне что CALL _delay_ms , что JMP _delay_ms ,
так что ни на какую мысль не наводит... (могу только сказать что, это там, не я написал:))))

Не знаю, вы что хотите сказать, что каждый кто воспользовался функцией , "вольного" распределения ног для ЖКИ , на Watchdog может не рассчитывать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 18:58:26 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 1
Все что я написал значит, что при вызове функции __lcd_write_data, вызывается функция _delay_ms, которая содержит в себе команду wdr, которая и сбрасывает сторожевой таймер.
Функцию __lcd_write_data вы вызываете в цикле, поэтому ваш сторожевой таймер никогда не сработает.

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)
СообщениеДобавлено: Вт май 07, 2013 20:30:50 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
В коде, где надо сделать резет:
Код:
if( mcu_failure == TRUE ) //глюк?
{
while(1);//ждать сброса
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Проблемы со сторожевым таймером. Что я делаю неправильно?
СообщениеДобавлено: Ср сен 11, 2013 12:15:26 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36
Сообщений: 256
Откуда: Волгоград
Рейтинг сообщения: 0
Всем привет! ATmega48pa, проблема с работой сторожевого таймера - задолбался я уже с ним. В одной части программы работает, а после прерывания INT1 - уже не пашет. Причем даже если заново его инициализовать. В чем дело то?
Вот упрощенная часть программы:

void main(void)
{
// Crystal Oscillator division factor: 3
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Low level
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x02;
EIFR=0x02;
PCICR=0x00;


LED = 1; delay_ms(25); LED = 0; // когда контроллер спит, строж. таймер работает как надо, тому подтверждение работа этого светодиода (кратковременное моргание раз в 4 секунды)

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/512k
// Watchdog Timer interrupt: Off
#pragma optsize-
#asm("wdr")
WDTCSR=0x38;
WDTCSR=0x28;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Global enable interrupts
#asm("sei")

SMCR = 0b00000101; // Power-down Mode - страница 43 мануала ATmega48
#asm("sleep"); //Вводит контроллер в режим энергосбережения
// Просыпаемся от прерыванием INT1 и сразу на обработчик


while (1)
{
LED = 1; // Вот тут строж. таймер уже не работает - светодиод постоянно светиться
}
}


// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
... // что тут, не важно
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
СообщениеДобавлено: Ср сен 11, 2013 12:37:29 
Мучитель микросхем

Карма: -2
Рейтинг сообщений: 0
Зарегистрирован: Пн авг 12, 2013 19:07:47
Сообщений: 494
Откуда: башкирия мелеуз
Рейтинг сообщения: 0
так вроде как сторожевой таймер отключается при входе в спящий режим и после просыпания его надо снова запускать
http://avr.ru/beginer/understand/sleep_mode


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
СообщениеДобавлено: Ср сен 11, 2013 12:44:52 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36
Сообщений: 256
Откуда: Волгоград
Рейтинг сообщения: 0
Power-Down - тут останавливается практически всё, кроме обработки внешних прерываний, интерфейса TWI и сторжевого таймера.
Да и в программе я красным пометил место, где видно что таймер работает из режима сна.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
СообщениеДобавлено: Ср сен 11, 2013 14:17:11 
Друг Кота
Аватар пользователя

Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21
Сообщений: 19844
Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Чё-то я требуемой логики не улавливаю.
Моё видение вашей проги:
1 — Разрешаете прерывания
2 — Засыпаете
3 — Сторож ресетит МК, переход к п.1

_________________
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Измерить нннада?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
СообщениеДобавлено: Ср сен 11, 2013 14:29:26 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36
Сообщений: 256
Откуда: Волгоград
Рейтинг сообщения: 0
Ну сейчас совсем не об этом. Нужно понять почему таймер не ресетит МК в основном цикле (когда прога находится там).

P.S. Логика этого каркаса-проги такая: МК спит и ждет внешнего прерывания (параллельно работает ст. таймер для индикации этого режима). Когда внеш. прерывание заканчивается прога уходит в основной цикл. И тут то таймер перестает работать - не ресетит МК.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 231 ]    , , 3, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y