Обсуждаем контроллеры компании Atmel.
Ответить

ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 16:43:57

Первый раз пытаюсь применить такую "жирную" микросхему, однако засада...

Код сгенерирован автоматически, пытаюсь проверить как сработает 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

На вид все верно, должен раз в 2 секунды перезагружаться. Вы код в симуляторе запускаете?

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 18:24:18

Да в протеусе, опыта симулирования не много но до этого времени протеус не подводил не думаю что в нем проблема...

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 18:41:41

Я в протеусе не работал никогда, но может вы просто тех двух секунд не дожидаетесь? Я не знаю с какой скоростью протеусовский симулятор работает. Попробуйте заменить WDTCR=0x0F; на WDTCR=0x08;. Это должно уменьшить интервал примерно до 20 мс.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 20:16:03

Да уж прот сильно медленно воспроизводит все. Там внизу слева строка нужно по ней ориентироваться сколько в реальном времени что занимает.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 21:40:39

Да нет симуляция загрузка 67% время реальное без разницы WDTCR=0x0F; или WDTCR=0x08; не перегружается и все.
Тут еще такое дело CodeVisionAVR V2.05.3 с "просторов интернета" может это что то значит?
Вложения
Exe.rar
Проект в протеусе
(13.46 KiB) Скачиваний: 372

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 09:27:14

И не дождетесь...

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

uk8amk это понятно что не дождусь, тем более как я писал для сборки проекта пользуюсь автоматической генерацией проекта, не могу соблюсти формальности использования функций, пользуюсь только результатом , типа как в пословице "или шашечки или ехать"...
как это оставить пустым while(1); в смысле код там не писать, так смысл тогда этой программы....

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 13:47:30

не используйте библиотечную функцию delay_
напишите свою функцию задержки, если есть в ней необходимость.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 14:00:35

Смысл собачьего таймера не в том, чтобы он всегда срабатывал, а только когда Мк завис.
Так что можно не заморачиваться насчет стандартной задержки. Если есть желание проверить правильность настройки можно и оставить пустым цикл while(1), что и было предложено товарищем uk8amk

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 17:25:33

Извините товарищи, но я вас совсем как-то не пойму:-\.
Если позволите я еще раз попробую объяснить с чем я тут столкнулся...
Сделал проект , по моим меркам "громадный" в нем уже 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) Скачиваний: 351

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 17:50:49

Скачал Ваш проект
- проходим в директорию и открываем файл 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

Ого, я в такие директории не ходок, мне что CALL _delay_ms , что JMP _delay_ms ,
так что ни на какую мысль не наводит... (могу только сказать что, это там, не я написал:))))

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

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 18:58:26

Все что я написал значит, что при вызове функции __lcd_write_data, вызывается функция _delay_ms, которая содержит в себе команду wdr, которая и сбрасывает сторожевой таймер.
Функцию __lcd_write_data вы вызываете в цикле, поэтому ваш сторожевой таймер никогда не сработает.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 20:30:50

В коде, где надо сделать резет:
Код:
if( mcu_failure == TRUE ) //глюк?
{
while(1);//ждать сброса
}

Проблемы со сторожевым таймером. Что я делаю неправильно?

Ср сен 11, 2013 12:15:26

Всем привет! 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

так вроде как сторожевой таймер отключается при входе в спящий режим и после просыпания его надо снова запускать
http://avr.ru/beginer/understand/sleep_mode

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 12:44:52

Power-Down - тут останавливается практически всё, кроме обработки внешних прерываний, интерфейса TWI и сторжевого таймера.
Да и в программе я красным пометил место, где видно что таймер работает из режима сна.

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 14:17:11

Чё-то я требуемой логики не улавливаю.
Моё видение вашей проги:
1 — Разрешаете прерывания
2 — Засыпаете
3 — Сторож ресетит МК, переход к п.1

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 14:29:26

Ну сейчас совсем не об этом. Нужно понять почему таймер не ресетит МК в основном цикле (когда прога находится там).

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