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

Обсуждаем контроллеры компании Atmel.
Ответить
brusel2
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср ноя 09, 2016 13:25:39

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

Сообщение 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);                         //вкл индикации питания				 
		     }
		  }
		  }            		  
}
Вложения
проектAtmelStudio.rar
(21.62 КБ) 287 скачиваний
файл протеуса.rar
(21.15 КБ) 243 скачивания
OKF
Это не хвост, это антенна
Сообщения: 1387
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Имена функций строчными. Аргументы (скобки) без пробела. Выравнивание, отступы, табуляция... Вы в школе тоже так писали? Это оформление.
Зачем избавляться от делай?
Зачем прерывания?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

[uquote="brusel2",url="/forum/viewtopic.php?p=3745143#p3745143"]...Написал програмулю...[/uquote]
Что и как должна делать?
brusel2 писал(а):...вроде...
Не надо вроде, надо так-то и так-то.
Docendo discimus
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

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

Сообщение wss60 »

Попытка сделать без “delay” :)
Вложения
noDelay.zip
(27.63 КБ) 238 скачиваний
brusel2
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср ноя 09, 2016 13:25:39

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

Сообщение brusel2 »

wss60, Спасибо Вам огромное за проделанную работу. Если Вам не трудно, можете добавить функцию "Остановка" по кратковременному нажатии кнопки. В моем варианте было по ISR(PCINT0_vect).
Проверил в протеусе все работает.
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

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

Сообщение wss60 »

Добавил.
Должно работать :)
Вложения
noDelay2.zip
(1.67 КБ) 223 скачивания
brusel2
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср ноя 09, 2016 13:25:39

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

Сообщение brusel2 »

Вернусь к своему вопросу. Собрал все в железе, загрузил тиньку прошивкой от wss60, но хочу сказать что есть непонятные косяки: циклы сбиваются, по времени неравномерные, после остановки, вооще не запускается, хотя в симуляторе работает нормально.
В своей версии убрал код с прерыванием, загрузил, и работает с delay все четко без ошибок.
Подскажите что и как добавить, чтоб при кратковременном нажатии кнопки, программа заканчивала работу.
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

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

Сообщение wss60 »

Конденсатор параллельно кнопки на 0.1мкф стоит?
Версия 2.0 :)
Вложения
2.0.zip
(1.82 КБ) 228 скачиваний
Ответить

Вернуться в «AVR»