Tema: Re: Padekit pagaut bug'a (Arduino)
Autorius: lietuvys
Data: 2015-06-17 00:02:39
<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 &gt;&gt; PE7) &amp; 1;<br>
      if (A != Aold)<br>
      {<br>
        if (A ^ ((PINE &gt;&gt; PE6) &amp; 1)) pos32--; else pos32++;<br>
        Aold = A;<br>
      }<br>
    }<br>
    <br>
    ISR(INT7_vect)<br>
    {<br>
      EIFR |= _BV(INTF7);<br>
      B = (PINE &gt;&gt; PE6) &amp; 1;<br>
      if (B != Bold)<br>
      {<br>
        if (B ^ ((PINE &gt;&gt; PE7) &amp; 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>