Помогите! Мигалка светодиодом не работает (

Поклонники продукции Microchip Technology Inc тусуются тут.
Oleg99
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт июн 10, 2016 21:45:31

Re: Помогите! Мигалка светодиодом не работает (

Сообщение Oleg99 »

В общем думал я думал и придумал следующий вариант развития событий:

Мне нужно было реализовать защиту на тот случай если по каким-то причинам не сработает концевой выключатель на двигателе. То есть не просто запускать двигатель и ждать когда сработает концевик а запустить двигатель с "таймером" и в не зависимости от того что раньше наступит прекратить работу двигатель. А наступить может два события, это:
первое событие - сработал концевик и в штатном режиме всё продолжает дальше работать
второе событие - концевик не сработал (не важно покаким причинам, может обрыв цепи например) двигатель всё равно выключается по истечении определённого времени и у меня не чего не сгорает.
В программе МК я это реализовал следующим образом

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

unsigned short x; // объявляем переменную
    x = 0; // чистим переменную
    while (RA1 == 1) // запускаем цикл и выполняем его пока на вводе RA1 нет "-"
   {
       RB0 = 1; //включаем мотор
               if (x!=8000){ //запускаем своеобразный программный таймер, когда досчитает до 8000 выйдет из цикла и перейдёт по абсолютной метке "next1"
               x = x+1;}
               else 
               goto next1;
   }   
    next1: // тут окажется МК после выхода из цикла по срабатыванию таймера
    RB0 = 0; // выключить мотор
Конечно костыль костылём погоняет НО! Работает ведь! И в железе тоже работает!
Единственное я пока что не могу понять как правильно рассчитать число Х что-бы получить нужный отрезок времени...
Какой-то бред с таймингом пока что...
Ещё нужно как-то настроить "собачий" сторожевой таймер... тут у меня пропасть. Я даже не знаю как это спросить у гугла (
Подскажите как бороться с таймером когда есть такая строка в программе " __delay_ms(800);"
Она ведь явно превышает возможности таймера и он раньше времени уйдёт в перезагрузку.
Подскажите пожалуйста!
Реклама
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Помогите! Мигалка светодиодом не работает (

Сообщение -=Vovka=- »

Для отсчета времени используют таймер, а в основном цикле уже обрабатывают.
А с задержкой для любителя костылей, еще один: в цикле делать __delay_ms(100);, а между функцией сбрасывать собаку :tea:
Реклама
Stewart
Открыл глаза
Сообщения: 76
Зарегистрирован: Вт апр 05, 2016 19:00:29
Откуда: Ростовская обл. Новочеркасск

Re: Помогите! Мигалка светодиодом не работает (

Сообщение Stewart »

А не проще настроить таймер на инкремент переменной каждую 0,1с (например)? И в программе проверять эту переменную на кратность нужной задержке? Про работу таймера и организацию прерываний от него надо читать. И про собачку есть раздел в даташите. Регистры таймера и прерываний смотреть.
Делать через delay можно короткие задержки в некритичных кусках кода, например при инициализации переферии, где тупое выполнение множества NOP ничему не мешает.
Ох уж эти сказки...
Ох уж эти сказочники...
Oleg99
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт июн 10, 2016 21:45:31

Re: Помогите! Мигалка светодиодом не работает (

Сообщение Oleg99 »

В общем не смог я подружиться с таймерами и прерываниями (
По этому заменил строки содержащие __delay на такую вот импровизацию паузы (наверное об этом вы и говорил)

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

void pauza100 (void) // zahita ot skvoznogo toka
{
    long i;
    i=0;
    while (i<2000) // vremy mechdu vkluceniem reversa
    {
        CLRWDT();
        i++;
    }
}


И собачий таймер включил в битах и настроил.

Всем огромное СПАСИБО за помощь!!!!
Благодаря Вам у меня есть ЗНАНИЯ в области программирования МК!!!
Спасибо что научили пользоваться даташитом! ;-) а то я его читал как художественную литературу))
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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