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
  • namqn
    Trưởng lão PIC bang
    • Feb 2006
    • 3020

    #61
    Nguyên văn bởi picpen View Post
    có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
    Bạn đã đọc tài liệu hướng dẫn của CCS C chưa? Tôi không dùng CCS C, nhưng đọc qua tài liệu hướng dẫn của CCS C thì nhận thấy những điểm sau:

    - Hàm printf có thể in số thực (float), có định dạng
    - Hàm printf có thể xuất kết quả đến một hàm khác, thay vì ra stdout

    Vậy có thể dùng hàm printf() để in số thực (float) của bạn đến một hàm nào đó, mà hàm đó sẽ xuất kết quả này lên LCD/LED 7 thanh.

    Thân,
    Biển học mênh mông, sức người có hạn.

    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
    http://www.picvietnam.com/forum/showthread.php?t=1263

    Comment

    • phamminhtuan
      Super Moderator
      • Feb 2006
      • 150

      #62
      Nguyên văn bởi picpen View Post
      có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
      Bạn có thể sử dụng như sau cho LCD, dùng thư viện lcd.c của CCS luôn, nếu cần xuất cho led 7 thanh hay cái gì đó thì bạn viết lại 1 hàm giống như hàm lcd_putc() của thư viện này cũng được.
      PHP Code:
      float fvar = 1.2345;
      printf(lcd_putc, "Float: %f", fvar); 
      
      Nếu muốn in ra LED 7 thanh thì bạn có thể viết 1 hàm chuyển đổi ascii sang mã 7 thanh lưu trong 1 vùng RAM, tham số truyền vào là kí tự ascii, chương trình của bạn sẽ hiển thị vùng RAM đó ra LED 7 thanh, hàm này viết cấu trúc giống như lcd_putc là ok
      Hàm lcd_putc như thế này
      PHP Code:
      void lcd_putc( char c) {
         switch (c) {
           case '\f'   : lcd_send_byte(0,1);
                         delay_ms(2);
                                                 break;
           case '\n'   : lcd_gotoxy(1,2);        break;
           case '\b'   : lcd_send_byte(0,0x10);  break;
           default     : lcd_send_byte(1,c);     break;
         }
      } 
      
      có thể sửa lại giống thế này
      PHP Code:
      unsigned char ptr = 0;
      unsigned char buffer[10]; //vùng RAM chứa mã LED 7 đoạn để xuất ra, ở đây là 10 LED
      void led7seg( char c) {
          unsigned num;
          num = c - 0x30;
          buffer[ptr] = table_led7doan[num];
          ptr++;
          if(ptr>=10) ptr = 0;
      }
      //với table_led7doan[] là bảng const chứa mã 7 đoạn từ 0-9
      //Bạn muốn in từ vị trí nào thì cho ptr bằng giá trị đó
      
      
      //Bạn sử dụng hàm printf như sau
      printf(led7seg, "Float: %f",fvar);
      //đảm bảo chạy 100% 
      
      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
      http://www.picvietnam.com/forum/showthread.php?t=1263

      Comment

      • kebitmat_f
        Đệ tử 1 túi
        • May 2006
        • 12

        #63
        Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.

        Comment

        • kebitmat_f
          Đệ tử 1 túi
          • May 2006
          • 12

          #64
          Cho mình hỏi thêm 1 cái nữa : khi sử dụng thạch anh 4Mhz thì chu kì thực thi 1 lệnh của vi điều khiển là 1micros. khi sử dụng thạch anh 20Mhz thì chu kì sẽ khác. Vì trong cái tutor của Nguyễn Trung Chính ở bài " Pic6f877a từ dễ tới khó" có đề cập đến vấn đề này. Sử dụng hàm tạo trễ: thời gian trễ = số chu kì lệnh*thời gian 1 lệnh .Như vậy có điều gì khác khi gọi hàm delay_ms(100) ứng với chọn thạch anh 4Mhz và 20Mhz?

          Comment

          • phamminhtuan
            Super Moderator
            • Feb 2006
            • 150

            #65
            Nguyên văn bởi kebitmat_f View Post
            Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.
            Khai báo #use delay(clock=xxMhz) là chỉ dẫn để CCS tạo ra mã delay đúng với tần số thạch anh mà mình sử dụng, ví dụ bạn sử dụng thạch anh 4Mhz, thì khai báo #use delay(clock=4Mhz), như thế thì cái hàm delay_ms(100) mới delay đúng 100ms, còn nếu bạn khai báo 4Mhz, nhưng sử dụng thạch anh 20Mhz thì dĩ nhiên hàm delay đó sẽ không còn đúng nữa, lúc này thay vì 100ms thì nó chỉ còn 100/5 = 20ms thôi, ngoài ra nếu bạn sử dụng UART cũng không đúng, vì clock bạn khai báo sai mà.

            Thế nên, bạn cứ ép buộc nó chạy thì nó vẫn chạy, không theo ý bạn thôi, muốn nó chạy đúng thì phần cứng ra làm sao, khai báo trong phần mềm như vậy
            Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
            http://www.picvietnam.com/forum/showthread.php?t=1263

            Comment

            • kebitmat_f
              Đệ tử 1 túi
              • May 2006
              • 12

              #66
              Thanks nhiều nha. Mình hiểu rồi

              Comment

              • nguyentanxuyen
                Nhập môn đệ tử
                • Aug 2008
                • 2

                #67
                mình rất cần phần mềm để viết chương trình nap cho PIC. bạn chia sẽ cho mình với. thanks

                Comment

                • namqn
                  Trưởng lão PIC bang
                  • Feb 2006
                  • 3020

                  #68
                  Nguyên văn bởi nguyentanxuyen View Post
                  mình rất cần phần mềm để viết chương trình nap cho PIC. bạn chia sẽ cho mình với. thanks
                  Những thông tin liên quan đến PIC dành cho người mới học:


                  Thân,
                  Biển học mênh mông, sức người có hạn.

                  Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                  http://www.picvietnam.com/forum/showthread.php?t=1263

                  Comment

                  • picpen
                    Đệ tử 5 túi
                    • Jun 2008
                    • 112

                    #69
                    Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
                    Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
                    Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
                    Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
                    printf(led7seg, "Float: %f",fvar);???????
                    **** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********
                    ** xin hãy cho tôi là tượng đá
                    ** Để muôn đời không nhớ thương ai ..!!

                    Comment

                    • phamminhtuan
                      Super Moderator
                      • Feb 2006
                      • 150

                      #70
                      Nguyên văn bởi picpen View Post
                      Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
                      Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
                      Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
                      Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
                      printf(led7seg, "Float: %f",fvar);???????
                      **** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********
                      Có lẽ cũng là bạn bên dientuvietnam.net: http://dientuvietnam.net/forums/show...68&postcount=6
                      Mình đã viết rõ trong luồng này rồi, cái bảng table_led7doan[] định nghĩa const với 20 giá trị là mã 7 đoạn từ 0-9 và mã 7 đoạn từ 0-9 có dấu chấm,
                      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                      http://www.picvietnam.com/forum/showthread.php?t=1263

                      Comment

                      • luanktd
                        Đệ tử 2 túi
                        • Nov 2006
                        • 35

                        #71
                        Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
                        Code:
                        #include<18f4431.h>
                        #fuses NOWDT,NOLVP,PUT,XT
                        #byte PORTB=0xF81
                        #byte TRISB=0xF93
                        void main()
                        { 
                         While(1)
                          {
                           TRISB=0x00;
                           PORTB=0x0F;
                          }
                        }
                        Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo
                        Last edited by namqn; 23-08-2008, 04:56 AM.

                        Comment

                        • picpen
                          Đệ tử 5 túi
                          • Jun 2008
                          • 112

                          #72
                          Chương trình của bạn thiếu hàm khai báo sử dụng tần số thạch anh cho pic :
                          #use delay(clock= x ) , x là tần số thạch anh mà bạn dùng cho pic ,nó có thể là 4Mhz ,10,12 hoặc 20Mhz tùy bạn chọn.
                          ** xin hãy cho tôi là tượng đá
                          ** Để muôn đời không nhớ thương ai ..!!

                          Comment

                          • namqn
                            Trưởng lão PIC bang
                            • Feb 2006
                            • 3020

                            #73
                            Nguyên văn bởi luanktd View Post
                            Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
                            Code:
                            #include<18f4431.h>
                            #fuses NOWDT,NOLVP,PUT,XT
                            #byte PORTB=0xF81
                            #byte TRISB=0xF93
                            void main()
                            { 
                             While(1)
                              {
                               TRISB=0x00;
                               PORTB=0x0F;
                              }
                            }
                            Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo
                            Bạn chạy thử bằng mô phỏng hay mạch thật? Nếu thử bằng mạch thật thì tần số thạch anh được sử dụng là bao nhiêu?

                            PIC18F4431 có 7 từ cấu hình, trong đó tối thiểu các từ cấu hình 1 đến 4 cần được thiết lập giá trị ban đầu. Bạn chỉ thiết lập có vài cụm cấu hình trong số đó. Tôi đã gặp nhiều trường hợp PIC18F không chạy trong mạch thật, chỉ vì thiết lập thiếu các từ cấu hình.

                            Khi viết code cho PIC18, tôi luôn thiết lập đầy đủ các từ cấu hình. Ví dụ dưới đây viết cho MPLAB C18, dùng cho các PIC18 như PIC18Fx320:
                            Code:
                            //Configuration bits
                            #pragma config OSC = INTIO1
                            #pragma config FSCM = OFF
                            #pragma config IESO = OFF
                            #pragma config PWRT = OFF
                            #pragma config BOR = ON
                            #pragma config BORV = 27
                            #pragma config WDT = OFF
                            #pragma config WDTPS = 32768
                            #pragma config MCLRE = ON
                            #pragma config PBAD = DIG
                            #pragma config CCP2MX = C1
                            #pragma config STVR = ON
                            #pragma config LVP = OFF
                            #pragma config DEBUG = OFF
                            #pragma config CP0 = OFF
                            #pragma config CP1 = OFF
                            #pragma config CP2 = OFF
                            #pragma config CP3 = OFF
                            #pragma config CPB = OFF
                            #pragma config CPD = OFF
                            #pragma config WRT0 = OFF
                            #pragma config WRT1 = OFF
                            #pragma config WRT2 = OFF
                            #pragma config WRT3 = OFF
                            #pragma config WRTB = OFF
                            #pragma config WRTC = OFF
                            #pragma config WRTD = OFF
                            #pragma config EBTR0 = OFF
                            #pragma config EBTR1 = OFF
                            #pragma config EBTR2 = OFF
                            #pragma config EBTR3 = OFF
                            #pragma config EBTRB = OFF
                            Thân,
                            Biển học mênh mông, sức người có hạn.

                            Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                            http://www.picvietnam.com/forum/showthread.php?t=1263

                            Comment

                            • popeye_ts22
                              Đệ tử 2 túi
                              • Jul 2008
                              • 42

                              #74
                              Em đọc về ADC rùi gửi lên LCD mà sao chẳng thấy hiển thị đúng ADC mà toàn ra giá trị lung tung các bác ạ.Em bỏ chân biến trở ra mà màn hình vẫn cứ hiện giá trị lung tung.Em biết đấy không phải là ADC nhưng không hiểu vì sao.Các bác giúp thằng em với..
                              Code:
                              #include <16f877a.h>
                              #include <def_877a.h>
                              #device 16F877*=16 ADC=10 
                              #use delay(clock=8000000)
                              #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
                              #include <lcd_lib_4bit.c>
                              
                              unsigned int  a,b,c,d,adc;
                              long value;
                              char *text;
                              void main()
                              {
                                 set_tris_d(0);
                                 setup_adc_ports( AN0_AN1_AN3 );
                                 setup_adc(ADC_CLOCK_INTERNAL);
                                 set_adc_channel( 0 );
                                 delay_ms(100);
                                 text="V";
                                 while(1)
                                 {
                                 adc=read_adc();
                                 //value=(adc*5000)/1023;
                                 
                                 value = (long)adc * 5000; // covert adc reading to milivolts
                                 value = value / 1023; // 0..1023 -> 0-5000mV
                                 a=value/1000;
                                 b=(value-(a*1000))/100;
                                 c=(value-(a*1000)-(b*100))/10;
                                 d=(value-(a*1000)-(b*100)-(c*10));
                                 LCD_Init();
                                 LCD_putcmd(0x80);
                                 LCD_putchar(48+a);
                                 LCD_putcmd(0x81);
                                 LCD_putchar(48+b);
                                 LCD_putcmd(0x82);
                                 LCD_putchar(48+c);
                                 LCD_putcmd(0x83);
                                 LCD_putchar(48+d);
                                 LCD_putcmd(0x84);
                                 LCD_putchar(text);
                                 delay_ms(100);
                                 }
                              }
                              Last edited by popeye_ts22; 26-08-2008, 11:03 PM.
                              Best Regard.

                              Comment

                              • popeye_ts22
                                Đệ tử 2 túi
                                • Jul 2008
                                • 42

                                #75
                                Em còn 1 số câu hỏi nữa tiện thể các bác trả lời luôn cho em:
                                - Có set đc 1 chân khác của PIC làm chân PWM không ạ.
                                - Khi Timer2 hoạt động PWM thì còn mình còn dùng làm Timer để đếm thời gian được không.Nếu điều khiển 2 động cơ cùng 1 lúc thì bắt buộc phải dùng đến Timer0,timer1 để đếm xung về,và như thế là hết các bộ timer,counter phải ko ạ.
                                - ADC có 8 kênh,nếu em dùng cả 8 kênh thì Vref=Vdd.Vậy thì ADC sẽ rất dễ bị nhiễu đúng không ạ.Có cách nào khắc phục được không ạ.
                                - Trong CCS mình chỉ cần chọn ALL ANALOG là chip mặc định Vref=Vdd có phải ko ạ.
                                Best Regard.

                                Comment

                                Working...