CCS C cho PIC/dsPIC phiên bản 4.xxx

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • phu_vinh77
    Nhập môn đệ tử
    • Apr 2010
    • 5

    #226
    Các anh các bạn các vị tiền bối ơi, sao em đọc thấy nhiều topic nói mà ko thấy trả lời.
    CCS có hổ trợ compiler cho dsPIC ko vậy ạ.
    Em cảm ơn.

    Comment

    • hamster.khin
      Đệ tử 1 túi
      • Sep 2010
      • 16

      #227
      giúp code điều khiển động cơ

      Nguyên văn bởi popeye_ts22 View Post
      Chào các bác.Có chút vướng mắc,các bác giúp em với.
      Mục đích:Điều khiển động cơ phản hồi tốc độ về LCD
      Thực hiện:Điều khiển được động cơ nhưng chưa phản hồi đc.
      Em không biết sau mỗi lần gọi ngắt có cần phải để 1 vòng while() để đợi ngắt không.
      Em dùng 16F877A,bây giờ điều khiển 1 kênh đã phải cần:TIMER2-PWM,TIMER 0:Đếm xung,TIMER1:Đếm thời gian,dùng để tính toán vận tốc.
      Vậy nếu em dùng động cơ thứ 2 phải làm thế nào,có thuật toán nào ko ạ.
      Có đoạn code và chương trình mô phỏng,các bác xem cho em:
      Code:
      #include <16f877a.h>
      #include <def_877a.h>
      #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
      #use delay(clock=8000000)
      #include <lcd_lib_4bit.c>
      int16 cnt,cnt2,xung,v;
      int8 a,b,c;
      #int_TIMER0
      void  TIMER0_isr(void) //TIMER0 dem xung ve
      {
      set_timer0(255);
      if(tmr0if==1)
       {
       cnt++;
       tmr0if=0;
       }
      }
      #int_TIMER1           //TIMER1 dem tgian,tinh van toc
      void  TIMER1_isr(void) 
       {
       set_timer1(5565);
       if(tmr1if==1)
         {
          xung=get_timer0()*4;   
          v=(xung*60)/((100*60*0.001));
           tmr1if=0;  
        }
       }
      void Lcd()
      {
      while(1)
         {
         a=(int)v/100;
         b=(int)(v-a*100)/10;
         c=(int)v%10;
         LCD_putcmd(0xC0);
         LCD_putchar("xung encoder");
         LCD_putcmd(0x80);
         LCD_putchar(a+48);
         LCD_putcmd(0x81);
         LCD_putchar(b+48);
          LCD_putcmd(0x82);
          LCD_putchar(c+48);
         }   
      }
      void Ngat()
      {
         set_timer0(255);
         setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
         enable_interrupts(INT_TIMER0);
         setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
         set_timer1(5565);
         enable_interrupts(INT_TIMER1);
        enable_interrupts(GLOBAL);
        }
      void PWM()
      {
         setup_timer_2(T2_DIV_BY_16,255,1);
         setup_ccp1(CCP_PWM);
         setup_ccp2(CCP_PWM);
         set_pwm1_duty(1000);
         set_pwm2_duty(1022);  
      }
      void main()
      {
         set_tris_d(0);
         set_tris_a(0xff);    //Cho tin hieu di vao RA4
         set_tris_c(0);
         LCD_Init();
         PWM();
         Ngat();
         Lcd();
         delay_ms(100);
      }
      bạn có thể up file lên được không cho mình xem với, mình cop code về sao không buil được file hex, xem giúp mình với !

      Comment

      • auto_tvt
        Nhập môn đệ tử
        • Jan 2011
        • 3

        #228
        phần mềm lập trình cho pic Mikro-C

        minh mới tập tành học vxl, va hiện mình Mikro-C , nhưng vì mới làm quen vxl nên lang thang trên mạng nhưng chẳng có code cho nó gì hết ah,
        sao mọi người không ai dùng phần mềm này ah,
        qua đây cho mình hỏi có ai dùng thi chỉ giáo cho mình với.. thanks mọi người.
        mail của em: auto.tvt@gmail.com

        Comment

        • caremlanh
          Đệ tử 3 túi
          • Jul 2010
          • 52

          #229
          Nguyên văn bởi auto_tvt View Post
          minh mới tập tành học vxl, va hiện mình Mikro-C , nhưng vì mới làm quen vxl nên lang thang trên mạng nhưng chẳng có code cho nó gì hết ah,
          sao mọi người không ai dùng phần mềm này ah,
          qua đây cho mình hỏi có ai dùng thi chỉ giáo cho mình với.. thanks mọi người.
          mail của em: auto.tvt@gmail.com
          tốt nhất là dùng CCS đi, ko thì HT PIC chứ Micro C chả hỏi được ai đâu

          Comment

          • nguyenminhthi90
            Nhập môn đệ tử
            • May 2010
            • 1

            #230
            nhờ các pro chỉ giúp phần RS232

            chào các bác!
            em tập theo cái tuto của pác linh thì đã có thể gửi ký tự từ PC lên LCD bình thường rồi, nhưng phần ngược lại, dù có printf cỡ nào nó cũng không truyền được vào hyper terminal được ah . cái này em mô phỏng bên con 8051 thì ngon lành cành đào ạ, hix :|
            sau đây là code của e:

            #include <16f877a.h>
            #include <def_877a.h>
            #use delay(clock=20000000)
            #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
            #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)

            #include <lcd_lib_4bit.c>
            //#include <input.c>

            int8 count=0;
            int1 t=1;

            #INT_RDA
            Receive_isr() {
            char c;
            count++;
            c = getc();
            putc(c);
            if (c=='z')
            {
            LCD_putcmd(0x01); //Clear Screen
            count=0;
            }

            if ((count<=16) && (c!='z'))
            {
            LCD_putchar(c);
            }
            if ((count > 16) && (t==1))
            {
            count=1;
            LCD_putcmd(0xc0);
            LCD_putchar(c);
            t=0;
            }
            if ((count > 16) && (t==0))
            {
            count=1;
            LCD_putcmd(0x01);
            LCD_putchar(c);
            t=1;
            }
            }
            void main()
            {

            enable_interrupts(int_rda);
            enable_interrupts(GLOBAL);
            lcd_init();
            lcd_putcmd(0x01);
            lcd_putcmd(line_1);
            printf("hello!");
            while (1) {}
            }

            em có gửi theo mấy cái file, mọi người chỉ giúp e nhé .
            Attached Files

            Comment

            • ngdnhanbk
              Đệ tử 2 túi
              • Nov 2010
              • 38

              #231
              Nguyên văn bởi dungnt7 View Post
              Theo mình biết thì giá trị value được biểu diễn bằng 10bit, giá trị lớn nhất của value là 1024.

              Value không phải lúc nào cũng nhỏ hơn period, theo datasheet thì (pwm_duty/pwm_period)=(value/(4*(tmr2+1))).

              Đoạn chương trình sau xuất xung PWM 50%, f=5Khz, ở chân CCP1
              void main()
              {
              setup_timer_1(T1_DISABLED);
              setup_timer_2(T2_DIV_BY_4,249,1);
              setup_ccp1(CCP_PWM);
              set_pwm1_duty(512);
              set_tris_c(0x00);
              }


              Vấn đề của bạn ngtdung.nguyen mình cũng chưa hiểu vì sao bị như vậy.
              Không cần set_tris_c(0x00) liệu có ảnh hưởng gì ko bạn
              Email:nguyennhan612@gmail.com

              Comment

              • ngdnhanbk
                Đệ tử 2 túi
                • Nov 2010
                • 38

                #232
                Nguyên văn bởi namqn View Post
                Có nhiều vấn đề liên quan đến câu hỏi của bạn mà hiện giờ tôi cũng chưa có thời gian tìm lại các tài liệu. Bạn có thể xem qua phần "Common Design Mistakes" trong tài liệu "ABCs of ADCs" của National Semiconductor (link download dưới đây), để từ đó tránh được một số lỗi thiết kế thường gặp. Điều này đôi khi có thể giúp bạn có được một thiết kế đủ tốt, chứ chưa cần đến những kỹ thuật phức tạp khác.



                Thân,
                Anh có thể up lại tài liệu trên được không, link die rồi ạ
                Email:nguyennhan612@gmail.com

                Comment

                • DunLop
                  Nhập môn đệ tử
                  • Feb 2012
                  • 4

                  #233
                  đo nhiệt độ dùng lm335 và 16f877a hiển thị led 7 đoạn

                  e mới học vdk...đang viết 1 mạch đo nhiệt độ dùng lm335 và 16f877a hiển thị led 7 đoạn
                  ko bik đoạn code e viết sai chỗ nào, mong ae giúp cho..thanks
                  # include <16f877a.h>
                  # fuses hs,nowdt,nolvp
                  # DEVICE 16f877a*=16 ADC=10
                  # use delay (clock=4000000)

                  int Maled[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
                  int hc=0,hdv=0,nhietdo,giatriadc;
                  # int_timer1
                  void ngattimer()
                  {
                  set_adc_channel(0);
                  delay_ms(10);
                  giatriadc=read_adc();
                  nhietdo=((giatriadc-558.558)/2.048);
                  hc=nhietdo/10;
                  hdv=nhietdo%10;
                  set_timer1(40536);
                  }
                  void hienthi();
                  void main()
                  {
                  set_tris_a (0xff);
                  set_tris_b (0x00);
                  set_tris_c (0x00);
                  setup_timer_1(t1_internal|t1_div_by_8);
                  set_timer1(40536);
                  enable_interrupts(int_timer1);
                  enable_interrupts(global);
                  setup_adc(adc_clock_internal);
                  setup_adc_ports(AN0);

                  while(1)
                  {

                  hienthi();
                  }

                  }
                  void hienthi()
                  {

                  output_high (pin_c0);
                  output_low (pin_c1);
                  output_b (Maled[hc]);
                  delay_ms(5);
                  output_high (pin_c1);
                  output_low(pin_c0);
                  output_b (Maled[hdv]);
                  delay_ms (5);


                  }

                  sơ đồ mạch:
                  Attached Files
                  Last edited by DunLop; 30-03-2012, 03:10 PM. Lý do: bổ sung

                  Comment

                  • lt10dkdt
                    Nhập môn đệ tử
                    • Mar 2012
                    • 1

                    #234
                    Nguyên văn bởi tyhon View Post
                    Em có đoạn code sau nhưng em không hiểu là lệnh adcHI và adcLO làm gì (với khai báo
                    char adcHI,adcLO).Anh nào giải thích hộ em

                    Code:
                       while(TRUE)
                            {
                                   adcValue = read_adc(); // Get ADC reading
                     
                                   adcHI = (char)((adcValue >> 5)& 0x1f);       
                                   adcLO = (char)((adcValue & 0x1f)|0x80);     
                                          
                                   putc(adcHI);  
                                   putc(adcLO);   
                     
                                   delay_ms(10);  // Preset delay, repeat every 10ms
                            }
                    }
                    em có đoạn code sau.tình hình là như thế này.em kết hợp nút ấn bên ngoài với ngắt. đoạn nhấp nháy thì oke hết rùi.nhưng khi khai báo ở void main thì toàn báo lỗi ở *case" ai biết chỉ dùm em với.em đang học về pic thôi.tim mãi mà không ra:

                    #include "16f877a.h"
                    #use delay(clock=20000000)
                    #int_rb

                    unsigned char x,i,a,b,tre;
                    int16 mode;

                    void trai()// chuong trinh con nhay trai sang
                    {

                    x=0x01;
                    output_d(x);
                    delay_ms(tre);
                    for(i=1;i<=7;i++)
                    {x=x<<1;
                    output_d(x);
                    delay_ms(tre);
                    }
                    }

                    void phai()//chuong trinh con nhay phai sang
                    {

                    x=0x80;
                    output_d(x);
                    delay_ms(tre);
                    for(i=1;i<=7;i++)
                    {
                    x=x>>1;
                    output_d(x);
                    delay_ms(tre);
                    }
                    }

                    void trong() //chuong trinh con nhay trong ra
                    {
                    a=0x01;
                    b=0x80;
                    for(i=1;i<=7;i++)
                    {
                    a<<=1;
                    b>>=1;
                    output_d(a|b);
                    delay_ms(tre);
                    }
                    }
                    void ngat()
                    {
                    if(input(pin_b0))
                    if(mode<2)mode++;//chuyen che do tang len o b0
                    if(input(pin_b1))
                    if(mode<0 )mode--;//chuyen che do tang len o b1
                    if(input(pin_b2))
                    if(tre<100) tre=tre+100;//tang thoi gian tre cho led
                    if(input(pin_b3))
                    if(tre>100) tre=tre-100;//giam thoi gian tre cho led

                    }

                    void main()
                    {
                    set_tris_b(0xff);
                    enable_interrupts(int_rb);
                    enable_interrupts(GLOBAL);

                    mode=0;
                    while (true)
                    case 0: trai();break;
                    case 1: phai();break;
                    case 2: trong();break;
                    }

                    Comment

                    • yannibandari
                      Nhập môn đệ tử
                      • Apr 2011
                      • 1

                      #235
                      mọi người ơi giúp mình với. mình tìm chương trình pic c cả ngày rồi,cài vào rồi lại xóa không biết bao nhiêu lần mà cũng không tìm ra phiên bản thích hợp. cứ mỗi lần compile cái file.c (đã chạy tốt trên máy khác,có thể phiên bản cũ) thì nó lại báo error! mình xài win 7 64bit untimate. ức chế quá!

                      Comment

                      • vietthanh123
                        Nhập môn đệ tử
                        • Apr 2011
                        • 3

                        #236
                        Nguyên văn bởi lt10dkdt View Post
                        đoạn nhấp nháy thì oke hết rùi.nhưng khi khai báo ở void main thì toàn báo lỗi ở *case" ai biết chỉ dùm em với.em đang học về pic thôi.tim mãi mà không ra:
                        Báo lỗi vì cấu trúc của hàm case bị thiếu. Cấu trúc có nó là:
                        switch (cmd)
                        {
                        case 0: sthing;
                        break;
                        case 1: sthing;
                        break;
                        case 2: sthing;
                        break;

                        }

                        Comment

                        • tranhien5291
                          Nhập môn đệ tử
                          • Oct 2012
                          • 1

                          #237
                          help!!!

                          Các bác ơi cho e hỏi e cài CCS nhưng mà bị báo lỗi " Exception EInoutError in module pcwwiz.exe at 00833f6 I/O error 123 " , k biết phải làm thế nào nữa. Các pro chỉ cho e với ạ!!! e cảm ơn ạ.
                          Last edited by tranhien5291; 04-11-2012, 10:19 PM.

                          Comment

                          • huydungsh
                            Nhập môn đệ tử
                            • Sep 2011
                            • 10

                            #238
                            các anh cho em hỏi đoạn chương trình sau co nghĩa như thế nào ak?
                            #int_timer0
                            void interrupt_timer0(){
                            int1 a;
                            int16 count;
                            set_timer0(56);
                            ++count;
                            if(count == 500)
                            {
                            count=0;
                            a=~a;
                            RB0=a;
                            }


                            }
                            theo em nghĩ thì khi timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến cuont tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần tương ứng với 100ms thì con pic16f877a có làm gì không? nếu làm thì khi thỏa mãn điều kiện IF thì làm sao pic có thể thực hiện các lệnh trong điều kiện đó. thanks all!

                            Comment

                            • quanghuy_125
                              Đệ tử 2 túi
                              • Apr 2009
                              • 44

                              #239
                              Nguyên văn bởi huydungsh View Post
                              các anh cho em hỏi đoạn chương trình sau co nghĩa như thế nào ak?
                              #int_timer0
                              void interrupt_timer0(){
                              int1 a;
                              int16 count;
                              set_timer0(56);
                              ++count;
                              if(count == 500)
                              {
                              count=0;
                              a=~a;
                              RB0=a;
                              }


                              }
                              theo em nghĩ thì khi timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến cuont tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần tương ứng với 100ms thì con pic16f877a có làm gì không? nếu làm thì khi thỏa mãn điều kiện IF thì làm sao pic có thể thực hiện các lệnh trong điều kiện đó. thanks all!
                              Đúng theo bạn nói" timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến count tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần "
                              Cái 100ms không tính được vì nó phụ thuộc vào xung nhịp mà mình đưa vào.
                              Khi count=500; thì count=0; a = đảo a; chân RB0 =a; và quá trình lại được tiếp diễn...
                              ĐT : 0167 6455 880 Mail: quanghuy1205@gmail.com
                              https://www.facebook.com/ThietKeDienTu

                              Comment

                              • huydungsh
                                Nhập môn đệ tử
                                • Sep 2011
                                • 10

                                #240
                                cảm ơn các anh đã giải thích! nguyên code là như sau:
                                #include <16F877A.h>
                                #include <DEFS_16F877A.h>
                                #device 16F877*=16 ADC=10
                                #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
                                #use delay(clock=4000000)
                                #use fast_io(b)
                                #use fast_io(c)
                                #use fast_io(d)

                                #int_timer0
                                void interrupt_timer0(){
                                int1 a;
                                int16 count;
                                set_timer0(56);
                                ++count;
                                if(count == 500)
                                {
                                count=0;
                                a=~a;
                                RB0=a;
                                }


                                }
                                void main()
                                {
                                set_tris_b(0);
                                setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
                                enable_interrupts(int_timer0);
                                enable_interrupts(global);
                                set_timer0(56);

                                while(true)
                                {
                                }
                                }
                                em chỉ copy ở page 1 thôi thắc ở cái đoạn đó mong các anh giải thích giúp em!! thanks all

                                Comment

                                Working...