Страница 1 из 2

Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 15:17:23
artmasterpro
Народ подскажите, нужно сделать прогу с мигающим светодиодом чтобы, по нажатию кнопки светодиод тух и МК переходил в sleep. GJотом по внешнему прерыванию возвращался к жизни. Подскажите что я не так делаю.

Негде не могу найти нормального описания команд для CAVR везде только для AVR stodio и Win AVR. Приходиться все тыкать на угад. в итоге нервы и куча потраченного времени.
Был на 123avr.nm.ru - там черт ногу сломит, куча рекламы и ловиш нужный тебе текст.

Код: Выделить всё

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

// Declare your global variables here
            unsigned char k;
void main(void)
{


// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x40;
MCUCR=0x01;
GIFR=0x40;

DDRB=0b00011101;
PORTB=0;

// Global enable interrupts
#asm("sei")
         k=0;  
          PORTB.0=0;
while (1)
      {
      PORTB.3=1    ;
         delay_us (200);
         PORTB.3=0;
         delay_us (200);
      };
}


// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{

  if (k==1) {
  //sleep_disable()
  ;PORTB.0=1;k=0;} else {k=1;PORTB.0=1;
  //sleep_enable();  powerdown ();
  }
  
  

}  

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 18:08:28
ooogo
по подробней опишите, что нужно и что куда подключено.

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 19:24:50
artmasterpro
к выводу INT0 подключена кнопка. На одну любую ногу порта светодиод. к примеру на PB0.
MK attiny13

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 20:28:18
ooogo
А зачем тогда прерывание на любое изменение уровня? Включите подтяжку, и установите прерывание по заднему фронту, кнопочку на землю, и флаг при выходе из спячки "1" при засыпании "0", в прерывании проверяйте его.

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 20:32:00
ooogo

Код: Выделить всё

if (k==1) {sleep_disable();PORTB.0=1;k=0;} 
else 
{k=1;PORTB.0=1;sleep_enable();  powerdown ();}
У Вас уже вроде все написано было, только с прерыванием разберитесь, и при объявлении k=1.

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 20:44:28
artmasterpro
Проверяю свой код в протеусе, тупит прерывание. Пока кнопка нажата - светодиод горит как отпустил все погасло. и в слип тоже не впадает я не пойму что не так в коде ?

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Сб май 08, 2010 23:04:31
ooogo
так если прямой ответ Вас не устраивает, то задаю наводящие вопросы.
1) Что у Вас на ножке INT0, когда кнопка отпущени и когда нажата?
2) При каких условиях возникает прерывание?

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Вс май 09, 2010 07:34:31
Neekeetos
artmasterpro писал(а):Проверяю свой код в протеусе, тупит прерывание. Пока кнопка нажата - светодиод горит как отпустил все погасло. и в слип тоже не впадает я не пойму что не так в коде ?
Неправильно то что ты усыпляешь МК из прерывания, а в этот момент сами прерывания запрещены. Так очевидно работать не будет, лучше сделать переменную флажок и менять ее в прерывании, а в основном цикле ее проверять и усыплять МК.

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Вс май 09, 2010 16:55:47
artmasterpro
про слип понял.
Вот во вложении файл в протеусе. Если не лень глянь - там слип отключен отдно прерывание но чегото не работает !
1) Что у Вас на ножке INT0, когда кнопка отпущени и когда нажата?
2) При каких условиях возникает прерывание?
прерывание возникает по изменению состояния ноги int0 - помоему по фронту

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Вс май 09, 2010 23:43:30
ooogo
artmasterpro писал(а):
прерывание возникает по изменению состояния ноги int0 - помоему по фронту
у Вас прерывание возникает при любом изменении уровня на int0, вот и получается, что нажал на кнопку - возникло прерывание(выполнился код внутри), отжал кнопку - снова возникло прерывание (снова выполнился код внутри). Т.е. когда просто нажал на кнопку, то прерывание вызовится, как минимум дважды , а если прибавить дребезг контактов ......

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Вс май 09, 2010 23:47:41
ooogo
В проге стоит частота 1 МГц, а в протеусе тактирование от внутреннего генератора 9,6 МГц с делением на 8 = нестыковочка?

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Пн май 10, 2010 10:32:57
artmasterpro
Вернул все как надо в настройках МК , тем не мение ничего не изменилось. :cry:

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Пн май 10, 2010 13:13:09
ooogo
Открываешь даташит и читаешь раздел 9, точнее 9.3, особое внимание удили таблице 9-2. Если с англицким совсем трудно, то скачиваешь книгу Белова "Микроконтроллеры AVR в радиолюбительской практике" и читаешь там.

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Пн май 10, 2010 14:13:16
artmasterpro
C английским норма полная !

Увы в даташите http://www.atmel.com/dyn/resources/prod ... oc1187.pdf
разделы не пронумерованы !

ЗА книгу спасибо скачал - читаю !

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Пн май 10, 2010 18:16:15
ooogo
Что значит не пронумерованы? :shock: А я по твоему откуда нумерацию взял?
http://www.atmel.com/dyn/resources/prod ... oc2535.pdf

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Пн май 10, 2010 22:13:48
artmasterpro
Воот ! все верно в твоем нумерация есть - а открой мой тама нет !

Изменил код:

Код: Выделить всё

GIMSK=0b01000000;
MCUCR=0b00000000;
GIFR=0b00000000;

DDRB=0b00011101;
PORTB=0;
Теперь происходит следующее: при нажатии на кнопку светодиод загораеться и некаких действий при повторном нажатии не происходит !!!!!

т.е. потушить его не получаеться ))

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Пн май 10, 2010 22:59:48
ooogo
опиши словами, что ты хотел сделать!? Ты понимаешь, что такое передний фронт и задний фронт сигнала?
вот что у меня получилось

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Вт май 11, 2010 09:11:17
artmasterpro
Вот то что у тебя получилось, я и хотел сделать.

Передний фронт - это левая нарастающая импульса а задний фронт это правая спадающая.


Скажи в чем разница между твоей и моей прогой ?

Я просто хочу понять в чом ошибка была ?

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Вт май 11, 2010 11:12:17
ooogo
artmasterpro писал(а): Скажи в чем разница между твоей и моей прогой ?

Я просто хочу понять в чом ошибка была ?
Что бы понять, разложи управляющие регистры в двоичной форме и найди в даташите за что отвечает каждый бит, вот тогда поймешь и будешь знать где искать нужную информацию. :)

Re: Attiny13 переход в Sleep по прерыванию

Добавлено: Ср май 12, 2010 22:03:46
artmasterpro
все получилось спасибо. Щас возьмус за слип, постараюсь без повода не тревожить !