Oho, ačiū. Kolkas nepersiorientuosiu, bet išsisaugosiu ateičiai On 2015-06-17 0:02, lietuvys wrote: > Jei nuspręstum programuoti C, čia mano kodinta Atmega128, kiek pamenu, > veikė patikimai netgi prie pakankamai didelių enkoderio sūkių: > > > static volatile uint8_t A, B, Aold, Bold; > static volatile int32_t pos32; > > ISR(INT6_vect) > { > EIFR |= _BV(INTF6); > A = (PINE >> PE7) & 1; > if (A != Aold) > { > if (A ^ ((PINE >> PE6) & 1)) pos32--; else pos32++; > Aold = A; > } > } > > ISR(INT7_vect) > { > EIFR |= _BV(INTF7); > B = (PINE >> PE6) & 1; > if (B != Bold) > { > if (B ^ ((PINE >> PE7) & 1)) pos32++; else pos32--; > Bold = B; > } > } > > int main(void) > { > MCUCR = _BV(JTD);// This bit must be set twice within four cycles > to change its value. > MCUCR = _BV(JTD);// See p.258 of ATmega128 datasheet > ACSR = _BV(ACD); // Disable Analog Comparator to reduce power > consumption > > // Initialize IO pins > PORTB = _BV(PB7) | _BV(PB5) | _BV(PB0) | _BV(PB1) ; > DDRB = _BV(PB4) | _BV(PB6) | _BV(PB7); > DDRD = _BV(PD0) | _BV(PD1) | _BV(PD3) | _BV(PD4) | _BV(PD5) | _BV(PD7); > DDRE = _BV(PE1) | _BV(PE2) | _BV(PE3) | _BV(PE4); > > PORTD = _BV(PD0) | _BV(PD1); > PORTE = _BV(PE6) | _BV(PE7); > > // interrupts > EICRB = _BV(ISC60) | _BV(ISC70); > EIMSK = _BV(INT6) | _BV(INT7); > > _delay_ms(800); > sei(); > SpecInicializacija(...); > wdt_enable(WDTO_2S); > > int32_t tmp32; > for (;;) > { > _delay_ms(200); > cli(); > tmp32 = pos32; > sei(); > DideleFunkcija(...); > wdt_reset(); > if (SW_IS_PRESSED) // Resetinimas > { > cli(); > pos32 = 0; > sei(); > } > } > } > > > > On 2015.06.05 14:36, ig wrote: >> Paprasta programele seka variklio encoderio outputa, skaiciuoja >> "zingsniukus" ir kai padaromas pilnas apsisukimas (624 zingsniai), >> keiciama sukimosi kryptis. Ir taip "mojuoja" pirmyn atgal. >> >> Taciau karts nuo karto (mazdaug vienas is desimt ciklu), atsitiktinai >> variklis apsisuka maziau nei pilna apsisukima ir pradeda keisti krypti. >> pabandziau su serial.println isvedineti "c" reiksme kai keiciasi >> kryptis (t.y. if viduje - uzkomentuota eilute). >