Thông báo

Collapse
No announcement yet.

Hi-Tech PIC và CCS C

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

  • Hi-Tech PIC và CCS C

    http://picvietnam.com/showthread.php?t=4

    Đây là tất cả các vấn đề các bạn mới học PIC cần quan tâm


    http://picvietnam.com/showthread.php?t=10

    Một bài viết chung về vi điều khiển


    http://picvietnam.com/showthread.php?t=5

    Tài liệu hướng dẫn PIC tại picvietnam


    http://picvietnam.com/showthread.php?t=19

    Các mạch nạp cho PIC


    http://picvietnam.com/showthread.php?t=74

    Mua bán về PIC và các sản phẩm PIC



    Chúng tôi luôn hỗ trợ các bạn về PIC, và mong chờ các bạn đóng góp các kiến thức để cùng chúng tôi hoàn thành tài liệu hướng dẫn PIC

    mọi chi tiết, liên hệ phungtbinh@yahoo.com hoặc falleaf.pic@gmail.com

    chúc vui.
    Falleaf
    Công ty TNHH Thương mại và Giao nhận R&P
    58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
    mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

  • #2
    Hi-Tech PIC compiler và nhúng vào MPLAB

    Cài MPLAB download free tại http://microchip.com mới có phiên bản mới 7.20. Sau đó cài Hi-Tech PIC compiler. Sau đó chọn Project -> Set Language Tool Location. Sau đó chọn trình biên dịch mà bạn dùng. Nếu không có thì bạn phải cải plugin cho nó. Bạn vào http://htsoft.com download MPLABConfig.exe. Với CCS bạn cũng làm tương tự bạn download file mplab-ccs-plugin-install.exe thế là OK.
    Attached Files

    Comment


    • #3
      Viết các câu lệnh trong C như thế nào ? Câu trả lời giống ANSI C về cấu trúc nên bạn không có gì phải lo. Thực ra PIC hay các loại vi điểu khiển khác thậm chí là CPU nó cũng chẳng hiểu AX, BX, CX... hay OPTION, INTCON, TRISA, PORTB là đâu mà nó chỉ hiểu đó là thanh ghi n bít tại địa chỉ bao nhiêu đó thôi. khi viết trong chương trình bằng Hi-Tech PIC bạn phải có dòng lệnh include<pic.h> bạn thử mở thư mục cài Hi-tech PIC vào thư mục include xem sao ? Hi-Tech PIC compiler đã định nghĩa cho bạn các thanh ghi...đó bằng các tên giống trong datasheet điều này rất quan trọng. Bạn có thể thay đổi các tên này nhưng như vậy sẽ chẳng có ai hiểu chương trình của bạn cả. Cuối cùng các bạn chỉ cần hiểu các thanh ghi trong PIC đã được định nghĩa giống với tên trong datasheet.
      Last edited by 4MD; 29-08-2005, 04:03.

      Comment


      • #4
        Tôi vẫn dùng HT-PIC mặc dù CCS có phần tiện lợi hơn bởi thư viện đồ sộ. Nhưng bộ compiler của HT-PIC của PIC16 là 950USD trong khi CCS lại giá chỉ chưa đến 1/2. Nghĩa là HT-PIC đắt gấp hơn 2 lần... một số bạn bè tui có đánh giá là vì lý do HT-PIC sinh mã tối ưu hơn CCS?
        Cái này CCS tự khoe, và đem ra so sánh:
        http://www.ccsinfo.com/compare.shtml
        Tuy nhiên HT-PIC thời điểm đó là:HI-TECH PICC V7.86, bây giờ đã là V8.05PL2 rùi, còn CCS thì đã là đời cao hơn rồi.
        http://www.hitech.com.au/purchase/pricelist.php
        http://www.hitech.com.au/products/picccompiler.php
        Bởi lý do trên, ai trung thành với HT-PIC thì đừng buồn :P

        Comment


        • #5
          Làm thế nào để dùng được Add Watch trong Hi-Tech PIC như trong ANSI C ?
          Chọn View -> Watch
          Attached Files

          Comment


          • #6
            4MD này trong HT PIC mình có viêt được theo kiểu vòng lặp các cổng không nhỉ chẳng hạn tôi muốn viết tất cả các cổng ở PORTB là mức cao dùng vòng lặp for sao không được nhỉ ? 4MD trả lời nhanh nhé

            Comment


            • #7
              Bạn post chương trình lên xem sao ?
              Bạn đang lập trình I/O để định nghĩa các cổng thì viết rất đơn giản thôi.
              #include&lt;pic.h>
              __CONFIG(UNPROTECT &amp; WDTEN &amp; HS &amp; PWRTEN &amp; BOREN &amp; LVPDIS &amp; DUNPROT &amp; DEBUGDIS);
              void main(){
              TRISB = 0x00; //Thanh gi huong port B, 0=Output; 1=Input;
              PORTB = 0xff; //Dat port B len muc cao
              while(1)
              {
              NOP(); //Lenh nay khong lam gi ca
              CLRWDT(); //Clear Watchdog Timer
              }
              }

              Comment


              • #8
                Sao tôi làm như bạn bảo mà không được thế ? Bạn có thể post vài ví dụ để tui hình dung rõ hơn việc viết chương trình bằng Hi-Tech PICC không ? vì tui nghe nói Hi-Tech PICC viết chương trình tối ưu hơn CCS. Tui đang dùng CCS nên không hiểu rõ lắm. Bạn có thể chỉ rõ hơn cách DEBUG không ?

                Comment


                • #9
                  Trước tiên bạn phải chọn Debugger -> MPLAB SIM sau đó vào Debugger chạy Step... Hoặc ấn F7 để chạy từng bước.
                  Attached Files

                  Comment


                  • #10
                    Còn đây là một hàm delay
                    void delayms(unsigned int delayms) //Ham tre delayms Fosc=18,432Mhz
                    {
                    unsigned int i;
                    T1CON = 0x00;
                    TMR1IE = 0;
                    TMR1L = 0x00;
                    TMR1ON = 1;
                    for(i=0;i++;i&lt;delayms)
                    {
                    TMR1H = 0xEE;
                    TMR1IF = 0;
                    while(!TMR1IF);
                    CLRWDT();
                    }
                    }
                    Tương tự có thể viết cho TMR0 và TMR2...Trên đây là những ví dụ đơn giản nhất thôi. Mong các bác tiếp tục chia sẻ các kinh nghiệm...
                    Last edited by 4MD; 02-12-2005, 10:03.

                    Comment


                    • #11
                      Nguyên văn bởi hio2
                      4MD viết chi tiết về Timer đi , cả các ví dụ nữa cho anh em tham khảo !
                      Một ví dụ về Timer0
                      void delay_400_ms(void)
                      {
                      unsigned int i=0;
                      for(i=0;i&lt;36;i++)
                      {
                      TMR0 = 56;
                      while(!TMR0IF);
                      TMR0IF = 0;
                      }
                      }
                      Mình dùng thạch anh 18.432Mhz. Prescaler là 1:256. Cần delay 400ms->mình tính được TMR2 = 18432000/4/256/ = 18000. TIMER 0 là bộ định thời 8 bít. Nếu lấy 18000/256=70.3125 lẻ -> 18000/200 = 90. Đây là số vòng lặp for để có được khoảng thời gian chính xác 1 giây. -> muốn trễ 400ms thì số vòng lặp for là: 90*0.4 = 36. TMR0 là thành ghi có thể đọc và viết. Mình viết TMR0=56 nó sẽ tăng từ 56->255 (Số 200 chia ở trên). Tương tự với TMR1 và TMR2 cũng thế.
                      Và ở trên mình có post một ví dụ về TMR1 rồi đó. :o

                      Comment


                      • #12
                        Dùng Timer để trễ thời gian

                        4MD viết

                        [code:1]void delay_400_ms&#40;void&#41;
                        &#123;
                        unsigned int i=0;
                        for&#40;i=0;i&lt;36;i++&#41;
                        &#123;
                        TMR0 = 56;
                        while&#40;!TMR0IF&#41;;
                        TMR0IF = 0;
                        &#125;
                        &#125; [/code:1]

                        noisepic viết code này trong CCS và xem mã nguồn ASM
                        [code:1]
                        .................... delay_400_ms&#40;&#41;;
                        0013&#58; GOTO 004 //&#40;2&#41;
                        .................... &#125;
                        ....................
                        .................... //************************************************
                        .................... void delay_400_ms&#40;void&#41;
                        .................... &#123;
                        0014&#58; SLEEP
                        .................... unsigned int i=0;
                        *
                        0004&#58; CLRF 0F //&#40;1&#41;
                        .................... for&#40;i=0;i&lt;36;i++&#41;
                        0005&#58; CLRF 0F //&#40;1&#41;*36
                        0006&#58; MOVF 0F,W //&#40;1&#41;*36
                        0007&#58; SUBLW 23 //&#40;1&#41;*36
                        0008&#58; BTFSS 03.0 //&#40;2&#41;*36
                        0009&#58; GOTO 00F //&#40;2&#41;
                        .................... &#123;
                        .................... TMR0 = 56;
                        000A&#58; MOVLW 38 //&#40;1&#41;*36
                        000B&#58; MOVWF 01 //&#40;1&#41;*36
                        .................... while&#40;TOIF=0&#41;;
                        .................... TOIF=0;
                        000C&#58; BCF 0B.2 //&#40;1&#41;*36
                        .................... &#125;
                        000D&#58; INCF 0F,F //&#40;1&#41;*36
                        000E&#58; GOTO 006 //&#40;2&#41;*36
                        .................... &#125;
                        000F&#58; GOTO 014 &#40;RETURN&#41; //&#40;2&#41;
                        //----------------------------------------------------------
                        [/code:1]
                        noisepic có chút ít ý kiến về chương trình trễ thời gian của 4MD.
                        Khi noisepic dùng các câu lệnh trên viết trong CCS và xem mã ASM
                        (Mình dùng thạch anh 4MHZ , mỗi chu kì lệnh ứng với 1us)
                        T_trễ=11*36+5+ tg trễ để đồng bộ ~400us= 0.4ms

                        Tức là thời gian trễ của cả hàm delay_400_ms~400ms+0.4ms=400.4ms

                        Nhưng đối với các ứng dụng cần nghiêm ngặt về thời gian thì phải chú ý hơn điều này!!

                        Còn trong HTPIC tốn khoảng thời gian "tương đối chính xác" là bao nhiêu để thực hiện hàm delay_400_ms này!
                        Learn more...

                        Comment


                        • #13
                          Bạn nào thử dùng HTPIC dịch đoạn mã trên và view ASM xem sai số như thế nào sao với CCS?

                          Thực tế đúng như noispic nói, sẽ có sai số, bởi lẽ ngoài thời gian timer tràn còn có thời gian xử lý. Bởi thế, cần có thêm việc bù trừ để tăng chính xác:
                          + Cái này phải nhúng ASM vào để tính thêm lệnh phụ trội để bù trừ.
                          + Hoặc cách khác là view asm để bù trừ.
                          Ngoài ra, nếu cài đặt thêm ngắt khác(ví dụ ngắt timer nào đó) thì có thể sẽ bị trễ đi nhiều hơn nữa.

                          Để thời gian chính xác hơn thì có thể dùng ngắt. Nhưng chú ý bù trừ bởi khi vào ngắt cũng mất khoảng 13 chu kỳ thì phải. Hơn nữa nếu nếu đúng vào thời điểm ngắt timer này, mà ngắt khác đang thực thi thì cũng sẽ bị sai số. Và những sai số ngẫu nhiên này khó quản lý.

                          Tuy nhiên có thể giảm sai số nhiều cách khác và tùy thuộc vào bài toán cụ thể nữa.

                          Ví du bạn tạo một RTC xem ngày tháng = mỗi 1 con PIC thì nên dùng thạch anh hệ thống chẵn, rồi prescale timer đủ lớn(bởi Prescale ko bị dừng khi bộ định thời dừng, ngoài ra nó có thời gian đủ lớn để MCU thực thi công việc timer nặgt nghèo mà ko phí một CLK nào). Hay cách khác là dùng crystal dao động kiểu RTC 32.768 tại chân bộ dao động timer(ko phải dao động hệ thống)...

                          Comment


                          • #14
                            Code:
                            14:                void delay_400_ms(void)
                            15:                {
                              07EB    0183     CLRF 0x3
                            16:                	unsigned int i=0;
                              07EC    01A0     CLRF 0x20
                              07ED    01A1     CLRF 0x21
                            17:                	for(i=0;i&lt;36;i++)
                              07EE    01A0     CLRF 0x20
                              07EF    01A1     CLRF 0x21
                              07F5    0AA0     INCF 0x20, F
                            18:                	{
                            19:                		TMR0 = 56;
                              07F0    3038     MOVLW 0x38
                              07F1    0081     MOVWF 0x1
                            20:                		while(!TMR0IF);
                              07F2    1D0B     BTFSS 0xb, 0x2
                              07F3    2FF2     GOTO 0x7f2
                            21:                		TMR0IF = 0;
                              07F4    110B     BCF 0xb, 0x2
                            Hi-Tech PICC compiler thực hiện hàm này mất 11 lệnh ASM còn CCS
                            mất 13 lệnh. Hi-Tech PICC mất 1 lệnh goto còn CCS mất 3 lệnh ->
                            tỉ lệ sẽ là 12/16=75% so với 100% của CCS -> Hi-Tech PICC compler
                            sinh mã tối ưu hơn CCS là điều không phải bàn cãi. Và thực tế thì
                            Hi-Tech PICC là trình biên dịch cho PIC tốt nhất...Kiểm tra tại
                            http://microchipc.com.
                            Việc khắc phục anh BinhAnh đã đưa ra cách giải quyết rõ ràng rồi.
                            Trong http://microchipc.com
                            Code:
                             Q. How do I time exact intervals?
                            My favorite way to handle this 'non-commensurate' intervals
                            problem is to steal a concept from the Bresenham line drawing algorithm.
                            Using the current case:
                                *
                                  4.00 MHz crystal
                                *
                                  1Mhz instruction rate
                                *
                                  256 cycles and prescaler of 64
                                *
                            each overflow of the timer represents 256*64 == 16384 microseconds
                            You start with a counter set to 1,000,000 (1 second in microseconds)
                            On each timer interrupt you subtract 16384 from the counter.
                            If the counter goes negative you update the time by one second and
                            then add 1,000,000 back in to the counter.
                            This technique will work for any interval. It can be made perfect for 
                            intervals that have a rational relationship to the instruction cycle time,
                            and can be abitrary close to perfect even for irrational ratios, for
                            example a SQRT(2) Mhz
                            crystal.
                            Theo tôi thì chỉ có thể tạo được tạo ra khoảng thời gian chính xác
                            bằng bội số của chu kì máy mà thôi. Nó là đơn vị nhỏ nhất mà máy
                            phân biệt được. Ví dụ muốn delay chính xác 10us (Thạch anh 4 Mhz)
                            chỉ cần viết 10 lệnh NOP(); liên tiếp nhau chẳng hạn. Nếu lớn hơn
                            thì có thể dùng vòng lặp for sau đó view ASM xem lệnh for mất bao
                            nhiêu chu kì máy rồi hiệu chính biến chạy cho phù hợp.

                            Comment


                            • #15
                              Nguyên văn bởi ngkdong
                              Ban nào có mạch nạp PIC voi MPLAB cho minh xin voi, minh đang cần.
                              Mạch nạp bạn xem ở đây: http://dientuvietnam.net/board/showthread.php?t=232
                              MPLAB thì bạn download trên microchip.com

                              Comment

                              Về tác giả

                              Collapse

                              falleaf Tìm hiểu thêm về falleaf

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

                              Collapse

                              Đang tải...
                              X