Бесконечный цикл.

faraddin
Offline
Зарегистрирован: 11.08.2013

Вот код, который зажигает диод на ардуино:





void setup() {                
  pinMode(13, OUTPUT); 
  digitalWrite(13, HIGH)   
}

void loop() {

}

Код ниже делает то же самое:



void setup() {                
  pinMode(13, OUTPUT); 
}

void loop() {
  digitalWrite(13, HIGH)   
}

Но делает это постоянно. Вот у меня вопрос, на микроконтроллер это как-то влияет? Повышение энергопотребления например или нагревается может? 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

faraddin пишет:

Вот у меня вопрос, на микроконтроллер это как-то влияет? Повышение энергопотребления например или нагревается может? 

Ну очевидно же, что в первом случае у Вас светодиод включается в начале работы и далее не гаснет, а во втором случае - включается при каждом цикле loop(), что приводит к преждевременному износу включающего мосфета, который 16000 раз в секунду дергается процессором. Ресурс переключений мосфета хоть и большой, но не бесконечный...

Ну и нагрев от этой операции, понятное дело, будет присутствовать.

__Alexander
Offline
Зарегистрирован: 24.10.2012

что-то вы сейчас фигню написали. этой командой устанвливается бит в регистре. если он уже установлен... то он уже установлен. )

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

faraddin пишет:

Вот у меня вопрос, на микроконтроллер это как-то влияет? Повышение энергопотребления например или нагревается может? 

для предотвращения износа контроллера, имеет смысл состояние пина хранить в переменной и, перед перезаписью состояния пина, сравнивать желаемое с имеющимся.

а, если серьёзно, то почему

void loop() {
  digitalWrite(13, HIGH)   
}

а, не

void loop() {
  digitalWrite(13, HIGH)   
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
  digitalWrite(13, HIGH) 
}

?

что бы наверняка переключиться.

Geronimo
Offline
Зарегистрирован: 06.05.2013

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

axill
Offline
Зарегистрирован: 05.09.2011

я настаиваю, что мой код куда надежнее установит единицу))

#define SUPER_OUTPUT  OUTPUT
#define SUPER_HIGH HIGH
	
void setup() {               
	  pinMode(13, SUPER_OUTPUT);
}
	 
void loop() {
	  digitalWrite(13, SUPER_HIGH)  
}

а если серьезно, то не возможно утверждать что один код более бесполезный чем другой. Оба хороши (в плане бесполезности :)

faraddin
Offline
Зарегистрирован: 11.08.2013

axill пишет:

я настаиваю, что мой код куда надежнее установит единицу))



#define SUPER_OUTPUT  OUTPUT
#define SUPER_HIGH HIGH
	
void setup() {               
	  pinMode(13, SUPER_OUTPUT);
}
	 
void loop() {
	  digitalWrite(13, SUPER_HIGH)  
}

а если серьезно, то не возможно утверждать что один код более бесполезный чем другой. Оба хороши (в плане бесполезности :)

Да тут не стоит вопрос про то, как надежно установить 1 или 0, меня интересует именно влияние постоянного, в каждом или почти каждом цикле, выставления порта в 1 или 0 на микроконтроллер.

__Alexander
Offline
Зарегистрирован: 24.10.2012

та нифига не произойдет, это равносильно что писать в переменную.

char x;
loop()
{
x =1;
x=2;
}

о каком износе может идти речь? 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Да никуда он не выставляется, он уже выставлен, его можно прочитать оттель, там, где уже выставлена единица выставление еще одной единицы означает НИЧЕГОНЕДЕЛАНЬЕ!

axill
Offline
Зарегистрирован: 05.09.2011

faraddin пишет:

Да тут не стоит вопрос про то, как надежно установить 1 или 0, меня интересует именно влияние постоянного, в каждом или почти каждом цикле, выставления порта в 1 или 0 на микроконтроллер.

извините, это я просто глумился. Не о том беспокоитесь. Заботиться нужно о решении реальной задачи (пусть даже с целью только обучения). Ничего не произойдет если без конца долбить digitalWrite с одним и тем же значением. Как выше написали "порт выставлен в 1, это значит, что он выставлен в 1". Добавить нечего

Geronimo
Offline
Зарегистрирован: 06.05.2013

__Alexander пишет:

та нифига не произойдет, это равносильно что писать в переменную.

char x;
loop()
{
x =1;
x=2;
}

о каком износе может идти речь? 

У ячейки памяти износа нет?

axill
Offline
Зарегистрирован: 05.09.2011

Стоит больше заботиться об износе програмиста, чем тех ячеек памяти RAM которые меняет его программа

вот флэш память программ (10000 циклов ресурс) и eeprom (100000) о них заботиться стоит

__Alexander
Offline
Зарегистрирован: 24.10.2012

Geronimo пишет:

У ячейки памяти износа нет?

у меня встречный вопрос. покажите мне ОЗУ, которое убилось банальным перезаписыванием в ней информации. На устройстве скорее текстолит войдет в полураспад, нежели озу износится. 

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

__Alexander пишет:

у меня встречный вопрос. покажите мне ОЗУ, которое убилось банальным перезаписыванием в ней информации. На устройстве скорее текстолит войдет в полураспад, нежели озу износится. 

если учесть, что речь идёт не об ОЗУ, а о состоянии порта, то проблема износа приобретает потусторонний смысл.