Написать программу и запрограммировать PIC12F1572
3 000 руб. за проект
Написать программное обеспечение (прошивку) под PIC12F1572, исходник и бинарный файл. Проконсультировать как прошить и чем или прошить самостоятельно.
Конструкция очень проста. При поступлении низкого уровня на вход подтянутого на высокий уровень программным способом через задержку в 40 миллисекунд, для предотвращения дребезга контактов, немедленно поступает на выход 1 формируя низкий активный уровень, на выход 2 низкий активный уровень появляется через 100 миллисекунд. При переходе низкого уровня на входе в высокий уровень на выходе 2 также формируется высокий уровень немедленно, на выходе 1 высокий уровень появляется через 100 миллисекунд.
Код в Ардуино
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _bounse1S = 0;
bool _bounse1O = 0;
unsigned long _bounse1P = 0UL;
bool _bounseInputD2S = 0;
bool _bounseInputD2O = 0;
unsigned long _bounseInputD2P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
void setup()
{
pinMode(2, INPUT_PULLUP);
pinMode(5, OUTPUT);
digitalWrite(5, 0);
pinMode(6, OUTPUT);
digitalWrite(6, 0);
_bounseInputD2O = digitalRead(2);
}
void loop()
{
bool _bounceInputTmpD2 = (digitalRead (2));
if (_bounseInputD2S)
{
if (millis() >= (_bounseInputD2P + 40))
{
_bounseInputD2O= _bounceInputTmpD2;
_bounseInputD2S=0;
}
}
else
{
if (_bounceInputTmpD2 != _bounseInputD2O)
{
_bounseInputD2S=1;
_bounseInputD2P = millis();
}
}
bool _bounceTmpD1 = !(_bounseInputD2O);
if (_bounse1S)
{
if (millis() >= (_bounse1P + 40))
{
_bounse1O= _bounceTmpD1;
_bounse1S=0;
}
}
else
{
if (_bounceTmpD1 != _bounse1O)
{
_bounse1S=1;
_bounse1P = millis();
}
}
if(_bounse1O)
{
_tim2O = 1;
_tim2I = 1;
}
else
{
if(_tim2I)
{
_tim2I = 0;
_tim2P = millis();
}
else
{
if (_tim2O)
{
if (_isTimer(_tim2P, 100)) _tim2O = 0;
}
}
}
digitalWrite(5, _tim2O);
if (_bounse1O)
{
if (_tim1I)
{
if (_isTimer(_tim1P, 100))
{
_tim1O = 1;
}
}
else
{
_tim1I =1;
_tim1P = millis();
}
}
else
{
_tim1O = 0;
_tim1I = 0;
}
digitalWrite(6, _tim1O);
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime)
{
return (currentTime>=(startTime + period));
}
else
{
return (currentTime >=(4294967295-startTime+period));
}
}
Конструкция очень проста. При поступлении низкого уровня на вход подтянутого на высокий уровень программным способом через задержку в 40 миллисекунд, для предотвращения дребезга контактов, немедленно поступает на выход 1 формируя низкий активный уровень, на выход 2 низкий активный уровень появляется через 100 миллисекунд. При переходе низкого уровня на входе в высокий уровень на выходе 2 также формируется высокий уровень немедленно, на выходе 1 высокий уровень появляется через 100 миллисекунд.
Код в Ардуино
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _bounse1S = 0;
bool _bounse1O = 0;
unsigned long _bounse1P = 0UL;
bool _bounseInputD2S = 0;
bool _bounseInputD2O = 0;
unsigned long _bounseInputD2P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
void setup()
{
pinMode(2, INPUT_PULLUP);
pinMode(5, OUTPUT);
digitalWrite(5, 0);
pinMode(6, OUTPUT);
digitalWrite(6, 0);
_bounseInputD2O = digitalRead(2);
}
void loop()
{
bool _bounceInputTmpD2 = (digitalRead (2));
if (_bounseInputD2S)
{
if (millis() >= (_bounseInputD2P + 40))
{
_bounseInputD2O= _bounceInputTmpD2;
_bounseInputD2S=0;
}
}
else
{
if (_bounceInputTmpD2 != _bounseInputD2O)
{
_bounseInputD2S=1;
_bounseInputD2P = millis();
}
}
bool _bounceTmpD1 = !(_bounseInputD2O);
if (_bounse1S)
{
if (millis() >= (_bounse1P + 40))
{
_bounse1O= _bounceTmpD1;
_bounse1S=0;
}
}
else
{
if (_bounceTmpD1 != _bounse1O)
{
_bounse1S=1;
_bounse1P = millis();
}
}
if(_bounse1O)
{
_tim2O = 1;
_tim2I = 1;
}
else
{
if(_tim2I)
{
_tim2I = 0;
_tim2P = millis();
}
else
{
if (_tim2O)
{
if (_isTimer(_tim2P, 100)) _tim2O = 0;
}
}
}
digitalWrite(5, _tim2O);
if (_bounse1O)
{
if (_tim1I)
{
if (_isTimer(_tim1P, 100))
{
_tim1O = 1;
}
}
else
{
_tim1I =1;
_tim1P = millis();
}
}
else
{
_tim1O = 0;
_tim1I = 0;
}
digitalWrite(6, _tim1O);
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime)
{
return (currentTime>=(startTime + period));
}
else
{
return (currentTime >=(4294967295-startTime+period));
}
}
- Файлы
Отзывы
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.