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).
>