0 голосов

Доброго! Пытаюсь усыпить t13a в режиме power down. По прерыванию PCINT мк должен просыпаться. к PB4 подключена кнопка, к PB0 - светодиод. Вот код.

#include <tiny13a.h>
#include <sleep.h>
#include <delay.h>

#define LED PORTB.0

volatile int cnt_ovf = 0; //счетчик переполнений

void init_cnt_tmr(void) //запускает таймер
{
    cnt_ovf = 0; 
    TCCR0A= (0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
    TCCR0B =(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
    TCNT0=0x00;
    OCR0A=0x00;
}

void stop_tmr(void) //останавливает таймер
{
   TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
   TCCR0B &= ~((1 << CS02) | (1 << CS01) | (1 << CS00));    
   TCNT0=0x00;
}

interrupt [PC_INT0] void pin_change_isr(void)//любое изменение на PB0
{
    if (PINB.4 == 1) // если кнопка нажата, то стоп таймер/выкл. led/спать
    {   //stop timer  
        stop_tmr();
        LED = 0;  
          
        sleep_enable();
        powerdown();
    }             
    else //если ожата, то запускаем таймер.
    {        
    //start timer    
        init_cnt_tmr(); 
    }
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void) //таймер/счетчик
{
    cnt_ovf++;
    if (cnt_ovf > 200)//если таймер натикал
    {
        cnt_ovf = 0;
        if (PINB.4 == 0)//если кнопка все еще отжата, то зажигаем светодиод и выкл. таймер
        {
            LED = 1;
            stop_tmr();
        }
    }
}

void main(void)
{

#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

OCR0B=0x00;

init_cnt_tmr();
stop_tmr();

TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

GIMSK=(0<<INT0) | (1<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
PCMSK =(0<<PCINT5) | (1<<PCINT4) | (0<<PCINT3) | (0<<PCINT2) | (0<<PCINT1) | (0<<PCINT0);

GIFR=(0<<INTF0) | (1<<PCIF);


#asm("sei")

sleep_enable();
powerdown();

while (1)
      {           
        
      }
}

Так вот режим сна какой-то неадекватный. 
При первичном запуске мк уходит в сон 0.5мА. Когда дергаю кнопку - то работает нормально, то вдруг выходя из сна по прерыванию амперметр показывает 0 мА(!) видимо МК виснет. Подскажите, что у меня не так в коде и, 0.5 мА чо-то сильно много имхо.

(16 баллов) 5
подтянул пин кнопки к питанию  (1<<PORTB4) и соответственно инвертировал логику работы.  кроме того, вывел переход в сон в главный цикл по флагу. при нажатой кнопке потребление 71мкА. при запуске, после инициализации мк сразу уходит в сон  и потребление мой амперметр уже не ловит. как только кнопка нажата появляются эти 71мкА. , при нажатой кнопке срабатывает прерывание и (так как логика инвертирована) - по LOW мк опять уходит в сон, но уже с 71мкА. вопрос остается. как будто через нажатую кнопку ток уходит, а начальное состояние кнопки должно быть "замкнуто". это вообще геркон
>>как будто через нажатую кнопку ток уходит
ответ:
>>подтянул пин кнопки к питанию  (1<<PORTB4)
попробую через прерывание вочдога ставить/убирать подтяжку, смотреть состояние и дальше по алгоритму

1 Ответ

–1 голос
Не вижу в коде комментариев, а в даташит лезть лень:

Где инициализация свободных пинов?

Что ещё подключено к другим пинам?

Где подтяжка на пине кнопки?

В каком состоянии вачдог?

В каком состоянии АЦП?

Каким образом измеряется ток?

Читать мою статью.

http://forum.amperka.ru/threads/Пощебечем-Часть-ii-Нанотаймер.19053/

и ещё

http://forum.amperka.ru/threads/Суперэкономичный-беспроводной-монитор-Т-и-rh.17221/

При питании от 3-х вольт ток потребления в PowerDown будет 300 нА если всё выключено  и 4 мкА с включенным вачдогом. Стандартные для AVR величины.
(1.8 тыс. баллов) 2 13 45
все порты, кроме 0 (лед) на вход. кроме кнопки и лед ничего не подключено. пин кнопки притянут к земле рез 1 ком. вочдог никак не трогал. ацп отключено. ток измеряю амперметром как обычно в разрыв питания
>>все порты, кроме 0 (лед) на вход
и всё?
>> ток измеряю амперметром
неправильно, т.к. щупы имеют индуктивность. Измерять надо напряжение на резисторе микровольтметром.
>>и все?
и все. в последнем варианте portb. 4 подтянул к +. что-то еще нужно?
>>неправильно...
больше нечем, пока так
Я в своих статьях всё расписал.
Измерять малые токи импульсных устройств щупами с не компенсированной индуктивностью бессмысленно - все измерения будут неверными.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. Un_ka

    262 балл(ов)

  2. toxicBarrel

    182 балл(ов)

  3. BAR__MEN

    123 балл(ов)

  4. parovoZZ

    94 балл(ов)

  5. Тигрыч

    57 балл(ов)

  6. sser

    55 балл(ов)

Награды месяца
1-е место: Дисплей Nextion Enhanced 3,5″
2-е место: Дисплей Nextion Enhanced 3,2″
3-е место: Дисплей Nextion Enhanced 2,8″

...