CCS C for PIC16F877A

Collapse
This topic is closed.
X
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • bien_van_khat
    ...Damned...
    • Apr 2006
    • 522

    #376
    Nguyên văn bởi bean984 View Post
    cho mình hỏi cái này nhé
    nếu dùng lệnh printf("%s", s); thì ký tự kết thúc của chuỗi s là gì?
    mình định dùng ký tự này để xử lý việc nhận chuỗi s. có phải ký null không nhỉ?
    Với C, một chuỗi luôn phải kết thúc với ký tự NULL.
    - Xin đọc trước khi post bài

    Xin đặt code trong thẻ [ code ] [ /code ]

    Comment

    • bean984
      Đệ tử 3 túi
      • Dec 2007
      • 51

      #377
      giúp mình cái hàm nhận xâu ký tự
      bên phát mình thực hiện như sau:
      Code:
      itoa(x,10,s);//chuyển số nguyên x thành xâu ký tự
      printf("%s", s);
      còn bên nhận mình thực hiện kiểm tra kt null như sau:
      Code:
      #INT_RDA
      RECEIVER()
      {
         char kt;
         int i;
         char s1[4];
         i=0;
         kt=fgetc(pc);
      
         while(kt!=null)
            {
               s1[i]=kt;
               i++;
               kt=fgetc(pc);
            }
               
               lcd_clear();
               delay_ms(1);
               lcd_display_str(0, 0, s1);//hiển thị xâu
      }
      nhưng không thu dc gì. mình k biết lỗi ở đâu nữa
      mình cảm ơn.

      Comment

      • bien_van_khat
        ...Damned...
        • Apr 2006
        • 522

        #378
        Theo như đoạn code trên, hàm lcd_display_str nhận đối số là một chuỗi do đó chắc chắn nó yêu cầu chuỗi của bạn phải kết thúc = ký tự NULL, chuỗi s1 như trên chưa có ký tự kết thúc.

        Bạn nên post cả code của phần phát
        - Xin đọc trước khi post bài

        Xin đặt code trong thẻ [ code ] [ /code ]

        Comment

        • bean984
          Đệ tử 3 túi
          • Dec 2007
          • 51

          #379
          bên phát mình chỉ có hai dòng lệnh vậy thôi vì mình ghép nó vào một chương trình con khác.
          Code:
          void tonghop_so()
          {
             char s[5];
             t1=nghin*10+tram;
             t2=chuc*10+donvi;
             trunggian2=t1*100+t2;
             if((hor==0)&(trunggian2<=5000))
                {
                rnominal0=trunggian2;
                itoa(trunggian2,10,s);//chuyển số nguyên trunggian2 thành xâu ký tự
                printf("%s", s);
                }
          }
          khi gọi đến hàm tonghop_so(); thì đồng thời gửi chuỗi.
          hàm lcd_display_str(); là hàm hiển thị một mảng ký tự.
          Code:
          void lcd_display_str(int line, int8 posc, char str[])
          {
             int8 i,j;
             j=strlen(str);// Cho xau la co dinh
             for (i = posc; i < j+posc ; i++)
                {
                lcd_display_char(line, i, str[i-posc]);
                delay_ms(1);
                }
          }

          Comment

          • tinhgiac_vp
            Đệ tử 2 túi
            • Oct 2007
            • 42

            #380
            Nguyên văn bởi nhh View Post
            INTERRUPT

            Các lệnh dùng cho ngắt:
            Code:
            enable_interrupts(level);	//cho phép ngắt kiểu level   
            disable_interrupts(level); 	             //cấm ngắt kiểu level
            ext_int_edge(edge);         	             // chọn cách lấy xung loại  edge
            level bao gồm:

            GLOBAL : ngắt toàn cục
            INT_RTCC : tràn TMR0
            INT_RB : có thay đổi trạng thái một trong các chân RB4 đến RB7
            INT_EXT : ngắt ngoài
            INT_AD : chuyển đổi AD đã hoàn tất
            INT_TBE : bộ đệm chuyển RS232 trống
            INT_RDA : data nhận từ RS232 sẵn sàng
            INT_TIMER1 : tràn TMR1
            INT_TIMER2 : tràn TMR2
            INT_CCP1 : có capture hay compare trên CCP1
            INT_CCP2 : có capture hay compare trên CCP2
            INT_SSP : có hoạt động SPI hay I2C
            INT_PSP : có data vào cổng parallel slave
            INT_BUSCOL : xung đột bus
            INT_EEPROM : ghi vào eeprom hoàn tất
            INT_TIMER0 : tràn TMR0
            INT_COMP : kiểm tra bằng nhau comparator

            edge bao gồm:

            L_TO_H : cạnh lên
            H_TO_L : cạnh xuống

            Sau khai báo trên để vào đoạn chương trình ngắt, khai báo:

            #INT_.........

            Ví dụ vào thực thi ngắt ngoài, ta có đoạn code:
            Code:
            #INT_EXT
            void ngat_ngoai()
            {
            //Chương trình ngắt tại đây
            }
            các cao thủ vui lòng viết 1 ví dụ cụ thể về ngắt ngoài được không??????? Em đã thử viết nhưng không chạy được. Chương trình của em dùng ngắt ngoài RB_0 và hiển thị lên port_C
            #include <16F877A.h>
            #byte portb = 0x06
            #byte portc = 0x07
            #use delay (clock = 20000000)
            int count=1;
            #INT_EXT
            void EXT_LED()
            {
            portc=count;
            count=count+1;
            delay_us(100);
            bit_clear(portb,0);
            }
            void main() {
            ext_int_edge(L_TO_H);
            enable_interrupts(INT_EXT);
            enable_interrupts(global);
            set_tris_b(0xff);
            set_tris_c(0x00);
            portc=0;
            bit_set(portb,0);
            while(1)
            {
            }

            }

            Comment

            • tinhgiac_vp
              Đệ tử 2 túi
              • Oct 2007
              • 42

              #381
              Bác F co CCS 4.038 không post lên cho mọi người nữa. Không biết nó có gì mới+tốt hơn không?

              Comment

              • anhvietqx
                Nhập môn đệ tử
                • Feb 2008
                • 3

                #382
                cám ơn các bạn rất nhiều

                Comment

                • bean984
                  Đệ tử 3 túi
                  • Dec 2007
                  • 51

                  #383
                  giúp mình về cái timer với!!
                  trong chương trình của mình có sử dụng cả timer và ngắt. Đây là hàm phục vụ ngắt của mình:
                  Code:
                  #int_RB
                  void ngat_RB()
                  {
                  if((RBIF)&&(RBIE))
                     {
                         //if(khoidong0==1)
                         //  goto Thoat;
                         output_low(pin_A3);
                         output_low(pin_A4);
                         output_low(pin_A5);
                         if(!RB4)
                         {
                            if(ver==0)
                              {
                                 ver=1;
                                 hienthicot1();
                                 goto Thoat;
                              }
                            if(ver==1)
                              {
                                 ver=2;
                                 CPHT=1;
                                 goto Thoat;
                              }
                            if(ver==2)
                              {
                                 ver=3;
                                 doctrunggian2();
                                 hienthicot3();
                                 goto Thoat;
                              }
                            if(ver==3)
                              {
                                 ver=4;
                                 phantich_so(trunggian2);
                                 trunggian=nghin;
                                 lcd_display_blink(0,13);
                                 goto thoat;
                              }
                            if(ver==4)
                              {
                                 ver=5;
                                 trunggian=tram;
                                 if(hor==6)
                                    lcd_display_char(0,13,pw[0]);
                                 lcd_display_blink(0,14);
                                 goto thoat;
                              }
                            if(ver==5)
                              {
                                 trunggian=chuc;
                                 if(hor==6)
                                    lcd_display_char(0,14,pw[0]);
                                 ver=6;
                                 lcd_display_blink(0,15);
                                 goto thoat;
                              }
                            if(ver==6)
                              {
                                 trunggian=donvi;
                                 if(hor==6)
                                    lcd_display_char(0,15,pw[0]);
                                 ver=7;
                                 lcd_display_blink(0,16);
                                 goto thoat;
                              }
                            if(ver==7)
                              {
                                 ver=4;
                                 trunggian=nghin;
                                 if(hor==6)
                                    lcd_display_char(0,16,pw[0]);
                                 lcd_display_blink(0,13);
                                 goto thoat;
                              }
                          }  // Xong RB4
                         if(!RB5)
                         {
                            if((ver==0)||(ver==1))
                              goto Thoat;
                            if(ver==2)
                            {
                              ver=1;
                              hienthicot1();
                              CPHT=0;
                              hor=0;
                              goto Thoat;
                            }// endif(ver==1)
                            if(ver==3)
                            {
                              if((hor==1)||(hor==2)||(hor==3)||(hor==4)||(hor==5))
                                       hor=1;
                              if((hor==6)||(hor==7)||(hor==8)||(hor==9))
                                       hor=6;
                              hienthicot2();
                              ver=2;
                              goto Thoat;
                            }// endif(ver==1)
                            if((ver==4)||(ver==5)||(ver==6)||(ver==7))
                              {
                                 //RBIF=0;
                                 tonghop_so();
                  
                              }
                           }// Endif(RB5)
                         if(!RB6) // Xu ly tang gia tri
                         {
                           if((ver==4)||(ver==5)||(ver==6)||(ver==7))
                              tangcot();
                         }// Endif(RB6)
                         if(!RB7)
                         {
                            if(ver==2)
                              {
                                 if(hor==0)
                                 {
                                    hor=1;
                                    goto hienthi42;
                                 }
                                 if(hor==1)
                                 {
                                    hor=6;
                                    goto hienthi42;
                                 }
                                 if(hor==6)
                                 {
                                    hor=0;
                                    goto hienthi42;
                                 }
                              hienthi42:
                                 hienthicot2();
                                 goto thoat;
                              }
                              if(ver==3)
                              {
                  
                                 if(hor==1)
                                 {
                                    hor=2;
                                    goto chuyendich43;
                                 }
                                 if(hor==2)
                                 {
                                    hor=3;
                                    goto chuyendich43;
                                 }
                                 if(hor==3)
                                 {
                                    hor=4;
                                    goto chuyendich43;
                                 }
                                 if(hor==4)
                                 {
                                    hor=5;
                                    goto chuyendich43;
                                 }
                                 if(hor==5)
                                 {
                                    hor=1;
                                    goto chuyendich43;
                                 }
                                 if((hor==6)&(user==1))
                                 {
                                    hor=7;
                                    user=0;
                                    goto chuyendich43;
                                 }
                                 if(hor==7)
                                 {
                                    hor=8;
                                    goto chuyendich43;
                                 }
                                 if(hor==8)
                                 {
                                    hor=9;
                                    goto chuyendich43;
                                 }
                                 if(hor==9)
                                 {
                                    hor=7;
                                    goto chuyendich43;
                                 }
                              chuyendich43:
                                 {
                                 //doctrunggian2();
                  
                                 hienthicot3();
                                 phantich_so(trunggian2);
                                // doctrunggian2();
                                 }
                              } //If (ver==3)
                           }// Endif(RB7)
                  Thoat:
                     RBIF=0; //Xoa co ngat RB
                     } // Ket thuc if co ngat
                  }// Ket thuc ham void
                  trong hàm phục vụ ngắt mình gọi đến khá nhiều hàm con. Khi chương trình chính không làm gì, chỉ thiết lập timer hoặc mình bỏ hẳn hàm phục vụ ngắt khỏi chương trình và trong chương trình chính cho gọi đến các hàm con khác thì timer chạy đúng như mong muốn. nhưng khi để hàm phục vụ ngắt và trong chương trình chính có gọi đến chương trình con đã được gọi trong hàm phục vụ ngắt thì thời gian ngắt của timer lại không chính xác nữa.
                  mình đã thử độc lập riêng timer thì hoàn toàn đúng.
                  mong được mọi người giúp đỡ. mình cảm ơn nhiều.

                  Comment

                  • bien_van_khat
                    ...Damned...
                    • Apr 2006
                    • 522

                    #384
                    CCS C không hỗ trợ reentrant, do đó khi 1 chuơng trình con được gọi đồng thời trong chương trình chính và trong trình phục vụ ngắt thì CCS sẽ sinh mã để tự động che ngắt khi vào chương trình con đó để tránh reentrant.

                    Với trường hợp của bạn có 2 hiệu ứng làm trễ ngắt timer:
                    Thứ 1: khi vào chương trình con được gọi chung, CCS sẽ che ngắt global, do đó ngắt timer ko đc xảy ra, làm ngắt timer đến trễ so với thực tế.
                    Thứ 2: Trình phục vụ ngắt thay đổi mức trên PORTB của bạn quá dài, vì trong thời gian đang thực thi trình này thì ngắt nói chung và ngắt timer nói riêng ko thể xảy ra, nên làm trễ ngắt timer.

                    Về khái niệm reentrant (vào lại).

                    Bạn có thể tưởng tượng một chương trình con A đang được chạy trong chương trình chính, ngắt xảy ra và A lại đc gọi bởi trình phục vụ ngắt. Lúc này sẽ có một số vấn đề phát sinh:
                    1 - Không gian bộ nhớ cấp cho các biến của A: nếu linker cấp phát tĩnh các biến này thì coi như tiêu. Với pic16F, cấp phát động bộ nhớ (dùng stack) là điều phức tạp vì hardware ko hỗ trợ nhiều cho truy xuất bộ nhớ gián tiếp, mình ko có thời gian disassembly nhưng tin chắc là CCS ko làm điều này (CCS ko hỗ trợ đệ quy).
                    2 - Các tác vụ về IO hoặc về biến tốn nhiều chu kỳ máy khi bị ngắt giữa chừng cũng coi như tiêu.
                    - Xin đọc trước khi post bài

                    Xin đặt code trong thẻ [ code ] [ /code ]

                    Comment

                    • anhvietqx
                      Nhập môn đệ tử
                      • Feb 2008
                      • 3

                      #385
                      thanks!!! rat bo ich!

                      Comment

                      • bean984
                        Đệ tử 3 túi
                        • Dec 2007
                        • 51

                        #386
                        thanks anh nhiều!!
                        nhưng em vẫn chưa hiểu lắm về reentrant. anh có tài liệu j nói về vấn đề này không?
                        vấn đề nữa là trình phục vụ ngắt trên port B của em có lẽ là không rút ngắn được bao nhiêu.vậy có cách nào để tính thời gian ngắt của timer không?

                        Comment

                        • bean984
                          Đệ tử 3 túi
                          • Dec 2007
                          • 51

                          #387
                          cho em hỏi một vấn đề nữa nhé.
                          hiện tại chương trình của em cần thêm một số modul nữa, nhưng khi thêm vào và dịch thì nó thông báo là hết RAM mặc dù trước đó ctrinh mới dùng hết khoảng hơn 60% RAM.
                          có ai biết về vấn đề này xin giúp em với, làm sao để có thể dịch được nhiều hơn?

                          Comment

                          • bien_van_khat
                            ...Damned...
                            • Apr 2006
                            • 522

                            #388
                            Nguyên văn bởi bean984 View Post
                            thanks anh nhiều!!
                            nhưng em vẫn chưa hiểu lắm về reentrant. anh có tài liệu j nói về vấn đề này không?
                            vấn đề nữa là trình phục vụ ngắt trên port B của em có lẽ là không rút ngắn được bao nhiêu.vậy có cách nào để tính thời gian ngắt của timer không?
                            Bạn vào google tìm với từ khóa reentrant, có rất nhiều topic về vấn đề này.

                            Về timer, mình nghĩ bạn nên đưa phần quét phím ra chương trình chính, khi có ngắt INT_RB, bạn set cờ báo cho chuơng trình chính kiểm tra phím bấm, lúc này ngắt timer vẫn xảy ra được

                            bean984 cho em hỏi một vấn đề nữa nhé.
                            hiện tại chương trình của em cần thêm một số modul nữa, nhưng khi thêm vào và dịch thì nó thông báo là hết RAM mặc dù trước đó ctrinh mới dùng hết khoảng hơn 60% RAM.
                            có ai biết về vấn đề này xin giúp em với, làm sao để có thể dịch được nhiều hơn?
                            Bạn định thêm vào module gì?
                            - Xin đọc trước khi post bài

                            Xin đặt code trong thẻ [ code ] [ /code ]

                            Comment

                            • auto_control
                              Nhập môn đệ tử
                              • Jan 2008
                              • 3

                              #389
                              mời tìm hiểu về pic cho mình hỏi có cách tạo ra cấu trúc truy nhập kiểu bảng (db ....)như đối với 8051 không .và tổ chức như thế nào/Mong trả lời của các bạn và các tiền bối
                              Last edited by auto_control; 22-03-2008, 12:58 AM.

                              Comment

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

                                #390
                                Nguyên văn bởi auto_control View Post
                                mời tìm hiểu về pic cho mình hỏi có cách tạo ra cấu trúc truy nhập kiểu bảng (db ....)như đối với 8051 không .và tổ chức như thế nào,
                                Bạn đặt câu hỏi này trong luồng về CCS C cho PIC, xem ra không thích hợp. Các ngôn ngữ cấp cao, trong trường hợp này là ngôn ngữ C, đã xử lý các cấu trúc dữ liệu cho người lập trình rồi, cho nên không cần quan tâm xem tổ chức như thế nào.

                                Câu hỏi của bạn nên được post ở luồng cơ bản về PIC và vi điều khiển, và sử dụng hợp ngữ. Bạn có thể đọc tài liệu hướng dẫn của MPASM để thấy có thể dùng DT, DB, và DW để định nghĩa các bảng dữ liệu.

                                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

                                Working...