[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