Страница 1 из 1

реверс двигателя на Attiny13

Добавлено: Чт ноя 28, 2019 12:24:36
brusel2
Здраствуйте! Написал програмулю для управления мотором, но никак не могу реализовать работу таймеров чтоб избавится от delay.
Это моя первая программа так что сильно не ругайте. Написано с помощью AtmelStudio 7.
В протеусе вроде работает.

Спойлер

Код: Выделить всё

//Реверс для асинхронного двигателя стиральной машины

#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);                         //вкл индикации питания				 
		     }
		  }
		  }            		  
}

Re: реверс двигателя на Attiny13

Добавлено: Пт ноя 29, 2019 06:17:49
OKF
Имена функций строчными. Аргументы (скобки) без пробела. Выравнивание, отступы, табуляция... Вы в школе тоже так писали? Это оформление.
Зачем избавляться от делай?
Зачем прерывания?

Re: реверс двигателя на Attiny13

Добавлено: Пт ноя 29, 2019 10:54:51
pyzhman
[uquote="brusel2",url="/forum/viewtopic.php?p=3745143#p3745143"]...Написал програмулю...[/uquote]
Что и как должна делать?
brusel2 писал(а):...вроде...
Не надо вроде, надо так-то и так-то.

Re: реверс двигателя на Attiny13

Добавлено: Пт ноя 29, 2019 13:12:52
wss60
Попытка сделать без “delay” :)

Re: реверс двигателя на Attiny13

Добавлено: Пт ноя 29, 2019 15:35:31
brusel2
wss60, Спасибо Вам огромное за проделанную работу. Если Вам не трудно, можете добавить функцию "Остановка" по кратковременному нажатии кнопки. В моем варианте было по ISR(PCINT0_vect).
Проверил в протеусе все работает.

Re: реверс двигателя на Attiny13

Добавлено: Сб ноя 30, 2019 13:54:36
wss60
Добавил.
Должно работать :)

Re: реверс двигателя на Attiny13

Добавлено: Пт дек 27, 2019 21:10:16
brusel2
Вернусь к своему вопросу. Собрал все в железе, загрузил тиньку прошивкой от wss60, но хочу сказать что есть непонятные косяки: циклы сбиваются, по времени неравномерные, после остановки, вооще не запускается, хотя в симуляторе работает нормально.
В своей версии убрал код с прерыванием, загрузил, и работает с delay все четко без ошибок.
Подскажите что и как добавить, чтоб при кратковременном нажатии кнопки, программа заканчивала работу.

Re: реверс двигателя на Attiny13

Добавлено: Пт дек 27, 2019 21:20:25
wss60
Конденсатор параллельно кнопки на 0.1мкф стоит?
Версия 2.0 :)