Отговори на тема  [ 27 мнения ]  Отиди на страница Предишна  1, 2
Ротационен енкодер. Как да чета движението му? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Ами те почти всички възможни начини се изредиха, ама да ти кажа аз как съм го ползвал този енкодер : на портБ с прекъсване (портБ.0 или 1) само на единия изход. При прекъсване го дебоунсвам малко и после сменям фронта на прекъсването. Проверявам в какво състояние е другия пин и определям и посоката и това е. При следващото цъкване пак се генерира прекъсване. Дебоунсването в прекъсване е малко кьорава работа ама на мен ми вършеше работа.


Пет Авг 24, 2007 5:39 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение 
В момента на платката имам вързан енкодера и на същите изводи и бутони. Така мога да пробвам и с двете. Пишейки леко тъп код за бутоните установих, че и енкодера работи. Не както би трябвало да бъде кода, но все пак е напредък. Главната програма проверява 3 бутона, 2 от които са вързани за енкодера.
Ето и програмката:

if (!PORTBbits.RB6)
{
if (curr_val<30)
{
curr_val += 1;
}
move_cursor(0x00);
itoa(curr_val,curr_val_txt);
write_rom_str("> ");
if (curr_val<10)
{
write_char(' ');
}
write_ram_str(curr_val_txt);
write_rom_str(".0");
write_char(0x00);
write_char('C');
while (!PORTBbits.RB6) // wait for button release
delay_ms(50);
}
if (!PORTBbits.RB7)
{
if (curr_val>0)
{
curr_val -= 1;
}
move_cursor(0x00);
itoa(curr_val,curr_val_txt);
write_rom_str("> ");
if (curr_val<10)
{
write_char(' ');
}
write_ram_str(curr_val_txt);
write_rom_str(".0");
write_char(0x00);
write_char('C');
while (!PORTBbits.RB7) // wait for button release
delay_ms(50);
}

Правят се и други работи (пише се това : > 12.0°C, като стойността в ляво от точката се мени при натискане на бутоните), но идеята е ясна. Въпросът е, че тези паузи заемат доста време и накрая може да се окаже, че нещата започват да стават бавно. Тоест трябва да помисля за прекъсвания на всяка цена и то с приоритет, че да не стават още проблеми.

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн


Пет Авг 24, 2007 5:54 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 27, 2006 12:37 pm
Мнения: 647
Местоположение: с. Згалево
Мнение 
Абе човек - ти ме шашкаш!!!
При наличие на такъв процесор /за 18-ката говоря/ се занимаваш да правиш часовника с друг и т.н. Че той с лекота може да се справи с всичкото това дето казваш.
Значи часовник за реално време си правиш с пика - примерно с прекъсване на тимер 0 /с висок приоритет за да не се може нещо да му пречи/ и софтуерен брояч;
Всички останали времеви интервали които ти трябват - взимаш софтуерно от това прекъсване.
В него можеш да си четеш и енкодера - съвсем спокойно.
Серийния порт си го ползвай за каквото искаш - ама иначе ако само трябва да пращаш данни - направи си софтуерен порт - че пращането се прави лесно а хардуерния ти остава за по-сериозни задачи.
Абе изобщо - една 18-ка може да се справи с всичко това.
За пример!
Аз съм си направил контролер на парното и бойлера, с часовник, клавиатура и какво ли още не - и то с 16Ф684 - че тогава нямах 18-ки. Следи температурата в 4 точки, управлява помпа, клапани, захранване на бойлера и още един билюк работи... И при мене подсветката на дисплея намалява плавно като не го закачаш, ама не гасне напълно, че да можеш да погледнеш и вечер какви са температурите по дисплея. Пика е с отделно захранване с акомулаторче, така че и часа помни ако спре тока, че даже и в последната версия пише лог файл в ММЦ карта с малко компромиси де щото не му стига рама. Настройките се помнят е ЕЕПРОМ-а на чипа. Всичкото това с една келава 16ка на около 4 мХз, та затова хващай и чети, че да ползваш хардуера по-пълноценно.


Пет Авг 24, 2007 7:41 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Юни 29, 2007 10:59 pm
Мнения: 113
Мнение 
Наистина не виждам какъв е проблема да имаш прекъсвания от енкодера. Да помислим: ако не използваш прекъсване, означава, че за да имаш 100% гаранция, че няма да изпуснеш импулс трябва да кибичиш постоянно на входовете от енкодера. Това води до почти 100% разход на времето за работа на процесора за почти нулева работа (точните пропорции можеш да си ги сметнеш). В това няма нищо лошо, ако няма друго за вършене и ПИК-а трябва да пие кафе. Обаче погледнато от професионална гледна точка, не е особено коректно, и дори леко обидно, освен ако няма друг начин. Обаче има и то доста по-удачен. Например с прекъсване по порт В при промяна на състоянията на някой от пиновете 4:7. В нормалния случай инкремент или декремент на 3 байтов брояч ще ти отнеме около 10-12 инструкции. Другото важно нещо е филтъра. В случая с енкодера ще ти е трудно да реализираш добър софтуерен. Ако това устройство наистина отговаря на името си, то производителя трябва да се е погрижил за относително добрата форма на импулсите, ако не е - ще ти се наложи да помислиш за хардуерен. Ето малко код на асемблер по начина по който съм го реализирал, макар не точно с този тип датчик. А и В са на ПОРТ В 5 и 6 (или обратно). На 7 имам бутон за нулиране на брояча, но орязвам кода за да не се пречка.

Код:
   movf   PORTB,w
   movwf   Temp
...................
..................
..................
   rlncf   Temp,w
   xorwf   Temp_old,w
   movff   Temp,Temp_old
   btfsc   WREG,6
   bra   Dec_Counter

   incfsz   counterl,f
   return
   incfsz   counterh,f
   return
   incf   counteru,f
   return
Dec_Counter
   decf   counterl,f
   incfsz   counterl,w
   return
   decf   counterh,f
   incfsz   counterh,w
   return
   decf   counteru,f
   return


Така орязан кода може малко да се оптимизира, но ви го поствам без корекции. На мястото на точките разбира се е премахнатия код.


Пет Авг 24, 2007 10:05 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение 
И на мен ми е кеф да си играя с тия чипове и да чета и да се уча, но точно в момента се мъча просто да сътворя нещо дето работи, защото си имам доста по-важна работа, а именно дипломна :) . След още 2 седмици се надявам да съм завършил и да ми остава малко повече време да уча PIC-овете. До тогава само ще си играя да подкарам това и онова по някакъв начин, защото до сега съм си играл да пускам светодиодчета и да чета бутони с процесори от 12-та и 16-та серия. Сътворил съм цяло едно работещо нещо (едни светлинни ефекти за лъскав вентилатор) и то на Асемблер. С програмиране на С се занимавам общо взето откакто почнах да си правя дипломната работа. И за РС не програмирам на С. Там ползвам Delphi. В началото като си взех компютър почнах на Pascal, а преди това съм си играл с Basic. Просто не харесвам тоя език, но за PIC-ове нямам голям избор. Пък и никога не е късно човек да научи нещо ново нали :)

П.П.
Ако някой има интерес към дипломната ми работа може да погледне ТУК. През повечето време работи непрекъснато схемата и ще продължи така поне до 5-ти септември, когато ми е защитата.

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн


Съб Авг 25, 2007 1:41 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Юни 29, 2007 10:59 pm
Мнения: 113
Мнение 
steve написа:
...
Ако някой има интерес към дипломната ми работа може да погледне ТУК. През повечето време работи непрекъснато схемата и ще продължи така поне до 5-ти септември, когато ми е защитата.


Нещо ти е счупен линка или при мен само не се отваря.

Освен ако това не е адреса на личното ти ПК, а ти си го изключил или нямаш нет. :)


Съб Авг 25, 2007 5:02 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Това използване на енкодера ми се струва излишно.Сложи си 2 бутона UP/DOWN.Реално погледнато е същата работа като енкодера - на енкодера му трябва един вход за такт и един за посока на такта,а в някой случаи и външни схеми.Вържи бутоните към прекъсване и си готов.Това да натискаш бутон,че след това да въртиш енкодера,.... абе не си усложнявай живота. :wink:
P.S. На изкуственно усложняване на схемаат не се гледа с добро око на дипломна защита - важното е оптималния инженерен поход.


Съб Авг 25, 2007 5:16 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение 
Има и бутони вързани, но това е за експерименти. Просто го имам енкодера и искам да го ползвам, а и изглежда доста по-добре и е по-удобен за ползване. В крайния вариант ще има само енкодер и никакви бутони. Той има вграден бутон. Друго не ми трябва. И освен това този проект няма много общо с дипломната освен датчика. Дипломната е на тема "Дистанционно измерване на температура посредством Ethernet" като е указан датчик TCN75. Терморегулатора си е мой проект. Целта е да заменя един друг регулатор от подово отопление, който ползвам за радиатора в стаята. Абе дълга и широка стана с тоя регулатор ама нали трябва някъде да се упражнявам.

Сайта от дипломната не винаги бачка заради нета в университета. И при мен не се показва понякога. Не е свързано с комп. Всичко е на една платка (PICDEM.net 2 на Microchip). Направо към LAN кабела и толкова. Работи от време на време. Не съм слагал аз нет в кабинета и нищо не мога да направя повече, за да работи. Иначе е яко да гледам как в кабинета е 37-38 градуса по обед, докато в моята стая е "едва 32" :) .

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн


Съб Авг 25, 2007 9:39 pm
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение 
steve написа:
Има и бутони вързани, но това е за експерименти. Просто го имам енкодера и искам да го ползвам, а и изглежда доста по-добре и е по-удобен за ползване. В крайния вариант ще има само енкодер и никакви бутони. Той има вграден бутон. .................


Понеже стана дума за различни начини... и ето какво сътвори братовчед ми който се учи на PIC-ове от скоро :)))
Тва чудо работи безотказно освен това :))) Можеш ей така за спорта да пробваш и него :)))

Код:
#define rt_L     input(PIN_E0)
#define rt_R     input(PIN_E1)
#define rt_P     input(PIN_E2)

///////////////////////////////////////////////


void lcd_rotery() {
   lcd_gotoxy(1,2);
   printf(lcd_putc," %d ", counter);
}


void btn_left() {

      if (rt_L == 0) {
         delay_ms(2);
         if (rt_L == 0) {
            if (rt_R == 1) {
               while (rt_L == 0) {
                  if (rt_R == 0) {
                     while (rt_R == 0) {
                        if (rt_L == 1) {
                           while (rt_L == 1) {
                              if (rt_R == 1) {
                                 if (counter > 0) {
                                    --counter;
                                    lcd_rotery();
                                    return;
                                 }
                               }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
}

void btn_right() {

      if (rt_R == 0) {
         delay_ms(2);
         if (rt_R == 0) {
            if (rt_L == 1) {
               while (rt_R == 0) {
                  if (rt_L == 0) {
                     while (rt_L == 0) {
                        if (rt_R == 1) {
                           while (rt_R == 1) {
                              if (rt_L == 1) {
                                  if (counter < 100) {
                                    ++counter;
                                    lcd_rotery();
                                    return;
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
}

void push_but() {
      if (rt_P == 0) {
         piezo_2();
      }
}

////////////////////////////////////////////

main() {

   counter = 50;

   while (TRUE) {
      btn_left();
      btn_right();
      push_but();
   }

}


Пон Сеп 03, 2007 5:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 08, 2006 2:12 pm
Мнения: 2017
Местоположение: Котел
Мнение 
Остава братовчед ти да е в 5-ти клас :D Направо ме разби, кода прилича на гърмяща змия!!!


Пон Сеп 03, 2007 5:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
WOW :D Абе и 5-ти клас да беше щеше поне да се сети да ползва for :P Ползвайте прекъсванията бе хора, ползвайте таймерите и всяка периферия която има под ръка - затова са я сложили...ротационен енкодер може да се чете с два пина от старшата тетрада на PORTB (4-7) и да дава прекъсване, остава проста обработка от 10-ина реда :?


Вто Сеп 04, 2007 8:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Интересен подход към проблема. Три малки проблема:
1. Не е прегледно.
2. Не е оптимално по отношение на ресурсите ( и време, и обем памет ).
3. Има поне 2 ситуации, при които ще зависне трайно. Задача за домашно: кои са те?


Вто Сеп 04, 2007 10:12 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 27 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни