ATtiny13A 101 применение

green4ik
Offline
Зарегистрирован: 23.04.2015

Благодарю! Жаль что сегодня не проверю! А есть такое но для протеуса? Т.е. более низкий уровень.

И как прописать в текущем сктече вместо delay?

int led = 13;
int led1 = 12;
int led2 = 11;

void setup() {                

  pinMode(led, OUTPUT); 
  pinMode(led1, OUTPUT);  
  pinMode(led2, OUTPUT);
}

void loop() {
  digitalWrite(led2, LOW);
  digitalWrite(led, HIGH);
  delay(2000); 
  digitalWrite(led, LOW); 
  digitalWrite(led1, HIGH);
  delay(2000);
  digitalWrite(led1, LOW); 
  digitalWrite(led2, HIGH);
  delay(2000);

Этот скетч пока на atmega 8, но мне нужен базовый принцип понять что бы перенести потом на тиньку 13.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define led1 13
#define led2 12
#define led3 11
#define POT_PIN A0

void setup() {
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);  
  pinMode(led3, OUTPUT);
}

void loop() {
  digitalWrite(led3, LOW);
  digitalWrite(led1 HIGH);
  pauseLED();
  digitalWrite(led1, LOW); 
  digitalWrite(led2, HIGH);
  pauseLED();
  digitalWrite(led2, LOW); 
  digitalWrite(led3, HIGH);
  pauseLED();
}

void pauseLED() {
  int resistorValue = analogRead(POT_PIN);
  int pauseTime = map(resistorValue, 0, 1023, 200, 2000);
  delay(pauseTime);
}

 

green4ik
Offline
Зарегистрирован: 23.04.2015

Огромное спасибо!

green4ik
Offline
Зарегистрирован: 23.04.2015

Помогите еще разок пожалуйста!

#define led1 0
#define led2 1
#define led3 2
#define POT_PIN A0

void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT); 
pinMode(led3, OUTPUT);
}

void loop() {
digitalWrite(led3, LOW);
digitalWrite(led1, HIGH);
pauseLED();
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
pauseLED();
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
pauseLED();
}

void pauseLED() {
int resistorValue = analogRead(POT_PIN);
int pauseTime = map(resistorValue, 0, 1023, 400, 1000);
delay(pauseTime);
}

В данном сктече мне нужно сделать так что бы между выключением и включением была еще одна пауза, но которая была бы в 2 раза меньше "pauseLED", т.е. как бы привязаться к этой переменной и разделить ее на 2. Каким образом это можно выполнить?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

green4ik, нужно передать в функцию pauseLed делитель.

pauseLED(1); // паузу разделить на 1 (т.е. не менять)
digitalWrite(led2, LOW);
pauseLED(2);// паузу разделить на 2
digitalWrite(led3, HIGH);
pauseLED(1);


void pauseLED(byte n) {
int resistorValue = analogRead(POT_PIN);
int pauseTime = map(resistorValue, 0, 1023, 400, 1000);
delay(pauseTime/n);

А вообще не привыкайте делать паузы через delay(), вредно для развития.

green4ik
Offline
Зарегистрирован: 23.04.2015

Благодорю! На многих форумах пишут что delay() это не очень хорошо! Будем учиться!

fishlabsoman
Offline
Зарегистрирован: 30.04.2015

burbuzin1 пишет:

Столкнулся с тем, что тини обрабатывает ИК код от пульта не так, как Arduino.

Приветствю!

Частота верно указана в настройках и зашита? Я отлаживал код на атмеге328 и для тини13 просто убирал серийный порт и использовал идентичное подключение по портам PB2, etc. На атмеге мой же код работает? Даёт стабильный результат? Я алгоритм, кажется, не менял, только упростил оригинальный код и довёл до состояния стабильной работоспособности на тини. Вы пробовали другой пульт или сенсор? Не знаю актуален ли еще ваш вопрос... Хм.. как вариант попробовать прошивку из статьи, она то 100% рабочая, только надо найти в ней константы кодов кнопок и как то заменить..

burbuzin1 пишет:

если q==5, мигаем 5 раз, если q==2, мигаем 2 раза итд.

Интересный способ, но вы уверены что код четырёхзначный? Я бы мог предложить извратиться и передать код по битам типа:
 

//нужен пин клоков и пин сигнала//псевдокод:
for (unsigned char i = 0; i < 16; i++) {
    clock pin HIGH
    if (bitRead(irCode, i) == true) {
        data pin HIGH
    } else {
         data pin LOW
    }
    delay 1sec
    clock pin LOW
    delay 1sec
}
//что то сделать что бы разделить начало и конец передачи

и потом записать на бумажку код, который будет иметь вид
1010110101 и сунуть его в стандартный калькулятор в режиме программирования. хотя это тоже забавный вел. или сделать приёмник на атмеге. 
UPD: по поводу велосипеда... уух, а ведь лонг то 32бита или 4байта. это будет долго, нужен приёмник 

 

burbuzin1
Offline
Зарегистрирован: 10.04.2015

Добрый день,

1. Частота указана и зашита верно. После опредения кода пульта, полученный код работает с любой частотой установленной на тини.

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

3. Другой пульт не пробовал. Пробовал менять приёмник. Результат тотже.

4. Код из статьи не работает в моём случае, т.к. коды кнопок пульта определяются по разному в атмеге и в тини. И коды кнопок пульта получаются не оригинальными, если я использую свой велосипед. Т.е. полученное мной значение irCode подходит еще для 2-3 кнопок.

5. Код четырёх значный в моём случае. Количество знаков в коде я определяю циклом:

 \\начальное значение счетчика
q=0
while{
\\делим на 10 пока делится
irCode >=10){ \\
irCode = irCode / 10}
}

\\результат q это количество итераций цикла, а значит и количество разрядов в IrCode

Пробовал использовать другой код для определения кода пульта, там получалось 9 значное число. И ситуация повторялась, код получался не уникальным и срабатывание происходит еще на 2-3 кнопках.

6. Ваш велосипед я не понял, попробуйте по другому объяснить.

vadim_kanc
Offline
Зарегистрирован: 28.05.2015

Добрый день, 

не силен в программировании, но мне надо сделать следущее:

у нас есть кнопка которая подключена к PB1. по ее нажатию проверялось наличие 3.3вольта на PB4. и Если оно отсутсвует посылалась логическая "1" на pb0, если нет то логическая "1" на PB2. Если не сложно помогите с кодом

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Выражение мне понравилось: если отсутствует наличие......  А проще сказать?

Дорисуйте табличку истинности.......

     PB1          PB0        PB2

      0                          ?

      1                         ?

vadim_kanc
Offline
Зарегистрирован: 28.05.2015

PB1           PB4         PB0         PB2                   PB1 вход кнопки

 0               0             0             0                      PB4 вход на который падается 3.3в  

1               1             1             0                      PB0,PB2 выходы

 1               0             0             1        

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

У двух входов 4 комбинации

PB1/PB4    PB0/PB2

00                00

01                 ??

10                 01

11                 10

vadim_kanc
Offline
Зарегистрирован: 28.05.2015

 

PB1/PB4 PB0/PB2

00 00

01 00

10 01

11 10

auct
Offline
Зарегистрирован: 14.12.2014

HWman пишет:

Мне нужно чтобы микроконтроллер заводил вачдог на 1 / 2 / 4 / 8 сек, засыпал, причём очень крепко, даже АЦП чтобы не работал и потом по вачдогу от ресета просыпался, исполнял что нужно и когда нужно засыпал опять на некоторое время.

А можно сделать так, чтобы тинька просыпалась по нажатию кнопки, моргала один раз диодом и снова засыпала?

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

auct пишет:

HWman пишет:

Мне нужно чтобы микроконтроллер заводил вачдог на 1 / 2 / 4 / 8 сек, засыпал, причём очень крепко, даже АЦП чтобы не работал и потом по вачдогу от ресета просыпался, исполнял что нужно и когда нужно засыпал опять на некоторое время.

А можно сделать так, чтобы тинька просыпалась по нажатию кнопки, моргала один раз диодом и снова засыпала?


Нет, нужно чтобы что-то делала а когда нужно засыпала.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Вот мои старые наработки, данный код пишет в энергонезависимую память числа 333 666 999, демонстрируя то, что можно записать число типа int, то есть максимум 65534:

 

#include <avr/eeprom.h> // не забываем подключить

#define redLed 0 // красный светодиод подключен к PB0
#define yellowLed 1 // жёлтый подключен к PB1
#define greenLed 2 // зелёный - PB2

int level1 = 0;
int level2 = 0;
int level3 = 0;

void setup() {
  
  EEPROMWriteInt(0,333); // записываем наши числа
  EEPROMWriteInt(2,666); // максимум можно 65534
  EEPROMWriteInt(4,999); // чего более чем достаточно

  pinMode(redLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(greenLed, OUTPUT);

  level1 = EEPROMReadInt(0); // 0 и 1 ячейки
  delay(50); // небольшая задержка не помешает
  level2 = EEPROMReadInt(2); // 2 и 3 ячейки
  delay(50);
  level3 = EEPROMReadInt(4); // 4 и 5 ячейки
  delay(50);
}

void loop() {
  int Value = analogRead(2); // считываем напряжение на PB4
  // PB4 это ADC2
  
  if (Value > level1) { 
    digitalWrite(redLed, HIGH);
  } 
  else {
    digitalWrite(redLed, LOW);
  }
  if (Value > level2) {
    digitalWrite(yellowLed, HIGH);
  } 
  else {
    digitalWrite(yellowLed, LOW);
  }
  if (Value > level3) {
    digitalWrite(greenLed, HIGH);
  } 
  else {
    digitalWrite(greenLed, LOW);
  }
}

//Функции (с) Кэп

void EEPROM_write(int uiAddress, char ucData) 
{ 
  while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
  EEAR = uiAddress; /*Проинициализировать регистры*/
  EEDR = ucData;
  EECR |= (1<<EEMWE); /*Установить флаг EEMWE*/
  EECR |= (1<<EEWE); /*Начать запись в EEPROM*/
}

char EEPROM_read(int uiAddress)
{
  while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
  EEAR = uiAddress; /* Проинициализировать регистр адреса*/
  EECR |= (1<<EERE); /*Выполнить чтение*/
  return EEDR;
}

void EEPROMWriteInt(int p_address, int p_value) // принимает 2 параметра, адресс и число 0...65534
{ // забирает 2 ячейки, так что использовать ячейки 0, 2, 4, 6...
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);
  EEPROM_write(p_address, lowByte);
  EEPROM_write(p_address + 1, highByte);
}

int EEPROMReadInt(int p_address) //Считывает число в диапазоне 0...65534
{ // использует 2 ячейки, так что считывает ячейки 0, 2, 4, 6...
  byte lowByte = EEPROM_read(p_address);
  byte highByte = EEPROM_read(p_address + 1);
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}

Вроде как закоментировано всё, думаю ни у кого не возникнет вопросов что как работает.

Вот файлы протеуса.

Работает как-то так:

https://www.youtube.com/watch?v=QDPuQ1zpKtM

Пользуйтесь.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Данная тема разрослась уже на 12 страниц, предгалаю закрепить её в разделе.

Roman-12
Offline
Зарегистрирован: 06.04.2012
// vk.com/razniepodelkiblogspot
// как прошить тини: 
// razniepodelki.blogspot.com/2014/05/attiny13-arduino.html

#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(); // спать!
  }
}

Пример сна.

auct
Offline
Зарегистрирован: 14.12.2014

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

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

auct пишет:

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


Только это в случае глубокого сна(разбудить можно нажав кнопку ресет или отрубив и подав питание).

auct
Offline
Зарегистрирован: 14.12.2014

HWman пишет:

Только это в случае глубокого сна(разбудить можно нажав кнопку ресет или отрубив и подав питание).

как контроллеру ресет сделать? замкнуть 1 и 8 ноги (т.е. подать + на 1 ногу)?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

прошивка ATtiny24 сильно отличается? В смысле есть ATtiny24, надо ее прошить.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Tomasina пишет:

прошивка ATtiny24 сильно отличается? В смысле есть ATtiny24, надо ее прошить.

Эм... С даташитом Вы уже ознакомились? Собсно ISP присутсвует.

dennnissska
Offline
Зарегистрирован: 22.02.2015

Всем привет. ATtiny13A поддерживает функцию tone и noTone?
А то скетч простой, жалко ардуину использовать.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Tomasina пишет:

прошивка ATtiny24 сильно отличается? В смысле есть ATtiny24, надо ее прошить.


Вот, сюда загляньте:
http://homes-smart.ru/index.php/oborudovanie/arduino/dobavlyaem-podderzh...

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

dennnissska пишет:
Всем привет. ATtiny13A поддерживает функцию tone и noTone? А то скетч простой, жалко ардуину использовать.

Привет, вот тут есть то, что Вам нужно:
http://habrahabr.ru/post/234763/

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

auct пишет:

HWman пишет:

Только это в случае глубокого сна(разбудить можно нажав кнопку ресет или отрубив и подав питание).

как контроллеру ресет сделать? замкнуть 1 и 8 ноги (т.е. подать + на 1 ногу)?


Под ногами 1 и 8 Вы имеете ввиду Reset и Vcc?

Если да, то так ничего не произойдёт, потому что порт ресет итак "подтянут" к плюсу питания, нужно к GND(4-я нога) "подтянуть", вот тогда плата уйдёт в ступор, а если отжать кнопку то перезагрузиться и всё код начнётся исполняться по новой.

dennnissska
Offline
Зарегистрирован: 22.02.2015

HWman пишет:

dennnissska пишет:
Всем привет. ATtiny13A поддерживает функцию tone и noTone? А то скетч простой, жалко ардуину использовать.

Привет, вот тут есть то, что Вам нужно:
http://habrahabr.ru/post/234763/


Огромное спасибо! То что нужно.

lelyik
Offline
Зарегистрирован: 08.07.2015

Я не робот я только учусь

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

В копилку:

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

avton пишет:

В копилку:


Я купил вот такой адаптер:
http://m.aliexpress.com/item/32356712268.html

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

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

Делал не только для себя,люди попросили сразу SPI разьем сделать для удобства программирования.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Вылезает и прижимается замечательно. Мне часто флешки приходиться заливать, вот и купил. Ваша конструкция не нова и очень хорошая, но не так удобна. Приходится постараться , при прижиме такого мелкого корпуса. Дам совет, не мой, с просторов инета, сделаете маску, микруха сама будет падать в нужное место.

auct
Offline
Зарегистрирован: 14.12.2014

я таким пользуюсь

купил за 36руб в радиомагазине. Тиньку прижимаю также прищепкой.

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

прошить можно в панельке,это больше для прототипа)

Про маску согласен.Маску лень было делать..

auct
Offline
Зарегистрирован: 14.12.2014

Вот такое дело. На ардуино леонардо собрал схемку из примера "Knock" https://www.arduino.cc/en/tutorial/knock Подобрал параметр threshold из скетча (например 300). На ардуино все работает.

Пробую перенести сие на Тиньку13, не прокатывает. Датчик к 2 ноге цепляю (в скетче А3 программирую). Может параметр опять нужно подбирать, нет никаких соответствий? А то, менять-прошивать- проверять-опятьменять-прошивать-проверять очень утомительно получается.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Набрел на просторах на еще один и второй реаниматор на платформе Дуни.

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

auct
Offline
Зарегистрирован: 14.12.2014

Уважаемый HWman  , в крайнем core прошиваю через ардуино тиньку мигать диодом 1 секунду, но он явно мигает меньшей длительностью импульса. Это можно как-то победить? 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

А что там у Вас с фьюзами в этом файлике? Посмотрите что там у Вас, в любом калькулятора фьюзов посмотрите, каким настройкам это соответствует. Можно поиграть с делителем на 8.

auct
Offline
Зарегистрирован: 14.12.2014

Gres пишет:
А что там у Вас с фьюзами в этом файлике? Посмотрите что там у Вас, в любом калькулятора фьюзов посмотрите, каким настройкам это соответствует. Можно поиграть с делителем на 8.

а где этот делитель искать? или просто его учитывать в программе?

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Смотрите в файлике какие у Вас прописаны фьюзы, находите любой онлайн калькулятор фьюзов, например вот: http://radioshemi.ucoz.ru/FUSI/calc.html?part=ATtiny13 их масса, вводите туда свои фьюзы (интересуют LOW) и смотрите какие выбраны настройки. Интересует делитель: Внутренний делитель на 8; [CKDIV8=0]. По умолчанию он установлен. Меняете его, просто сняв галку, хекс число фюзов меняется, прописываете его в файлике и заливаете скетч вновь. С фьюзами аккуратненее!!! Можно залочить чип!!!

auct
Offline
Зарегистрирован: 14.12.2014

Спасибо. Только пока это для меня сложновато.

На 600кгц лучше работает, да и чувствительнось к Knock-у лучше, остановлюсь на этом.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

dennnissska пишет:
 Огромное спасибо! То что нужно.

Пожалуйста.
Поделитесь тем что получилось.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

auct пишет:

Уважаемый HWman  , в крайнем core прошиваю через ардуино тиньку мигать диодом 1 секунду, но он явно мигает меньшей длительностью импульса. Это можно как-то победить? 


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

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

auct пишет:

На 600кгц лучше работает, да и чувствительнось к Knock-у лучше, остановлюсь на этом.


Только смотрите, если не будет прошиваться то Вам сюда:
http://geektimes.ru/post/255396/

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Тут бываю редко, если что пишыте мне на ВК.

auct
Offline
Зарегистрирован: 14.12.2014

HWman пишет:

auct пишет:

На 600кгц лучше работает, да и чувствительнось к Knock-у лучше, остановлюсь на этом.


Только смотрите, если не будет прошиваться то Вам сюда:
http://geektimes.ru/post/255396/

Прошилось без вопросов и не один раз (мучился с подбором значения) Спасибо!

auct
Offline
Зарегистрирован: 14.12.2014

переведите плиз для Тиньки13 код:

attachInterrupt(0, blink, FALLING);

слышал про sei(); интересует  прерывание именно по FALLING

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013
void setup{
MCUCR|=1<<ISC01;
GIMSK|=1<<INT0;
}

ISR (INT0_vect){
//.....//  
}

 

Frolv
Offline
Зарегистрирован: 31.08.2015

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

Требуется прошить тиньку 13 что бы получилось что-то вроде сервотестера. Управление оборотами переменным резистором. Дайте код, пожалуйста.