[ shpiki @ 23.11.2009. 23:15 ] @
Pozdrav svima.
htedoh pokrenuti koracni motor pomocu PIC.a i imam problem. Naime, motor "zakuca" na jednom mestu, ne znam gde je problem, okacicu source i shemu
i molio bih za pomoc. Program je pisan u mikroC.

Code:
unsigned char i=0;

void interrupt() {

if(PORTB.B0){
   if(INTF_Bit){
      INTCON=0b10010000;   //ukljucuje TMR0 (unutrasnji clock)
      TMR0=65;
      if(T0IF_Bit){
         if(i<=3){
            PORTA=2^i;
            i++;
            }
         i=0;
      }
   }
   INTF_Bit=0;
   T0IF_Bit=0;
   INTCON=0b10110000;     //iskljucuje TMR0
}
}

void main() {
OPTION_REG=0b00000000;  //pull-up otpornici enabled; prescaler 1:2
INTCON=0b10010000;      //global interrupt ukljucen; RB0/int ukljucen
TRISA=0;                //svi izlazni
TRISB=0b00000001;       //RB0 ulazni, ostali izlazni
PORTA=0;                // pocetno stanje
PORTB=0;                // jednako 0

while(1) {}

}


Unapred hvala!
[ rsinisa @ 23.11.2009. 23:47 ] @
Kao prvo, ne možeš da kačiš step motor direktno na kontroler. Možda u PROTEUS-u i može (nisam probao), ali u realnim uslovima nikako.
Kao drugo, ne treba ti onaj externi oscilator u simulaciji; obriši to i u properties upiši frekvencu na kojoj ti radi PIC.
Kao treće, imaš sasvim dovoljno instrumenata u PROTEUS-u da možeš da otkriješ gde je problem.
Kao četvrto, prelažem da pročitaš PDF-ove za L297 i L298; naučićeš mnogo, veruj mi.
Kao peto, ne vidim zašto za test koristiš TMR0? Imaš verovatno neku komandu "pauza" pa upotrebi nju. Da sam na tvom mestu za početak bih testirao sa pojedinačnim kombinacijama i pauzama izmedju njih.

Pozdrav.
Sinisha

[ Branislav83 @ 24.11.2009. 17:14 ] @
Ovo sam radio nekad ranije za neki seminarski zadatak. Nije nesto narocito, ali je zgodno za ucenje. Obrati paznju kako sam pokrenuo motor, a ostalo nemoj da te brine (nije toliko bitno).
Imas kompletan MikroC projekat i simulaciju. Kasnjenje je radjeno sa ugradjenim rutinama za kasnjenje u MikroC-u.
Pozzz



sema i kod
[ shpiki @ 26.11.2009. 22:03 ] @
Zahvaljujem na odgovorima, pronasao sam gresku, ako nekog interesuje, mogu da okacim novi kod.

@Branislav83:
primer ti je super, dosta stvari na jednom mestu! Hvala jos jednom!

Pozdrav!
[ Branislav83 @ 27.11.2009. 12:18 ] @
>
Pa postavi, što da ne. Možda još neko bude imao sličan problem.
[ shpiki @ 27.11.2009. 13:20 ] @
ovako:
-prvo: prescaler: po mojim podesavanjima, faza bi se menjala za nekih cca. 190nS
-drugo: PORTA=2^i u C-u ne radi, ^ je u stvari XOr operacija
(ako neko zna kako da odradim x^n u C neka javi :) )
-trece: isao sam If u If petlju (sto bi mozda radilo na nekom boljem PIC.u), na 84a prebrzo punim stack.
znaci, treba prvo da proverim da li se desio interupt na RB0 (pritisnut taster) a tek onda u drugoj If petlji
(van ove prve) proveravam da li se tajmer napunio, itd..

evo koda:
Code:
unsigned char i=0;

void interrupt() {

//ako se desio interrupt na RB0
//postavi vrednosti za TMR0 i postavi T0IE na 1
//(TMR0 Overflow Interrupt Enable bit)
if(INTF_Bit){
     INTCON=0b10111000;
     TMR0=22;
     INTF_Bit=0;
     }

//ako se timer napunio i postavio T0IFlag na 1
//ukljucuje odg pin PORTa B (zavisi od i)     
if(T0IF_Bit){
     T0IF_Bit=0;
          switch(i){
          case 0: PORTA=1;  break;
          case 1: PORTA=2;  break;
          case 2: PORTA=4;  break;
          case 3: PORTA=8;  break;
          }
          
 i++;
if(i>3) i=0;

T0IF_Bit=0;
TMR0=22;
          
}
}

void main() {
OPTION_REG=0b00000111;   //prescaler 1:256
INTCON=0b10010000;
TRISA=0;
TRISB=0b00000001;

PORTA=0;
PORTB=0;
while(1) {}
}


Hvala kolegi zivadin_despot na pomoci!

Pozdrav!