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