Attiny85 и задержка запуска
- Войдите на сайт для отправки комментариев
Пнд, 16/10/2017 - 17:23
Здравствуйте.
Каким образом можно убрать задержку запуска выполния кода после подачи питания.
Есть подозрение что это связано с ожиданием загрузчика на обновление прошивки.
Используется Digispark для упровления люстрой пультом и при подаче питаня проходит около 6 сек до включения.
Стереть загрузчик и прошивать программатором. Хотя 6 сек что-то многовато для загрузчика, обычно не более 3 сек.
Стереть загрузчик и прошивать программатором. Хотя 6 сек что-то многовато для загрузчика, обычно не более 3 сек.
на дижиспарке ресет залочен
к сожалению всё уже запихано в люстру и залито термоклеем... из неё торчит только USB
есть ли способ поменять загрузчик через USB и в загрузчике влючть 3,4,1 пин как OUTPUT и HIGH?
п.с. до ресета есть доступ.
к сожалению всё уже запихано в люстру и залито термоклеем... из неё торчит только USB
есть ли способ поменять загрузчик через USB и в загрузчике влючть 3,4,1 пин как OUTPUT и HIGH?
п.с. до ресета есть доступ.
ну, если в загрузочную область вшить блинк, то можно.
но для этого нужно прошивать программатором
модули реле с алиэкпресс подробно указывать не стал. код ниже...
#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++; }видео
https://drive.google.com/file/d/0B-r_dBsHJ1-VR3Z6LUo5UXhIcE0/view?usp=sharing
видео
ты зачем не пердупредил, что сварочные очки нужно одевать перед пердосмотром видео?
может посоветуете прошивку где загрузчик будет запускаться после действий с ресетом, а в самом начале программа...
п.с. я до этого дел с микроконтроллерами не имел.
Нет такого. На то он и загрузчик, чтобы запускаться первым. А потом уже основная программа.
прошил через Arduino как програматором на том и решил проблему.