[ developer94 @ 09.01.2012. 15:17 ] @
Jel' iko eksperimentisao sa X-ovim softverskim simulatorom, i dal ste uspeli da naterate stimulus da radi kako treba?
Pokusavam da simuliram enkoder, mada mi to bas ne ide od ruke, posto ulaz koji simulira em ne odgovara ocekivanom, em nemogu da nadjem smislenu sekvencu koju stimulus salje.

Ideja je da initial-low signal krene prvi, sa high i low trajanjima po 2 ciklusa, a initial-high sa istim krene jedan ciklus kasnije. To bi trebalo da salje signal identican enkoderovom u toku kretanja, medjutim to nije slucaj.

Ovako izgleda konfiguracioni prozor stimulusa kod mene, pa ako neko moze da proba na praznoj aplikaciji i da mi javi sta dobija, bio bih veoma zahvalan!
[ bogdan.kecman @ 09.01.2012. 15:31 ] @
ja sam potrosio ceo jedan dan pokusavajuci da simuliram nesto u mplabx-u i zakljucio sam da mi je mnogo brze da iznabadam sve na breadboard i isprobam / izdebagiram nego da simuliram kroz mplabx... posebno sa komentarima od strane microchip-a tipa "stimulus is dark art" i slicnim idiotlucima ... generalno fali dokumentacija i to ozbiljno fali dokumentacija


znam da ti nista nisam pomogao, al bar znas da nisi jedini :D
[ developer94 @ 09.01.2012. 16:17 ] @
To je vise od pomoci, posto sad necu potrositi ceo, vec samo pola dana!
Inace problem je sto nemam ni jedan ICD (tacnije imam mikroICD na EasyPIC 4, ali naravno nije kompatibilan sa Microchip-ovim alatima), a bogme nemam ni enkoder kojim bi testirao ovo, bar za sad.

Nista, znaci ne gine mi rucna simulacija plus neki dodatni USB to COM debug kog se posebno bojim jer vec zadnjih 200tinjak linija nisam imao cvrst dokaz da kod idalje funkcionise u praksi...

Interesantno je to sto je stimulus UI uradjen prilicno intuitivno, i na prvi pogled deluje fleksibilno, sto i jeste. Bez pogleda na dokumentaciju koja dolazi uz MPLAB X a koja ima par zanimljivih stvarcica kao referenca koje ja nisam nalazio u drugim dokumentima, mi je bilo jasno kako treba da ga isprogramiram da *khm*radi*khm* ono sta ocu. Sve deluje sjajno, samo greota sto tako i ne radi...
[ bogdan.kecman @ 09.01.2012. 18:22 ] @
30eur je pickit3 klon od olimex-a (comet diluje olimex stvari, treba videti posto je kod njih ako nemas nacin da narucis preko ebay-a ili direkt iz olimexa, oni prodaju i original pickit3 pa vidi sta ti je jeftinije)... to treba imati u svakom slucaju, mikroICD je zanimljiv ali na zalost, beskoristan ako ne koristis mikroC (ili mikroBasic, mikroPascal) a ja sam ih batalio, C18, C30 i C32 su ipak bolje resenje po mnogo cemu (a paskal i basic me ne zanimaju), ja sam cak svoj stari easypic3 prepravio bio da radi sa pickit2, skinuo sam mu ceo njegov mikroICD deo i nabudzio pk2 :D ... ne znam ni gde mi je sad taj easypic, dal sam ga nekome dao ili pozajmio ... davno je to bilo ..

elem, ne znam koji ti je pic u pitanju, ako je neki 18F mozes na brzaka da napravis pickit2 klon (ili kupis na forumu za 2000din), ako je nesto jace onda je pk3 ipak bolje resenje (ICD je preskup, jeste brzi ali ... previse je to para za hobi)
[ bogdan.kecman @ 09.01.2012. 18:28 ] @
inace za enkoder ... ja volem da ga turim na interapt pinove i onda to radi bez problema ... evo ti primer za 18F2550

Code:

...

volatile signed int encoder = 0;
signed int encoderMAX = 1023;
signed int encoderMIN = 0;

#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
  _asm GOTO low_isr _endasm
}

#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
  _asm GOTO high_isr _endasm
}

#pragma code
#pragma interruptlow low_isr
void low_isr (void)
{
  if (INTCON3bits.INT1IF){              //ENC1 rising edge
      if (PIN_E2){
          if (encoder > encoderMIN) encoder--;
      } else {
          if (encoder < encoderMAX) encoder++;
      }
      changed = 1;
      INTCON3bits.INT1IF = 0;
  } else if (INTCON3bits.INT2IF){       //ENC2 rising edge
      if (PIN_E1){
          if (encoder < encoderMAX) encoder++;
      } else {
          if (encoder > encoderMIN) encoder--;
      }
      changed = 1;
      INTCON3bits.INT2IF = 0;
  }
}

...
    //setup interrupt 1 and 2 where encoder A and B inputs are
    INTCON2bits.INTEDG1 = 1; //INT1 on rising edge
    INTCON2bits.INTEDG2 = 1; //INT2 on rising edge
    INTCON3bits.INT2IP  = 0; //INT2 low priority
    INTCON3bits.INT1IP  = 0; //INT1 low priority
    INTCON3bits.INT2IE  = 1; //INT2 enable
    INTCON3bits.INT1E   = 1; //INT1 enable
    INTCON3bits.INT2IF  = 0;
    INTCON3bits.INT1IF  = 0;

    INTCONbits.GIEH   = 1;
    INTCONbits.GIEL   = 1;

...



mozes i da stavis samo A ili B na interrupt a drugi signal sa enkodera da stavis na obican pin i imas interrupt samo na jedan ulaz, to isto radi ok ..
[ developer94 @ 09.01.2012. 21:09 ] @
Imam ideju kako cu da uradim enkoder, mada ovaj tvoj primer mi bas nije najjasniji... Pokusao sam da simuliram u glavi, pa i na papiru, i ako sam dobro shvatio ovo bi vrtelo encoder varijablu u krug. (tacnije 0,1,2,1,0,1,2,1 itd.)
Moze li objasnjenje rada tog cuda?

Edit: Moja greska, preskocio sam cinjenicu da racuna na svaku rastucu ivicu, izvinjavam se!

[Ovu poruku je menjao developer94 dana 09.01.2012. u 22:32 GMT+1]
[ bogdan.kecman @ 10.01.2012. 05:48 ] @
za CW imas rastucuA rastucuB opadajucuA opadajucuB

mozes da vatas sve ivice i dobijes extra preciznost mada je to preveliko cimanje, mozes da vatas samo rastucu ili samo opadajucu ivicu na A i na B ili samo da vatas rastucu ili opadajucu samo na A ili B

najjednostavnije je da radis samo jednu ivicu samo jednog izlaza. To je najmanja rezolucija ali ubedljivo najjednostavnije za izvedbu

1. stavis da ti je A vezan za interrupt pin (na primer EXT)
2. napravis interrupt na tom pinu (npr rastuci)
3. izlaz sa B stavis na obican input pin (Bez interrapta)

i onda radis samo:

Code:

interrupt (void)
{
  if (tvoj_interrupt){              //RASTUCA IVICA NA A
      if (ako je B==1){            //dakle interapt je bio na rastuce A tako da je A sigurno 1, ako je i B 1 onda znaci da idemo u rikverc
          if (encoder > encoderMIN) encoder--;
      } else {                          //ovde je dakle A1 a B je 0, dakle idemo napred
          if (encoder < encoderMAX) encoder++;
      }
  }
}


e sad, ovo ti je idealno za rucni enkoder, ono za menije i slicno, ako oces max rezoluciju sa nekog enkodera sa motora i slicno onda mozes da turis i A i B na on change i imas nesto tipa (ovo nije provereno, sad cukam iz glave)

Code:

interrupt (void)  //ovo je interrupt on change za te pinove
{
 if (overi el tvoj interrupt){
    if (A=1){
      if (A==B) encoder++ else encoder--;
    } else {
      if (A==B) encoder-- else encoder++;
    }
 }
}


ova varijanta ti daje najvecu preciznost zato sto brojis korak i na uzlaznoj i na silaznoj ivici oba signala, obrati samo paznju da IOC ima svoje limite sto se tice brzine, proveri datasheet ali ako imas neke 800 ili 1600 koracne enkodere koji trce u hiljadama rpm trebace ti neki zahebano brz mcu da to pokupi...

inace isplati se turiti jedan 7474 i resiti problem :) ustedis nekoliko taktova na mcu-u u svakom interaptu, zavisno koliko je opterecen mcu to moze da bude znacajno poboljsanje
[ developer94 @ 10.01.2012. 13:26 ] @
Uradio sam enkoder, slicno ovom prvom kodu. Inace ovo za 7474 je odlicna ideja! Bas se razmisljam upravo da li cu moci da spakujem sve, posto treba jos par stvari da naguram u interapt, a nemam osecaj kad je dosta, posto slabo radim embedded programiranje...
Odosmo off-topic opet, al hvala za pomoc, mnogo znaci!
[ grabik @ 10.01.2012. 21:56 ] @
U farnellu DSPIC30F2010 bilo 20mips ili 30mips verzija je jeftinija od pic18f2550, prvi ima hardversku podrsku za enkoder ,nema za USB.

Recimo radio sam sa DSPIC30F4012 sa PID napisanim u C-u pogoni DC servo motore sa enkoderima rezolucija od 2k bez problema , ne trebaju nikakvi vanjski IC osim ako hoces da iskoristis i diferencijalni enkoder onda ti recimo treba jedan SN75115.
[ mnn @ 04.03.2012. 07:05 ] @
Kako doći do ovih stvari kao što su u Mplab-u 8 :Watch ,Stopwatch,File registers ili Special Function Registers...
[ grabik @ 04.03.2012. 10:58 ] @
Window->Debugging

U stvari imas snimljen citav tutorijal, ne znam u cemu je problem pogledati iste.