PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Pic16f877a TỪ DỄ TỚi KhÓ (http://www.picvietnam.com/forum/showthread.php?t=238)

newuser 02-07-2006 01:16 PM

bạn nên viết chương trình delay theo dạng như sau sẽ rất tiện:
Code:

DELAY
            MOVLW D'xx'
            MOVWF COUNTA
            CLRF COUNTB
HERE
            NOP                        ;1us
            DECFSZ COUNTB,F      ;1us
            GOTO HERE                ;4us*255~1000uS=1ms
            DECFSZ COUNTA,F
            GOTO HERE                ;'xx' ms
;            DECFSZ COUNTx,F     
;            GOTO HERE
            RETURN
bạn thay COUNTA và COUNTB như thế này cũng được :
            DECFSZ 0X22,F
            GOTO HERE
            DECFSZ 0X21,F
            GOTO HERE

bạn muốn tạo trễ bao lâu chỉ cần thêm biến COUNTx rồi nạp giá trị ban đầu cho nó ,không mất công nhảy tới nhảy lui--->chóng mặt ^_^

được không bạn ?

typhn 02-07-2006 09:21 PM

Mấy bác ơi,giúp em với.
Em mới bắt đầu học pic,nhưng chưa có mạch nạp.
Em thử biên dịch chương trình bằng mplap.
Em làm y hệt anh NTC,cái bài cho led chạy từ trái sang phải ấy
code như sau:

Code:


;8 led o portb
;cho led chay tu trai sang phai
;thoi gian delay la 100ms


        list                p=16f877A        ; list directive to define processor
        #include        <p16f877A.inc>        ; processor specific variable definitions
       
        __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;==========================
;KHOI TAO CAC BIEN       

;==========================
            count1 equ 0X20
            counta equ 0X21     
            countb equ 0X22     
 
          ORG        0X0000
          GOTO        MAIN
               

MAIN
          BCF        STATUS,RP1    ;RP1=0
          BSF        STATUS,RP0    ;RP0=1=>CHON BANK1
          CLRF        TRISB              ;XUAT DU LIEU RA PORTB
         
          BCF            STATUS,RP0  ;CHON BANK0
          MOVLW      B'10000000'
          MOVWF      PORTB          ;BAT LED O CHAN RB7
LOOP
          CALL          DELAY_100MS
          RRF            PORTB,1
          GOTO        LOOP

DELAY_100MS
         
          MOVLW      d'100'
          MOVWF      count1
DELAY0
 
          MOVLW      d'199'
          MOVWF      counta
          MOVLW      d'1'
          MOVWF      countb
D1
          DECFSZ      counta,1
          GOTO        $+2
          DECFSZ      countb,1
          GOTO        D1
          DECFSZ      count1,1
          GOTO        DELAY0
          RETURN
 end

Sau đó em nhấn alt+F10 để dịch ra file hex thì nó báo như sau:

Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\pic\B3.mcs".
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F877A "B3.ASM" /l"B3.lst" /e"B3.err"
Warning[207] D:\PIC\B3.ASM 15 : Found label after column 1. (count1)
Warning[207] D:\PIC\B3.ASM 16 : Found label after column 1. (counta)
Warning[207] D:\PIC\B3.ASM 17 : Found label after column 1. (countb)
Message[302] D:\PIC\B3.ASM 26 : Register in operand not in bank 0. Ensure that bank bits are correct.
Loaded D:\pic\B3.COD.
BUILD SUCCEEDED: Mon Jul 03 15:52:56 2006

Ko hiểu sao lại có mấy cái warning ở trên
Mấy bác giải thích dùm em với
thanks

falleaf 02-07-2006 09:40 PM

Trích:

Nguyên văn bởi typhn

Code:


        list                p=16f877A        ; list directive to define processor
        #include        <p16f877A.inc>        ; processor specific variable definitions
       
        __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;==========================
;KHOI TAO CAC BIEN       

;==========================
            count1 equ 0X20
            counta equ 0X21     
            countb equ 0X22


Em chú ý, nó báo warning cái đoạn này, khi em gán count1 equ 0x20, có nghĩa là em đặt cái 0x20 thay bởi count1, nghĩa là em đặt một cái nhãn cho 0x20. Thay vì sau này viết 0x20 thì em viết là count1.

Cách viết này, có thể dùng để đặt hằng số, có thể đặt biến, nếu em dùng nó như một thanh ghi, thì nó là biến, nếu em dùng nó như là số, thì nó là hằng.

Cho nên, lúc này em phải viết nó vào cột thứ nhất, như một cái nhãn.

Vì vậy, nó mới thông báo rằng tìm thấy một cái nhãn không viết trong cột 1. Hay dịch nguyên văn là nó tìm thấy một cái nhãn viết sau cột 1.

Trong phần này anh nhớ đã có viết rất chi tiết trong bài viết về tập lệnh, đặt biến. Khi đặt biến, em dùng cách đặt RES thì sẽ tốt hơn dùng equ. Sau này chuẩn hoá, đặt biến sẽ dùng RES chứ không dùng EQU nữa.

Chúc vui

PS, em nhớ phải đặt chương trình trong cái thẻ [code] [/ code] (viết liền lại), thì mọi người mới thấy đựơc những chỗ sai kiểu như thế này.

Chúc vui

typhn 03-07-2006 08:37 AM

cảm ơn anh!
Em sửa được rồi.
Nhưng cái lỗi này thì em chưa hiểu lắm:
Message[302] D:\PIC\B3.ASM 26 : Register in operand not in bank 0. Ensure that bank bits are correct.
Sao thanh ghi lại ko ở trong bank 0 hả anh?
Anh giải thích giùm em với
thanks

ntc 03-07-2006 10:39 AM

http://www.picvietnam.com/forum//sho...p?t=238&page=5

Bạn tham khảo thêm ở chỗ này.

:)

phutdv 03-07-2006 04:11 PM

Thấy mấy anh bàn luận sôi nổi quá.
Em có 1 thắc mắc: khi trước, làm việc với 8051, em dùng ASM51 để biên dịch ra file hex. Bây giờ, học PIC, mấy anh cho em cái trình biên dịch cho PIC nhé, hình như là MPLAP như bác typhn có nói.
Rất mong sự giúp đỡ!
Thân mến!

txt 03-07-2006 05:12 PM

Tui học PiC bằng C trước khi hoc bằng ASM và hiểu rõ PIC hoạt động bằng cách giám sát mã ASM dịch ngược cho mỗi dòng lệnh . Do vậy học C không có nghĩa là sẽ không thể hiểu rõ PIC làm gì ,vấn đề là ta có muốn hiểu hay không , và bởi vì không có trình biên dịch nào mà kho hàm dựng sẵn của nó lại đủ cho tất cả mục đích và mong muốn của chúng ta . Đôi khi bạn có thể viết như thể viết kiểu ASM nhưng lại đang dùng kiểu thể hiện ( phong cách viết ) theo C ( không cần chèn mã ASM) , nhưng sẽ rất dễ nhìn , rõ ràng , thấy ngay được mọi thứ , và có thể đơn giản nhiều thứ ( ví dụ như lặp lại hoài việc chuyển bank phiền phức ). Tôi khoái C và mặc dù đang viết "CCS tiếng Việt " dở dang , nhưng tôi có ý định viết thành 1 quyển sách " Lập trình C cho PIC ", sử dụng CCS là chính , kết hợp MPLAB . Chỉ nói về C , còn ASM chỉ nói như là giải thích cách hoạt động của hàm , chương trình . Không biết điều này có là ngược đời hay không ?( nắm C trước , ASM nắm sau thông qua làm việc với C ) . Rõ ràng có ưu điểm : C dễ hiểu và viết nhanh , ASM chỉ cần hiểu , không cần phải viết . Nhưng các bạn có đồng ý về điều này ?

acbossvn 03-07-2006 06:06 PM

Mình mới chuyển sang tiếp cận PIC sau khi đã nghiên cứu 89C51 với trình dịch Keil. Khi dùng trình dịch này mình đã thấy hết ưu điểm của ngôn ngữ C với Micro-controler. Vì vậy, hiện tại mình rất ủng hộ và tán thành việc nghiên cứu PIC bằng ngôn ngữ C và tạm thời dùng trình dịch CCS. Txt đã có 1 ý tưởng rất hay là viết sách. Hoan hô bác Txt vì thành ý của bác dành cho anh em mới và đang tiếp cận PIC. Chúc bác viết sách thành công và sớm up lên diễn đàn cho mọi người. Mình sẽ theo dõi liên tục vấn đề này trong thời gian tới. Mong mọi người chỉ bảo thêm...

acbossvn 03-07-2006 06:09 PM

Dù mới tham gia, mình vẫn thấy luồng này vẫn lộn xộn quá. Nếu được, xin hãy tách riêng các bài viết bằng code C và ASM ra. Như vậy sẽ tiện theo dõi hơn.

falleaf 03-07-2006 09:05 PM

Bạn đọc kỹ tiêu đề, luồng này nói về 16F877A, cho nên mục tiêu là để phác thảo nên các tính năng, ứng dụng của nó. Đây là một cách học khác với cách học lập trình.

Để học lập trình, bạn vào từng mục cụ thể, MPASM hoặc Các ngôn ngữ lập trình khác, để thảo luận riêng về một ngôn ngữ nào đó.

Chúc vui

acbossvn 04-07-2006 09:26 AM

Các huynh cho đệ hỏi chút: la cái CCS dịch xong chương trình ko thấy thông báo lỗi gì...nhưng khi debug lại ko được và có thông báo: cannot detect ICD type? Nghĩa là sao zaay....

vẫn có thông báo như thế kể cả khi tiểu đệ debug code cho CCS được viết trên diễn đàn này.

typhn 04-07-2006 09:36 PM

Mấy anh cho em hỏi về giao tiếp ICSP.
Có tài liệu tiếng anh nhưng em đọc ko hiểu lắm
thanks

namqn 04-07-2006 10:16 PM

Trích:

Nguyên văn bởi acbossvn
Các huynh cho đệ hỏi chút: la cái CCS dịch xong chương trình ko thấy thông báo lỗi gì...nhưng khi debug lại ko được và có thông báo: cannot detect ICD type? Nghĩa là sao zaay....

vẫn có thông báo như thế kể cả khi tiểu đệ debug code cho CCS được viết trên diễn đàn này.

Bạn debug chương trình bằng CCS hay MPLAB?

Trong trường hợp MPLAB, nếu bạn không có ICD (thường là như vậy, vì ICD đâu có dễ gì mua được) thì bạn vẫn có thể debug bằng MPLAB SIM. Bạn vào mục mênu Debugger > Select Tool, chọn 2 MPLAB SIM.

Còn CCS thì tôi không dùng nên không rõ, nhưng có vẻ như nó chỉ hỗ trợ ICD hay MACH X là mấy cái debugger của riêng hãng CCS, cùng với việc liên kết với MPLAB SIM.

Thân,

namqn 04-07-2006 10:21 PM

Trích:

Nguyên văn bởi typhn
Mấy anh cho em hỏi về giao tiếp ICSP.
Có tài liệu tiếng anh nhưng em đọc ko hiểu lắm
thanks

ICSP là giao tiếp dùng để đưa chương trình mã máy và các thông tin cấu hình, dữ liệu trong EEPROM (nếu có), vào chip thông qua một chuẩn nối tiếp, nó cho phép nạp chương trình cho chip ngay trong mạch đích.

Bạn dùng chức năng tìm kiếm của diễn đàn để tìm các luồng có liên quan đến ICSP để đọc thêm.

Để sử dụng thì chỉ cần có mạch nạp hỗ trợ ICSP, mạch đích được thiết kế theo khuyến cáo của hãng Microchip, và một số chú ý mà tôi đã nói qua trong các luồng khác khi trả lời về vấn đề này.

Thân,

typhn 04-07-2006 11:29 PM

Cảm ơn anh.Em cũng hơi hiểu rồi
Mạch nạp em sử dụng là PG2C.
Nếu cắm theo chuẩn ICSP thì ta có thể nạp cho PIC khi nó ở mạch ngoài mà ko cần cắm pic vào mạch nạp nữa.
Thanks


Múi giờ GMT. Hiện tại là 04:10 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam