Чт ноя 28, 2019 12:24:36
//Реверс для асинхронного двигателя стиральной машины
#define F_CPU 1200000UL
#define REL_PWR PB0 // пин реле питания
#define REL_RVS PB2 // пин реле реверса
#define LED_OUT PB4 // пин светодида работы
#define LED_IN PB3 // пин светодида питания
#define BUTTON PB1 // пин кнопки
#define WORK 23000 //время работы (около 30 сек)
#define countWORK 10 //количество циклов работы
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned char i=0, count=0, statePWR=0;
void LEFT () {
if (statePWR) {
PORTB &= ~(1<<REL_PWR); //выкл питание
_delay_ms (500); //пауза
PORTB &= ~(1<<REL_RVS); //выкл реверс
_delay_ms (500); //пауза
PORTB |= (1<<REL_PWR); //запуск
}
}
void RIGHT () {
if (statePWR) {
PORTB &= ~(1<<REL_PWR); //выкл питание
_delay_ms (500); //пауза
PORTB |= (1<<REL_RVS); //включить реверс
_delay_ms (500); //пауза
PORTB |= (1<<REL_PWR); //запуск
}
}
void STOP () {
if (statePWR) {
PORTB &= ~(1<<REL_PWR); //выкл питание
_delay_ms (100); //пауза
PORTB &= ~(1<<REL_RVS); //выкл реверс
}
}
ISR(PCINT0_vect)
{
_delay_ms (50);
if (statePWR) { //если включено
if (!(PINB & (1<<BUTTON))) { //если нажата кнопка
_delay_ms(30);
STOP();
}
}
}
int main(void) {
// кнопоки
DDRB &= ~(1<<BUTTON); // вход
PORTB |= (1<<BUTTON); // подтянут
// выходы
DDRB |= (1<<REL_PWR)|(1<<REL_RVS)|(1<<LED_OUT)|(1<<LED_IN); // выход
PORTB &= ~((1<<REL_PWR)|(1<<REL_RVS)|(1<<LED_OUT)); // выкл
PORTB |= (1<<LED_IN);
GIMSK |= (1<<PCIE)|(1<<INT0); // Разрешаем внешние прерывания PCINT0.
GIFR |=(1<<INTF0);
PCMSK |= (1<<BUTTON); // Разрешаем по маске прерывания на ногах кнопки
sei(); // Разрешаем прерывания глобально
while (1)
{
if (!statePWR) { //если не включено
if (!(PINB & (1<<BUTTON))) { //если нажата кнопка
count++; //увеличиваемся
_delay_ms(30);
}
if (PINB & (1<<BUTTON)) { //если кнопка отпущена
_delay_ms(10);
count=0; //сброс счета
}
if (count>=60) { //если длительное нажатие > 2 сек
count=0; //сброс
statePWR = 1; //флаг на запуск
PORTB &= ~(1<<LED_IN); //выкл индикации питания
PORTB |= (1<<LED_OUT); //вкл индикации работы
for (i=0; i<countWORK; i++) {
LEFT(); //запуск ВЛЕВО
_delay_ms(WORK);
RIGHT(); //запуск ВПРАВО
_delay_ms(WORK);
}
STOP(); // СТОП ВСЕМУ
statePWR = 0; //сброс флага запуска
PORTB &= ~(1<<LED_OUT); //гасим индикацию работы
PORTB |= (1<<LED_IN); //вкл индикации питания
}
}
}
}
Пт ноя 29, 2019 06:17:49
Пт ноя 29, 2019 10:54:51
brusel2 писал(а):...вроде...
Пт ноя 29, 2019 13:12:52
Пт ноя 29, 2019 15:35:31
Сб ноя 30, 2019 13:54:36
Пт дек 27, 2019 21:10:16
Пт дек 27, 2019 21:20:25