Спойлер
Код: Выделить всё
// Подключение биполярного шагового двигателя к AVR
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void cw_dir(){ //направление по часовой
PORTB=0b00000011; //+a +b
_delay_ms(1000);
PORTB=0b00000110; //+b -a
_delay_ms(1000);
PORTB=0b00001100; //-a -b
_delay_ms(1000);
PORTB=0b00001001; //-b +a
_delay_ms(1000);
}
void ccw_dir(){ //направление против часовой
PORTB=0b00001001; //+a +b
_delay_ms(1000);
PORTB=0b00001100; //+b -a
_delay_ms(1000);
PORTB=0b00000110; //-a -b
_delay_ms(1000);
PORTB=0b00000011; //-b +a
_delay_ms(1000);
}
volatile unsigned char step_index;
volatile unsigned int ovftimes;
volatile unsigned char status;
volatile unsigned int var=0;
volatile unsigned int var2=0;
// Прерывание по переполнению Т0
ISR(TIMER0_OVF_vect)
{
static unsigned int count = 1;
count++;
if(count >= ovftimes) // Применяем задержку
{
cli(); // Запрещаем прерывания
if(status){ // если status == 1 крутим по часовой
while(var<=100)
{
ccw_dir();
var++;
}; var2=0;
}
else
{ // если status == 0 крутим против часовой
while(var2<=100)
{
cw_dir();
var2++;
}; var=0;
}
if (step_index >= 4)
step_index=0;
count = 0; // Сброс счетчика
TCNT0 = 0; // Старт счетчика с нуля
sei(); // Глобально разрешаем прерывания
}
}
int main(void)
{
DDRB = 0b00001111; // PB0, PB1, PB2, PB3 - выходы
PORTB = 0x00; // Лог. нули на выходе
PORTD = 0xFF;
DDRD = 0x00;
ADCSRA = (1 << ADEN) // разрешение АЦП
| (1 << ADPS2) // предделитель на 64 (частота АЦП 125kHz)
| (1 << ADPS1);
ADMUX = 0x00; // ADC0 - вход, внешний ИОН 5 Вольт
TCCR0 |= (1 << CS01); // Предделитель на 8
TCNT0 = 0; // Старт счетчика с нуля
step_index = 0;
ovftimes = 10; // первоначальная задержка
sei(); // Глобально разрешаем прерывания
while(1)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем пока завершится преобразование
ovftimes = ADCW; // Значение временной задержки
if((PIND &(1 << PD2)) == 0)
{
TIMSK |= (1 << TOIE0); // Разрешаем прерывания от таймера
status = 1;
}
else
{
//TIMSK &= ~(1 << TOIE0); // Запрещаем прерывания от таймера
}
if((PIND &(1 << PD3)) == 0)
{
TIMSK |= (1 << TOIE0); // Разрешаем прерывания от таймера
status = 0;
}
else
{
//TIMSK &= ~(1 << TOIE0); // Запрещаем прерывания от таймера
}
}
}



