Отключение пина

blink_977
Offline
Зарегистрирован: 10.08.2013

Интересует такой вопрос: можно ли програмно отключать один или несколько пинов на AVR в теле функции но не в void setup()?

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Можно. setup и loop это условное деление. первая исполняется только один раз при сбросе вторая постояннно повторяется. Управляющие команды просто передают параметры в соответствующие регистры микроконтроллера - и вход становится выходом.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Можно сделать все в любой момент, но отключить нельзя :) Можно отломить ! 

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

blink977
Offline
Зарегистрирован: 20.01.2012
        #include <avr/wdt.h> // - библиотека WDT (сторожевого таймера)
	#include <util/delay.h>
	 
	// - pin ATtiny
	byte startbutton = 0;
	byte ignition_pin = 1;
	byte starter_pin = 2;
	byte brake_pin = 3;
	byte alt_pin = 4;
	 
	boolean button_state = 0;
	 
	void setup(){
	  wdt_disable(); // запретили как можно скорее WDT, что-бы не уйти в бесконечный ребут
	   
	  pinMode(startbutton, INPUT);
	  digitalWrite(startbutton, HIGH);// - включаем внутренний pull-up резистор
	  pinMode(ignition_pin, OUTPUT);
	  pinMode(starter_pin, OUTPUT);
	  pinMode(brake_pin, INPUT);
	  pinMode(alt_pin, INPUT);
	   
	  wdt_enable(WDTO_2S); // активировали сторожевой таймер, каждые 2-е секунды его нужно сбрасывать !
	}
	 
	void ignition(){
	  if(digitalRead(startbutton)==LOW && button_state==0){
	    digitalWrite(ignition_pin,!digitalRead(ignition_pin));
	    button_state=1;
	  }
	  if(digitalRead(startbutton)==HIGH && button_state==1) button_state=0;
	}
	 
	void start(){
	  if(digitalRead(startbutton)==LOW && button_state==0)
	  {
	    digitalWrite(ignition_pin,!digitalRead(ignition_pin));
	    button_state=1;
	    _delay_ms(500);
	    digitalWrite(starter_pin, HIGH);
	  }
	  if(digitalRead(startbutton)==HIGH && button_state==1) button_state=0;
	}
	 
	 
	void loop(){
	  wdt_reset(); // говорим WDT что "все ОК", начинается очередной отсчет 2-х секунд.
	   
	  if(digitalRead(brake_pin)==LOW) ignition();
	  else start();
	   
	  if(digitalRead(alt_pin)==HIGH) digitalWrite(starter_pin, LOW);

алгоритм такой: если brake_pin - LOW то при нажатии кнопки, включается только ignition_pin, и при последующем нажатии отключается. теперь, если brake_pin - HIGH, при нажатии кнопки включится ignition_pin и затем через 500мс starter_pin, который отключится как только alt_pin станет HIGH, и остается включенным только ignition_pin, который и отключится при последующем нажатии кнопки.

 проблема вот в чем: если нажать на кнопку и отключить ignition_pin, и brake_pin в этот момент в состоянии HIGH, то ignition_pin выключается и через пол секунды включается только sarter_pin, который должен включатся только после ignition_pin и только если brake_pin ==HIGH. если нажать на кнопку и brake_pin в этот момент LOW, то starter_pin не включается, то есть работает корректно. подкиньте идею, что не так в скетче?