В общем у меня вертикально перемещающаяся платформа на 900 мм максимум...задание производится двумя кнопками + и - соответственно и кнопкой старт для запуска всей этой фигни, ну плюс еще сброс...сделано на шаговом двигателе с дискретностью 1мм
вот алгоритм может кривой, но по другому не выходит вот собственно код самой проги( программируем пик на выполнение собственно того что нам нужно)
Код: Выделить всё
#include <pic.h>
//определяем переменные
const char DIG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
const char SPOT[3]={0x4,0x2,0x1};
char VL[3];
char NSPOT=0;
signed char nstep;
int C, N=0,M;
//опускаем платформу вниз
void DOWN(void)
{
while(C!=N && RB3!=0)
{
for(char i=0; i<200; i++)
switch(nstep)
{
case 0: RB4=1; RB5=0; RB6=0; RB7=0; break;
case 1: RB4=0; RB5=1; RB6=0; RB7=0; break;
case 2: RB4=0; RB5=0; RB6=1; RB7=0; break;
case 3: RB4=0; RB5=0; RB6=0; RB7=1; break;
}
C--;
VL[0]=C/100;
VL[1]=(C%100)/10;
VL[2]=C%10;
_delay(5); вот собственно и вопрос я здесь пытаюсь организовать задержку, так как двигатель шаговый то нужно организовать задержку между его шагами около 5мс...
я смог это сделать только делеем, но видимо это не правильно и нужно бы придумать какое то дополнительно условие при котором будет организована та самая задержка
!!!!!!!!!!!!!!!!!!!!!!!
Код: Выделить всё
nstep--;
if(nstep<0)
nstep=3;
}
}
//поднимаем платформу вверх
void UP(void)
{
while(C!=N)
{
for(char i=0; i<200; i++)
switch(nstep)
{
case 0: RB4=1; RB5=0; RB6=0; RB7=0; break;
case 1: RB4=0; RB5=1; RB6=0; RB7=0; break;
case 2: RB4=0; RB5=0; RB6=1; RB7=0; break;
case 3: RB4=0; RB5=0; RB6=0; RB7=1; break;
}
C++;
VL[0]=C/100;
VL[1]=(C%100)/10;
VL[2]=C%10;
Код: Выделить всё
nstep++;
if(nstep>3)
nstep=0;
}
}
//прерывание от таймера - вывод на информации на индикаторы
void interrupt _int()
{
T0IF=0;
TMR0=100;
PORTA=SPOT[NSPOT];
PORTC=DIG[VL[NSPOT]];
NSPOT++;
if(NSPOT>2)
{
NSPOT=0;
}
}
void main(void)
{
//настройка микросхемы
ADCON1= 0x7;
TRISA = 0x0;
OPTION= 0x4;
TRISB = 0x0F;
PORTB = 0x0;
TRISC = 0x0;
PORTC = 0x0;
T0IE = 0x1;
GIE = 0x1;
T0IF = 0x0;
TMR0 =0x60;
//опускаем платформу до 0 при включении
C=900;
DOWN();
C=0;
VL[0]=0;
VL[1]=0;
VL[2]=0;
while(1)//сканируем кнопки каждые 50мс
{
for(unsigned int i=0; i<3150; i++);//50мс
if(RB1==0)//если пользователь нажимает старт
{
M=N-C
if(M<0)
DOWN();//вниз
if(M>0)
UP();//вверх
}
if(RB0==0) N--;//если пользователь нажимает вниз
if(RB2==0) N++;//если пользователь нажимает вверх
if(N<0) N=900;// если пользователь хочет узнать, что есть ниже нуля
if(N>900) N=0;//если пользователь хочет узнать, что есть выше 900
VL[0]=N/100;
VL[1]=(N%100)/10;
VL[2]=N%10;
}
}

