Дайте совет по управлению светодиодами

hugoboss317
Offline
Зарегистрирован: 21.03.2013

В нижеприведённом скетче я указал место где нужно остановить выполнение кода в данном соостоядии полупроводниковыхсветоизлучающих элементах.

1. подскажите как это сделать.

2. При выполнении плавного разгорания и затухания светодиодов то "0" до "255" и обратно если выполняется до нуля, при следующей команде с нуля и начинается, а если выполняется до "255", то начинается от "255".Как сделать чтоб всегда начинался розжиг с "0"?



int brightness = 0;    
int fadeAmount = 5;
void setup() {                

  pinMode(10, OUTPUT);  //левый ходовой огонь
  pinMode(11, OUTPUT);  //правый ходовой огонь
  pinMode(2, INPUT);    // ACC (зажигание)
  pinMode(3, INPUT);    // габаритные огни
  pinMode(4, INPUT);    // постановка на охрану
  pinMode(5, INPUT);    //звуковой сигнал
  pinMode(6, INPUT);    //снятие с охраны
}
  
void loop() {
  if(digitalRead(2) == HIGH) AccOn();
  if(digitalRead(2) == LOW) AccOff();
  
  if(digitalRead(3) == HIGH) LiteOn();
  if(digitalRead(3) == LOW) LiteOff();
  
  if(digitalRead(4) == HIGH) LockOn();

  if(digitalRead(5) == HIGH) AlarmOn();
  
  if(digitalRead(6) == HIGH) LockOn();
  
  
}
void AccOff() 
{
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}

void AccOn() 
{
  for(byte i=0;i<6;i++) 
{
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    } 
    for(byte i=0;i<6;i++)
    {
  digitalWrite(10, HIGH);   
  delay(40);               
  digitalWrite(10, LOW);    
  delay(40); 
    } 
    
  for(byte i=0;i<153;i++)
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(10, HIGH);
    digitalWrite(10, HIGH);  //тут надо остановить до включения  других кнопок (pin3,4,5,6) или выключения этой (pin 2)  
}
 
void LiteOff() 
{  
}

void LiteOn() 
{
}

void AlarmOn() 
{
  for(byte i=0;i<6;i++) 
{
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    }  

 for(byte i=0;i<6;i++)
    {
  digitalWrite(10, HIGH);   
  delay(40);               
  digitalWrite(10, LOW);    
  delay(40); 
    } 
    delay(50);
    
    for(byte i=0;i<4;i++)
    {
  digitalWrite(10, HIGH); digitalWrite(11, HIGH);  
  delay(40);               
  digitalWrite(10, LOW); digitalWrite(11, LOW);   
  delay(40);
    }
}
void LockOn()
{
   for(byte i=0;i<6;i++) 
{
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    }  

 for(byte i=0;i<6;i++)
    {
  digitalWrite(10, HIGH);   
  delay(40);               
  digitalWrite(10, LOW);    
  delay(40); 
    } 
    delay(50);
    for(byte i=0;i<204;i++)
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }    
}

 

tsostik
Offline
Зарегистрирован: 28.02.2013

1)

...
    digitalWrite(10, HIGH);
    digitalWrite(10, HIGH);  //тут надо остановить до включения  других кнопок (pin3,4,5,6) или выключения этой (pin 2)  
    while(
             digitalRead(2)==HIGH &&
             digitalRead(3)==LOW &&
             digitalRead(4)==LOW &&
             digitalRead(5)==LOW &&
             digitalRead(6)==LOW 
             ) //из этого цикла мы выйдем как только на pin2 появится LOW или на любом из pin3...6 появится HIGH
    {
        //ничего не делаем, просто ждем
    };

2)Если я правильно понял, о чем идет речь, то надо в самом начале функций AccOn и LockOn написать

brightness = 0;
fadeAmmont=5;

Кроме того, из соображений защиты от ошибок лучше поменять строчки

  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }

на

  if (brightness <= 0 || brightness => 255) {
    fadeAmount = -fadeAmount ;    
  }

Ну и последнее - если на пине 2 (ACC) у вас HIGH всегда, пока включено зажигание, то функция AccOn будет вызываться каждый раз в loop.

Судя по всему, она должна вызываться ровно один раз при включении зажигания.

Для этого в начало надо добавить переменную

int accState = 0;

В теле loop изменить соответствующие строки кода:

  if(digitalRead(2) == HIGH) AccOn();
  if(digitalRead(2) == LOW) AccOff();

на

  if((digitalRead(2) == HIGH) && (accState == 0) ) AccOn();
  if((digitalRead(2) == LOW) && (accState == 1) ) AccOff();

А в функциях AccOn и AccOff написать, соответственно

void AccOff() 
{
   accState = 0;
 ...
}

void AccOn() 
{
   accState = 1;
 ...
}

Куски Вашего реального кода я заменил многоточиями, не забудьте вернуть его обратно :-)

 

PS: По сравнению с тем, что было в поршлых топиках успехи ОЧЕНЬ радуют!

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Стараюсь! Спасибо, плюс ещё и ответили на вопрос который я только готовил. Буду пробовать.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, всё получилось как надо за исключением того что если при включённом зажигании "посигналить" (digitalRead(5) == HIGH), после "перемигиваний" диоды тухли. Я сделал так: (по колхозному наверно но получилось)

в конце void AlarmOn() добавил  -





if (accState = 1){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
    }
    else
    {
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW);
    }

Теперь буду пытаться плавно выключить их при включении габаритов.

tsostik
Offline
Зарегистрирован: 28.02.2013

Нормально, только между accState и 1 должно быть ДВА знака равно.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, уже допетрил. Спасибо.

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

 

Всё, дописал, работает как надо, можно к монтажу переходить. Осталась пара вопросиков.

1. Я так понял что нижеприведённое выражение в моём скетче не нужно, это просто пример того как остановить выполнение кода до каких либо действий?














while(
             digitalRead(2)==HIGH &&
             digitalRead(3)==LOW &&
             digitalRead(4)==LOW &&
             digitalRead(5)==LOW &&
             digitalRead(6)==LOW 
             ) 
    {        
    }

2. для габаритных огней вводил ещё одну переменную int lightState = 0; Для чего я понял, но мне немного не понятно при каких условиях меняется её значение.

Вот что получилось:



int accState = 0;
int lightState = 0;
void setup() {                

  pinMode(10, OUTPUT);  //левый ходовой огонь
  pinMode(11, OUTPUT);  //правый ходовой огонь
  pinMode(2, INPUT);    // ACC (зажигание)
  pinMode(3, INPUT);    // габаритные огни
  pinMode(4, INPUT);    // постановка на охрану
  pinMode(5, INPUT);    //звуковой сигнал
  pinMode(6, INPUT);    //снятие с охраны
}
  
void loop() {
  if((digitalRead(2) == HIGH) && (accState == 0) ) AccOn();
  if((digitalRead(2) == LOW) && (accState == 1) ) AccOff();
  
  if((digitalRead(3) == HIGH) && (lightState == 0) ) LightOn();
  if((digitalRead(3) == LOW) && (lightState == 1) ) LightOff();
  
  if(digitalRead(4) == HIGH) LockOn();

  if(digitalRead(5) == HIGH) AlarmOn();
  
  if(digitalRead(6) == HIGH) LockOn();
  
  
 
}
void AccOff()                        //Выключаем зажигание /АСС/
{
  if(lightState == 0){   //при включённых ГО ничего не происходит
  accState = 0;
  int brightness = 255;    
  int fadeAmount = 5;  
  delay(3000);          
  for(byte i=0;i<153;i++)  
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness - fadeAmount; 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
  }
}

void AccOn()                           //включаем зажигание /АСС/
{
  if(digitalRead(3) == LOW){    //если включены ГО, ничего не происходит
  accState = 1;
  int brightness = 0;    
  int fadeAmount = 5;
  delay(5000);           
  for(byte i=0;i<153;i++)
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness <= 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
  }
  
}
void LightOff()                              //Выключаем габариты
{  
  if(digitalRead(2) == HIGH){ //при выключеном АСС ничего не происходит
  lightState =0;
  int brightness = 0;    
  int fadeAmount = 5;
  delay(3000);           
  for(byte i=0;i<153;i++)
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness <= 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
   if(accState == 0){
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    }
  }
}

void LightOn()                                //Включаем габариты
{
  if(accState == 1){      //при выключеном АСС ничего не происходит
 lightState = 1;
 int brightness = 255;   
  int fadeAmount = 5;   
  delay(2000);          
  for(byte i=0;i<153;i++)  
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness - fadeAmount; 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    delay(10);  
  } 
}

void AlarmOn()                         // нажимаем сигнал
{
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  for(byte i=0;i<6;i++) 
{
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    }  
 for(byte i=0;i<6;i++)
    {
  digitalWrite(10, HIGH);   
  delay(40);               
  digitalWrite(10, LOW);    
  delay(40); 
    } 
    delay(50); 
    for(byte i=0;i<4;i++)
    {
  digitalWrite(10, HIGH); digitalWrite(11, HIGH);  
  delay(40);               
  digitalWrite(10, LOW); digitalWrite(11, LOW);   
  delay(40);
    }
    if (digitalRead(2) == HIGH && digitalRead(3) == LOW){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
    }
    
    else
    {
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW);
    }
}
void LockOn()                   //ставив/снимаем с охраны
{
  int brightness = 0;    
  int fadeAmount = 5;
   for(byte i=0;i<6;i++) 
{
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    }  

 for(byte i=0;i<6;i++)
    {
  digitalWrite(10, HIGH);   
  delay(40);               
  digitalWrite(10, LOW);    
  delay(40); 
    } 
    delay(50);
    for(byte i=0;i<204;i++)
    {
  analogWrite(10, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness <= 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }    
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    if (digitalRead(2) == HIGH && digitalRead(3) == LOW){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
    }
    
    else
    {
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW);
    }
}

 

tsostik
Offline
Зарегистрирован: 28.02.2013

1)да, этот код прост стоит на месте, пока значение в условии не станет ложным. Если необходимость в нем отпала, можно его и убрать.

2)Я не очень понял вопрос.  В таком варианте, как сейчас в коде суть этой переменной "не вызывать второй раз функцию lightOn, если огни уже включены". Насколько я понимаю, это именно то, что надо. Соответственно в функии lightOn ее значение устанавливается в 1(габариты включены), в функции lightOff ее значение устанавливается в ноль (габариты выключены).

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, Вы правельно всё поняли, это так и надо. Я как раз хотел задать вопрос как написать чтоб МК отличал включено только что или уже было включено. Вы мне показали как это сделать для АссOn. Для LightOn я добавил ещё одну переменную по Вашему примеру и оперировал ей, понимая её значение, но не совсем понимая от чего она зависит, а именно в каком месте прописывается что она меняет состояние и от чего. Наверное тоже непонятно обьяснил. Попробую ещё порассматривать сам.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

В общем я понял это так:

Вводим переменную int accState = 0; задавая начальное значения путём приравнивания к нулю.

Далее в функции при появлении единици на пине 2 сравниваем её с начальным значением if((digitalRead(2) == HIGH) && (accState == 0) ) AccOn(); (т.е. именно тут определяется была ли уже "1" на пине или только появилась.) Если ЛОЖЬ, функция не выполняется. А привязывается переменная accState k функции AccOn своим названием acc.

 Ну хоть примерно правельно я понял?

tsostik
Offline
Зарегистрирован: 28.02.2013

hugoboss317 пишет:

Вводим переменную int accState = 0; задавая начальное значения путём приравнивания к нулю.

Это правильно.

 

hugoboss317 пишет:

Далее в функции при появлении единици на пине 2 сравниваем её с начальным значением if((digitalRead(2) == HIGH) && (accState == 0) ) AccOn(); (т.е. именно тут определяется была ли уже "1" на пине или только появилась.) Если ЛОЖЬ, функция не выполняется.

Опять же, почти правильно. Только сравниваем не с НАЧАЛЬНЫМ значением, а с ПОСЛЕДНИМ известным значением (состоянием зажигания)

hugoboss317 пишет:

А привязывается переменная accState k функции AccOn своим названием acc.

А вот тут - нет. По имени ничего привязываться в С не умеет.

Просто внутри функции AccOn первой командой пишется "accState = 1", что обозначает "зажигание включено" и это состояние остается до тех пор, пока мы не войдем в функцию AccOff, где первой интсрукцией пишем "accState=0" - "зажигание выключено".

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Хорошо, теперь посоветуйте какие порты выбрать на меге8 и как?

tsostik
Offline
Зарегистрирован: 28.02.2013

Нужно наqти схему той ардуины, которую вы будете использовать для компиляции в ArduinoIDE (это должна быть плата на ATMega8), в нем найти какие ноги МК висят на тех пинах, которые используются (в данном случае 2, 3, 4, 5, 6, 10 и 11)

Потом найти даташит на соответствующую мегу и посмотреть, какие пины висят на этих ногах.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Решил остановится на портах "D". Переписал пины в коде выходы 2 и 3, входы 4, 5, 6, 11, 12. выбрал плату мега8 и при компеляции вылазеет хренова туча ошибок. Что то я вобще не в ту степь залез. Что подскажите?

Это может быть связано с тем что на мегу8 я не качал hardware (не нашёл), а создал текстовый документ boards и вставил туда данные по этой меге?

tsostik
Offline
Зарегистрирован: 28.02.2013

hugoboss317 пишет:

Это может быть связано с тем что на мегу8 я не качал hardware (не нашёл), а создал текстовый документ boards и вставил туда данные по этой меге?

Не просто может, а скорее всего так и есть.

Выберите board "Arduino NG or older w/ATmega8"

И соответстувующие номера пинов смотрите не на МК а на разводке платы NG (вот например http://robocraft.ru/files/craftduino/CraftDuino-wb.png)

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ой, выбрал Arduino NG or older w/ATmega8, всё получилось. Ещё раз плагодарен. Осталось подкорректировать в коде пини для меги.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я опять стучусь к Вам. Залил скетч в мегу8, странно себя ведёт, интервалы времени отсчитывает как будто заморожена во времени: Delay (50); это для меги8 -  0,5 секунды, не вкурсе почему так? 

tsostik
Offline
Зарегистрирован: 28.02.2013

Потому что ArduinoIDE считает, что мега работает на одной скорости (прописанной в boards.txt), а в жизни мега работает на другой скорости

(определенной схемой подключения внешнего генератора и фьюзами в МК).

Нужно привести эти скорости в соответствие друг другу.

То есть в первую очередь определиться с правильным значением фьюз-битов для меги (например "от внутреннего 8МГц осциллятора", "предделитель 1"), прошить их в МК, после

чего постаить реальную частоту работы меги в boards.txt (для указанных выше значение это будет 8000000).

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Без внешнего генератора работать не будет?

 

tsostik
Offline
Зарегистрирован: 28.02.2013

Будет, но это надо указать в конфигурации фьюзов.

Как именно - ответ в даташите к конкретной модели МК

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

Как раз в текстовом документе к восьмой меге прописано 8 МГц.  

 

tsostik
Offline
Зарегистрирован: 28.02.2013

Дисклеймер: Все ниженаписанное появилось исключительно, как результат чтения даташита на ATmega8

Личного опыта у меня нет. На других МК фьюзы могут быть другими.

В даташите написанно, что по дефолту МК поставляется, сконфигурированный на работу от 1МГц внутреннего осцилятора.

Если частота 1МГц устраивает, но надо просто прописать ее в boards.txt для Arduino NG

Если нужно получить 8МГц от внутреннего осциллятора,то биты CKSEL3:0 нужно установить в 0100

CKSEL - это младшие 4 бита в Fuse Low Byte

Биты SUT1:0 (4 и 5 биты Fuse Low Byte) можно оставить в том виде какими они есть по дефолту.

Биты 6 и 7 Fuse Low Byte лучше не трогать.

 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я наверное немножко застрелюсь :) Выставил в boards  для Arduino NG 1 МГЦ, с фьюзами не получилось. Пошло как надо НО....... теперь brightness не выполняется, или "0" или "1". Нет плавного разгорания или затухания.

 

 

Я кажется понял почему

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Очень нужно уместить созданый ранее скетч на Attiney2313А, и тут интересная штука (уже обговаривали её) При компилировании для   Attiney45, выходит вот это:"Размер скетча в двоичном коде: 2 020 байт (из 4 096 байт максимум)"

а для Attiney2313,: "Размер скетча в двоичном коде: 2 090 байт (из 2 048 байт максимум)".

Совсем чуток. Что знаю , перепробовал. Что посоветуете?



int accState = 0;
int lightState = 0;
void setup() { 

  pinMode(11, OUTPUT);  //левый ходовой огонь
  pinMode(12, OUTPUT);  //правый ходовой огонь
  
  pinMode(2, INPUT);    // ACC (зажигание)
  pinMode(3, INPUT);    // габаритные огни
  pinMode(4, INPUT);    // постановка на охрану
  pinMode(5, INPUT);    //звуковой сигнал
  pinMode(6, INPUT);    //снятие с охраны
  
}
  
void loop() {
  if((digitalRead(2) == HIGH) && (accState == 0) ) AccOn();
  if((digitalRead(2) == LOW) && (accState == 1) ) AccOff();
  
  if((digitalRead(3) == HIGH) && (lightState == 0) ) LightOn();
  if((digitalRead(3) == LOW) && (lightState == 1) ) LightOff();
  
  if(digitalRead(4) == HIGH) LockOn();

  if(digitalRead(5) == HIGH) AlarmOn();
  
  if(digitalRead(6) == HIGH) LockOn();
   
}
void AccOff()                        //Выключаем зажигание /АСС/
{
  if(lightState == 0){   //при включённых ГО ничего не происходит
  accState = 0;
  int brightness = 255;    
  int fadeAmount = 5;  
  delay(3000);          
  for(byte i=0;i<153;i++)  
    {
  analogWrite(12, brightness);
  analogWrite(11, brightness);   
  
  brightness = brightness - fadeAmount; 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
  }
}

void AccOn()                           //включаем зажигание /АСС/
{
  if(digitalRead(3) == LOW){    //если включены ГО, ничего не происходит
  accState = 1;
  int brightness = 0;    
  int fadeAmount = 5;
  delay(5000);           
  for(byte i=0;i<153;i++)
    {
  analogWrite(11, brightness);
  analogWrite(12, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness <= 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(11, HIGH);
    digitalWrite(12, HIGH);
  }
  
}
void LightOff()                              //Выключаем габариты
{  
  if(digitalRead(2) == HIGH){ //при выключеном АСС ничего не происходит
  lightState = 0;
  int brightness = 0;    
  int fadeAmount = 5;
  delay(3000);           
  for(byte i=0;i<153;i++)
    {
  analogWrite(11, brightness);
  analogWrite(12, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness <= 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(11, HIGH);
    digitalWrite(12, HIGH);
   if(accState == 0){
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    }
  }
}

void LightOn()                                //Включаем габариты
{
  if(accState == 1){      //при выключеном АСС ничего не происходит
 lightState = 1;
 int brightness = 255;   
  int fadeAmount = 5;   
  delay(2000);          
  for(byte i=0;i<153;i++)  
    {
  analogWrite(11, brightness);
  analogWrite(12, brightness);   
  
  brightness = brightness - fadeAmount; 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    delay(10);  
  } 
}

void AlarmOn()                         // нажимаем сигнал
{
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  for(byte i=0;i<6;i++) 
{
  digitalWrite(12, HIGH);   
  delay(40);               
  digitalWrite(12, LOW);    
  delay(40); 
    }  
 for(byte i=0;i<6;i++)
    {
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    } 
    delay(5); 
    for(byte i=0;i<4;i++)
    {
  digitalWrite(11, HIGH); digitalWrite(12, HIGH);  
  delay(40);               
  digitalWrite(11, LOW); digitalWrite(12, LOW);   
  delay(40);
    }
    if (digitalRead(2) == HIGH && digitalRead(3) == LOW){
      digitalWrite(11, HIGH);
      digitalWrite(12, HIGH);
    }
    
    else
    {
      digitalWrite(11, LOW); 
      digitalWrite(12, LOW);
    }
}
void LockOn()                   //ставив/снимаем с охраны
{
  int brightness = 0;    
  int fadeAmount = 5;
   for(byte i=0;i<6;i++) 
{
  digitalWrite(12, HIGH);   
  delay(40);               
  digitalWrite(12, LOW);    
  delay(40); 
    }  

 for(byte i=0;i<6;i++)
    {
  digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 
    } 
    delay(50);
    for(byte i=0;i<204;i++)
    {
  analogWrite(11, brightness);
  analogWrite(12, brightness);   
  
  brightness = brightness + fadeAmount; 
  if (brightness <= 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;    
  }    
  delay(10);    
    }    
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    if (digitalRead(2) == HIGH && digitalRead(3) == LOW){
      digitalWrite(11, HIGH);
      digitalWrite(12, HIGH);
    }
    
    else
    {
      digitalWrite(11, LOW); 
      digitalWrite(12, LOW);
    }
}

 

ustas
Offline
Зарегистрирован: 12.03.2012

имхо, почитать вот это: http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Смысл понял, но на практике не получается, пишу простейший код на два диода и две кнопки, не работает, меняю или подставляю знаки, диоды живут своей жизнью. К тому же у меня два выхода порты "В" на ШИМ. На сколько я понял если задам еденици, ШИМа не получится.

Ещё варианты есть?

 

 

Пля ну куда деть грёбаные 42 байта ((((((((((

step962
Offline
Зарегистрирован: 23.05.2011

У вас достаточно много блоков типа

 digitalWrite(11, HIGH);   
  delay(40);               
  digitalWrite(11, LOW);    
  delay(40); 

либо

digitalWrite(11, LOW);
digitalWrite(12, LOW);

Это четыре (два) вызова функций со всеми прилагающимися прелестями - запоминание параметров в стеке, загрузка в стек адреса возврата, загрузка в стек содержимого некоторых регистров. Команды, команды, команды - слова, слова, слова (слово=2 байта).

Если написать функцию вроде

 void digiW(char pin1,char pin2,char state1, char state2,char aDelay) {
  digitalWrite(pin1,state1);   
  if (aDelay) delay(aDelay);               
  digitalWrite(pin2,state2);   
  if (aDelay) delay(aDelay);               
}

то есть надежда сэкономить несколько слов программной памяти, ведь вместо примерно n*N*4+m*N*2=N*(n*4+m*2) слов будет затрачено примерно (n+m)*N+N*(4+2)=N*(n+m+6) слов.

здесь

n - число блоков по 4 инструкции, которые мы собираемся заменять одним вызовом универсальной мигательной функции

m - число блоков по 2 инструкции

N - число слов программной памяти, занимаемое вызовом одной отдельно стоящей функции (будь то digitalWrite, delay или digiW).

В общем - попробуйте. Результат не гарантируется, но, как любил говаривать Лаврентий Павлович, "попытка - не пытка".

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

hugoboss317 пишет:
Пля ну куда деть грёбаные 42 байта ((((((((((

Замени delay( на delayMicroseconds( 

ustas
Offline
Зарегистрирован: 12.03.2012

и еще разок

  pinMode(11, OUTPUT);  //левый ходовой огонь
  pinMode(12, OUTPUT);  //правый ходовой огонь
   
  pinMode(2, INPUT);    // ACC (зажигание)
  pinMode(3, INPUT);    // габаритные огни
  pinMode(4, INPUT);    // постановка на охрану
  pinMode(5, INPUT);    //звуковой сигнал
  pinMode(6, INPUT);    //снятие с охраны

Перепишите хотя бы этот кусок, внимательно прочитав: http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

ustas
Offline
Зарегистрирован: 12.03.2012

 

leshak пишет:

Кстати2,  по умолчанию все пины и так включены на вход, так что делать pinMode(...,INPUT) - не обазательно.

Из другой темы, но тоже в тему

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Чтоб не "заблудится" сделал Так:

  //pinMode(2, INPUT);    // ACC (зажигание)
  //pinMode(3, INPUT);    // габаритные огни
  //pinMode(4, INPUT);    // постановка на охрану
  //pinMode(5, INPUT);    //звуковой сигнал
  //pinMode(6, INPUT);    //снятие с охраны

было 2090 , стало 2060 из 2048. Полегчало.

По ссылке переходил, вчера до двух ночи колдовал.Там описания скудны, примеры выщепнуты из выщепнутого, пишется для знающих и понимающих которые это и так уже знают. Как по мне, рас уж начали пояснять, так и разжувать уже можно чтоб и моя бабушка поняла. Вобщем с DDRD = и с PORTD = , неполучается так же как и в моей теме "LCD 128x64 и MEGA2560. Зажгём?", Дают дельные советы а как применить....((((

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

hugoboss317 пишет:
было 2090 , стало 2060 из 2048. Полегчало.

delay( на delayMicroseconds(  - пробовал?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

"Калапуций" пишет:
delay( на delayMicroseconds( - пробовал?

2004 из 2048  П О Б Е Д А!!! Благодарю.

Буду знать что это не одно и то же. Остановлюсь на этом, но позже, для себя надо рассмотреть пример "DDRD = B11111110;" и с "



 void digiW(char pin1,char pin2,char state1, char state2,char aDelay) {
  digitalWrite(pin1,state1);   
  if (aDelay) delay(aDelay);               
  digitalWrite(pin2,state2);   
  if (aDelay) delay(aDelay);               
}

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

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

P.S. Подправил все delay, получилось 1810, ещё и жене на сапоги осталось))))))

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Вот опять проблема. delayMicroseconds игнарируется если значение больше 16383. Наша песня хороша, начинай с начала (((

 

 

P.S. где значения больше, поменял на delay , вместилось 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Что то я непойму, в процессе работы у МК может меняться тактовая частота? Сначала розжиг и затухание нормально, как надо, спустя время как притормаживать начинает раза в два.

Подключено питание через кренку, =5,02В. это что с ним?