Скетч от Arduino nano в Atmega8 (нужен ли загрузчик)

Niferman
Offline
Зарегистрирован: 27.02.2015

Собственно вопрос?

Сделал на ардуино несколько проектов, вроде все работает и прикольно. Решил сделать в авто кнопку Старт/Стоп. Сделал на Arduino nano - на столе работает. Подумал зачем переводить целую ардуино и решил переделать все на Atmega8

Сам скетч думаю скомпилить в Atmel Studio.

В связи с чем вопрос - нужен ли загрузчик ставить на Atmega8?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да как хочешь. зависит через что будешь прошивать

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Легко. Поиск по форуму - прошивка ATmega8. Я гдето фаил выкладывал для IDE с добавленными Ммега8 без кварца на 8мгц и с кварцем на 16мгц без загрузчика. Поищите arduino as isp. Главное в свободное место уложится.

Niferman
Offline
Зарегистрирован: 27.02.2015

arduino as isp - уже попробовал.

И  вот в это я сейчас уперся. В свободное место.

На Atmega8 - размер 8kB памяти?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012
Niferman
Offline
Зарегистрирован: 27.02.2015

Да не.. у меня все проще оказалось...

Sketch uses 8 108 bytes

Счас сижу думаю как уменьшить его что бы поместился....

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А что, 8108 байт не помещается в 8кбайтрую память? Или там еще что-то?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

8Кб = 8192Б

Плюс если компилить для 8, мб меньше выйдет, чем для Нано.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Niferman пишет:

Да не.. у меня все проще оказалось...

Sketch uses 8 108 bytes

Счас сижу думаю как уменьшить его что бы поместился....


Выкладывайте скетч, посмотрим как уменьшить.

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

yul-i-an пишет:
Niferman пишет:

Да не.. у меня все проще оказалось...

Sketch uses 8 108 bytes

Счас сижу думаю как уменьшить его что бы поместился....

Выкладывайте скетч, посмотрим как уменьшить.

накуя?

Скетч использует 314 байт (3%) памяти устройства. Всего доступно 8 192 байт.

 

Niferman
Offline
Зарегистрирован: 27.02.2015
#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;
}

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

В 74 строке получаем текущий millis() в переменную currentMillis. А в строках 84, 89,113,252,253,256,273 опять обращаемся к millis() вместо того чтобы использовать значение переменной currentMillis.

Niferman
Offline
Зарегистрирован: 27.02.2015

Подскажите как и чем точнее заменить ожидание в строке 251 delay (delay_ign); // Задержка на бензонасос и датчики

нужно заменить на ожидание получения логического нуля на пине D16.

Т.е. для дизеля нужно сделать ожидание когда прогреются свечи накала (потухнет лампа на щитке приборов) 

bwn
Offline
Зарегистрирован: 25.08.2014

while - ????

Niferman
Offline
Зарегистрирован: 27.02.2015

Спасибо, все получилось.