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

Delphin911
Offline
Зарегистрирован: 25.12.2019

Народ, не кидайтесь тапками, старательно читал форум, но не хватило терпения. Хочу для начала только теоретический вопрос по Attiny13 задать. Одни и те же выводы у нее могут быть и цифровыми и аналоговыми? Судя по распиновке в даташите получается, что выводы PB5, PB2, PB4 и PB3 это аналоговые A0, A1, A2 и A3 соответственно(ADCX)? Ну т.е. в скетче мы их указываем как A0, A1, A2 и A3. А выводы PB0, PB1, PB2, PB3, PB4 и PB5 соответственно цифровые порты 0, 1, 2, 3, 4 и 5(PCINTX). При этом PB0 и PB1 поддерживают ШИМ (AINX). Или я не до конца понял распиновку?

Так же не до конца понял обозначения dW, CLKI, T0, INTX. Хотя dW, как и SCK, MISO, MOSI используются при программировании через Ардуино (возможно и не только).

Ну RESET вроде понятно, но тоже не разобрался каким уровнем сброс осуществляется. Туго у меня с английским, а Datasheet на нем родимом.

Или может ссылочку дайте, где об этом по русски почитать можно.

Спасибо!

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

Delphin911 пишет:

старательно читал форум, но не хватило терпения. 

Туго у меня с английским

Или может ссылочку дайте, где об этом по русски почитать можно.

https://translate.google.ru/

Delphin911
Offline
Зарегистрирован: 25.12.2019

wdrakula пишет:

Delphin911 пишет:

старательно читал форум, но не хватило терпения. 

Туго у меня с английским

Или может ссылочку дайте, где об этом по русски почитать можно.

https://translate.google.ru/

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

Т.е. вы хотите сказать, что в датащите это (что я мпрашиваю) описано и разъяснено? Хм. Попробую еще раз почитать. Помоему там черезчур все мудрено и без определенной подготовки не въедешь.

Вы хоть скажите, то что я написал правильно?

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

Delphin911 пишет:

Т.е. вы хотите сказать, что в датащите это (что я мпрашиваю) описано и разъяснено? Хм. Попробую еще раз почитать. Помоему там черезчур все мудрено и без определенной подготовки не въедешь.

абсолютно верно думаете.

Но только скажу вам, что "без определенной подготовки" оно и в переводе будет "черезчур все мудрено".

Так что путь один - набирать вот эту самую "подготовку", желательно одновременно с изучением английского

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

Delphin911 пишет:

Вы хоть скажите, то что я написал правильно?

1.Нет, почти всё неправильно.

2. Attiny13 безнадежно устаревшая вещь. Ровно с теми же "ножками" и той же ценой attiny85.

Delphin911
Offline
Зарегистрирован: 25.12.2019

wdrakula пишет:

1.Нет, почти всё неправильно.

2. Attiny13 безнадежно устаревшая вещь. Ровно с теми же "ножками" и той же ценой attiny85.

1. Инфу пот портам вроде из видео на ютуб каналах брал. Ну разве что по поводу PB5 сильно сомневался.

А что конкретно неправильно? Вот скажем, что PB0 и PB1 с поддержкой ШИМ это в Datasheet написано, уже нашел. И что порты с PB2 по PB5 аналоговые, тоже в Datasheet написано.

Table 21. Port B Pins Alternate Functions
Port Pin Alternate Function
PB5 RESET/dW/ADC0/PCINT5(1)
PB4 ADC2/PCINT4(2)
PB3 ADC3/CLKI/PCINT3(3)
PB2 SCK/ADC1/T0/PCINT2(4)
PB1 MISO/AIN1/OC0B/INT0/PCINT1/RXD(5)
PB0 MOSI/AIN0/OC0A/PCINT0/TXD(6)

Notes: 1. Reset pin, debugWire I/O, ADC Input channel, or Pin Change Interrupt.
2. ADC Input channel or Pin Change Interrupt.
3. ADC Input channel, Clock Input, or Pin Change Interrupt.
4. Serial Clock Input, Timer/Counter Clock Input, ADC Input Channel 0, or Pin Change
Interrupt.
5. Serial Data Input, Analog Comparator Negative Input, Output Compare and PWM
Output B for Timer/Counter, External Interrupt 0 or Pin Change Interrupt.
6. Serial Data Output, Analog Comparator Positive Input, Output Compare and PWM
Output A for Timer/Counter, or Pin Change Interrupt.

По поводу устарела - не буду спорить. Наверное. Просто у меня она есть сейчас и я эксперементирую на ней. Выводы вроде там одинаковые. Ну памяти в 85 8кб. А выводы суда по картинке такие же и так же в Datasheet без пол литры не разберешся сразу.

Ну а опыта как-то надо набираться!? Я вот еще с пол года назад, пока Ардуинкой не занялся, вообще ничего о микропроцессорах не знал.

Delphin911
Offline
Зарегистрирован: 25.12.2019

Вот еще нашел видео с простым и подробным описанием. https://www.youtube.com/watch?v=ibhgMzKOiJQ

Получается ошибался я только с 1 ногой, на которой только сброс.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Delphin911 пишет:

wdrakula пишет:

Delphin911 пишет:

старательно читал форум, но не хватило терпения. 

Туго у меня с английским

Или может ссылочку дайте, где об этом по русски почитать можно.

https://translate.google.ru/

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

Т.е. вы хотите сказать, что в датащите это (что я мпрашиваю) описано и разъяснено? Хм. Попробую еще раз почитать. Помоему там черезчур все мудрено и без определенной подготовки не въедешь.

Вы хоть скажите, то что я написал правильно?

да нормально для автомата - запрос на член 'положить' в 'MyBuffer',  )))

Delphin911
Offline
Зарегистрирован: 25.12.2019

В общем понятно. Без диплома о знании программирования на низком уровне сюда обращаться не стоит. Засмеют.
А у меня в принципе все правильно. Я уже прошил свою первую тиньку.

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

Я объясню, почему была такая реакция на твои посты.

Delphin911 пишет:

Одни и те же выводы у нее могут быть и цифровыми и аналоговыми?

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

Delphin911 пишет:

Судя по распиновке в даташите получается, что выводы PB5, PB2, PB4 и PB3 это аналоговые A0, A1, A2 и A3 соответственно(ADCX)? Ну т.е. в скетче мы их указываем как A0, A1, A2 и A3. А выводы PB0, PB1, PB2, PB3, PB4 и PB5 соответственно цифровые порты 0, 1, 2, 3, 4 и 5(PCINTX). При этом PB0 и PB1 поддерживают ШИМ (AINX). Или я не до конца понял распиновку?

Обозначения зависят от выбранного ядра, их более чем одно.  PCINTx  сокращение для Pin Change Interrupt - прерывания изменения состояния пина, то есть ты понял, что вообще из другой оперы? AIN0 и AIN1  входы аналогового компаратора. К ШИМу никакого отношения.

Delphin911 пишет:

Так же не до конца понял обозначения dW, CLKI, T0, INTX. Хотя dW, как и SCK, MISO, MOSI используются при программировании через Ардуино (возможно и не только).

Каша в голове. Не сочетается с тем, что ты прошил тиньку. Основное описание тиньки - около 100 страниц на примитивном "школьном" аглицком. Что там непонятно?

Delphin911 пишет:

Ну RESET вроде понятно, но тоже не разобрался каким уровнем сброс осуществляется. Туго у меня с английским, а Datasheet на нем родимом.

Черта над словом RESET на схеме как бы намекает на активный низкий, нет?

Ну вот мы и добрались до основы: новичок признается, что не читает по аглицки. Что показывает полную несерьёзность интереса. Электроникой и программированием без аглицкого заниматься нельзя. Совсем нельзя. Без дискуссий и обсуждений этого факта.

=======================

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

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

Простенький термометр для дистиллятора (еще не доделал термостойкую коробочку), скетч отсюда:

http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=32#comment-446373

добавил изменение времени отправки данных в зависимости от температуры

#include <util/delay.h>     /* for _delay_us() */
#define periodusec 400 // mcs
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <OneWire.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define errTemp 1371

#define ds_pin PB4
OneWire ds18b20(ds_pin);

#define en_pin PB0

#define rf_pin PB3
#define RC_BIT rf_pin

#define defaultTimerCountSec 1812 // 30 min // 1027 = ~17min delay start by sec
word TimerCountSec = 10;
word CurrentTime = 0;

#define minTempControl 2300 //  = 30 'C
#define maxTempControl 3240 //  = 124 'C
#define minTimerSend 30 // = 30 sec
#define maxTimerSend 300 // = 5 min

void setup () {
  ExecFunc();
}

void loop () {
  CalcTimer();
  toSleep();
}

void ExecFunc() {
  word currT = getTemp();
  if (currT != errTemp) {
    if ((currT >= minTempControl) and (currT <= maxTempControl)) {
      TimerCountSec = map(currT, minTempControl, maxTempControl, minTimerSend, maxTimerSend);
      TimerCountSec = maxTimerSend - (TimerCountSec - minTimerSend);
    } else {
      TimerCountSec = defaultTimerCountSec;
    }
    currT += 21500;
    pinMode(en_pin, OUTPUT); digitalWrite(en_pin, HIGH); // RF ON
    pinMode(rf_pin, OUTPUT); digitalWrite(rf_pin, LOW); // OFF data RF
    sendRC(currT);
  } else {
    TimerCountSec = defaultTimerCountSec;
  }
  offPins();
}

void CalcTimer() {
  ++CurrentTime;
  if (((CurrentTime + 1) * 8) >= TimerCountSec) {
    CurrentTime = 0;
    ExecFunc();
  }
}

word getTemp() {
  byte dsData[9];
  ds18b20.reset();
  ds18b20.write(0xCC);
  ds18b20.write(0x44);
  delay(800);
  ds18b20.reset();
  ds18b20.write(0xCC);
  ds18b20.write(0xBE);
  for (byte i = 0; i < 9; i++) dsData[i] = ds18b20.read();
  if (OneWire::crc8(dsData, 8) != dsData[8]) return errTemp;
  word outTemp = (word)(dsData[1] << 8) + dsData[0];
  if ((word)(outTemp & 0x8000) == (word)(0x8000)) { // minus temp
    outTemp = (~outTemp) + (word)1;
    outTemp = (((word)6 * outTemp) + outTemp / (word)4) / (word)10;
  } else { // plus temp
    outTemp = (((word)6 * outTemp) + outTemp / (word)4) / (word)10;
    if (outTemp == 0) return errTemp;
    outTemp  += (word)2000;
  }
  return outTemp;
}

void offPins() {
  ds18b20.reset();
  digitalWrite(PB0, LOW); pinMode(PB0, INPUT);
  digitalWrite(PB1, LOW); pinMode(PB1, INPUT);
  digitalWrite(PB2, LOW); pinMode(PB2, INPUT);
  digitalWrite(PB3, LOW); pinMode(PB3, INPUT);
  digitalWrite(PB4, LOW); pinMode(PB4, INPUT);
}

ISR (WDT_vect)
{
  wdt_disable();  // disable watchdog
}

void toSleep() {
  cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF
  setup_watchdog(9);
  wdt_reset();  // pat the dog
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  noInterrupts (); // timed sequence follows
  sleep_enable();
  sleep_bod_disable();
  interrupts ();  // guarantees next instruction executed
  sleep_cpu ();  // cancel sleep as a precaution
  sleep_disable();
}

// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {
  byte bb; int ww;
  if (ii > 9 ) ii = 9;
  bb = ii & 7;
  if (ii > 7) bb |= (1 << 5);
  bb |= (1 << WDCE); ww = bb;
  MCUSR &= ~(1 << WDRF);
  // start timed sequence
  WDTCR |= (1 << WDCE) | (1 << WDE);
  // set new watchdog timeout value
  WDTCR = bb; WDTCR |= _BV(WDIE);
}

void sendRC(unsigned long data) { // Отправка данных по радиоканалу RCswitch. Двоичный протокол
  DDRB |= _BV(RC_BIT);
  data |= 3L << 20; // ?
  unsigned short repeats = 1 << (((unsigned long)data >> 20) & 7);
  data = data & 0xfffff;
  unsigned long dataBase4 = 0; uint8_t i;
  for (i = 0; i < 20; i++) {
    dataBase4 <<= 1;
    dataBase4 |= (data % 2);
    data /= 2;
  }
  unsigned short int j;
  for (j = 0; j < repeats; j++) {
    data = dataBase4; uint8_t i;
    for (i = 0; i < 20; i++) {
      switch (data & 1) {
        case 0:
          PORTB |= _BV(RC_BIT);
          _delay_us(periodusec);
          PORTB &= ~_BV(RC_BIT);
          _delay_us(periodusec * 3);
          break;
        case 1:
          PORTB |= _BV(RC_BIT);
          _delay_us(periodusec * 3);
          PORTB &= ~_BV(RC_BIT);
          _delay_us(periodusec);
          break;
      }
      data >>= 1;
    }
    PORTB |= _BV(RC_BIT);
    _delay_us(periodusec);
    PORTB &= ~_BV(RC_BIT);
    _delay_us(periodusec * 31);
  }
}

- приемник

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

#include <LiquidCrystal.h>
LiquidCrystal lcd(/*RS*/8,/*Enable*/9,/*DB4*/4,/*DB5*/5,/*DB6*/6,/*DB7*/7);

word lastCode = 0;
word lastTime = 0;
unsigned long timerSec = 0;
unsigned long current_millis;
unsigned long timerLigth;

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin 2 // иницилизация.Используется вывод м/к с прерыванием под номером 0.
  pinMode(10, OUTPUT);
}

void loop() {
  current_millis = millis();
  // put your main code here, to run repeatedly:
  if ((millis() - timerSec) >= 1000UL) {
    timerSec = current_millis;
    ++lastTime;
    lcd.clear();
    lcd.print(lastTime);
    lcd.print(" sec ");
    word lts = lastTime / 60;
    lcd.print(lts);
    lcd.print(" min");
    lcd.setCursor(0, 1);
    unsigned long tmpcode = lastCode - 21500;
    lcd.print("  ");
    if (tmpcode >= 2000UL) {
      tmpcode -= 2000UL;
    } else {
      lcd.print("-");
    }
    lcd.print(tmpcode / 10);
    lcd.print(".");
    lcd.print(tmpcode % 10);
    lcd.print("  'C");
    /*lcd.print(lastCode);
      lcd.print("-->");
      lcd.print(tmpcode);*/
  }
  // receive street temp
  if (mySwitch.available()) {
    unsigned long receivedCode =  mySwitch.getReceivedValue();
    mySwitch.resetAvailable(); startLigth();
    lastTime = 0;
    lastCode = receivedCode;
  }
  // set display light
  if (analogRead(A0) < 500) startLigth();
  if ((current_millis - timerLigth) <= 5000UL) digitalWrite(10, HIGH); else digitalWrite(10, LOW);
  //--- end loop
}

void startLigth() {
  timerLigth = current_millis;
}

-

 

pittyalex
Offline
Зарегистрирован: 09.11.2016

Молодец. Ну или как далеко ловит? На сколько батарейки хватает?

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

pittyalex пишет:
Молодец. Ну или как далеко ловит? На сколько батарейки хватает?

Пробовал в пределах кухни, больше и не надо.
Потребление в спящем режиме 300 мкА, по примерным расчётам должно хватить на минимум 10 полноценных 6и часовых выгонов.

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

2032 на пределе по току, не? Я бы 3,6 акк поставил или даже АА/А.

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

Green пишет:

2032 на пределе по току, не?

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