вертикально перемещающаяся платформа на PIC16F876

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср дек 10, 2008 11:11:33

Сообщение twise »

Здравствуйте, для начала я обрисую кратко насколько можно свою систему, а затем и задам вопрос по ней
В общем у меня вертикально перемещающаяся платформа на 900 мм максимум...задание производится двумя кнопками + и - соответственно и кнопкой старт для запуска всей этой фигни, ну плюс еще сброс...сделано на шаговом двигателе с дискретностью 1мм

вот алгоритм может кривой, но по другому не выходит
111111.png
алгоритм
(32.8 КБ) 402 скачивания
вот собственно код самой проги( программируем пик на выполнение собственно того что нам нужно)

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

#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;
    }
}
Я конечно понимаю что я криво объяснился, но сделал как мог, если что то нужно еще добавить для полноты информации только скажите)
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

Сообщение БАТАРЕЙКУС »

поготь я так понял тебе нужна задержка в 5 милисек.
если да то напиши её в асемблере раз на компиляторе неполучается в Си коде.
http://ikarab.narod.ru/Delay.html
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Небольшое замечание. Рассмотрел алгоритм и не нашел, равно как в описании, датчиков крайних положений. Это не есть хорошо ибо ошибка в работе алгоритма (помеха например) приведет к тому что или поедет нетуда или вообще "зашибет". Делал аналогичную систему, лет так 7 назад (двухкоординатный измеритель, ШД привод, длина 5 м), так там пришлось выделять 3 зоны с различными режимами.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср дек 10, 2008 11:11:33

Сообщение twise »

ну да про датчики я чтото лоханулся....но тем не менее как можно реализовать эту гребанную задержку....про 5мс это я так образно это типа минимальной задержки исходя из 20мгц ...я пробовал делеем и я не говорю что это не работает, но хотелось бы чего то другого например еще одного условия ...цикла да чего угодно, потому что использовать делей как намекнул один из моих товарищей " ...как то не очень..."
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср дек 10, 2008 11:11:33

Сообщение twise »

БАТАРЕЙКУС писал(а):поготь я так понял тебе нужна задержка в 5 милисек.
если да то напиши её в асемблере раз на компиляторе неполучается в Си коде.
http://ikarab.narod.ru/Delay.html
за программку спасибо огромное
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»