Как включить прерывание на AtTiny85, в Arduino IDE?
- Войдите на сайт для отправки комментариев
Вс, 15/11/2020 - 14:09
Здравствуйте! Для моей задумки нужно использовать прерывание, соответственно его нужно включить. Ядро было взято вот это - ATTinyCore. Пробовал подключить вот так attachInterrupt(pin, handler, mode) и никак не реагирует на высокий уровень на данной ножке. В описании данного ядра сказано, что оно урезано и многие функции не работают. Пробовал включить регистром bitSet(BYTE, BIT); Вот что именно я писал bitSet(SREG, I); И тут он начинает ругаться на I, типа она не объявлена. Как быть?
Я б почитал что такое sreg и какое конкретно I ему нужно. А вообще надо привести программу полностью. У меня с этим ядром прерывания работают.
Вот целый код, тут закоменчено многое, тестил всякое
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; } }Правильно компилятор ругается, что такое "I" в этой строчке?
вы явно эту строчку взяли в каком-то другом скетче, вот там и смотрите что это за переменная...
Может рано вам за прерывания на тини хвататься, если вы даже не понимаете, как переменную обьявить?
Посмотрел код... вы всю эту возню с прерываниями затеяли, потому что у вас кнопки не работают из-за кучи делеев в коде... То есть сначала пишем кривой код, а когда начинаются проблемы - вместо лечения кривизны придумываем такой же кривой костыль с прерыванием? ну-ну...
#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 при нажатии на кнопку.
Правильно компилятор ругается, что такое "I" в этой строчке?
вы явно эту строчку взяли в каком-то другом скетче, вот там и смотрите что это за переменная...
Может рано вам за прерывания на тини хвататься, если вы даже не понимаете, как переменную обьявить?
Посмотрел код... вы всю эту возню с прерываниями затеяли, потому что у вас кнопки не работают из-за кучи делеев в коде... То есть сначала пишем кривой код, а когда начинаются проблемы - вместо лечения кривизны придумываем такой же кривой костыль с прерыванием? ну-ну...
Этоне переменная, а имя бита в регистре, который включает глоб.прерывание. И по описанию даной функции так она и работает
Этоне переменная, а имя бита в регистре, который включает глоб.прерывание.
скажите это не мне, а компилятору. Он ничего не знает про это "имя бита в регистре". Возможно там, откуда вы это списали - оно было описано в заголовке скетча, а вы эту часть скопипастить забыли...
минутный посик по гуглю показывает, что вы потеряли правильное название бита. Включение глобальных прерываний на тини делается так:
Но этого недостаточно, нужно еще настроить правильное прерывание на нужном пине, а вы этого не делаете
соответственно вам надо поменять регистри под свой пин
Но главное остается - вы бы лучше основной код поправили... тогда и прерывания не нужны будут. А то "увлекаемся ардуино" с 2014 года, а код такой наваяли, что на второй день новички лучше пишут
Но главное остается - вы бы лучше основной код поправили...
Если бы я знал как...
Если бы я знал как...
за шесть лет занятий ардуино даже не научились блинком мигать без делей?
Перепишу ваш код без делей за 1500, кнопки будут работать без прерываний