Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

12F675 Servo Motor

Başlatan ipek, 16 Ocak 2017, 22:41:32

ipek

netten buldum derlerken tek bir uyarı verdi,GPIO.4 'de hiç çıkış gözlemleyemedim,yazılımın init parametreleri hatalı olabilirmi ?

#include <12F675.H>
#fuses INTRC_IO,NOWDT,NOPUT //,NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(a)
#use rs232(baud=9600, xmit=PIN_A2)

//analog implementation
//AN0=target
//AN1=potentiomenter

//driver type:
//type 0: ch0-left, ch1-right,
//type 1: ch0-on/off, ch1-direction
#define driver_type 0

//output (type=0)
#define motorL    PIN_A4
#define motorR 	PIN_A5

//output (type=1)
#define motorON   PIN_A4
#define motorDIR	PIN_A5

//PID
#define Kp 0.2 * 16
#define Ki 0.0 * 16
#define Kd 0.0 * 16

#define dead_band   1
#define offset     30
#define max_pwm    240
#define max_integration 20000
#define derivate_dead_band 10


#byte ADRESH=0x1e
#byte ADRESL=0x9e
#byte ADCON0=0x1f
#byte ANSEL=0x9f


#define get_analog(var) #asm \
	movf	ADRESL,w \
	movwf	&var \
	movf	ADRESH,w \
	movwf	&var+1 \
   #endasm

#define neg16(a) #asm \
  COMF   a,F \
  COMF   &a+1,F \
  INCF   a,F \
  BTFSC  03,2 \
  INCF   &a+1,F \
  #endasm

#define txd16(dato) putc((int)dato); putc((int)(dato>>8))

//long BARG;
#define sgn16(i) (bit_test(i,15))
int sign;
int16 target,pot,e,pwm,tmp,prev_e=0,derivate,integration=0;

void main()
{
int cont;

 set_tris_a(0b00001011);
 ANSEL=0b00010011;  //0:nc, 001:fosc/8, 0011:DDAA


 #if driver_type==0
 output_low(motorL); output_low(motorR);
 #else
 output_low(motorON);
 #endif

 while(true) //bucle
 {
   //Get analog channels

   //TARGET
   ADCON0=0b10000001; //1: Right, 0: vref=5v, 00:NC, 00: ch=0, 1: start, 1: AD_ON
   delay_us(100);
   bit_set(ADCON0,1); //start
   while(bit_test(ADCON0,1));
   get_analog(target);

   //POTENTIOMETER
   ADCON0=0b10000101; //1: Right, 0: vref=5v, 00:NC, 01: ch=1, 1: start, 1: AD_ON
   delay_us(100);
   bit_set(ADCON0,1); //start
   while(bit_test(ADCON0,1));
   get_analog(pot);

//** IMPLEMENTS PID *******
   pwm=0;
   e=target-pot; //error
   derivate=e-prev_e; prev_e=e; //derivate

   if((e>dead_band) || (e+dead_band<0))
   {
      //integrative
      integration=integration+e;

      //Kp
      sign=false;
      if (sgn16(e)) { sign=true; neg16(e); }
      pwm=e*Kp; pwm=pwm>>4;
      if (sign) neg16(pwm);


      //Kd
      sign=false;
      if (sgn16(derivate)) { sign=true; neg16(derivate); }
      if(derivate>derivate_dead_band)
      {
        tmp=derivate*Kd; //tmp=tmp>>4;
        if (sign) neg16(tmp);
        pwm=pwm+tmp;
      }
   }

   //Ki
   sign=false;
   if (sgn16(integration)) { sign=true; neg16(integration); }
   if (integration>max_integration) integration=max_integration;    //check limits
   tmp=integration; tmp=tmp>>4;
   tmp=tmp*Ki; tmp=tmp>>4;
   if (sign) {neg16(tmp); neg16(integration) }
   pwm=pwm+tmp;

   tmp=pwm;
   if(pwm)
   {
      if(sgn16(tmp))
      {
         //negative
         #if driver_type==0
         output_high(motorL);
         #else
         output_high(motorON);
         output_high(motorDIR);
         #endif
         neg16(tmp);
      }
      else
      {
         //positive
         #if driver_type==0
         output_high(motorR);
         #else
         output_high(motorON);
         output_low(motorDIR);
         #endif
      }

      tmp+=offset;
      if(tmp>max_pwm) tmp=max_pwm;
   }

//************************

   //implements PWM
   for(cont=0;cont<255;cont++)
   {
     delay_us(50);
     if ((int)tmp==cont)
     {
       #if driver_type==0
       output_low(motorL); output_low(motorR);
       #else
       output_low(motorON);
       #endif
     }
   }
   #if driver_type==0
   output_low(motorL); output_low(motorR);
   #else
   output_low(motorON);
   #endif

/*     //monitor
     putc('0');  txd16(POT);
     putc(0x3c); txd16(TARGET);
     putc(0x3d); txd16(PWM);
*/
  } //while(1)
}

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

ipek

CCSC 4.093 ile bu header'i görünce bunun olacağını düşündüm,

[img][http://i.hizliresim.com/Anv7QB.jpg/img]
#include <12F675.H>
#fuses INTRC_IO,NOWDT,NOPUT //,NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(a)
#use rs232(baud=9600, xmit=PIN_A2

sifirzero

Ccs c ile mikro c karışımı kodlar olmuş.resim gorunmuyor
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

Derlemiş hiç bir sorun yok sadece while (1)
Olan yeri while (true) yap
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

ipek


elektronik

#6
//output (type=0)
#define motorL   PIN_A4
#define motorR   PIN_A5

//output (type=1)
#define motorON   PIN_A4 
#define motorDIR  PIN_A5   

aynı pinler iki defa tanımlanmış.

sadogan

Hocam, #define driver_type 0  ile sürücü tipi belirlemiş
sizin sürücü hangisine uygun bilmiyorum ama type 1 yaparak yeniden derleyip test edebilirsiniz.

sifirzero

Eve gidince bakayım hocam
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

ilyas KAYA

Ayrıca gp4 analog olarak belirtilmiş. Otomatik olarak giriş oluyor olabilir.
Ansel ı kontrol ediniz. Analog giriş yok ise Ansel ı sıfır yapın

pwm.c

ipek abi kodları bahsettiğin siteden indirip derledim. sanırım burası:
http://www.sportdevices.com/servo/servo.c
proteusta gp4 çıkışını alabildim burada sıkıntı yok gibi. derleyicinin verdiği uyarı ise şu kodlara:
if((e>dead_band) || (e+dead_band<0))

buradaki "e" isimli değişken unsigned olduğu için negatif değer alamaz ancak yukarıdaki if koşulunda sıfırdan küşük mü diye bakılmış. mantık hatası var diye bildirilmiş.
kodlarda belki başka hatalarda olabilir. uzun ve karmaşık olduğu için bulmakta zorlanıyorum. neyse, istersen benim hex dosyasını vereyim belki çalışır:

:1000000000308A0004280000FF238316900000308F
:100010008A00BB288E30A0003708A1003608A20055
:10002000A301A108031D1E282208A100A201083077
:10003000A002A108031D1E28A00126280310A11B51
:100040002528A20DA10DA0031E28A11308003A081F
:1000500003199728C2003E0803199728C2070318FE
:1000600038287F30C202031C9728031997283C28A0
:100070008130C207031897284208A000A101A201FD
:10008000A3013B08C600C6173C08C5003D08C400D4
:100090001830C200C301441C65284108A307031C93
:1000A0005728A20A031D5728A10A0319C31740089D
:1000B000A207031C5E28A10A0319C3173F08BC004E
:1000C000BC173C08A1070318C317C30DA10CA20C51
:1000D000A30CC60CC50CC40C0310C20B4A2801307B
:1000E000A00703189728A11B7C28C60DA30DA20DFD
:1000F000A10DA00303199728C61F8D28A30A031D6D
:100100008D28A20A031D8D28A10A031D8D28A10C8C
:10011000A20CA30CA00A031997283B08C3003F08B0
:10012000C306C31F9528A1179B28A1139B28A001D4
:10013000A101A201A30108008E30A0003608A00290
:100140003708A2003808A100A217A0080319B32895
:100150000310A208031DAF28A1080319B328A20C9D
:10016000A10CA00BA828B71FBA28A109A209A10AAF
:100170000319A20A080003081F3983000515B001FE
:10018000AF01B401B3011F1383161F109F101F117D
:100190009F110730831299000B30831685001330AE
:1001A0009F0083120512851281309F002130A0002C
:1001B000A00BD8289F149F18DB2883161E088312D3
:1001C000A5001E08A60085309F002130A000A00BCE
:1001D000E7289F149F18EA2883161E088312A70099
:1001E0001E08A800AC01AB0127082502A9002608BB
:1001F000AA002808031C280FAA022F082902B10010
:100200002A08B2003008031C300FB2022A08B000DE
:100210002908AF00AA08031D1B292908013C03185F
:10022000CA291B2901302907B6002A08B70003187C
:10023000B70A001CCA292908B3072A0803182A0F7D
:10024000B407A401AA1F2B290130A400A909AA09F7
:10025000A90A0319AA0A2A08B7002908B6000A2021
:100260002308BD002208BC002108BB002008BA00FA
:10027000CD30C100CC30C0004C30BF007C30BE005F
:1002800027202308B9002208B8002108B700200859
:10029000B6002308BD002208BC002108BB002008CE
:1002A000BA00C101C001BF018330BE00272023086E
:1002B000B9002208B8002108B7002008B6009C2029
:1002C0002208AC002108AB00AC0CAB0CAC0CAB0CA6
:1002D000AC0CAB0CAC0CAB0C0F30AC05A408031988
:1002E0007629AB09AC09AB0A0319AC0AA401B21F09
:1002F00080290130A400B109B209B10A0319B20A78
:10030000B208031D872931080A3C0318CA2932089C
:10031000B7003108B6000A202308BD002208BC003F
:100320002108BB002008BA00C101C001BF01BE0105
:1003300027202308B9002208B8002108B7002008A8
:10034000B6002308BD002208BC002108BB0020081D
:10035000BA00C101C001BF018330BE0027202308BD
:10036000B9002208B8002108B7002008B6009C2078
:100370002208AE002108AD00A4080319C429AD0964
:10038000AE09AD0A0319AE0A2D08AB072E080318F3
:100390002E0FAC07A401B41FD4290130A400B30967
:1003A000B409B30A0319B40A34084D3C0318E3290D
:1003B000FF3A031DDF293308203C0318E3294E30A0
:1003C000B4002030B3003408AE003308AD00AE0CEA
:1003D000AD0CAE0CAD0CAE0CAD0CAE0CAD0C0F30CC
:1003E000AE052E08B7002D08B6000A202308BD0070
:1003F0002208BC002108BB002008BA00C101C001CE
:10040000BF01BE0127202308B9002208B800210837
:10041000B7002008B6002308BD002208BC00210850
:10042000BB002008BA00C101C001BF018330BE007B
:1004300027202308B9002208B8002108B7002008A7
:10044000B6009C202208AE002108AD00AE0CAD0C19
:10045000AE0CAD0CAE0CAD0CAE0CAD0C0F30AE0551
:10046000A40803193D2AAD09AE09AD0A0319AE0A65
:10047000B309B409B30A0319B40A2D08AB072E084F
:1004800003182E0FAC072C08AE002B08AD002B086C
:100490002C040319632AAE1F542A0516AD09AE09B0
:1004A000AD0A0319AE0A552A85161E30AD0703188A
:1004B000AE0AAE08031D602A2D08F03C0318632A1B
:1004C000AE01F030AD00B501350F672A742A103047
:1004D000A000A00B692A000035082D02031D722A16
:1004E00005128512B50A642A05128512D428630004
:02400E00F411AB
:00000001FF
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

ipek

@pwm.c

enteresan senin Hex dosyasını kopyala yapıştır yaptım GPIO.4'den çıkış alabildim.
şimdi bizim derleyicimi hatalı derliyor,yoksa kod'da bir değişiklikmi yaptın sorusu kemirdi beni ,evet o sitede bulmuştum..

ikinci şık ise CCSC PCW derlediği Hex dosyasın Footer'ine günün tarihini ve seçilmiş işlemcinin adını verir acaba sen bunu XC8'demi derledin ?

pwm.c

Alıntı yapılan: ipek - 17 Ocak 2017, 16:55:51
@pwm.c

enteresan senin Hex dosyasını kopyala yapıştır yaptım GPIO.4'den çıkış alabildim.
şimdi bizim derleyicimi hatalı derliyor,yoksa kod'da bir değişiklikmi yaptın sorusu kemirdi beni ,evet o sitede bulmuştum..

ikinci şık ise CCSC PCW derlediği Hex dosyasın Footer'ine günün tarihini ve seçilmiş işlemcinin adını verir acaba sen bunu XC8'demi derledin ?
kodları CCS C 5.065 ile derledim.
pic numarası ve tarih bilgilerini buraya eklerken kendim silmiştim (karışıklık olmasın diye). bilgisayardaki hex dosyasında hepsi duruyor.
bu derleyicilerde eski ve yeni versiyon çok farkeder. forumda benim kullandığım versiyonun linki mevcut oradan indirip deneyebilirsiniz.
ayrıca CCS C kodlarını XC8 derleyemez. aynı picbasicpro ve proton gibi basic yapılı olmasına rağmen çok farklı derleyicilerdir. proton'un bazı komutları karşılığı picbasicpro'da olmuyor. CCS de aynı böyle.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

ipek

@pwm.c
sağolasın linkten indirdim sonuç mükemmel..

omereliusuk

Pina4 opencollector pullup yapmadan logic 1 olmaz.