Miki,
Evo ti jedno parče koda za inkrementalne enkodere, na 8 bit PIC, gde viši nibl B porta ima sposobnost provociranja hardverskog interrupta na bilo kakvu promenu.
Nije direktno ono što ti treba, ali će kao moguć pricip poslužiti.
Bio mi je potreban niži nibl od B porta, pa zato pravim gomilu šiftovanja.
U suštini to može i kraće kada se tretiraju samo potrebni pinovi.
Pozz
Code:
////////////////////////////////////////////
#define enc_blink RC3
#define a_in RB4
#define b_in RB5
#define z_in RB6
//ulevo se povecava broj encoder_count, za obrnuto zameniti a i b
///////////////////////////////////////////////////////////////////
unsigned char old_count=0,temp_count=0;
signed long encoder_count; //izlazna varijabla
const signed char table[] = {0,-1,+1,0,+1,0,0,-1,-1,0,0,+1,0,+1,-1,0};
void interrupt int_hand (void)
{
if(RBIF&&RBIE){
temp_count=PORTB;
if(temp_count & 0b01000000)encoder_count=0;
temp_count <<= 2;
temp_count >>= 6;
old_count = (old_count | temp_count);
encoder_count += table[old_count];
old_count <<= 6;
old_count >>= 4;
enc_blink^=1; //RC4, test pin
// citanje sve 4 tranzicije enkodera, max. 111KHz, tj. 9uS (za sve 4 tranzicije), kada je encoder_count int
// kada je encoder_count long, onda max. 95KHz, tj. 10,5uS.
// za letvu od 5um, max. brzina je 475mm/sek.
}
RBIF = 0;
}
//moguca je dodatna optimizacija, koriscen je ceo BPORT, nizi nibl se koristi za druge stvari.
//to je razlog ovih silnih siftovanja.
P.S.
Moguće je znatno ubrzanje i ovog kako stoji, korišćenjem asm SWAP za niži i viši nibl, no mrzelo me da pišem, a ovo mi je zadovoljavalo potrebe.
P.P.S.
Zaboravih,
U pitanju je bio PIC18F4620 na 40MHz (HSPLL)
[Ovu poruku je menjao macolakg dana 14.12.2013. u 11:30 GMT+1]
[Ovu poruku je menjao macolakg dana 14.12.2013. u 11:38 GMT+1]