Attiny85 и задержка запуска

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017

Здравствуйте.

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

Есть подозрение что это связано с ожиданием загрузчика на обновление прошивки.

Используется Digispark для упровления люстрой пультом и при подаче питаня проходит около 6 сек до включения.

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

Стереть загрузчик и прошивать программатором. Хотя 6 сек что-то многовато для загрузчика, обычно не более 3 сек.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Jeka_M пишет:

Стереть загрузчик и прошивать программатором. Хотя 6 сек что-то многовато для загрузчика, обычно не более 3 сек.

на дижиспарке ресет залочен

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017

к сожалению всё уже запихано в люстру и залито термоклеем... из неё торчит только USB

есть ли способ поменять загрузчик через USB и в загрузчике влючть 3,4,1 пин как OUTPUT и HIGH?

п.с. до ресета есть доступ.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Dmitriyxz пишет:

к сожалению всё уже запихано в люстру и залито термоклеем... из неё торчит только USB

есть ли способ поменять загрузчик через USB и в загрузчике влючть 3,4,1 пин как OUTPUT и HIGH?

п.с. до ресета есть доступ.

ну, если в загрузочную область вшить блинк, то можно.

но для этого нужно прошивать программатором

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017

модули реле с алиэкпресс подробно указывать не стал. код ниже...

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017

#include <avr/delay.h>
//#include <avr/sleep.h>

//#define acStatePin 0

#define maxCountlamp 3 // максимальное кол-во реле
#define buttonMinCountlamp 1 // минимальное кол-во включеных реле при упровлении выключателем

uint8_t lampsPin[maxCountlamp] = {4, 3, 1}; // номер пина реле
bool lampsStatus[maxCountlamp] = {1, 0, 0}; // текущий статус реле
bool lampsIsInvert[maxCountlamp] = {0, 0, 1}; // состояние включеных реле
bool lampsSleep[maxCountlamp] = {1, 1, 1}; // состояние малого потребления тока у реле

bool defaultLampsStatus[maxCountlamp] = {1, 0, 0}; // статус реле при сбросе

volatile unsigned long ptime = 0;
volatile unsigned long ntime = 0;

bool acState = 0;

volatile uint8_t m = 0;
volatile uint8_t  complete = 0;
volatile uint8_t  tcnt = 0;
volatile uint8_t  startflag = 0;
uint32_t irdata = 0;
uint32_t keydata = 0 ;

bool tmp = 0;
bool tmp2 = 0;
uint8_t tmp8 = 0;
bool tmplampsStatus[maxCountlamp] = {};

void setup() {

  DDRB = B00011010;
//  for (int i = 0; i < 3; i++) {
//    pinMode(lampsPin[i], OUTPUT);
//  }

//  for (int i = 0; i < maxCountlamp; i++) {
//    digitalWrite(lampsPin[i], (lampsIsInvert[i]) ? !lampsStatus[i] : lampsStatus[i]);
//  }

  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП ?

  PORTB |= 1 << PB2; // подтяжка IR
  PORTB |= 1 << PB0; // подтяжка acState
  //  PORTB |= 1 << DDB1; // ??
  GIMSK |= 1 << INT0; //interrupt int0 enable
  MCUCR |= 1 << ISC00; //Any logical change on INT0 generates an interrupt request
  GTCCR |= 1 << PSR0;
  TCCR0A = 0;
  TCCR0B = (1 << CS02) | (1 << CS00); // divider /1024
  TIMSK = 1 << TOIE0; //interrupt Timer/Counter1 Overflow  enable

  TCCR1 = (1 << CTC1) | (7 << CS10); // CTC  mode, div64
  OCR1C = 0.001 * F_CPU / 64 - 1; // 1ms, F_CPU @16MHz, div64
  TIMSK |= (1 << OCIE1A);

  GIMSK |= 1 << PCIE;
  PCMSK |= 1 << PCINT0;
  sei();

//  pinMode(acStatePin, INPUT);
//  digitalWrite(acStatePin, HIGH);
  
//  _delay_ms(10);
  ptime = 0;
  ntime = 0;

  PORTB |= B00011000;
}

ISR(PCINT0_vect) {
  
  acState = PINB & B00000001;//digitalRead(acStatePin);

  if (acState == 0) { //AC ON
//    sleep_disable();
    ptime = ntime - ptime;
    if  (ptime < 2000 && ptime > 100) {
      int i;
      for (i = 0; i < maxCountlamp; i++) {
        if (lampsStatus[i] == 1) {
          lampsStatus[i] = 0;
          break;
        }
      }
      if (i == maxCountlamp) {
        for (int i = 1; i < maxCountlamp; i++) {
          lampsStatus[i] = 1;
        }
        lampsStatus[0] = 0;
      }
    } else if (ptime > 3000) {
      for (int i = 0; i < maxCountlamp; i++) {
        lampsStatus[i] = defaultLampsStatus[i];
      }
    }
  } else { //AC OFF
    //выключаем реле
    for (int i = 0; i < maxCountlamp; i++) {
      digitalWrite(lampsPin[i], lampsSleep[i]);
    }
  }

  if (ptime > 100) {
    ptime = ntime;
  }
}


void loop() {
  if (acState == 1) { //AC OFF
//    if ((ntime - ptime) > 2100) {
//      set_sleep_mode (SLEEP_MODE_PWR_DOWN);
//      sleep_enable();
//      sleep_cpu();
//
//      acState = 0;
//    }
  } else {
    if (complete) { // если был принят код
      switch (keydata) {
        case 0xBA45FF00: //power
        case 0x8E8F:
          tmp = 0;
          for (int i = 0; i < maxCountlamp; i++) {
            if (!lampsStatus[i]) {
              tmp = 1;
              break;
            }
          }
          if (tmp) {
            memcpy(tmplampsStatus, lampsStatus, sizeof(lampsStatus));
            for (int i = 0; i < maxCountlamp; i++) {
              //              tmplampsStatus[i] = lampsStatus[i];
              lampsStatus[i] = 1;
            }
          } else {
            memcpy(lampsStatus, tmplampsStatus, sizeof(lampsStatus));
          }
          break;
        case 0xB847FF00: //menu

          break;
        case 0xBB44FF00: //test
        case 0x888F:
          for (int j = 0; j < 2; j++) {
            for (int i = 0; i < maxCountlamp; i++) {
              digitalWrite(lampsPin[i], HIGH);
              _delay_ms(2000);
            }
            for (int i = 0; i < maxCountlamp; i++) {
              digitalWrite(lampsPin[i], LOW);
              _delay_ms(1000);
            }
            _delay_ms(2000);

            for (int k = 0; k < 3; k++) {
              for (int i = 0; i < maxCountlamp; i++) {
                digitalWrite(lampsPin[i], HIGH);
              }
              _delay_ms(500);
              for (int i = 0; i < maxCountlamp; i++) {
                digitalWrite(lampsPin[i], LOW);
              }
              _delay_ms(500);
            }
            _delay_ms(1000);
          }
          break;
        case 0xBF40FF00: //+
        case 0x948F:
          for (int i = maxCountlamp - 1; i >= 0; i--) {
            if (lampsStatus[i] == 1) {
              lampsStatus[i] = 0;
              break;
            }
          }
          break;
        case 0x7887FE01: //break

          break;
        case 0xF807FF00: //prew
          tmp8 = lampsPin[0];
          tmp2 = lampsIsInvert[0];
          tmp = lampsSleep[0];
          for (int i = 0; i < maxCountlamp - 1; i++) {
            lampsPin[i] = lampsPin[i + 1];
            lampsIsInvert[i] = lampsIsInvert[i + 1];
            lampsSleep[i] = lampsSleep[i + 1];
          }
          lampsPin[maxCountlamp - 1] = tmp8;
          lampsIsInvert[maxCountlamp - 1] = tmp2;
          lampsSleep[maxCountlamp - 1] = tmp;
          break;
        case 0xEA15FF00: //play

          break;
        case 0xF609FF00: //next
          tmp8 = lampsPin[maxCountlamp - 1];
          tmp2 = lampsIsInvert[maxCountlamp - 1];
          tmp = lampsSleep[maxCountlamp - 1];
          for (int i = maxCountlamp - 1; i > 0; i--) {
            lampsPin[i] = lampsPin[i - 1];
            lampsIsInvert[i] = lampsIsInvert[i - 1];
            lampsSleep[i] = lampsSleep[i - 1];
          }
          lampsPin[0] = tmp8;
          lampsIsInvert[0] = tmp2;
          lampsSleep[0] = tmp;
          break;
        case 0xE916FF00: //0

          break;
        case 0xE619FF00: //-
        case 0x958F:
          for (int i = 0; i < maxCountlamp; i++) {
            if (lampsStatus[i] == 0) {
              lampsStatus[i] = 1;
              break;
            }
          }

          break;
        case 0xF20DFF00: //C
          //        lampsPin = [4, 3, 1];
          break;
        case 0xF30CFF00: //1
          lampsStatus[0] = !lampsStatus[0];
          break;
        case 0xE718FF00: //2
          lampsStatus[1] = !lampsStatus[1];
          break;
        case 0xA15EFF00:  //3
          lampsStatus[2] = !lampsStatus[2];
          break;
        case 0xF708FF00: //4

          break;
        case 0xE31CFF00: //5

          break;
        case 0xA55AFF00: //6

          break;
        case 0xBD42FF00: //7

          break;
        case 0xAD52FF00: //8

          break;
        case 0xB54AFF00: //9
//          set_sleep_mode (SLEEP_MODE_PWR_DOWN);
//          sleep_enable(); // разрешаем сон
//          sleep_cpu(); // спать!
          break;
        default:

          break;
      }

      _delay_ms(250);
      complete = 0;
    }


    for (int i = 0; i < maxCountlamp; i++) {
      digitalWrite(lampsPin[i], (lampsIsInvert[i]) ? !lampsStatus[i] : lampsStatus[i]);
    }

  }
//  _delay_ms(50);
}

ISR (INT0_vect) {
  if (PINB & 1 << 2) { // Если лог1
    TCNT0 = 0;
  } else {
    tcnt = TCNT0; // если лог 0
    if (startflag) {
      if (30 > tcnt  && tcnt > 2) {
        if (tcnt > 15 && m < 32) {
          irdata |= ((uint32_t)1 << m);
        }
        m++;
      }
    }
    else  startflag = 1;
  }
}

ISR (TIMER0_OVF_vect) {
  //если сработало это прерывание, значит конец посылки
  if (m) {
    complete = 1; m = 0; startflag = 0; keydata = irdata; irdata = 0; // если индекс не 0, то создать флаг конца
  }
}

ISR(TIMER1_COMPA_vect) {
  ntime++;
}

 

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017
Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Dmitriyxz пишет:

видео

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

Похожее изображение

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017

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

п.с. я до этого дел с микроконтроллерами не имел.

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

Нет такого. На то он и загрузчик, чтобы запускаться первым. А потом уже основная программа.

Dmitriyxz
Offline
Зарегистрирован: 17.08.2017

прошил через Arduino как програматором на том и решил проблему.