Tema: Re: Padekit pagaut bug'a (Arduino)
Autorius: ig
Data: 2015-07-08 10:49:35
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).
>