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

Игорь Я
Offline
Зарегистрирован: 03.09.2018

Спасибо Всем за высказанные мысли и идеи.

Извиняюсь,что сразу не описал комплектацию таймера, а она такова:

Использовать суточный таймер всего на одной микросхеме аттини13. Я понимаю конечно, что можно в качестве опорного сигнала использовать DC3231, либо построить на другом AVR с внешним кварцем, но повторюсь - реализовать задачу для цикличного суточного таймера с индикацией работы самого таймера (мигание светодиода) на одной аттини, из-за её габаритов и потребления.

Думаю, что вчера путем долгих экспериментов и вычислений для корректировки значения millis, добился ухода +2сек за 10 мин. Я думаю этого вполне хватит для моей задачи. Вчера вечером в 20:30 включил таймер. Сегодня вечером посмотрю во сколько сработает, а завтра - во сколько отключится.

Я не умею корректировать внутренний коэффициент деления с помощью каких-либо программ. Если кто-то сможет, а главное - ЗАХОЧЕТ помочь мне с этим, ценой своего личного времени - буду очень признателен.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Помогаю: выкинь Tiny13, купи Tiny85, туда влезет всё, и в габаритах не проиграешь, только чучуть в цене. 

Игорь Я
Offline
Зарегистрирован: 03.09.2018

И что это даст?

Внутренний генератор Тини85 намного точнее Тини 13?

При исходном коде программирования  в конечном итоге будет какая-то разница?

Green
Offline
Зарегистрирован: 01.10.2015

DetSimen пишет:

Помогаю: выкинь Tiny13, купи Tiny85, туда влезет всё, и в габаритах не проиграешь, только чучуть в цене. 

А как же спортивный интерес?
Советую 2 кнопки +/- для оскала и чем то измерять на выходе временной интервал, сформированный миллис или делей. Ну а сам оскал сохранять в еепром при этом.

Green
Offline
Зарегистрирован: 01.10.2015

Игорь Я пишет:

И что это даст?


Кварц можно подключить. И даже на 32 кгц.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

Green пишет:

А как же спортивный интерес?

Некогда спортом заниматься)

Я без частотомера проверяю. Ставлю миллис  1000 = 1 сек. Выставляю 10 минут, потом смотрю на сколько ушло, перевожу в проценты и корректирую 10 минут на эти проценты...

а ведь и правда, с частотомером побыстрее будет. Сам что-то не допёр. Спасибо.

 

nik182
Онлайн
Зарегистрирован: 04.05.2015

Не надо программировать с помощью программ. Добавь кнопку, при коротком нажатии добавляешь десятки в регистр, при длинном убавляешь единчки. За день настроишь точность лучше 10 минут.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

Green пишет:

Игорь Я пишет:

И что это даст?


Кварц можно подключить. И даже на 32 кгц.

.. и тут начнётся рост габаритов - кварц, кондюки для кварца.. да и размер самого маленького 32768 я видел, диаметром со спичку и длиной милиметров 7.

Green
Offline
Зарегистрирован: 01.10.2015

nik182 пишет:
Добавь кнопку, при коротком нажатии добавляешь десятки в регистр, при длинном убавляешь единчки. За день настроишь точность лучше 10 минут.

Тоже вариант. Заряжаешь таймер на какой то промежуток, час например, и считаешь расхождение. Корректируешь кнопкой (кнопками) и по новой, пока не получишь результат.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

чот наткнулся, что в тини 85 внутренний кварц.. похоже лажа какая-то. скорее всего RC - генератор. Поправьте если это не так.

"Отличия attiny25 от 45 и 85 - объем памяти: 2, 4, 8 кб соответственно. Так же есть 13, 1 кб.

Из функций - пара независимых таймеров для ШИМ, 5(6) портов ввода вывода (6 потому что RESET тоже можно настроить, как порт ввода вывода, но для сброса понадобится специальное устройство), и самое приятное - внутренний кварц на 128 кГц, 1, 8 или 16 МГц, то есть внешний резонатор не нужен, а частоту работы можно изменить прямо в"

может не правильно написано?

Green
Offline
Зарегистрирован: 01.10.2015

Неправильно прочитано. 85, в отличие от 13, позволяет иметь внешний кварц. Стабильность RC у всех одинакова. Внутренних кварцев не бывает. У ds3231 разве что.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Если таймер суточный, то можно обойтись совсем без МК использую DS3231 с его будильниками

И кроме выставления времени и будильников вообще ничего не нужно

Игорь Я
Offline
Зарегистрирован: 03.09.2018

sav13 пишет:

Если таймер суточный, то можно обойтись совсем без МК использую DS3231 с его будильниками

И кроме выставления времени и будильников вообще ничего не нужно

такой вариант прорабатывался.. в DC3231 нет возможности цикла, нужна еще  микросхема.. нужен вариант: сутки на выходе МК присутствует - 0, а через сутки - 1, и так постояно пока есть питание..

 

Игорь Я
Offline
Зарегистрирован: 03.09.2018

... что-то пошло не так..

Итак: вечером 06.11.20 в 20:30 включил таймер. 07.11.20 в 20:35 таймер переключился с 0 на 1 (всё как и рассчитал - за 10 мин +2сек, как раз на пять минут за сутки убежали). Спать ложился уже около 00:00 часов - таймер работал, т.е на выходе была - 1., а сегодня утром встал, а там опять на выходе - 0. Когда переключился таймер ума не приложу. Сначала подумал, что сеть ночью пропадала, но нет, часы на плите не сбросились. Выходит, что с программой что-то не то?. Я вот и не знаю, что там внутри происходит, какие алгоритмы и процессы? Может в какой-то период таймер сбрасывается? или со счетчиками переполнения происходят? Тут уже помощь требуется - код который зашит в Аттини13 не может сбиваться через определенное время? Помогите, кто может!

на всякий случай еще проверил галочку на Watch-dog Timer  - галочки нет..

Игорь Я
Offline
Зарегистрирован: 03.09.2018

Код забыл вставить

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Эти переменные хранят временной шаблон для интервалов мигания
// и текущее состояние светодиодов
 
int ledPin1 = 3; // номер пина со светодиодом
int ledState1 = LOW; // состояние светодиода
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis1 = 0;
long OnTime1 = 85742496; // длительность свечения светодиода (в миллисекундах)
long OffTime1 = 85742496; // светодиод не горит (в миллисекундах)
 
int ledPin2 = 4; // номер пина со светодиодом
int ledState2 = LOW; // состояние светодиода
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis2 = 0;
long OnTime2 = 500; // длительность свечения светодиода (в миллисекундах)
long OffTime2 = 500; // светодиод не горит (в миллисекундах)
 
void setup() {
// устанавливаем цифровой пин со светодиодом как ВЫХОД
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
 
void loop() {
// выясняем не настал ли момент сменить состояние светодиода
 
unsigned long currentMillis = millis(); // текущее время в миллисекундах
 
// конечный автомат для 1-го светодиода
if((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OnTime1))
{
   ledState1 = LOW; // выключаем
   previousMillis1 = currentMillis; // запоминаем момент времени
   digitalWrite(ledPin1, ledState1); // реализуем новое состояние
}
else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1))
{
   ledState1 = HIGH; // выключаем
   previousMillis1 = currentMillis ; // запоминаем момент времени
   digitalWrite(ledPin1, ledState1); // реализуем новое состояние
}
 
// конечный автомат для 2-го светодиода
if((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2))
{
   ledState2 = LOW; // выключаем
   previousMillis2 = currentMillis; // запоминаем момент времени
   digitalWrite(ledPin2, ledState2); // реализуем новое состояние
}
else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2))
{
   ledState2 = HIGH; // выключаем
   previousMillis2 = currentMillis ; // запоминаем момент времени
   digitalWrite(ledPin2, ledState2); // реализуем новое состояние
}
}

 

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

Игорь Я пишет:

sav13 пишет:

Если таймер суточный, то можно обойтись совсем без МК использую DS3231 с его будильниками

И кроме выставления времени и будильников вообще ничего не нужно

такой вариант прорабатывался.. в DC3231 нет возможности цикла, нужна еще  микросхема.. нужен вариант: сутки на выходе МК присутствует - 0, а через сутки - 1, и так постояно пока есть питание..

 


И эта микросхема давно существует.
Называется она D триггер,
155ТМ2 или по новому 7474 с множеством вариаций ТТЛ КМОП
При соединении инверсного выхода и входа данных получается делитель на 2

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

Для начала объявить все без исключения временные промежутки unsigned long

Игорь Я
Offline
Зарегистрирован: 03.09.2018

что-то в программе не то?

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

Игорь Я пишет:

что-то в программе не то?

Т е фраза объявить переменные вместо long написать unsigned long не понятна?
Не поможет, значит дальше разбираться.
Вы код то сами писали?

Игорь Я
Offline
Зарегистрирован: 03.09.2018

andycat][quote=Игорь Я пишет:

. Вы код то сами писали?

нет, код готовый брал отсюда http://robotosha.ru/arduino/multi-tasking-arduino.html, в середине статьи код

Игорь Я
Offline
Зарегистрирован: 03.09.2018

все Гуру сдулись?

"А царь-то, не настоящий!"..(С)

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

Игорь Я пишет:

все Гуру сдулись?

ну пока народ думал, что форум вам ПОМОГАЕТ делать таймер - были предложения вариантов. А как выяснилось, что вы в коде ничего не смыслите и делать нужно за вас -  думаю и интерес к теме пропал.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

 

[/quote]

что вы в коде ничего не смыслите 

[/quote]

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Игорь Я пишет:

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

Чтобы разобрать проблему надо книжки читать. А если книжки читать Вам лень, выход - заплатить тому, кто  уже прочел нужные книжки.

Sok
Offline
Зарегистрирован: 05.01.2018
Доброго времени суток.            Встала проблема измерения напряжения на ATTiny13. В ARDUINO скетч прекрасно работает, заливаю 
в ТИНЬКУ, никакой реакции на изменения напряжения нет, вернее есть, динамик отрабатывает сигналы, а на повышение
напряжения до 15 вольт не реагирует, сигнализация продолжается. Напряжение 15 вольт подаю через резистивный делитель.
Уж простите в программировании мало опыта, а в электронике ещё меньше. Может надо как-то конфигурировать порты АЦП 
тиньки, я прописывал вместо А0 номер порта ATTiny13. Подскажите в чём дело . Решаю эту проблему 8 часов. поиск
решения в интернете результатов не даёт, так как мало кто заливает скетчи через Ардуино в тиньку13.
Вот код:
 
#define VREF 5      // точное напряжение на пине 5V (в данном случае зависит от стабилизатора на плате Arduino)
#define DIV_R1 10000  // точное значение 10 кОм резистора
#define DIV_R2 5000   // точное значение 4.7 кОм резистора

void setup() {
   //Serial.begin(9600);

  pinMode(A0, INPUT); // пин A0 будет входом
  pinMode(3, OUTPUT);// BUZZER
}
   
void loop() {
    float voltage = (float)analogRead(A0) * 5  * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024; // Эту строку писал не я 
                                                                                      // и с трудом её понимаю
  // Serial.println(voltage);
   if (voltage < 11.9){
     for (int w=0; w <= 2;){ // Сигнализация что напряжение упало до 11.9 вольт
     digitalWrite(3, HIGH); 
       delay(100);           // этот блок для ACTIVE BUZZER 5V
     digitalWrite(3, LOW);
       delay(100);
    }
  }
}

 


 

Green
Offline
Зарегистрирован: 01.10.2015

А0 - это RESET, 1-я нога тини13. Вы на нём собрались что то измерять?
Да и бипер у вас будет пищать вечно с этим скетчем.)

Sok
Offline
Зарегистрирован: 05.01.2018

Естественно я вписывал не RESET все другие ноги. Вечно пищать? там же условие  if (voltage < 11.9). На Arduino Pro Mini всё прекрасно работает, пищит только когда напряжение опускается ниже 11.9 и прекращает как только напряжение поднимается.

Sok
Offline
Зарегистрирован: 05.01.2018

Прошу прощенья, я из за запарки стер в скетче w++.  Да так получается вечный цикл вот исправил:

 for (int w=0; w <= 2; w++)

Green
Offline
Зарегистрирован: 01.10.2015

Ну да, будет вечно пищать, если напряжение однажды станет ниже 11.9.
Все вписывать не надо. Нужно одну конкретную. Показывайте схему и скетч. Иначе ещё будете решать 8 часов.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

andriano пишет:

Чтобы разобрать проблему надо книжки читать. 

[/quote]

Этим сейчас и занялся. Скачал AtmelStudio 7, читаю уроки на С++ и видео смотрю, разбираю принципы построения и функции. 

Тяжко идет запоминание такого объема. Наверное с возрастом, нейроны в мозге  с трудом записывают "1" в память... Сплошной мусор...

Sok
Offline
Зарегистрирован: 05.01.2018

Да с возрастом не только единицы плохо записываются, но видимо и нули отличаются от стандарта. Сам такой, увлёкся на старости лет, в моей молодости не было таких умных микроконтроллеров. 

Green; Игорь Я; Спасибо что ответили, но проблемы то и нет! Дело в Китайских ATTiny13, Заменил на другую и всё работает! А вот книжки читать надо, потому как на этом Arduino Wiring в мои любимые 13тые мало что помещается, например этот код что написан занял 98% памяти Тиньки, я даже не пойму почему? Раньше раз в 5 больше кода помещалась. Теперь не знаю хватит ли 2% на команды обработки полученных данных...

Sok
Offline
Зарегистрирован: 05.01.2018

Ну вот здрасссте        Закоментировл цикл и  после компиляции пишет "Скетч использует 246 байт (24%) памяти устройства. Всего доступно 1024 байт." Это как понимать? С циклом как я писал занимал (98%)

#define VREF 5      // точное напряжение на пине 5V (в данном случае зависит от стабилизатора на плате Arduino)
#define DIV_R1 10000  // точное значение 10 кОм резистора
#define DIV_R2 5000   // точное значение 4.7 кОм резистора

void setup() {
   //Serial.begin(9600);

  pinMode(3, INPUT); // пин A0 будет входом
  pinMode(4, OUTPUT);// BUZZER
}
   
void loop() {
    float voltage = (float)analogRead(3) * 5 * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024; 
   //Serial.println(voltage);
   if (voltage < 11.9){
     /*for (int w=0; w <= 1; w++){ // Сигнализация что напряжение упало до 11.9 вольт
     digitalWrite(4, HIGH); 
       delay(100);           // этот блок для ACTIVE BUZZER 5V
     digitalWrite(4, LOW);
       delay(100);
    }*/
  }
}

 

 

Green
Offline
Зарегистрирован: 01.10.2015

float уберите, напряжение считайте в десятках вольт или даже в милливольтах.

Green
Offline
Зарегистрирован: 01.10.2015

Sok пишет:

Ну вот здрасссте 


В блок после условия вставьте что-нибудь. Компиляторы сейчас умные - наверняка выкинул все ваши вычисления за ненадобностью.

iopq
Offline
Зарегистрирован: 05.07.2016

вот может кому будет полезно -

#define PIN_OUTPUT  DDRB  |=   _BV(4)
#define PIN_INPUT   DDRB  &= ~ _BV(4)
#define PIN_HIGH    PORTB |=   _BV(4)
#define PIN_LOW     PORTB &= ~ _BV(4)

byte data[4]  = {0x74, 0x00, 0x02, 0x1F};

int main (void) {
  while (1) {
    lightningPower();
    _delay_ms(1000);
  }
}

void Break() {
  PIN_OUTPUT;
  PIN_LOW;
  _delay_us(14);
  PIN_HIGH;
  _delay_us(4);
}

void lightningPower() {
  Break();
  for (int i = 0 ; i < 4 ; i++) {
    for (byte bitMask = 0x01; bitMask; bitMask <<= 1) {
      PIN_LOW;
      _delay_us(2);
      (data[i] & bitMask) ? PIN_HIGH : PIN_LOW;
      _delay_us(5);
      PIN_HIGH;
      _delay_us(3);
    }
    _delay_us(12);
  }
  Break();
  PIN_INPUT;
  PIN_LOW;
}

занимает 186 байт

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

iopq пишет:

вот может кому будет полезно -

...

занимает 186 байт

И что это было? 102-е применение ATiny?

nik182
Онлайн
Зарегистрирован: 04.05.2015

Особенно делей 1000 доставляет.

iopq
Offline
Зарегистрирован: 05.07.2016

совсем забыл - это что бы с lightning кабеля питание получать. ну а что делей 1000? по хорошему нужно читать ответ кабеля и прекращать отправку, но для упрощения и так работает 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ахтунг! Яблофилы в Ардуино!!! Срочную санобработку! Два раза в день по 30 минут программирование в Андроид-студио!

Lalen
Offline
Зарегистрирован: 25.12.2020

Всем добрый день! 

Хочу сразу предупредить, что в программировании я полный ноль, но так вышло, что очень нужно реализовать проект с attiny13(13a), dht11, rf433. То есть считываются показатели температуры и влажности с dht11, отправляются при помощи передатчика rf433, а приемник в идеале соединен с ардуино уно и выводит уже в монитор порта. Хотела уточнить, это вообще реально? Просто столкнулась с проблемой катастрофически маленькой памяти у attiny13. Прошивать attiny при помощи Arduino UNO и Arduino IDE наловчилась, но как дальше быть? Излазила уйму сайтов и перепробовала разные варианты, ничего толкового так и не вышло :(
Схема подключения:

__Alexander
Offline
Зарегистрирован: 24.10.2012

Lalen пишет:

Просто столкнулась с проблемой катастрофически маленькой памяти у attiny13.

Ну так надо начать и смотреть за расходом памяти. На глаз никто не скажет влезет или нет. Может и влезет. Какой модуль 433?

Lalen
Offline
Зарегистрирован: 25.12.2020

такого формата

Green
Offline
Зарегистрирован: 01.10.2015

Этот передатчик, по моему, от 5 до 12 вольт. Ну и дальность при 5 совсем небольшая.

Lalen
Offline
Зарегистрирован: 25.12.2020

Заявлено, что от 3 В.  Дальность в проекте не особо важна, главное - чтоб передавал/принимал, дальность 20 см (или даже меньше) вполне устроит

Green
Offline
Зарегистрирован: 01.10.2015

Я бы советовал сначала связать 2 Ардуино проводами через Software serial на 1200 с инверсией. Затем через модули. Ну а дальше подключать к тини13.

__Alexander
Offline
Зарегистрирован: 24.10.2012

Lalen пишет:

Заявлено, что от 3 В.  Дальность в проекте не особо важна, главное - чтоб передавал/принимал, дальность 20 см (или даже меньше) вполне устроит

Скажем так, свой протокол Вы вряд-ли будете писать, а если использовать готовые библиотеки, то в 1кб точно не впишетесь, для 433 сожрет только килобайт 5-6, не говоря что надо еще добавить для dht.

Green
Offline
Зарегистрирован: 01.10.2015

Да какой там протокол - здесь же одно ус-во. Преамбула, синхро, данные, КС - всё.

OK0
Offline
Зарегистрирован: 06.03.2020