Attiny13 и Arduino IDE

Max_Budkin
Offline
Зарегистрирован: 19.11.2017
Здравствуйте! Помогите написать скетч для микроконтроллера Attiny13 через среду программирования Arduino IDE. 
Требуется сделать скетч под ATTiny13 для его будущего использования в качестве шаблона. 
Есть рабочий скетч для ардуино УНО. 
Алгоритм работы следущий: 
 
//-------БИБЛИОТЕКА---------
#include "LowPower.h"   // Библиотека сна

#define LED 13           // Светодиод на пин 13
#define button 2        // кнопка "проснуться", она же внешнее прерывание INT0

boolean sleep_flag = true;   // флаг, что НЕ спим

void setup() {

  // подтягиваем кнопку
pinMode(button, INPUT_PULLUP);

  // пин как выход
pinMode(LED, OUTPUT);

  // покажем 2-ух секундным свечением светодиода то, что выполняется setup, а не loop
digitalWrite (LED, HIGH);
delay (2000);
digitalWrite (LED, LOW);

  // подключить прерывание (для ATMega 328 т.е. Arduino UNO - работает.
attachInterrupt(0, go, CHANGE);
  // 0 - это ножка внешнего прерывания ( она же пин 2); go - имя функции, которая выпонится при прерывании;
  // CHANGE - режим прерывания (если изменения с LOW на HIGH и наоборот)
}

void loop() {

  // Если НЕ спим, то..
if (sleep_flag == true) {

  // помигаем светодиодом.
for (int i=0; i<=5; i++){
  digitalWrite (LED, HIGH);
  delay (100);
  digitalWrite (LED, LOW);
  delay (100);
  }

  // Отмечаемся, что сейчас будем спать
sleep_flag = false;

  // ЗАСЫПАЕМ
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  }
}

  // Функция, которая выполнится если сработает прерывание (изменение на ножке 2 (она же INT0).
void go() {
sleep_flag = true;
delay (50);
  }

 

 
 
Так же есть код, который работает на ATTiny13 из статьи https://geektimes.ru/post/258862/
 

#define F_CPU 1200000UL  // Частота МК в герцах

#include <avr/io.h>
#include <avr/sleep.h> // здесь описаны режимы сна
#include <util/delay.h>

#define led_Yes 0 // grn
#define led_No 1 // red 
#define rand_gen 3 
#define wait 5000 // тайм аут перехода в спящий режим

void setup() {
  //pinMode(led_Yes, OUTPUT); 
  DDRB |= (1<<led_Yes);
  //pinMode(led_No, OUTPUT); 
  DDRB |= (1<<led_No);
}

void loop() {
  randomSeed(analogRead(rand_gen)); // не псевдо радном
  byte randomValue;
  randomValue = random(0,2); // диапазон генератора случайных чисел от 0 до 1
  if(randomValue > 0){   
    //digitalWrite(led_Yes, HIGH);
    PORTB |= (1<<led_Yes); 
  }
  else{
    //digitalWrite(led_No, HIGH); 
    PORTB |= (1<<led_No); 
  }

  _delay_ms(wait); 
  system_sleep();
}

void system_sleep(){ 
  //digitalWrite(led_No, LOW); 
  PORTB &= ~(1<<led_No);
  //digitalWrite(led_Yes, LOW); 
  PORTB &= ~(1<<led_Yes);

  ADCSRA &= ~(1 << ADEN); // перед сном отключим АЦП
  ACSR |= (1 << ACD); // и компаратор
  // для уменьшения энергопотребления во сне
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
  while(1) {
    sleep_enable(); // разрешаем сон
    sleep_cpu(); // спать!
  }
}

 

 
Как мы можем увидеть, здесь используется стандартная библиотека avr - <avr/sleep.h>. 
 
Этот код для ATTiny13 работает на этом микроконтроллере, МК засыпает. Но просыпается он от RESET, а это значит, что программа запускается заново. Нужно сделать так, чтобы контроллер засыпал на определенном месте, просыпался от внешнего прерывания и продолжал работу с того места на котором уснул.
 
Распиновка Arduino UNO
 
РАСПИНОВКА ATTiny13
 
 
 
Как прошивать ATTiny13 из ArduinoIDE?
Для работы с ATTiny13 я использую Arduino IDE 1.0.5., на 1.6.6 ИМХО работает неккоректно и IDE может вообще не запуститься. 
Лучше использовать 1.0.5.
 
Если не заработал способ выше, то вот еще вариант немного другой 
(только для Arduino IDE 1.0.5, на 1.6.6 IDE вообще не запускается)
 
Если всё сделано правильно, то в платах появится ATTiny13 с выбором частоты. Я работаю на 1.2 мГц. 
Так же, если всё правильно, то код выше для ATTiny13 на 1.2 мГц компилируется хорошо.
rigl
Offline
Зарегистрирован: 15.10.2014

Добавте atachinterrupt на 1 пин и просыпаетесь после sleep_cpu(); по нажатию кнопки.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Не получается. Не компилируется..

rigl
Offline
Зарегистрирован: 15.10.2014

Покажите, что вы пытаетесь скомпилировать. И с ошибки при компиляции.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017
#define F_CPU 1200000UL  // Частота МК в герцах

#include <avr/io.h>
#include <avr/sleep.h> // здесь описаны режимы сна
#include <util/delay.h>

#define led_Yes 0 // grn
#define led_No 1 // red 
#define rand_gen 3 
#define wait 5000 // тайм аут перехода в спящий режим

void setup() {
  //pinMode(led_Yes, OUTPUT); 
  DDRB |= (1<<led_Yes);
  //pinMode(led_No, OUTPUT); 
  DDRB |= (1<<led_No);
  
  attachInterrupt(0, go, CHANGE);
}

void loop() {
  randomSeed(analogRead(rand_gen)); // не псевдо радном
  byte randomValue;
  randomValue = random(0,2); // диапазон генератора случайных чисел от 0 до 1
  if(randomValue > 0){   
    //digitalWrite(led_Yes, HIGH);
    PORTB |= (1<<led_Yes);  
  }
  else{
    //digitalWrite(led_No, HIGH); 
    PORTB |= (1<<led_No);  
  }

  _delay_ms(wait); 
  system_sleep();
}

void go() {
delay (50);
  }

void system_sleep(){ 
  //digitalWrite(led_No, LOW); 
  PORTB &= ~(1<<led_No);
  //digitalWrite(led_Yes, LOW); 
  PORTB &= ~(1<<led_Yes);

  ADCSRA &= ~(1 << ADEN); // перед сном отключим АЦП
  ACSR |= (1 << ACD); // и компаратор
  // для уменьшения энергопотребления во сне
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
  while(1) {
    sleep_enable(); // разрешаем сон
    sleep_cpu(); // спать!
  }
}

Ошибка:

sketch_nov20d.ino: In function 'void setup()':
sketch_nov20d:18: error: 'attachInterrupt' was not declared in this scope
 
Прошу прощения, если не понимаю простых ошибок, я занимаюсь программированием МК всего чуть более двух недель..
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются. Возможна потеря данный передаваемых по последовательному соединению (Serial data) в момент выполнения функциии обработки прерывания. Переменные, изменяемые в функции, должны быть объявлены как volatile.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Спасибо, сейчас буду исправлять!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вапще-то памойму у тини13 нет аппаратного прерывания для ножек 0 и 1, есть PCINT на весь порт В. Тогда надо мануально писать функцию

ISR(PCINT0_vect) 

и смотреть состояние вывода 0 вручную.

Поэтому attachInterrupt() у Tiny13 просто нет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

PCINTx-прерывания обслуживают сразу целый порт, поэтому в обработчике необходимо смотреть на записанное и текущее состояние выводов и выискивать, какой же из пинов изменил свое состояние (и в какую сторону). Ну а потом уже решать, реагировать ли на это изменение или проигнорировать.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Надеюсь, мне будет под силу с этим разобраться))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тут целая тема есть, даже прилепленная, по AtTiny13.  Если прочесть ее всю - можно почерпнуть для себя многамнога полезного. 

rigl
Offline
Зарегистрирован: 15.10.2014

Добавлял Attiny13 от сюда

Arduino iDE 1.6.8

Скомпилировалось без ошибок.

DetSimen пишет:

вапще-то памойму у тини13 нет аппаратного прерывания для ножек 0 и 1, есть PCINT на весь порт В. Тогда надо мануально писать функцию

ISR(PCINT0_vect) 

и смотреть состояние вывода 0 вручную.

Поэтому attachInterrupt() у Tiny13 просто нет.

По картинке мне показалось, что есть на PB1, надо проверить.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Скачал по вашей ссылке, обновил свои папки в IDE 1.6.6 - всё равно не вышло.. Можно попросить залить на файл-обменник вашу папку с Arduino iDE 1.6.8? Буду очень признателен!

Хотелось бы иметь рабочий IDE, мб я что-то неправильно наделал..

rigl
Offline
Зарегистрирован: 15.10.2014

IDE 1.6.8 

Если отключать АЦП, то после пробуждения его надо включать, и дать время на включение.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Благодарю! 

Понял, буду пробовать!

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Что-то не могу .exe найти в папке IDE 

rigl
Offline
Зарегистрирован: 15.10.2014

Моя вина, у меня меня дебиан.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

rigl пишет:

Моя вина, у меня меня дебиан.

Аа, понял, ничего страшного, всё равно спасибо! ;)

 

ioleg73
Offline
Зарегистрирован: 16.05.2015

 Чуть предистории, выхожу как-то на кухню посмотреть на градусник, а на стекле только квадратики скотча висят, отклеился падлюка.

Задумался сделать радиодатчики. Пока только думаю только о концепции, что-же я хочу.

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

Приемник на про мини, стекляшка Nok 1112 96x68 3 показания темп и меленько сколько прошло с последнего замера. 

По датчикам есть вопрос, а почему все используют 1820 ??? есть копеечный вариант LM75 ? вроде по интерфейсу в плане кода, экономии размера кода приятен. Ах, да Аттиньки13 . Будут вопросы только по режимам сна, не приходилось экономить на питании. Помню лм-ки где-то валялись, на материнках попадались, найду буду пробовать или до чипдипа дойти надо.

PS .   вроде всё всунул, с редактированиет тут вроде морока.  

о, еще и воткнул не туда. хотел в 1001 применение. простите.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А что мешает и приемник и передатчик на attiny? Маленький экран прикрутить - вот и отображение уличной температуры в любой точке комнаты

ioleg73
Offline
Зарегистрирован: 16.05.2015

ну, в прошку можно и графику засунуть. меня в общем только сами выносные датчики интересуют. ваше мнение.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
ioleg73
Offline
Зарегистрирован: 16.05.2015

Печалька. Прикупил в чипдипе две LM75-ки,  попытался подцепить, не работит. 
Распаял на DIP пустышки и вторую, воткнул в макетку с ардуиной, не работит... Прошелся сканером и2с, не находит. повтыкал всё что нашел и2с-шное, находит. Стал рассматривать маркировку под лупой, чтото у меня есть сомненья, не перемаркировка ли это? Буду  ждать от китайцев. Уже думаю поставить чтото иное, но уж очень она мне понравилась. 

Может кто пользовал, делитесь впечатлениями.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ioleg73 пишет:

Печалька. Прикупил в чипдипе две LM75-ки,  попытался подцепить, не работит. 
Распаял на DIP пустышки и вторую, воткнул в макетку с ардуиной, не работит... Прошелся сканером и2с, не находит. повтыкал всё что нашел и2с-шное, находит. Стал рассматривать маркировку под лупой, чтото у меня есть сомненья, не перемаркировка ли это? Буду  ждать от китайцев. Уже думаю поставить чтото иное, но уж очень она мне понравилась. 

Может кто пользовал, делитесь впечатлениями.

извините, нифига не понял :(

недавно вы писали что нужен тупо выносной датчик на AtTiny - ссылку я дал,

монитор на AtTiny Маленький я тоже подключал - никаких проблем.

Вопрос в чем?

ioleg73
Offline
Зарегистрирован: 16.05.2015

Да, вопроса-то и нет. Пишу что в чипдипе попались не рабочие.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

В Чипе за такие деньги attiny не рабочие? Че то не верится 

ioleg73
Offline
Зарегистрирован: 16.05.2015

не тиньки, а лмки, читай внимательнее. и маркировка на них лазерная, какая-то доверия не внушающяя. это только на днях завезенная партия из 10 шт. в мой ближайший магазин.

PS:  посмотрел, осталось 8 шт.  СПб. ул Востания.

На Кронверский ехать не хотелось, а тут на Востания появились 10. Итого 2 у меня, 8 осталось счастливчикам.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ioleg73, такие вещи нужно сопровождать по крайней мере фотографией монтажа. Откуда нам знать, что вы всё правильно включили? По поводу поключения этих датчиков к ардуине уже были темы..

ioleg73
Offline
Зарегистрирован: 16.05.2015

Подтяжки есть. Всё остальное что на шину вешалось, находится сканером шины, эти молчат. 24сХХ даже по цокалевке  похожа.