Как включить прерывание на AtTiny85, в Arduino IDE?

Levstepan
Offline
Зарегистрирован: 30.05.2014

Здравствуйте! Для моей задумки нужно использовать прерывание, соответственно его нужно включить. Ядро было взято вот это - ATTinyCore. Пробовал подключить вот так attachInterrupt(pin, handler, mode) и никак не реагирует на высокий уровень на данной ножке. В описании данного ядра сказано, что оно урезано и многие функции не работают. Пробовал включить регистром bitSet(BYTE, BIT); Вот что именно я писал  bitSet(SREG, I); И тут он начинает ругаться на I, типа она не объявлена. Как быть?

nik182
Offline
Зарегистрирован: 04.05.2015

Я б почитал что такое sreg и какое конкретно I ему нужно. А вообще надо привести программу полностью. У меня с этим ядром прерывания работают.

Levstepan
Offline
Зарегистрирован: 30.05.2014

Вот целый код, тут закоменчено многое, тестил всякое

volatile int intFlag = 0;     
const int ledPin1 =  PB5;      
const int ledPin2 =  PB3;
int regim = 0;
int flag = 0;

void setup() {
 // sei;
  //SREG = 0;
  //SREG |= (1 << I);
 bitSet(SREG, I);
 // Serial.begin(9600);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(PB2, INPUT_PULLUP);
  attachInterrupt(0, counter, RISING);
}
void counter() {
  regim++;
  intFlag = true;
}
void loop() {
  //if (intFlag == true && flag == 0)
  //{
   // flag = 1;
    if (regim > 4)
   {
      regim = 0;
    }
  
 // if (intFlag == true && flag == 1)
 // {
  //  flag = 0;
   // intFlag = false;
   // Serial.println("button");
 // }
  switch (regim) {
    case 0:
     // Serial.println("regim0");
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      break;
    case 1:
      //Serial.println("regim1");
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      delay(500);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      delay(500);
      break;
    case 2:
     // Serial.println("regim2");
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      delay(100);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      delay(100);
      break;
    case 3:
     // Serial.println("regim3");
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      delay(100);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      delay(100);
      break;
      case 4:
     // Serial.println("regim4");
      digitalWrite(ledPin1, HIGH); //1
      delay(100);
      digitalWrite(ledPin1, LOW);
      delay(100);
      digitalWrite(ledPin1, HIGH);//2
      delay(100);
      digitalWrite(ledPin1, LOW);
      delay(100);
      digitalWrite(ledPin1, HIGH);//3
      delay(100);
      digitalWrite(ledPin1, LOW);
      delay(100);
      digitalWrite(ledPin2, HIGH); //1
      delay(100);
      digitalWrite(ledPin2, LOW);
      delay(100);
      digitalWrite(ledPin2, HIGH);//2
      delay(100);
      digitalWrite(ledPin2, LOW);
      delay(100);
      digitalWrite(ledPin2, HIGH);//3
      delay(100);
      digitalWrite(ledPin2, LOW);
      delay(100);
      break;
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Правильно компилятор ругается, что такое "I" в этой строчке?

bitSet(SREG, I);

вы явно эту строчку взяли в каком-то другом скетче, вот там и смотрите что это за переменная...

 

Может рано вам за прерывания на тини хвататься, если вы даже не понимаете, как переменную обьявить?

Посмотрел код... вы всю эту возню с прерываниями затеяли, потому что у вас кнопки не работают из-за кучи делеев в коде... То есть сначала пишем кривой код, а когда начинаются проблемы - вместо лечения кривизны придумываем такой же кривой костыль с прерыванием? ну-ну...

apg_777
Offline
Зарегистрирован: 22.09.2020
#include <avr/interrupt.h>
#include <avr/sleep.h>

volatile bool isChange = true; // флаг изменения времени
#define intPin PB1  // Вход прерывания

ISR(PCINT1_vect) {
  if (digitalRead(intPin) == LOW) isChange = true; // флаг отработки прерывания
  cli(); // запрет прерываний
}

void setup()
{
// ..............
  pinMode(intPin , INPUT);
  GIMSK = 0b00100000; // прерывание по изменению
  PCMSK = 0b00000010; // Запуск прерывания PCINT1
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}

void loop() {
// .................

    sleep_enable(); // разрешить режим сна; MCUSR |= _BV(SE);
    sei(); // включить прерывания
    sleep_cpu(); // заснуть
}

Так у меня организовано пробуждение ATTiny при нажатии на кнопку.

Levstepan
Offline
Зарегистрирован: 30.05.2014

b707 пишет:

Правильно компилятор ругается, что такое "I" в этой строчке?

bitSet(SREG, I);

вы явно эту строчку взяли в каком-то другом скетче, вот там и смотрите что это за переменная...

 

Может рано вам за прерывания на тини хвататься, если вы даже не понимаете, как переменную обьявить?

Посмотрел код... вы всю эту возню с прерываниями затеяли, потому что у вас кнопки не работают из-за кучи делеев в коде... То есть сначала пишем кривой код, а когда начинаются проблемы - вместо лечения кривизны придумываем такой же кривой костыль с прерыванием? ну-ну...

Этоне переменная, а имя бита в регистре, который включает глоб.прерывание. И по описанию даной функции так она и работает

b707
Offline
Зарегистрирован: 26.05.2017

Levstepan пишет:

Этоне переменная, а имя бита в регистре, который включает глоб.прерывание.

скажите это не мне, а компилятору. Он ничего не знает про это "имя бита в регистре". Возможно там, откуда вы это списали - оно было описано в заголовке скетча, а вы эту часть скопипастить забыли...

b707
Offline
Зарегистрирован: 26.05.2017

минутный посик по гуглю показывает, что вы потеряли правильное название бита. Включение глобальных прерываний на тини делается так:

SREG |= ( 1 << SREG_I );

Но этого недостаточно, нужно еще настроить правильное прерывание на нужном пине, а вы этого не делаете

GIMSK |=  (1<<PCIE);		// Enable pin change interrupt for PORTB
 PCMSK =  0x01;	                // Enable pin change interrupt for PB0

соответственно вам надо поменять регистри под свой пин

 

Но главное остается - вы бы лучше основной код поправили... тогда и прерывания не нужны будут. А то "увлекаемся ардуино" с 2014 года, а код такой наваяли, что на второй день новички лучше пишут

Levstepan
Offline
Зарегистрирован: 30.05.2014

b707 пишет:

Но главное остается - вы бы лучше основной код поправили... 

Если бы я знал как...

b707
Offline
Зарегистрирован: 26.05.2017

Levstepan пишет:

Если бы я знал как...

за шесть лет занятий ардуино даже не научились блинком мигать без делей?

Перепишу ваш код без делей за 1500, кнопки будут работать без прерываний