Например TDA7294

Форум РадиоКот • Просмотр темы - Atmega8a не хочет просыпаться
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 18, 2024 12:50:09

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


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



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Atmega8a не хочет просыпаться
СообщениеДобавлено: Сб июн 09, 2018 20:10:41 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
В общем ситуация такая : есть 8мега, к ней подцеплен кварц на 32768Гц. По сути обычные часы, прерывание происходит каждую секунду, при сравнении счетчика. Часы 99% времени будут питаться от внешнего источника, но хотелось бы добавить батарейку на случай отключения электричества, что-бы время не сбивалось. Резервное питание реализовано через 2 диода шотки, и нпн транзистор. В общем, нужно что-бы при отключении внешнего питания МК засыпал, а при появлении просыпался. Выбрал я для этих целей режим сна PowerSave. Так вот, усыпить получается, а вот разбудить нет. Если что, колектор транзистора подключен к INT1, то бишь при наличии внешнего питания на PD3 будет 0, при отсутствии 1.
Код:
Спойлер
Код:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

unsigned char bin[64] = {        //костыль для управления портом B

0b00000000,
0b00100000,
0b00010000,
0b00110000,
0b00001000,
0b00101000,
0b00011000,
0b00111000,
0b00000100,
0b00100100,
0b00010100,
0b00110100,
0b00001100,
0b00101100,
0b00011100,
0b00111100,
0b00000010,
0b00100010,
0b00010010,
0b00110010,
0b00001010,
0b00101010,
0b00011010,
0b00111010,
0b00000110,
0b00100110,
0b00010110,
0b00110110,
0b00001110,
0b00101110,
0b00011110,
0b00111110,
0b00000001,
0b00100001,
0b00010001,
0b00110001,
0b00001001,
0b00101001,
0b00011001,
0b00111001,
0b00000101,
0b00100101,
0b00010101,
0b00110101,
0b00001101,
0b00101101,
0b00011101,
0b00111101,
0b00000011,
0b00100011,
0b00010011,
0b00110011,
0b00001011,
0b00101011,
0b00011011,
0b00111011,
0b00000111,
0b00100111,
0b00010111,
0b00110111,
0b00001111,
0b00101111,
0b00011111,
0b00111111,
};

unsigned char hour, min, sec, fix;


ISR(TIMER2_COMP_vect)          // Должно ли это прерывание будить???
{
    sleep_disable();          // Запрещаем сон
    sec++;
   fix++;
    if (sec == 60)
      {
          sec = 0;
          min ++;
      };

    if (min == 60)
      {
          min = 0;
          hour ++;
      };
    if (hour > 23)
      {
         hour = 0;
      };
    if (fix > 169)
      {
         TCNT2++;
       fix = 0;
      };
    if((PIND & (1<<PD3)))          // проверяем на наличие внешнего питания
   {
   sleep_enable();                      // разрешаем сон
   Offall();                            // отключаем отображение
   sleep_mode();                        // Засыпаем (по описанию не понял разницы между sleep_mode(); и sleep_cpu(); но результат одинаковый.
   }
}


void Offall(void){
PORTB = 0x00;
PORTD &= 0x1F;

}

void delayws(char del)        // задержка, но без отключения отображения.
{
for(int i = 0; i< del; i++){
ShowTime(hour, min, sec);
}
}


void ShowTime(char h, char m, char s)

PORTB = bin[h];
PORTD |= (1 <<PD5);
_delay_us(1300);
PORTD &= ~(1 <<PD5);
PORTB = bin[m];
PORTD |= (1 <<PD6);
_delay_us(1300);
PORTD &= ~(1 <<PD6);
PORTB = bin[s];
PORTD |= (1 <<PD7);
_delay_us(1300);
PORTD &= ~(1 <<PD7);
}


int main(void)
{
//SetUp
DDRB = 0b11111111;
DDRD = 0b11100000;
PORTD |= (1 <<PD3);
DDRC|= (0 << PC2)|(0<<PC3);
PORTC |= (1 << PC2)|(1<<PC3);

 asm ("cli");
//Timer 2
ASSR |= (1 << AS2);                   // Разрешаем тактирование  таймера Т2 от кварца 32768 (асинхронный режим)
  while (ASSR != (0b00001000))        // Ожидаем разрешения записи 
 {
     asm ("nop");
 }

TCCR2 |= (1<<CS21) | (1<<CS22) | (1<<WGM21);      //  Тактирование: 32768 делим на предделитель (256) = 128. Сброс по совпадению.
OCR2 = 127;                                        //  В регистр сравнения заносим 127
TIMSK |= (1<<OCIE2);                              //  Разрешаем прерывание по совпадению T2
TIFR = 0;                                         //  Сброс флагов.

set_sleep_mode(SLEEP_MODE_PWR_SAVE);              // Режим сна
sleep_enable();                                   // Разрешаем сон

asm ("sei");




while(1){


if((PINC & (1<<PC2)) == 0){                                    //  Кнопка минут
delayws(50);
while((PINC & (1<<PC2)) == 0){
delayws(1);
}
min++;
if (min > 59) min = 0;
}

if((PINC & (1<<PC3)) == 0){                                    //  Кнопка часов
delayws(50);
while((PINC & (1<<PC3)) == 0){
delayws(1);
}
hour++;
if (hour > 23) hour = 0;
}

ShowTime(hour, min, sec);                               // Вывод времени

}
return 0;
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Atmega8a не хочет просыпаться
СообщениеДобавлено: Сб июн 09, 2018 20:17:22 
Опытный кот
Аватар пользователя

Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42
Сообщений: 744
Откуда: Караганда, Казахстан
Рейтинг сообщения: 1
Так SEI надо делать до засыпания. А если заснешь при закрытых прерываниях, так разбудит только RESET или собака.

_________________
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Atmega8a не хочет просыпаться
СообщениеДобавлено: Сб июн 09, 2018 20:32:50 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
Спасибо тебе огромное, я почему-то думал что у меня там разрешены прерывания, но просто всунув еще одну asm ("sei"); , прямо перед засыпанием все заработало. Еще раз спасибо, ты даже не представляешь сколько я времени впустую убил пытаясь найти причину :))


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

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


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

Сейчас этот форум просматривают: Varlakotam и гости: 34


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

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


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