Все опять энкодер - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Все опять энкодер (Помогите перевести)
Все опять энкодер
LeXaCH Дата: Чт, 17.01.2013, 00:07  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

Нашел статейку по поводу подключения энкодера, есть исходник но она не Protone. Частично разобрался и перевел а Proton. но не совсем получается. Посмотрите в архив, там есть исходник из статьи, энкодер в протеус(если у кого нет), протеусовский файл и программа ( то что я смог перевести)  wacko
Прикрепления: enc.rar(28Kb)
ЯНДЕКС Дата: 17.01.2013
доцент2 Дата: Чт, 17.01.2013, 13:53  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 313
Репутация: 1   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

могу подкинуть простой пример с использованием прерывания на TMR0, можно переделать на INT.
на примере вместо энкодера поставил две кнопки, нажимает в нужной последовательности - эмитируете работу энкодера.
на мекетке работает.
Прикрепления: 11111.rar(16Kb)
LeXaCH Дата: Чт, 17.01.2013, 15:27  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

доцент2  Спасибо.
Но хотелось бы еще и с этим разобраться.
Если сделать так:
If PORTA.0 = 1 And PORTA.1 = 1 Then currentState = %00000011
If PORTA.0 = 1 And PORTA.1 = 0 Then currentState = %00000010
If PORTA.0 = 0 And PORTA.1 = 1 Then currentState = %00000001
If PORTA.0 = 0 And PORTA.1 = 0 Then currentState = %00000000
но в исходном коде было:
If (PORTA & (1 << RotA))!= 0 Then SetBit currentState,0
If (PORTA & (1 << RotB))!= 0 Then SetBit currentState,1
где RotA это А.0 ; RotB это А.1. Почему то currentState, не правильно выявляется
ivan_fd Дата: Чт, 17.01.2013, 18:19  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

В том примере, что Вы скинули, поставьте другой энкодер (ROTARY_ENCODER3).
  Потому, что в Вашем состояние ножек энкодера всегда становится в 0 или 1, в зависимости от 
вывода С.

  P.S: сейчас посмотрю, что можно придумать. Был у меня пример работы с энкодерами.

Через прерывание, немного не то.


Меня все время преследуют умные мысли...но я быстрее!!!
доцент2 Дата: Чт, 17.01.2013, 18:41  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 313
Репутация: 1   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

запустил Ваш пример в протеусе, на дисплее слишком много бесполезной информации.
убрав все лишнее, получилось вот так:
Dim RotA As Byte
Dim RotB As Byte
Dim currentState As Byte
TRISA = %011
PORTA = %000
currentState = 0

Main:
DelayMS 100
Print At 1, 1, Bin8 currentState

If PORTA.0 = 1 Then RotA = 1
If PORTA.0 = 0 Then RotA = 0

If PORTA.1 = 1 Then RotB = 1
If PORTA.1 = 0 Then RotB = 0

If (PORTA & (1 << RotA))!= 0 Then SetBit currentState,0
If (PORTA & (1 << RotB))!= 0 Then SetBit currentState,1

GoTo Main

не совсем понятны два последних условия???
поставте ваш кусок и не парьтесь!
If PORTA.0 = 1 And PORTA.1 = 1 Then currentState = %00000011
If PORTA.0 = 1 And PORTA.1 = 0 Then currentState = %00000010
If PORTA.0 = 0 And PORTA.1 = 1 Then currentState = %00000001
If PORTA.0 = 0 And PORTA.1 = 0 Then currentState = %00000000
С данным энкодером действительно беда какая то.
По мне если в программе есть паузы и вообще много всего, за состоянием энкодера лучше следить через прерывания.

Сообщение отредактировал доцент2 - Чт, 17.01.2013, 18:56
ivan_fd Дата: Чт, 17.01.2013, 20:11  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Энкодеры с протеуса до одного места. Нужно в железе пробовать.

Этот код должен работать нормально.
Опрашивать, приблизительно 1 раз в мсек.


Код
EncoderScan:

   
     New = PORTA & $03;   // Берем текущее значение  

   
     Select EncState
     
           Case 2
        
               If New = 3 Then Inc EncData;
               If New = 0 Then Dec EncData;  
               Break;
        
   
           Case 0
        
                If New = 2 Then Inc EncData;
                If New = 1 Then Dec EncData;  
                Break;
        
           Case 1
        
                If New = 0 Then Inc EncData;
                If New = 3 Then Dec EncData;  
                Break;
        
            Case 3
        
                If New = 1 Then Inc EncData;
                If New = 2 Then Dec EncData;  
                Break;
           EndSelect       
     
   
           EncState = New;    

Return


Меня все время преследуют умные мысли...но я быстрее!!!
LeXaCH Дата: Чт, 17.01.2013, 20:24  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

Цитата ivan_fdВ том примере, что Вы скинули, поставьте другой энкодер (ROTARY_ENCODER3).Энкодер у меня правильный так работает pec16. Он работает так. При повороте энкодера при С на земле.
А=1 В=0       в другую сторону А=0 В=1
А=1 В=1                                  А=1 В=1
А=0 В=1                                  А=1 В=0
А=0 В=0                                  А=0 В=0
Можете нажать на паузу, включить одну из логических единиц и помотреть пошагово.


доцент2
Нулей там много, я пытался разобраться, где что получается.

Как я понял эти два последних выражения, если появится на каком, то из входом энкодера 1, то 1 сдвигается влево и происходит побитное умножение . Получается что одно из выражений не равно нулю и эта 1 записывается currentState. Если на входе А то в 0 степень, если на В то 1 степень, если на  2 входах, то в 0 и 1 степень currentState. А дальше по подпрограмме.
Но не получается правильно,как раз эти два выражения. Они должны правильно выглядить, как чуть ниже. А по настоящему, почему то записывается, как будто включается либо 2 входа, либо только один
ivan_fd Дата: Чт, 17.01.2013, 22:14  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я не спорю, что он коды выдает правильно, а то, что у него всегда выводы, после щелчка, становятся в 0.
А должны сохранять свое состояние, то есть - стоит на выходах 0-0, при повороте вперед должно стать 1-0 и если его оставить, то на выводах так и должно остаться 1-0.

Код я Вам дал рабочий. Вот посмотрите вложение, все работает. Но поскольку энкодер в протеусе "интересный", то он при одном щелчке прибавляет не 1, а сразу 4. А если сделать в железе, то должно быть ОК.
Прикрепления: encoder.zip(53Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
dimitriy-bc Дата: Сб, 19.01.2013, 15:53  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 194
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. Может я ошибаюсь, но мне кажется, что в этом случае лучше использовать прерывания. Вот то, что у меня получилось.
Прикрепления: encoder_forum.rar(51Kb)
LeXaCH Дата: Вс, 20.01.2013, 12:10  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

А как лучше этот энкодер реализовать на PIC18F4550. Сами входы энкодеров будут на А1 и А0. На портах В висит ds1307 и lcd . Но по портам В.0 и В.1 не только производится опрос датчика ds, но и будет производиться передача в процессе выполнения программы. wacko
ivan_fd Дата: Вс, 20.01.2013, 13:32  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Скажите, чем Вас не устраивает код который я Вам дал??????  pray

Вешайте энкодер на какие угодно порты. Настройте таймер на прерывание (время сами определите), и по прерыванию вызывайте
процедуру опроса энкодера.

Можно конечно использовать и вход внешнего прерывания, но тут мы привязаны к порту и начинаются проблемы с дребезгом.


Меня все время преследуют умные мысли...но я быстрее!!!
MiXaS Дата: Вс, 20.01.2013, 14:03  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Всем привет! Был у меня опыт работы с энкодером. Есть у меня готовый код и на протоне и на PB. Причем есть 2 варианта использования. С использованием прерывания и без прерывания. Конечно если нужно добиться большой скорости опроса, то лучше использовать прерывания, но этот способ сложнее реализовать, если нужно приращивать и уменьщать разные переменные. Есть другой способ. Я лично 2 способ сипользую чаще, так как в большенстве программ изменять нужно более 2 переменных. Но второй способ имеет тоже свои недостатки-увеличение кода, но если посидеть подумать, то можно этот момент решить. Я выложу 2 примера с перыванием и без. Также хочу отметить, что в протеусе работу энкодера промоделировать сложно, поэтому советую сразу в железе.
Если Вы используете PEC 12 или 16, то необходимо поставить конденсаторы на каждую контактную группу, (3 кондера- лево, право и кнопка). http://www.picbasic.ru/forum/9-574-1#6561 пост 10.

Специально для этой темы написал код для примера, надеюсь поможет. Код точно рабочий, я только что залил его в мк и проверил.

Прошу прощения за не аккуратность. Надеюсь разберетесь
Прикрепления: __PB_2.pbp(3Kb) · __PB.pbp(2Kb)
LeXaCH Дата: Вс, 20.01.2013, 14:12  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

ivan_fd, Код устраивает, я просто еще спросил совета.
MiXaS, Сейчас попробуем разобраться
LeXaCH Дата: Вс, 20.01.2013, 23:18  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

Пробывал включить таймер TMR0 на PIC18f4550. Выдает ошибку при компиляции. Требует объявить TMR0 переменной, хотя при 8 разрядном режиме ничего не написано. При 16 разрядном там TMR0H и TMR0L надо.
Моя проба. Где опять мой касяк  wink
Прикрепления: otladka.bas(8Kb)
ivan_fd Дата: Пн, 21.01.2013, 12:03  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Dim TMR0 As TMR0L.Word
TMR0 = $00               ' Значение регистра TMR0


Меня все время преследуют умные мысли...но я быстрее!!!
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Все опять энкодер (Помогите перевести)
Страница 1 из 212»
Поиск: