Отключение пина
- Войдите на сайт для отправки комментариев
Ср, 26/02/2014 - 21:13
Интересует такой вопрос: можно ли програмно отключать один или несколько пинов на AVR в теле функции но не в void setup()?
Интересует такой вопрос: можно ли програмно отключать один или несколько пинов на AVR в теле функции но не в void setup()?
Можно. setup и loop это условное деление. первая исполняется только один раз при сбросе вторая постояннно повторяется. Управляющие команды просто передают параметры в соответствующие регистры микроконтроллера - и вход становится выходом.
Можно сделать все в любой момент, но отключить нельзя :) Можно отломить !
Короче, пин отключить нельзя, можно настроить на вход, можно на выход, можно включить-отключить подтяжку, можно задействовать по второму-третьему функционалу ( для аппаратных протоколов, ацп, прерывание и тд).
#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 не включается, то есть работает корректно. подкиньте идею, что не так в скетче?