Скетч от Arduino nano в Atmega8 (нужен ли загрузчик)
- Войдите на сайт для отправки комментариев
Пнд, 30/05/2016 - 11:21
Собственно вопрос?
Сделал на ардуино несколько проектов, вроде все работает и прикольно. Решил сделать в авто кнопку Старт/Стоп. Сделал на Arduino nano - на столе работает. Подумал зачем переводить целую ардуино и решил переделать все на Atmega8
Сам скетч думаю скомпилить в Atmel Studio.
В связи с чем вопрос - нужен ли загрузчик ставить на Atmega8?
да как хочешь. зависит через что будешь прошивать
Легко. Поиск по форуму - прошивка ATmega8. Я гдето фаил выкладывал для IDE с добавленными Ммега8 без кварца на 8мгц и с кварцем на 16мгц без загрузчика. Поищите arduino as isp. Главное в свободное место уложится.
arduino as isp - уже попробовал.
И вот в это я сейчас уперся. В свободное место.
На Atmega8 - размер 8kB памяти?
http://arduino.ru/forum/programmirovanie/ne-mogu-proshit-samodelnuyu-ard...
Да не.. у меня все проще оказалось...
Sketch uses 8 108 bytes
Счас сижу думаю как уменьшить его что бы поместился....
А что, 8108 байт не помещается в 8кбайтрую память? Или там еще что-то?
8Кб = 8192Б
Плюс если компилить для 8, мб меньше выйдет, чем для Нано.
Да не.. у меня все проще оказалось...
Sketch uses 8 108 bytes
Счас сижу думаю как уменьшить его что бы поместился....
Выкладывайте скетч, посмотрим как уменьшить.
Да не.. у меня все проще оказалось...
Sketch uses 8 108 bytes
Счас сижу думаю как уменьшить его что бы поместился....
накуя?
#include <Bounce2.h> // подключаем библиотеку подавления дребезга Bounce 2 #define pressed_long 3000 // длительность долговременное нажатия #define max_mode 3 // количество режимов #define Sbut 7 // пин кнопки запуска #define Gled 10 // пин зеленого сид #define Yled 11 // пин желтого сид #define Rled 9 // пин красного сид // taho = 3; // пин входа тахометра привязан к прерыванию #define tormoz 2 // пин входа сигнала тормоза #define asens1 A6 // пин входа первого аналогового сенсора #define asens2 A7 // пин входа второго аналогового сенсора #define buzz 13 // пин пищалки #define acc 18 // пин аксессуаров #define ign1 19 // пин основной линии зажигания #define ign2 6 // пин дополнительной линии зажигания #define starter 5 // пин стартера #define ob_start 600 // обороты запуска двигателя #define delay_ign 2000 // задержка перед всключением стартера unsigned long astop_starter = 5000; // ограничение автоматической работы стартера unsigned long mstop_starter = 15000; // ограничение ручной работы стартера unsigned long previousMillis = 0; // счетчик времени //тахометр, для ускорения и точности переменные помещаются в ОЗУ командой volatile volatile unsigned long micros_th = 0; // переменная времени импульса volatile byte tz = 0; // счетчик обнуления volatile unsigned int tp =0; // обороты volatile boolean tt = false; //триггер тахометра // Установки кнопки: int regim=1; // начальный режим Bounce bouncer = Bounce(); //создаем экземпляр класса Bounce unsigned long pressed_moment; // счетчик времени нажатия //установки светодиодов int brightness = 0; // начальная яркость int fadeAmount = 20; // шаг изменеия яркости unsigned long inter = 100; // частота мигания unsigned long currentTime; // счетчик времени unsigned long loopTime; // период сид unsigned long RpreviousMillis; // период красного сид void setup() { attachInterrupt(1, tachometr, RISING ); //активация прерывания для тахотера pinMode(Gled, OUTPUT); // объявляем режим работы пина pinMode(Yled, OUTPUT); // объявляем режим работы пина pinMode(Rled, OUTPUT); // объявляем режим работы пина pinMode(Sbut, INPUT); // объявляем режим работы пина pinMode(acc, OUTPUT); // объявляем режим работы пина pinMode(ign1, OUTPUT); // объявляем режим работы пина pinMode(ign2, OUTPUT); // объявляем режим работы пина pinMode(starter, OUTPUT); // объявляем режим работы пина pinMode(tormoz, INPUT); // объявляем режим работы пина pinMode(asens1, INPUT); // объявляем режим работы пина pinMode(asens2, INPUT); // объявляем режим работы пина digitalWrite(acc,LOW); //выключаем все выходы digitalWrite(ign1,LOW); //выключаем все выходы digitalWrite(ign2,LOW); //выключаем все выходы digitalWrite(starter,LOW); //выключаем все выходы digitalWrite(Gled,LOW);//выключаем все сид digitalWrite(Yled,!LOW);//выключаем все сид digitalWrite(Rled,!LOW);//выключаем все сид bouncer .attach(Sbut); // привязываем библиотеку кнопки к выводу Sbut bouncer .interval(20); // устанавливаем период дребезга = 20 мс Serial.begin(9600); //установка Serial-порта на скорость 9600 бит/сек currentTime = millis(); //устанавливаем время loopTime = currentTime; //синхронизируем время } void loop() { currentTime = millis(); // счетчик привязываем ко времени if (tz !=0) {tz--;}else{tp=0;}; // обработка тахометра Serial.print("Tacho: "); Serial.println (tp); //delay(30); if (bouncer.update()) //если произошло событие { if (bouncer.read()==1)//если кнопка нажата { pressed_moment = millis(); // запоминаем время нажатия tone(buzz, 3500, 100); // подаем сигнал что нажата кнопка } else // кнопка отпущена { if((millis() - pressed_moment) < pressed_long)// если кнопка была нажата кратковременно { if (digitalRead (tormoz)==LOW) // тормоз при этом не нажат { regim++; // увеличиваем счетчик текушего режима if (regim>max_mode){regim=1;} // при достижении максимального режима возвращаемся в режим1 pressed_moment = 0; // обнуляем момент нажатия } else { if (regim == 4){ regim = 1; pressed_moment = 0; goto rej1;}// если был включен 4 режим устанавливаем 1,обнуляем момент нажатия else //иначе, если нажат тормоз: { regim = 5; //устанавливаем 5 режим pressed_moment = 0; // обнуляем момент нажатия tone(buzz, 3500, 100); //звуковой сигнал delay(200); tone(buzz, 3500, 100); //звуковой сигнал goto rej5; } } } } } if((pressed_moment > 0) && ((millis() - pressed_moment) > pressed_long)) // кнопка удерживалась долго { if (regim == 4)// если режим 4 { regim = 2; //то устанавливаем режим 2 pressed_moment = 0; // обнуляем момент нажатия tone(buzz, 3500, 1000); // предупреждение pressed_moment = 0; // обнуляем момент нажатия goto rej2; //переход на 2 режим } if (regim == 2)// если режим 2 то устанавливаем режим 1 { regim = 1; //то устанавливаем режим 1 pressed_moment = 0; // обнуляем момент нажатия tone(buzz, 3500, 100); // звук goto rej1; //переход на 1 режим } if (regim == 1 || regim == 3) //если режим 1 или 3 { regim = 5; //то переходим к 5 pressed_moment = 0; // обнуляем момент нажатия tone(buzz, 3500, 100); //подаем много звуковых сигналов delay(200); //потому как начинается запуск без защиты тормозом tone(buzz, 3500, 100); //для не стандартных ситуаций delay(200); tone(buzz, 3500, 100); //звуковой сигнал delay(200); tone(buzz, 3500, 100); //звуковой сигнал delay(200); tone(buzz, 3500, 100); //звуковой сигнал delay(200); tone(buzz, 3500, 100); //звуковой сигнал delay(200); tone(buzz, 3500, 100); //звуковой сигнал delay(200); tone(buzz, 3500, 100); //звуковой сигнал goto rej5; //переход на 5 режим } } if(regim==1)//первый режим - все выключено { rej1: //ссылка на 1 режим digitalWrite(acc,LOW); //Аксессуары отключены digitalWrite(ign1,LOW); //Зажигание основное отключено digitalWrite(ign2,LOW); //Зажигание вспомогательное отключено digitalWrite(starter,LOW); //Стартер отключен digitalWrite(Yled,!LOW); //Желтый сид выключен digitalWrite(Rled,!LOW); //Красный сид выключен digitalWrite(Gled,LOW); //Зеленый сид выключен if (digitalRead(tormoz) == HIGH) // если нажат тормоз { if(currentTime >= (loopTime + 1)) // проверяем время { analogWrite(Gled, brightness); // Передаём яркость сид brightness = brightness + fadeAmount; // Прибавляем шаг изменения яркости if (brightness <= 0 || brightness >= 255) {fadeAmount = -fadeAmount;}// если достигли мин. или макс. значения, то идем в обратную сторону (реверс) if (brightness >= 255) {brightness=255;} // устанавливаем предел чтобы не мигал if (brightness <= 0) {brightness=0;} // устанавливаем предел чтобы не мигал loopTime = currentTime; // синхронизируем время } } else {digitalWrite(Gled, LOW);} //Гасим сид Serial.println("ALL OFF:"); // Передаем режим рабоы } if(regim==2)//второй режим - включены аксессуары {rej2: //ссылка на 2 режим digitalWrite(acc,HIGH); //Аксессуары включены digitalWrite(ign1,LOW); //Зажигание основное отключено digitalWrite(ign2,LOW); //Зажигание вспомогательное отключено digitalWrite(starter,LOW); //Стартер отключен digitalWrite(Gled,HIGH); //Зеленый сид включен digitalWrite(Yled,!LOW); //Желтый сид выключен digitalWrite(Rled,!LOW); //Красный сид выключен if (digitalRead(tormoz) == HIGH) // если нажат тормоз { if(currentTime >= (loopTime + 1)) // проверяем время { analogWrite(Gled, brightness); //Передаём яркость сид analogWrite(Yled, brightness); //Передаём яркость сид brightness = brightness + fadeAmount; // прибавляем шаг изменения яркости if (brightness <= 0 || brightness >= 255) {fadeAmount = -fadeAmount;}// если достигли мин. или макс. значения, то идем в обратную сторону (реверс) if (brightness >= 255) {brightness=255;} // устанавливаем предел чтобы не мигал if (brightness <= 0) {brightness=0;} // устанавливаем предел чтобы не мигал loopTime = currentTime; // синхронизируем время } } else {digitalWrite(Yled, !LOW); digitalWrite(Rled, !LOW);}//Гасим сид Serial.println("ACC ONLY"); // Передаем режим работы } if(regim==3)//третий режим - ручное включение зажигания { rej3: // ссылка на 3 режим if (tp >= ob_start) {digitalWrite(starter,LOW); regim=4; goto rej4;} // защита автозапуска digitalWrite(acc,HIGH); //Аксессуары включены digitalWrite(ign1,HIGH); //Зажигание основное включено //digitalWrite(ign2,HIGH); // мне не нужно питание на второй линии зажигания в этот момент, для кого нужно испавьте digitalWrite(starter,LOW); //Стартер отключен digitalWrite(Gled,HIGH); //Зеленый сид включен digitalWrite(Yled,!HIGH); //Желтый сид включен digitalWrite(Rled,!LOW); // Красный сид выключен if (digitalRead(tormoz) == HIGH) // если нажат тормоз { if(currentTime >= (loopTime + 1)) // проверяем время { analogWrite(Yled, brightness); //Передаём яркость сид analogWrite(Rled, brightness); //Передаём яркость сид brightness = brightness + fadeAmount; // прибавляем шаг изменения яркости if (brightness <= 0 || brightness >= 255) {fadeAmount = -fadeAmount;}// если достигли мин. или макс. значения, то идем в обратную сторону (реверс) if (brightness >= 255) {brightness=255;} // устанавливаем предел чтобы не мигал if (brightness <= 0) {brightness=0;} // устанавливаем предел чтобы не мигал loopTime = currentTime; // синхронизируем время } } else {digitalWrite(Yled, !HIGH); digitalWrite(Rled, !LOW);} //Восстанавливаем сид Serial.println("IGN ON ENGIN OFF"); //Передаем режим работы } if(regim==4)//четвертый режим - основной рабочий { rej4: // ссылка на 4 режим digitalWrite(starter,LOW); //Стартер отключен digitalWrite(acc,HIGH); //Аксессуары включены digitalWrite(ign1,HIGH); //Зажигание основное включено if (analogRead(asens1) >= 500) {analogWrite(Gled, 50);} else {digitalWrite(Gled,HIGH);} //Если включены габариты зеленый снижает яркость чтобы не слепить digitalWrite(Yled,!HIGH); //Желтый сид включен digitalWrite(Rled,!HIGH); //Красный сид включен Serial.println("ENGIN ON"); //Передаем режим работы // delay (del_ign2); //Задержка зажигания вспомогательного оборудования // digitalWrite(ign2,HIGH); //Включение зажигания вспомогательного оборудования } if(regim==5)//пятый режим - пуск двигателя { rej5: //ссылка на 5 режим if (tp >= ob_start) {digitalWrite(starter,LOW); regim=4; goto rej4;} // Защита автозапуска digitalWrite(Gled, LOW); // Зеленый сид выключен digitalWrite(Yled,!HIGH); // Желтый сид включен digitalWrite(ign1,HIGH); // Включить основное зажигание digitalWrite(ign2,LOW); // Выключить дополнительное зажигание delay (delay_ign); // Задержка на бензонасос и датчики previousMillis=millis(); // время для ограничения стартера RpreviousMillis=millis(); // время для мигания красного сид if (bouncer.read()==0 && digitalRead(tormoz) == 1) // если кнопка отпущена и нажат тормоз { auto_start: // подпрограмма автозапуска currentTime=millis(); // текущее время if(currentTime - RpreviousMillis > inter) {RpreviousMillis=currentTime; digitalWrite(Rled,!digitalRead(Rled));} // мигание красным сид if (tp <= ob_start && digitalRead(tormoz) == 1) //если не заведена, но тормоз нажат { digitalWrite(starter,HIGH); //включаем стартер Serial.print("STARTER ON AUTO :"); Serial.println (tp); // информация в порт } if (tp >= ob_start){digitalWrite(starter,LOW); regim=4;Serial.println("START Ok!!!"); goto rej4;} // если завелась, отключаем стартер, сообщаем, переходим в режим 4 if (digitalRead(tormoz) == 0) {digitalWrite(starter,LOW); tone (buzz, 3500, 2000); regim=3; Serial.println("Error: Tormoz"); goto rej3;} // если отпустили тормоз, отключаем стартер, сообщаем об ошибке, переходим в режим 3 if (currentTime - previousMillis > astop_starter){digitalWrite(starter,LOW); tone (buzz, 3500, 2000); regim=3; Serial.println("Error: TimeOut"); goto rej3;} // если сработал таймаут, отключаем стартер, сообщаем об ошибке, переходим в режим 3 if (digitalRead(Sbut)==1) {digitalWrite(starter,LOW); tone (buzz, 3500, 2000); regim=3; Serial.println("Error: Press Button"); delay (1000); goto rej3;} // если еще раз нажали кнопку, отключаем стартер, сообщаем об ошибке, переходим в режим 3 goto auto_start; // возврат в начало подпрограммы автозапуска. } else // если не сработало первое правило (кнопка отпущена нажат тормоз) {manual_start: // подпрограмма ручного запуска if (digitalRead(Sbut)==1) // кнопка нажата, начинается ручной запуск { currentTime=millis(); // текущее время if(currentTime - RpreviousMillis > inter) {RpreviousMillis=currentTime; digitalWrite(Rled,!digitalRead(Rled));}//мигаем красным сид digitalWrite(starter,HIGH); // включаем стартер Serial.print("STARTER ON MANUAL :"); Serial.println (tp); // передаем информацию } else {digitalWrite(starter,LOW); regim=3; Serial.println("Start OFF"); goto rej3;} // если отпустили кнопку отключаем стартер, сообщаем об ошибке, переходим в режим 3 if (currentTime - previousMillis > mstop_starter){digitalWrite(starter,LOW); tone (buzz, 3500, 2000); regim=3; Serial.println("Error: TimeOut"); goto rej3;} // если сработал таймаут, отключаем стартер, сообщаем об ошибке, переходим в режим 3 goto manual_start; // возврат в начало подпрограммы ручного запуска } } } void tachometr() //подпрограмма измерения оборотов { if(!tt) {micros_th = micros();} else {tp = (30000000/(micros() - micros_th));} tt = !tt; tz = 10; }В 74 строке получаем текущий millis() в переменную currentMillis. А в строках 84, 89,113,252,253,256,273 опять обращаемся к millis() вместо того чтобы использовать значение переменной currentMillis.
Подскажите как и чем точнее заменить ожидание в строке 251
delay (delay_ign);// Задержка на бензонасос и датчикинужно заменить на ожидание получения логического нуля на пине D16.
Т.е. для дизеля нужно сделать ожидание когда прогреются свечи накала (потухнет лампа на щитке приборов)
while - ????
Спасибо, все получилось.