ATmegd328p vs ATtiny85

Тема в разделе "Микроконтроллеры AVR", создана пользователем Motrosoff, 15 авг 2016.

  1. Motrosoff

    Motrosoff Гик

    Вопрос! Сможет ли ATtiny85 выполнять такие же по сложности функции, как и ATmega328P???
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Сможет, если уложитесь в уменьшенный объем памяти.
     
  3. Onkel

    Onkel Гуру

    существуют задачи, для которых ответом является однозначно "нет"
     
  4. Motrosoff

    Motrosoff Гик

    А вот это ATtiny85 выполнит ?????
    Код (C++):
    unsigned long time4 = 0;
    const byte ledPin = 12;
    const byte maxVoltage =5;// максимально возможное измеряемое напряжение

    void setup()
    {
      pinMode(ledPin, OUTPUT);
     
    }

    void loop()
    {
    if(millis()>=(time4+1000)) // если прошло 5 секунд то проверяем напряжение
    {
      float voltage = map(analogRead(A4),0,1060,0,maxVoltage*100)/100.0;
     
      time4=millis();// засекаем время
      if(voltage<2.8) blink();
       }
    }

    void blink()
    {
    for(int i=0;i<10;i++)
    {
      digitalWrite(ledPin, HIGH);
      delay(250);
      digitalWrite(ledPin, LOW);
      delay(250);}
    }
     
  5. Motrosoff

    Motrosoff Гик

    Кстати это вы мне с этим кодом помогали)))
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    Выберите в IDE "Плата - Attiny85/DigiSpark", если скомпилируется, то с 90%-й вероятностью и запустится.
     
  7. Motrosoff

    Motrosoff Гик

    Спасибо, попробуем):)
     
  8. ostrov

    ostrov Гуру

    Как минимум А4 не поймет Тиня 85. ))
    Да и прочие ledPin = 12;

    [​IMG]

    А если пины правильные подставить, то компилируется без проблем. 27% памяти занимает всего.
     
  9. Motrosoff

    Motrosoff Гик

    аа)) этот код был для меги 328..вот хочу его в маленькую микрушку засунуть.)
     
  10. ostrov

    ostrov Гуру

    Будет работать. Замените лед пин, например на 1, а аналоговый на A1 и все ок.

    Только вопрос по самому коду. Зачем в лупе делать паузы по таймеру, при том что в блинке используются delay()? Других задач кроме замера напряжения каждые 5 сек с миганием по факту заряда программа не выполняет. Сделайте все через два delay() и один if().

    Код (C++):
    #define ledPin     1
    #define analogPin  A1
    #define maxVoltage 5     // максимально возможное измеряемое напряжение
    #define pause      5000  // период замера

    void setup() {
      pinMode(ledPin, OUTPUT);
      digitalWrite(ledPin, LOW);
    }

    void loop() {
      float voltage = map(analogRead(analogPin), 0, 1060, 0, maxVoltage * 100) / 100.0;
      if (voltage < 2.8) {
        for (byte i = 0; i < 20; i++)
        {
          digitalWrite(ledPin, !digitalRead(ledPin));
          delay(250);
        }
      }
      delay(pause);
    }
    А если убрать delay(pause) так и вовсе будет мигать сразу после снижения напруги ниже 2.8 безостановочно.
     
    Последнее редактирование: 17 авг 2016
    Motrosoff нравится это.
  11. ostrov

    ostrov Гуру

    Ну или сделать по уму без dealy() вообще:

    Код (C++):
    #define ledPin     1
    #define analogPin  A1
    #define maxVoltage 5    // максимально возможное измеряемое напряжение
    #define pause      5000  // период замера
    #define mig        250   // частота мигания

    unsigned long timerMeas;
    unsigned long timerMig;
    float voltage;

    void setup() {
      pinMode(ledPin, OUTPUT);
    }

    void loop() {
      if ((millis() - timerMeas) > pause) {   // пора замерять
        voltage = map(analogRead(analogPin), 0, 1060, 0, maxVoltage * 100) / 100.0;
        timerMeas = millis();
      }
      if ((millis() - timerMig) > mig) { // пора мигать
        (voltage < 2.8) ? digitalWrite(ledPin, !digitalRead(ledPin)) : digitalWrite(ledPin, LOW);
        timerMig = millis();
      }
    }
    ]

    Пока напруга выше 2.8В - светодиод не горит, когда ниже - мигает.

    И еще, вместо огромной формулы приведения показания аналогового пина к вольтажу, я бы вычислил непосредственные показания на этом пине при 2,8В и сверял бы с ними. Это примерно 573 (не забываем про AREF). В таком случае код упрощаем сокращаем до:

    Код (C++):
    #define ledPin     1
    #define analogPin  A1
    #define pause      5000  // период замера
    #define mig        250   // частота мигания
    #define minVoltage 574   // минимальное напряжение

    unsigned long timerMeas;
    unsigned long timerMig;
    unsigned int voltage;

    void setup() {
      pinMode(ledPin, OUTPUT);
    }

    void loop() {
      if ((millis() - timerMeas) > pause) {   // пора замерять
        voltage = analogRead(analogPin);
        timerMeas = millis();
      }
      if ((millis() - timerMig) > mig) { // пора мигать
        (voltage < minVoltage) ? digitalWrite(ledPin, !digitalRead(ledPin)) : digitalWrite(ledPin, LOW);
        timerMig = millis();
      }
    }
    И получаем всего 11% использованной памяти МК. Можно чего нибудь еще на него повесить, либо перейти на Attiny13. )
     
    Последнее редактирование: 17 авг 2016
    sys и Motrosoff нравится это.