[elektro] STM32F4 EXTI rotary encoder

uprogc . uprogc at gmail.com
Sat Jun 27 20:10:20 CEST 2015


Eddig igy volt megoldva, de IT-ben ez nem mukodik nekem.

rotate check_encoder() // returns the state of the encoder
{
static  rotate e = WAITING;
static  uint8_t waitcount = 0;
// enc_INPUT_reg, enc_trigger
if ( ((~ROT_ENC_PORT->IDR) & ROT_ENC_TRIGGER) != 0)  { //  trigger signal
if ( ( ( ~ROT_ENC_PORT->IDR) & ROT_ENC_DIRECTION) != 0)  { // left or right?
if (e != LEFT) // debounce for polling
waitcount++;
e = LEFT;
} else {
if (e != RIGHT) // debounce for polling
waitcount++;
e = RIGHT;
}
} else {
e = WAITING;
waitcount = 0;
}

if (waitcount > 1) { // only give a L/R value after non-wait
// transition
waitcount = 0;
return e;
} else
return WAITING; // ignore
}

Ezert valasztottam a komplexebb megoldast, amit be is linkeltem. Annal meg
ket IT-t hasznal, egyben. Tudom lehet kulon is,...Mindent lehet, a kerdes
az lett volna, hogy jo-e az elkepzeles azokra a reszletekre nezve amit az
elobb bemasoltam, vagy nem.

Koszi.

Szabi

2015-06-27 20:49 GMT+03:00 elight <elight at gmail.hu>:

> Nem értem és nem látom be
> miért kell két interrupt kezelése egy encoderhez????
>
> Mondtam más , az egyik bit fel és lefutását kell egy INT vonalon figyelni..
> Minden jelszint váltás interruptot okoz majd , ha a polarity bitet
> közben mozgatod..
> Tehát ha éppen "lefutott" INT van akkor a következő csak "felfutott"
> jel lehet "Rise/Fall váltakozik"  .
>
> Minden élváltás után  összehasonlítod a két bitet
> és ezek alapján tevékenykedhetsz..
> Tehát mondjuk veszel egy regisztert , irányítasz rá
> egy pointert.. és a pointer ahova mutat
> azt növeled, / csökkented.
> De növelheted csökkentheted ötösével is pl..
> Ez megoldható egy fleggel, amit a tengelyen lévő kapcsoló
> billentget.. Ha megnyomod, 5 -ötösével ugrik
> ha megnyomod mégegyszer akkor egyeséve ugrál és újra nyomva
> megint ötösével.
>
> A lényeg ilyesmi:
>
> Az int eseményből meg kell hívni az encoder függvényt
>   akkor   ha az az esemény bekövetkezett (élváltás A ).
>
>
> void( encoder_isr(void)
> {
>
>     unsigned char encoder;
>
>     encoder = ENC_PORT;       //  Itt beolvasod a protot ami a két bitet
> is tartalmazza, mondjuk B0 és B1
>                                             //  A B0 port váltása okozta
>    az interruptot.
>
>     Enc_New_X =  ( encoder & mask );       //  ahol a mask a két bitre
> mutat pl:  0b00000011
>
>     if(    Enc_New_X.F0   != Enc_New_X.F1 )           // a két bit
> összehasonlítása
>    {
>         // itt kezelhetők a encoder ++  műveletek   pl.
>
>          if( (*ps_Enc_Buffer_Point)  <   s_Enc_Maximum  )   // meg kell
> nézni elpörgött e a határig.
>         {
>                 (*ps_Enc_Buffer_Point) ++; //  ha nem még növelhető
>                MENU_EVENT_FL = 1;
> //  Pl.  Menü változás történt, a kijelzésen is kezelni kell majd
>                     //....
>          }
>
>
>    }
>    else
>    {
>
>          if( (*ps_Enc_Buffer_Point)  >   s_Enc_Minimun )   // meg kell
> nézni elpörgött e a határig.
>         {
>                 (*ps_Enc_Buffer_Point) --; //  ha nem még csökkenthető
>                MENU_EVENT_FL = 1;
> //  Pl.  Menü változás történt, a kijelzésen is kezelni kell majd
>                     //....
>          }
>
>
>    }
>
> }
>
> Értelem szerűen a változókat létre kell hozni, illetve a kívánt
> működésmódokat is...
> Ha magát  a pointert mozgatod a fókusz áthelyezheted egy másik értékre is..
>
> Üdv István
>
>
>
>
>
>
>
>
>
>
> 2015-06-27 18:02 keltezéssel, uprogc . írta:
> > ui: Talan igy ?
> >
> > EXTI4_15_IRQHandler(void)
> > {
> >
> > if (EXTI_GetITStatus(EXTI_Line4) != RESET ||
> EXTI_GetITStatus(EXTI_Line5) !=
> > RESET)
> > ...
> >
> > }
> >
> >
> > 2015-06-27 18:56 GMT+03:00 uprogc . <uprogc at gmail.com>:
> >
> >> Szia,
> >>
> >> Koszi.
> >>
> >> Kozben talaltam valamit, ki fogom probalni:
> >>
> http://electronics.stackexchange.com/questions/99915/stm32-rotary-encoder-with-hardware-interrupts
> >> Meg lehet azt csinalni, hogy az EXTI4 es az EXTI5 egy IT-be fusson be ?
> >>
> >>
> >> U,
> >> Szabi
> >>
> >> 2015-06-26 19:27 GMT+03:00 elight <elight at gmail.hu>:
> >>
> >>> Na   EZ nekem is jól jött volna , amikor elkezdtem ezzel foglalkozni !
> >>> :-) :-) :-)
> >>>
> >>>
> >>> http://embedded-lab.com/blog/?p=9149
> >>>
> >>> Üdv István
> >>>
> >>>
> >>>
> >>> 2015-06-26 13:11 keltezéssel, elight írta:
> >>>> Szia
> >>>>
> >>>>
> >>>> az EXTI jól működik... ha jól konfigolod...
> >>>> Rakj külső felhúzót ,
> >>>> és ha optikai , nem is  kell a kondi.
> >>>> Az exti-nél a jel polarity-t kell minden megszakításnál
> >>>> váltogatni.. És az akkor vett minták alapján a forgatás könnyen
> >>>> kitáblátozatolható.. Nem volt ezzel gondom..
> >>>> Olyan gyors, ahogy tekereg...
> >>>>
> >>>> Üdv István
> >>>> 2015-06-26 13:01 keltezéssel, uprogc . írta:
> >>>>> Sziasztok,
> >>>>>
> >>>>> Eddig Systick-el olvastam be a rotary enkodert, kb 3 ms-ra van
> allitva,
> >>>>> mukodik.
> >>>>> Mivel tobb lepesu optikai enkodert szeretnek majd hasznalni a
> >>> mechanikus
> >>>>> helyett, gondoltam atteszem EXTI-re. Hat nem mukodik.
> >>>>> Gondoltam prell van, 100nF-100pF -ig tobb erteket kiprobaltam, de nem
> >>>>> jo.
> >>>>> Meg a 100 pF-al is mintha belassulna, de inkabb bedoglik. Meg a lassu
> >>>>> lepeseket sem veszi.
> >>>>>
> >>>>> Erdemes kulsofelhuzo ellenallassal es kondival megprobalni ?
> >>>>> Egyeb otlete valakinek otlete ezzel kapcsolatosan?
> >>>>> (Bekotesek jok ;) )
> >>>>>
> >>>>> U,
> >>>>> Szabi
> >>>>> -----------------------------------------
> >>>>>             elektro[-flame|-etc]
> >>>>>
> >>> -----------------------------------------
> >>>            elektro[-flame|-etc]
> >>>
> >>
> > -----------------------------------------
> >            elektro[-flame|-etc]
>
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list