[elektro] rotary encoder, mit csinálok rosszul?

uprogc . uprogc at gmail.com
Mon Jan 2 16:45:22 CET 2017


Nem tudom az jobb-e, ez mukodik, ennel jobbat ami a mukodest illeti nem
hiszem hogy lehetne csinalni. Ezek a mech enkoderek a szemet kategoriaba
tartoznak. Ki is fogom majd valtani oket valamivel, csak legyen idom ra.

Hibat szamlalni ? Minek ? Nem szeretnek enkodert tesztelni, azt megtehetnek
a gyarban ennyi penzert........Ezeknel jobbat lehet csinalni floppy
fejmozgato motorbol, vagy hasonlobol + komparator, es sosem kopik ki....

Szabi

2017-01-02 15:56 GMT+02:00 Bali Zoltan <eltexto at freemail.hu>:

> Hm, állapotgépes nem jobb?
> Ott mindjárt meg is lehet számolni
> a hibás állapotokat.
> A switch-case kezelés az érvényes állapotok között,
> default: -ág meg reprezentálja a
> lenti táblázat érvénytelen nulláit.
> Viszont ott, lehet egy hiba számlálót inkrementálni,
> mondjuk diagnosztikai célra...
>
> Üdv.  Zoli
>
>
> 2017.01.02. 14:00 keltezéssel, uprogc . írta:
>
>> En igy csinaltam ;)
>>
>>
>>      static int8_t states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
>>      uint8_t RotaryCurrentState = 0x00;
>>      uint8_t RotaryTransition = 0;
>>      int8_t  RotaryPosition = 0;
>>
>> enum e_encoder { WAITING, LEFT, RIGHT };
>> typedef enum e_encoder rotate;
>>
>>
>> //NOTE Ezt hivjuk le/felfuto elnel is ITbol
>> // read_encoder_sig(() ez csak azt mondja meg hogy 0 vagy 1 szint van az
>> adott PINen
>>
>>
>> void callback_menu_enc()
>> {
>>      RotaryCurrentState = ( (read_encoder_sig(ROT_ENC_PORT,
>> ROT_ENC_TRIGGER
>> ) << 1) |
>>
>>   read_encoder_sig(ROT_ENC_PORT, ROT_ENC_DIRECTION ));
>>    RotaryTransition = (RotaryTransition <<2 ) | RotaryCurrentState;
>>    RotaryPosition = RotaryPosition + states[RotaryTransition & 0x0F];
>>
>>    //CW Transition
>>    if (RotaryPosition == 4)
>>    {
>>      e = LEFT;
>>      RotaryPosition = 0;
>>    }
>>    //CCW Transition
>>    else if (RotaryPosition == -4)
>>    {
>>      e = RIGHT;
>>      RotaryPosition = 0;
>>    }
>>      else
>>      {
>>          e = WAITING; // ez is kell
>>      }
>>
>>      switch(e) {
>>          case LEFT:
>> //
>>          break;
>>
>>       case RIGHT:
>> //
>>          break;
>>
>>          case WAITING:
>>          default:
>>                  break;
>>          }
>> }
>>
>> Remelem nem maradt le semmi ;)
>>
>> Szabi
>> -----------------------------------------
>>            elektro[-flame|-etc]
>>
>>
>>
> -----------------------------------------
>          elektro[-flame|-etc]
>


More information about the Elektro mailing list