Попробую ответить автору топика, если еще актуально..
Как говорится "...Пастернака не читал , но скажу..."
Ни в Си ни в АВР не силен , но попробую объяснить , знатоки поправят,если что..
//************************************************** *************************
// File Name : upstepper.c
// Version : 1.0
// Description. : Transistor as Switch: Simple Unipolar Stepper
// Motor Driver - Full Step Method
// Author : RWB
// Target :
ATTiny13
// Compiler : AVR-GCC 4.3.2; avr-libc 1.6.2 (WinAVR 20090313)
// IDE : Atmel AVR Studio 4.17
// Programmer : Atmel AVRISPmkII
// Last Updated : 03 Nov 2010
//************************************************** *************************
#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
// Unipolar Stepper Motor CW/CCW Stepping Sequence
#define MAX_STEP 4
// Здесь определяем два массива, в каждом по четыре значния
// которые будем по очереди выводить в порт.Один массив крутит в
// одну сторону, другой - в другую. Выводится по две единицы,
// т.е запитаны будут одновременно две фазы.Можно поигратся
//и выводить по одной
//единице и сравнить момент на валу ШД.
unsigned char cwstep_seq[MAX_STEP]= {0b00000110,
0b00000011,
0b00001001,
0b00001100};
unsigned char ccwstep_seq[MAX_STEP]= {0b00001100,
0b00001001,
0b00000011,
0b00000110};
volatile unsigned char step_index; //здесь номер включенной фазы -1.2.3.4
volatile unsigned int ovftimes; //число шагов
volatile unsigned char status; //определяет направление вращения
//Это подпрограмма обработки прерывания по переполнению таймера 0
ISR(TIM0_OVF_vect)
{
static unsigned int count=1;
//Крутим ШД если статус = 0 в одну
// если 1 - в другую сторону
count++;
// if (count ›= ovftimes) {
//Здесь мне кажется надо так, или я туплю?
if (count ‹= ovftimes) {
cli(); // Disable Interrupt - Запрет прерываний
// Stepping Output
if (status)
PORTB = ccwstep_seq[step_index++];
else
PORTB = cwstep_seq[step_index++];
if (step_index ›= MAX_STEP)
step_index=0;
} А здесь верно (поправьте, если не прав)
count=0; // Reset Count
TCNT0=0; // Start counter from 0
sei(); // Enable Interrupt
// } И скобочка кажется не верно
}
//Основная программа
int main(void)
{
//Инициализируем порты
// Initial I/O
DDRB = 0b00001111; // Set PB0, PB1, PB2, and PB3 as Output, Others as Input
PORTB = 0b00000000; // Reset PORTB Output
//Инициализируем АЦП
// Set ADCSRA Register on ATTiny13
ADCSRA = (1‹‹ADEN) | (1‹‹ADPS2) | (1‹‹ADPS1);
ADCSRB = 0b00000000;
// Set ADMUX to PB4 (ADC2)
ADMUX=0b00000010;
// Disable Digital Input on PB4 (ADC2)
DIDR0=0b00001000;
//Инициализируем Таймер0 - работа от внутреннего тактового генеретора
// с предделителем на 8
// Initial TIMER0
TCCR0A=0b00000000; // Timer/Counter 0 Normal Operation
TCCR0B=(1‹‹CS01); // Use prescaller: Clk/8 with 9.6 MHz Internal Clock
TCNT0=0; // Start counter from 0
TIMSK0=(1‹‹TOIE0); // Enable Counter Overflow Interrupt
step_index=0;
ovftimes=10;
status=0; // 0 - CW, 1 - CCW
sei(); // Enable Interrupt
// Бесконечный цикл определяет значение напряжения
//на входе АЦП в зависимоти от положения движка
//потенциометра и результ. заносится в переменную
//ovftimes , если значение больше 800,
//направление вращения меняется на противоположное -status^=0x01
for(;

{ // Loop Forever
// Start conversion by setting ADSC on ADCSRA Register
ADCSRA |= (1‹‹ADSC);
// wait until convertion complete ADSC=0 -› Complete
while (ADCSRA & (1‹‹ADSC));
// Get the ADC Result
ovftimes = ADCW;
if (ovftimes › 800)
status^=0x01; // Toggle the Direction
_delay_ms(50);
}
return 0; // Standard Return Code
}
/* EOF: upstepper.c */
Если вам нужно только поочередное вращение в одну и другую сторону программа будет выглядеть примерно так:
#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
// Unipolar Stepper Motor CW/CCW Stepping Sequence
#define MAX_STEP 4
unsigned char cwstep_seq[MAX_STEP]= {0b00000110,
0b00000011,
0b00001001,
0b00001100};
unsigned char ccwstep_seq[MAX_STEP]= {0b00001100,
0b00001001,
0b00000011,
0b00000110};
volatile unsigned char step_index;
volatile unsigned int ovftimes;
volatile unsigned char status;
ISR(TIM0_OVF_vect)
{
static unsigned int count=1;
count++;
if (count ‹= ovftimes) {
cli(); // Disable Interrupt
// Stepping Output
if (status)
PORTB = ccwstep_seq[step_index++];
else
PORTB = cwstep_seq[step_index++];
if (step_index ›= MAX_STEP)
step_index=0;
}
count=0; // Reset Count
TCNT0=0; // Start counter from 0
status^=0x01;
sei(); // Enable Interrupt
//}
}
int main(void)
{
// Initial I/O
DDRB = 0b00001111; // Set PB0, PB1, PB2, and PB3 as Output, Others as Input
PORTB = 0b00000000; // Reset PORTB Output
// Initial TIMER0
TCCR0A=0b00000000; // Timer/Counter 0 Normal Operation
TCCR0B=(1‹‹CS01); // Use prescaller: Clk/8 with 9.6 MHz Internal Clock
TCNT0=0; // Start counter from 0
TIMSK0=(1‹‹TOIE0); // Enable Counter Overflow Interrupt
step_index=0;
ovftimes=100; // Изменяя это значение, меяем колич. шагов
//в ту или другую сторону
status=0; // 0 - CW, 1 - CCW
sei(); // Enable Interrupt
for(;

{ //Крутим пустой цикл
}
return 0; // Standard Return Code
}
/* EOF: upstepper.c */