Thông báo

Collapse
No announcement yet.

Các câu hỏi thông dụng về lập trình CCS cho PIC 16F887

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    theo tôi biêt....
    tôi làm thực tế, nếu ko có lệnh fast_io(a)(hoặcfast_io(b)......) thì VDK ko thể xuất ra thực tế dc, lệnh đó hỗ trợ xuất nhập, đúng ko ta....?
    còn cái TRISB, nếu bạn đã biết viết mplap thì, TRISB=0xff; nó giống set_tris_a(0xff); đc chứ?
    còn PORTB=0xff; thì ccs là output_b(0xff);

    còn nếu bạn add file này vào phần Drivers của thư mục cài đặt ccs thì câu lệnh nó hoàn toàn biến thành giồng mplap. bạn vào phần help của ccs là cách học nhanh và tốt nhất!
    Attached Files
    TamPhieuLuuKy@yahoo.com
    092 2838 712 --->>

    Comment


    • #17
      và khi khai báo bạn phải khai như thế này no mới giống mplap quen thuộc

      #include "def_16f877a.h"

      #FUSES NOWDT //No Watch Dog Timer
      #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
      #FUSES NOPUT //No Power Up Timer
      #FUSES NOPROTECT //Code not protected from reading
      #FUSES NODEBUG //No Debug mode for ICD
      #FUSES NOBROWNOUT //No brownout reset
      #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
      #FUSES NOCPD //No EE protection
      #FUSES NOWRT //Program memory not write protected
      #FUSES RESERVED //Used to set the reserved FUSE bits
      #fast_io(c)
      #device 16f877a*=16 adc =8
      #use delay(clock=12000000)
      TamPhieuLuuKy@yahoo.com
      092 2838 712 --->>

      Comment


      • #18
        cho em hỏi thêm nữa: lệnh fast_io được sử dụng như thế nào? có phải khi khai báo sử dụng fast_io thì trong chuong trình em cần phải khai báo tris không ?
        - trong CCS khi em thiết lập nó là ngõ ra( sáng tắt led) thì hình như em chẳng cần làm gì ( chẳng có fast_io cũng không có tris gì hết), vậy là sao ạ. hình như nếu không nhầm thì lệnh nếu sử dụng output_x(giá trị) đẽ xuất mức logic ra ngõ ra của pic, nó ưu tiên hơn là việc em thiết lập ngõ đó là số hay tương tự. điều này em đọc trong datasheet của 16f887. xin các anh chỉ giáo thêm


        PS: em rât muốn bác nào chỉ em các lệnh output, tris gì gì đó. lung tung quá ( chắc em gà mờ quá) cảm ơn các bác nhiều.
        Be quan. Plz contact through email:

        Comment


        • #19
          các bác giải thích dùm em

          set_tris_a(0xff);
          set_tris_b(0xff);
          set_tris_c(0xff);

          while(1)
          { //PORTA =0X00;
          output_a(0x00);
          delay_ms(1000);
          //PORTA = 0XFF;
          output_a(0xff);
          delay_ms(1000);

          }

          điều lạ là em đã khai báo porta là ngõ vào, vậy mà xuất ra vẫn bình thường, vậy có phải lệnh output chẳng hề ảnh hửong bởi lệnh tris hay không?


          nhưng khi em làm lại như sau:

          #byte porta = 0x05 ( định nghĩa porta - vì em quen sử dụng)

          bên dưới

          set_tris_a(0xff);
          set_tris_b(0xff);
          set_tris_c(0xff);

          while(1)
          { PORTA =0X00;
          //output_a(0x00);
          delay_ms(1000);
          PORTA = 0XFF;
          //output_a(0xff);
          delay_ms(1000);

          }
          thì em thấy nếu muốn xuất ra porta em phải cấu hình bằng lệnh set_tris_a(0x00) mới được, còn nếu em làm set_tris_a(0xff) thì không xuất được.


          => kết luận: lệnh output sao sao ấy, nó chẳng quan tâm đến tris là in hay output. các bác giải thích dùm em nhé
          Be quan. Plz contact through email:

          Comment


          • #20
            Hàm output_a đưa 1 byte ra PORTA, trước khi làm điều này nó tự cập nhật lại cấu I/O của PORTA nên xuất ra bình thường.

            Còn PORTA = 0XFF; mà trước đó PORTA được định nghĩa bởi #byte porta = 0x05 thì nghĩa là bạn xuất ra PORTA bằng cách đưa trực tiếp 0XFF vào địa chỉ 0x05. Điều này yêu cầu trước khi thực hiện cần phải định hướng cho PORTA bằng set_tris_a(0x00);

            Comment


            • #21
              KHI EM SỬ DỤNG NGẮT TIMER 0 ĐỂ LÀM ĐỊNH THỜI TRONG PIC, EM BIÊN SOẠN 1 PROJECT, KHI KHAI BÁO NGẮT CÓ 2 CHẾ ĐỘ ( trong phần interrupt ấy), em chọn cái nào?

              #int_RTCC // cai nay la cai gi , co phai ngat timer0 ?
              RTCC_isr()
              {

              }

              #int_TIMER0 // sao lai co cai nay nua vay?
              TIMER0_isr()
              {

              }
              Be quan. Plz contact through email:

              Comment


              • #22
                Em xin hỏi thêm: trong time1 có một bit T1SYNC (synchronous) để đồng bộ , bit này có ý nghĩa khi nguồn cung cấp xung cho timer1 là nguồn xung bên ngoài ( từ thạch anh, hoặt từ chân T1CKI) và không có ý nghĩa khi timer1 đếm xung nội ( vì đếm xung nội thì còn đồng bộ với xung nội để làm gì), các bác có thể giải thích cho em về cái này không. ( em đang thực hiện viết chuơng trình tạo một xung có tần số 2Khz, duty = 50%, nhưng khi em sử dụng PIC wizard, có một ô em chưa biết có nên đánh dấu tích vào để lựa chọn có đồng bộ hay không). em sử dụng thạch anh ngoài, tần số 20M
                Be quan. Plz contact through email:

                Comment


                • #23
                  Và nữa:.....^^
                  Khi sử dụng ngắt trong ccs, hình như nó tự xóa cờ báo ngắt phải không ạ
                  Be quan. Plz contact through email:

                  Comment


                  • #24
                    thêm nữa:
                    có nguy hiểm gì không nếu em làm như sau
                    #byte INTCON = 0X8B

                    Nếu em khai báo thế này thì có nguy hại gì không ạ
                    em biết trong CCS hình như nó tự động chuyển bank thích hợp phải không ạ, vì 887 chia làm 4 bank thanh ghi, một số thanh ghi có ở cả 4 banks nên nếu em khai báo như trên có gì sai không, thực ra ngoài địa chỉ 8B thì thanh ghi INTCON còn có 3 địa chỉ khác nữa ( nằm trong bank 0,2,3). mong các anh chỉ giáo
                    Be quan. Plz contact through email:

                    Comment


                    • #25
                      thêm nữa ạ
                      giải thích dùm em: set_tris_b((int)FOR_SEND); // The constant

                      tại sao lại thêm (int) mà không phải là set_tris_b(FOR_SEND);

                      hình như là làm vậy để ép kiểu gì đó phải không các bác, các bác lão làng giúp em với nhé ( em có chị gái xinh lắm -- hehe 27 chưa chồng - em giới thiệu cho làm anh "dê" của em)
                      Be quan. Plz contact through email:

                      Comment


                      • #26
                        và đây là một bài mẫu trong ccs, cách khai báo và làm việc rất hay ( em nghĩ là nếu làm các bài như LCD,...thì cách này rất okie), trong này có đề cập đến kiểu dữ liệu struct - các bác tham khảo nhé:
                        struct port_b_layout

                        {int data : 4;

                        int rw : 1;

                        int cd : 1;

                        int enable : 1;

                        int reset : 1; };

                        struct port_b_layout port_b;

                        #byte port_b = 6

                        struct port_b_layout const INIT_1 = {0, 1,1,1,1};

                        struct port_b_layout const INIT_2 = {3, 1,1,1,0};

                        struct port_b_layout const INIT_3 = {0, 0,0,0,0};

                        struct port_b_layout const FOR_SEND = {0,0,0,0,0};

                        // All outputs

                        struct port_b_layout const FOR_READ = {15,0,0,0,0};

                        // Data is an input

                        main() {

                        int x;

                        set_tris_b((int)FOR_SEND); // The constant
                        // structure is

                        // treated like

                        // a byte and

                        // is used to

                        // set the data

                        // direction

                        port_b = INIT_1;

                        delay_us(25);



                        port_b = INIT_2; // These constant structures delay_us(25);
                        // are used to set all fields

                        port_b = INIT_3; // on the port with a single
                        // command



                        set_tris_b((int)FOR_READ);

                        port_b.rw=0;

                        // Here the individual

                        port_b.cd=1; // fields are accessed

                        port_b.enable=0; // independently.

                        x = port_b.data;

                        port_b.enable=0

                        }
                        Be quan. Plz contact through email:

                        Comment


                        • #27
                          Góp ý với bác chút nhé : dự định có bao nhiêu vấn đề , bao nhiêu câu hỏi , post 1 lần lun . Kiểu này chứng tỏ bác mới tập tò hiểu vấn đề , để rồi chưa hiểu tới nơi tới chốn thì gặp bí chỗ nào ,k search trước , lên post bài hỏi tùm lum tà la tới đó .


                          Xin hỏi đã đọc bài ở luồng này chưa ?

                          http://www.picvietnam.com/forum/showthread.php?t=357
                          http://www.picvietnam.com/forum/showthread.php?t=2296

                          Comment


                          • #28
                            Xin đa tạ bác, em sang bên đó thấy nhiều bài quá, em rối hết ^^
                            Be quan. Plz contact through email:

                            Comment


                            • #29
                              Nguyên văn bởi Lenh Ho Xem bài viết
                              KHI EM SỬ DỤNG NGẮT TIMER 0 ĐỂ LÀM ĐỊNH THỜI TRONG PIC, EM BIÊN SOẠN 1 PROJECT, KHI KHAI BÁO NGẮT CÓ 2 CHẾ ĐỘ ( trong phần interrupt ấy), em chọn cái nào?

                              #int_RTCC // cai nay la cai gi , co phai ngat timer0 ?
                              RTCC_isr()
                              {

                              }

                              #int_TIMER0 // sao lai co cai nay nua vay?
                              TIMER0_isr()
                              {

                              }
                              nhìn loạt câu hỏi mà choáng.
                              Em nào cũng được, ko thành vấn đề.
                              My Face :

                              Comment


                              • #30
                                Nguyên văn bởi Lenh Ho Xem bài viết
                                Em xin hỏi thêm: trong time1 có một bit T1SYNC (synchronous) để đồng bộ , bit này có ý nghĩa khi nguồn cung cấp xung cho timer1 là nguồn xung bên ngoài ( từ thạch anh, hoặt từ chân T1CKI) và không có ý nghĩa khi timer1 đếm xung nội ( vì đếm xung nội thì còn đồng bộ với xung nội để làm gì), các bác có thể giải thích cho em về cái này không. ( em đang thực hiện viết chuơng trình tạo một xung có tần số 2Khz, duty = 50%, nhưng khi em sử dụng PIC wizard, có một ô em chưa biết có nên đánh dấu tích vào để lựa chọn có đồng bộ hay không). em sử dụng thạch anh ngoài, tần số 20M
                                Ko cần lằng nhằng, đoạn này. bit đồng bộ kệ nó. với CCS tất cả trở nên thừa thải.
                                2khz, 50% OK, có thể timer thêm ngắt tí vào cho nó ngọt, ko thì chơi PWM luôn, của bộ CCP Module đấy.

                                Và nữa:.....^^
                                Khi sử dụng ngắt trong ccs, hình như nó tự xóa cờ báo ngắt phải không ạ
                                khi nhảy đến trình phục vụ cờ được clear, nhưng thôi nên clear nó bằng sofware thì đa số thấy người ta làm như thế.

                                thêm nữa:
                                có nguy hiểm gì không nếu em làm như sau
                                #byte INTCON = 0X8B

                                Nếu em khai báo thế này thì có nguy hại gì không ạ
                                em biết trong CCS hình như nó tự động chuyển bank thích hợp phải không ạ, vì 887 chia làm 4 bank thanh ghi, một số thanh ghi có ở cả 4 banks nên nếu em khai báo như trên có gì sai không, thực ra ngoài địa chỉ 8B thì thanh ghi INTCON còn có 3 địa chỉ khác nữa ( nằm trong bank 0,2,3). mong các anh chỉ giáo
                                - chẳng để làm gì cả, ko cần sài, việc dùng bank nào ccs sẽ lo.
                                - nên nhớ trình biên dịch CCS can thiệt rất nhiều, bởi vì các hàm của nó chơi hết rồi, nên người code hoàn toàn có thể code được mà có thể ko cần hiểu bản chất nó như thế nào.

                                giải thích dùm em: set_tris_b((int)FOR_SEND); // The constant

                                tại sao lại thêm (int) mà không phải là set_tris_b(FOR_SEND);

                                hình như là làm vậy để ép kiểu gì đó phải không các bác, các bác lão làng giúp em với nhé ( em có chị gái xinh lắm -- hehe 27 chưa chồng - em giới thiệu cho làm anh "dê" của em)
                                - Hic, hỏi đíu gì lăm thế ko biết. chị 27 mà chưa lấy thì ... ế rồi
                                - kaka, định tính cho anh nào vào tròng đây.
                                - ko ép kiểu thì bạn nghĩ để làm gì, nhìn chữ constant kìa, xem coi FOR_SEND được khai báo là gì, rất cả thể là macro (define)

                                - Cái cuối cùng là cậu ta pót sản phẩm của mình lên và tự sướng với nó. Kaka, lần sau bỏ cái tính ấy đi, tìm hiểu trước khi hỏi.
                                Code mẫu cái gì chứ, struct gì chứ, nhìn code chẳng ra gì cả.

                                P/S : To @Lenh Ho : Thời tôi mới tập code còn code sáng sủa hơn bạn
                                Last edited by hienclubvn; 13-08-2011, 15:27.
                                My Face :

                                Comment

                                Về tác giả

                                Collapse

                                Lenh Ho Tìm hiểu thêm về Lenh Ho

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X