Накидал тестовую программу в Студии, где мигает светодиод, а во время паузы между переключениями МК должен засыпать. И вот что то не могу разобраться с просыпанием, что делаю не так.
Буду признателен реальной помощи в разъяснении проблемы.
Проект в Протеусе прилагаю
Код: Выделить всё
//ATtiny13 SLEEP_test
#include <avr/io.h>
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include "bitop.h"
#define F_CPU 1200000UL //Частота генератора 9600000/8
#include <util/delay.h>
//-------------------------------------
#define SIG 2
//--------------------------------
unsigned char FLAG = 0;
//--------------------
void CPU_Init(void);
void sleep_wdog (void);
/***********************************/
ISR(WDT_vect)
{
clrbit (WDTCR, WDTIE); // запрет прерывания по ватчдогу
}
/***********************************************/
int main(void)
{
CPU_Init();
while(1)
{
setbit(PORTB, SIG);
sleep_wdog ();
clrbit (PORTB, SIG);
sleep_wdog ();
}
} // окончание бесконечного цикла
//*************************************************
void CPU_Init(void) // инициализация порта
{
PORTB = 0b00000000;
DDRB = 0b00010100;
}
//*********************************************************************
void WDT_Init(void)
{
wdt_reset(); // сбрасываем
wdt_enable(WDTO_1S); // настройка прескалера на 1s и разрешение работы WDT
setbit(WDTCR,WDTIE); // разрешить прерывание от WDT
sei(); // enable global interrupts
set_sleep_mode(SLEEP_MODE_IDLE); //
}
//*********************************************************************
void sleep_wdog (void)
{
wdt_reset(); // сбрасываем
wdt_enable(WDTO_1S); // настройка прескалера на 1s и разрешение работы WDT
setbit(WDTCR,WDTIE); // разрешить прерывание от WDT
sei(); // enable global interrupts
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
sleep_cpu();
}
- Вложения
-
- test.rar
- (15.63 КБ) 101 скачивание


