Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: ipek - 16 Ocak 2017, 22:41:32

Başlık: 12F675 Servo Motor
Gönderen: ipek - 16 Ocak 2017, 22:41:32
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)
}
Başlık: Ynt: 12F675 Servo Motor
Gönderen: sifirzero - 16 Ocak 2017, 23:33:38
Ustam nerede derledin
Başlık: Ynt: 12F675 Servo Motor
Gönderen: ipek - 16 Ocak 2017, 23:55:29
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
Başlık: Ynt: 12F675 Servo Motor
Gönderen: sifirzero - 17 Ocak 2017, 00:04:07
Ccs c ile mikro c karışımı kodlar olmuş.resim gorunmuyor
Başlık: Ynt: 12F675 Servo Motor
Gönderen: sifirzero - 17 Ocak 2017, 00:08:21
Derlemiş hiç bir sorun yok sadece while (1)
Olan yeri while (true) yap
Başlık: Ynt: 12F675 Servo Motor
Gönderen: ipek - 17 Ocak 2017, 00:25:15
@serkan
bak simulasyon Port4'de en ufak kımıldama yok..

http://s8.dosya.tc/server3/mxaawu/Closed_Loop_Servo_Motor.rar.html
Başlık: Ynt: 12F675 Servo Motor
Gönderen: elektronik - 17 Ocak 2017, 01:22:18
//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ış.
Başlık: Ynt: 12F675 Servo Motor
Gönderen: sadogan - 17 Ocak 2017, 01:32:30
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.
Başlık: Ynt: 12F675 Servo Motor
Gönderen: sifirzero - 17 Ocak 2017, 08:57:17
Eve gidince bakayım hocam
Başlık: Ynt: 12F675 Servo Motor
Gönderen: ilyas KAYA - 17 Ocak 2017, 12:58:36
Ayrıca gp4 analog olarak belirtilmiş. Otomatik olarak giriş oluyor olabilir.
Ansel ı kontrol ediniz. Analog giriş yok ise Ansel ı sıfır yapın
Başlık: Ynt: 12F675 Servo Motor
Gönderen: pwm.c - 17 Ocak 2017, 16:13:51
ipek abi kodları bahsettiğin siteden indirip derledim. sanırım burası:
http://www.sportdevices.com/servo/servo.c (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
Başlık: Ynt: 12F675 Servo Motor
Gönderen: 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 ?
Başlık: Ynt: 12F675 Servo Motor
Gönderen: pwm.c - 17 Ocak 2017, 18:25:48
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.
Başlık: Ynt: 12F675 Servo Motor
Gönderen: ipek - 18 Ocak 2017, 00:27:17
@pwm.c
sağolasın linkten indirdim sonuç mükemmel..
Başlık: Ynt: 12F675 Servo Motor
Gönderen: omereliusuk - 24 Ocak 2017, 23:16:32
Pina4 opencollector pullup yapmadan logic 1 olmaz.