Inkrementalni cidlo - cudlik

Miroslav Mraz mrazik na volny.cz
Sobota Červenec 23 19:54:41 CEST 2016


No pokud Chip_GPIO_ReadPortBit vrací jen 0 nebo 1, pak je možné použít 
XOR a napsat třeba:

int kol1test() {
   uint8_t pinKol1a=Chip_GPIO_ReadPortBit(LPC_GPIO, KOL1_aPort, KOL1_aPin);
   uint8_t pinKol1b=Chip_GPIO_ReadPortBit(LPC_GPIO, KOL1_bPort, KOL1_bPin);
   if (pinKol1a ^ pinKol1b) return +1;
   else                     return -1;
}

void PIN_INT0_IRQHandler() { // KOL1a
    Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(KOL1_aIntInd));
    sysKol1n += kol1test();
}

void PIN_INT1_IRQHandler() { // KOL1b
    Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(KOL1_bIntInd));
    sysKol1n -= kol1test();
}
Ruku do ohně za to nedám, ale mělo by to chodit.

Mrazík

Dne 23.7.2016 v 15:06 Pavel Hudecek napsal(a):
> Dobrý den všem,
>
> vím že se tu na to párkrát někdo ptal. No a já to občas do něčeho dělám.
> Zajímavé je, že mi to pokaždé vyjde jinak složité. Teď mi to zrovna zase
> vyšlo velice elegantně, tak se musím pochlubit a třeba se to někomu bude
> hodit:
>
> static volatile uint8_t pinKol1a=1, pinKol1b=1, pinKol2a=1, pinKol2b=1;
>
> void kol1test() { //
> ==================================================================================
>
>    pinKol1a=Chip_GPIO_ReadPortBit(LPC_GPIO, KOL1_aPort, KOL1_aPin);
>    pinKol1b=Chip_GPIO_ReadPortBit(LPC_GPIO, KOL1_bPort, KOL1_bPin);
> }
>
> void PIN_INT0_IRQHandler() { // KOL1a
> =================================================================
>    Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(KOL1_aIntInd));
>    kol1test();
>    if (pinKol1a && pinKol1b || !pinKol1a && !pinKol1b) sysKol1n--; else
> sysKol1n++;
> }
>
> void PIN_INT1_IRQHandler() { // KOL1b
> =================================================================
>    Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(KOL1_bIntInd));
>    kol1test();
>    if (pinKol1a && pinKol1b || !pinKol1a && !pinKol1b) sysKol1n++; else
> sysKol1n--;
> }
>
> Pak se ještě v milisekundovém přerušení testuje, zda je sysKolXn
> dělitelný 4 a pokud ano, hodnota dělená čtyřmi se bere jako výsledek.
>
> Funguje zcela spolehlivě a to i přesto, že se jedná o čudlík s
> mechanickými kontakty určený k ručnímu kroucení (testováno el.
> šroubovákem).
>
> Jen u toho ifu mě warning otravuje, že prý by doporučoval závorky. Já si
> ale myslím, že by to jen znepřehlednily. Ale nevím, jak ho vypnout
> (nejlépe lokálně, aby jinde a jindy prudit mohl).
>
> PH
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>


Další informace o konferenci Hw-list