Pic16f877a TỪ DỄ TỚi KhÓ

Collapse
This topic is closed.
X
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • zero_OR_one
    Nhập môn đệ tử
    • Oct 2005
    • 5

    #61
    các bác cho em hỏi tý:

    Code:
     ; Bài toán yêu cầu :nhấn 2 lần nút button(nối tại RA0) led nối với RB0
     ; sẽ sáng(mạch dùng luôn của bác Chính vậy chỉ khác có cái button 
     ; nối với VCC qua RA0 xuống đất)
     ; chương trình sẵn:
     ; Project: Two pushes to turn on a LED
    
    	Processor  16F84a
    	include <p16F84a.inc>
    	__CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _RC_OSC
    
    
    	ORG 0		;This is the start of memory for the program.
    SetUp	
                 BSF 03,5	             ;Go to Bank 1
    	CLRF 06		;Make all port B output
    	MOVLW 01	;Load W with 0000 0001
    	MOVWF 05	;Make RA0 input
    	BCF 03,5	;Go to Bank 0 - the program memory area.
    	CLRF 1F		;Clear the button file
    	CLRF 06		;Blank the output
    	GOTO Main
    		
    Delay	
                 NOP		;Create approx 250mS delay
    	DECFSZ 1A,1
    	GOTO Delay
    	DECFSZ 1B,1
    	GOTO Delay
    	RETURN	
    
    Delay2	
                 NOP		;Create 1mS debounce delay	
    	DECFSZ 1A,1
    	GOTO Delay2
    	RETURN
    
    Sw	
                 BTFSS 05,0	;Test the push button
    	GOTO Sw3	;Button not pressed	
    	BTFSC 1F,2	;Test end-of-flash flag
    	RETURN
    	BTFSC 1F,0	;First pass?
    	RETLW 00	;No
    	BTFSS 1F,1	;Test first-press flag
    	GOTO Sw2	;First press
    	BSF 06,0	             ;Button has been pressed twice. Illuminate LED
    	CALL Delay	;Keep LED on
    	CALL Delay	;Keep LED on
    	BCF 1F,1	             ;Clear second-push flag bit
    	BSF 1F,2	             ;Set end-of-flash flag
    	BCF 06,0	             ;Turn LED off
    	RETURN
    Sw2	
                 BSF 1F,1	             ;Set the first-press flag
    	BSF 1F,0	             ;Set button pass flag bit
    	RETURN	
    Sw3	
                 BCF 1F,0	              ;Clear button pass flag bit
    	BCF 1F,2	              ;Clear end-of-flash flag
    	RETURN
    
    Main	
                 CALL Sw
    	CALL Delay2	;Debounce switch	
    	GOTO Main
    
    	END		;Tells assembler end of program
    Một số chỗ em chưa hiểu:
    1.Các file 1A,1B mặc định bao nhiêu mà tạo được các thời gian trễ như trên
    2.File 1F với các bit hoạt động ra sao
    3.Chương trình này hoạt động thế nào :em chư hiểu giải thuật ,tại sao nhấn nút button lần 1 led chưa sáng,lần 2 led mới sáng
    Chỗ này:
    Code:
    Sw	
                 BTFSS 05,0	;Test the push button
    	GOTO Sw3	;Button not pressed	
    	BTFSC 1F,2	;Test end-of-flash flag
    	RETURN
    	BTFSC 1F,0	;First pass?
    	RETLW 00	;No
    	BTFSS 1F,1	;Test first-press flag
    	GOTO Sw2	;First press
    	BSF 06,0	;Button has been pressed twice. Illuminate LED
    	CALL Delay	;Keep LED on
    	CALL Delay	;Keep LED on
    	BCF 1F,1	;Clear second-push flag bit
    	BSF 1F,2	;Set end-of-flash flag
    	BCF 06,0	;Turn LED off
    	RETURN
    Nhấn lần 1:->BTFSC 1F,2->BTFSC 1F,0->BTFSS 1F,1->GOTO Sw2
    Sw2 BSF 1F,1 ;Set the first-press flag
    BSF 1F,0 ;Set button pass flag bit
    RETURN
    Vậy thì sau khi nó trở về từ Sw2 sẽ BSF 06,0 ;Button has been pressed twice. Illuminate LED.
    Em hiếu sai ở đâu ,mong anh Chính và mọi người trả lời hộ(Giait thích kĩ hộ em sử dụng các file 1A,1B,nhất là 1F)
    Em cảm ơn nhiều
    Last edited by ntc; 03-04-2006, 11:55 AM. Lý do: SỬA LẠI CÁCH VIẾT CODE

    Comment

    • ntc
      Đệ tử 8 túi
      • Oct 2005
      • 264

      #62
      Mọi người khi post phần code nhớ post theo cách như trên nghe. Nhìn nó sáng sủa, dễ đọc, dễ hiểu, dễ trả lời.

      Hic, viết code kiểu gì mà đọc muốn túi mắt túi mũi luôn.

      Cái thời gian delay còn phụ thuộc vào tần số hoạt động của con PIC nữa, không biết làm sao tính được. Bạn coi lại coi tần số của thạch anh là bao nhiêu?

      1A, 1B là 2 thanh ghi nằm trong RAM sử dụng cho chương trình delay. Nó không được khởi tạo nên có thể xem giá trị ban đầu bằng 0. Khi giảm lần đầu tiên thì 0 sẽ giảm về 255.

      Cách tính thời gian delay cho đoạn chương trình delay này nhh đã giải thích rất cụ thể ở các bài trước. Bạn xem lại các bài trước trong luồng này sẽ thấy (cái chương trình điều khiển LED chớp tắt trong 1 giây á).

      Còn cái thanh ghi 1F. Hic, chóng mặt quá, để từ từ xem sau vậy. Đại khái nó dùng 3 bit LSB để chỉ thị trạng thái cái nút bấm nó như thế nào mà xử lí. Chưa bấm thì giá trị trong thanh ghi 1F nó như thế nào đó, bấm 1 lần thì như thế nào đó, 2 lần thì như thế nào đó.

      Comment

      • falleaf
        PIC Bang chủ
        • May 2005
        • 2631

        #63
        Anh đề nghị em quản lý luồng như sau:

        1) Nếu post bài hướng dẫn, thì việc post source code là rất tốt, vì người dùng có thể thử nghiệm ngay

        2) Nếu post bài câu hỏi, nếu không phải code người đó viết, sẽ không trả lời, vì không có đủ thời gian để đọc code và xem code. Trước đây anh đọc code rất nhanh, nhưng trả lời một thời gian sau, quá nhiều người nhờ, lại viết email nhờ về code. Chúng ta không có thời gian để làm việc đó.

        3) Nếu các bạn muốn hỏi về code, các bạn phải đọc hiểu, và trích ra những phần mà các bạn không hiểu để hỏi, chứ không post toàn bộ đoạn code lên để hỏi như thế này. Mỗi người lập trình, có một tư duy lập trình khác nhau. Không thể nào trả lời các câu hỏi về code được, nếu như bạn không trình bày ý đồ của bạn một cách rõ ràng, nhất là khi các bạn muốn lấy code của những người khác.

        4) Nếu như các bạn muốn đặt câu hỏi về các chương trình, cấu trúc, và việc tận dụng các chức năng của PIC, cũng như vận dụng các chức năng đó một cách hợp lý, với dạng câu hỏi này, các bạn lưu ý post lưu đồ giải thuật, hoặc nội dung cần làm, chứ không post đoạn code.

        Chúc vui
        Công ty TNHH Thương mại và Giao nhận R&P
        store.hn@rpc.vn - store.hcm@rpc.vn

        Học PIC như thế nào?

        Comment

        • zero_OR_one
          Nhập môn đệ tử
          • Oct 2005
          • 5

          #64
          Nguyên văn bởi ntc
          Mọi người khi post phần code nhớ post theo cách như trên nghe. Nhìn nó sáng sủa, dễ đọc, dễ hiểu, dễ trả lời.

          Hic, viết code kiểu gì mà đọc muốn túi mắt túi mũi luôn.

          Cái thời gian delay còn phụ thuộc vào tần số hoạt động của con PIC nữa, không biết làm sao tính được. Bạn coi lại coi tần số của thạch anh là bao nhiêu?

          1A, 1B là 2 thanh ghi nằm trong RAM sử dụng cho chương trình delay. Nó không được khởi tạo nên có thể xem giá trị ban đầu bằng 0. Khi giảm lần đầu tiên thì 0 sẽ giảm về 255.

          Cách tính thời gian delay cho đoạn chương trình delay này nhh đã giải thích rất cụ thể ở các bài trước. Bạn xem lại các bài trước trong luồng này sẽ thấy (cái chương trình điều khiển LED chớp tắt trong 1 giây á).

          Còn cái thanh ghi 1F. Hic, chóng mặt quá, để từ từ xem sau vậy. Đại khái nó dùng 3 bit LSB để chỉ thị trạng thái cái nút bấm nó như thế nào mà xử lí. Chưa bấm thì giá trị trong thanh ghi 1F nó như thế nào đó, bấm 1 lần thì như thế nào đó, 2 lần thì như thế nào đó.
          Xin lỗi anh C,em sẽ rút kinh nghiệm lần sau.
          Thạch anh ở đây dùng 4 MHZ anh à
          Em vẫn chưa hiểu giải thuật,ai hiểu giải thuật thì chỉ cho em với.
          Em thấy bài toán này khó đấy chứ nhỉ

          Comment

          • nhh
            Đệ tử 9 túi
            • Feb 2006
            • 174

            #65
            Nguyên văn bởi vpic16f877
            Hey,mấy đồng bào có thể hướng dẫn viết C trên pic6f877a ko?
            Mình đã có những bài viết ở luồng này rồi mà !
            Ngày mai bắt đầu từ ngày hôm nay

            Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
            http://www.picvietnam.com/forum//showthread.php?t=1263

            Comment

            • picpicpic
              Đệ tử 2 túi
              • Jan 2006
              • 36

              #66
              hihi....Đợi mãi vẫn chưa thấy bài mới....
              ************************************************** **
              The only wrong thing would be to deny what your heart truly feels!
              ************************************************** **

              Comment

              • nguyenan
                Đệ tử 1 túi
                • Nov 2005
                • 11

                #67
                cac bac xem dum em sao no lai bao noi vay,co can phai bo phan khai bao khong vay:

                Code:
                MPASM  5.02                         TEXT3.ASM   4-18-2006  12:05:38         PAGE  1
                
                
                LOC  OBJECT CODE     LINE SOURCE TEXT
                  VALUE
                
                                      00001    ;CHUONG TRINH HIEN THI RA PORTB
                                      00002         processor  16f877a
                                      00003 
                                      00004     include  <p16f877a.inc>
                                      00001         LIST
                                      00002 ; P16F877A.INC  Standard Header File, Version 1.00    Microchip Technology, Inc.
                                      00400         LIST
                                      00005  
                Warning[207]:  Found label after column 1. (_config)
                Error[122]  :     Illegal opcode (_cp_off)
                                      00006  _config  _cp_off &_wdt_off &_pwrte_on &_xt_osc &_lvp_off 
                                       00007 
                0000                00008  org 0x000
                                       00009 ;bat dau chuong trinh   
                0000   2801       00010    goto START
                0001                 00011 START
                0001   1303           00012    bcf STATUS,RP1
                0002   1283           00013    bcf STATUS,RP0
                Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
                0003   0186           00014    clrf TRISB
                0004   1283           00015    bcf STATUS,RP0
                0005   308F           00016    movlw B'10001111'
                0006   0086           00017    movwf PORTB
                0007                  00018 lop
                0007   2807           00019    goto lop
                Warning[205]: Found directive in column 1. (end)
                                      00020 end ;ket thuc chuong trinh
                Last edited by falleaf; 18-04-2006, 02:55 PM.

                Comment

                • newuser
                  Đệ tử 4 túi
                  • Feb 2006
                  • 66

                  #68
                  uhm...chán quá, gõ bài gửi cho bạn,đến khi gửi thì chẳng hiểu sao mình lại bị log out. Mình trả lời bạn ngắn gọn thôi vậy, ngại gõ lại quá...
                  bạn thấy dòng thông báo rồi đó, nó nói rằng bạn không thể tác động lên thanh ghi TRISB vì đơn giản là thanh ghi này không nằm ở bank0, nó nằm ở bank1/bank3 bạn à, vì thế bạn phải sửa lại đoạn code như sau:
                  BSF STATUS,RP0;chọn bank 1
                  BCF STATUS,RP1
                  bạn nên viết macro cho việc chọn bank thanh ghi cho tiện vì nếu bạn viết chương trình bằng asm thì phải nhảy qua nhảy lại các bank thanh ghi rất nhiều. Ví dụ như:
                  bank0 macro
                  bcf STATUS,RP0
                  bcf STATUS,RP1
                  endm
                  bank1 macro
                  bsf STATUS,RP0
                  bcf STATUS,RP1
                  endm
                  ....
                  lưu lại với đuôi *.inc trong cùng thư mục với file *.asm
                  đặt dòng include *.inc vào đầu chương trình bạn nhé.

                  Comment

                  • ntc
                    Đệ tử 8 túi
                    • Oct 2005
                    • 264

                    #69
                    Một số vấn đề về các thông báo, cảnh báo và lỗi khi biên dịch dùng MPASM. Mấy cái này, trong mấy cái Tutorial, mình đã rất cẩn trọng khi viết, để tránh được những thông báo không cần thiết của trình biên dịch, nhưng chắc có một số bạn không để ý.

                    Error[122] : Illegal opcode (_cp_off)
                    Cái "config" phải có tới hai dấu gạch ở đằng trước nó lận. Viết như thế này nó mới hiểu "__config". Nếu chỉ có một dấu gạch ở đằng trước, trình biên dịch sẽ không hiểu được đó là một derective, mà chỉ hiểu là một cái label bình thường.

                    Warning[207]: Found label after column 1. (_config)
                    Do trình biên dịch chỉ hiểu cái derective "_config" của bạn là một label khi bạn viết sai, nên mới xuất hiện thông báo này. Các label phải được đặt ở cột đầu tiên khi soạn thảo các file asm. Khi đó các thông báo tương tự sẽ không xuất hiện nữa.

                    Warning[205]: Found directive in column 1. (end)
                    Các lệnh phải được đặt ở các cột tiếp theo, mà không viết ở đầu hàng như các label. Nếu bạn cho lệnh "END" thụt vào bên trong hàng đầu tiên (trở về đầu dòng và nhấn "tab" một cái cho cái lệnh "END" nó thụt vô bên trong, khi đó, nếu biên dịch lại, dòng thông báo này sẽ không xuất hiện nữa. Các lệnh khác cũng vậy, bạn nên viết thụt vào trong một cột.

                    Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
                    Đây không phải là một thông báo lỗi, mà chỉ là một cảnh báo để bạn xem lại việc truy xuất thanh ghi đó có nằm trong bank hiện hành hay không. Trình biên dịch không kiểm tra các thao tác này cho bạn, mà chỉ đưa ra một thông báo như vậy để bạn kiểm tra lại thôi. Xin nhắc lại, đây không phải là một thông báo lỗi. Bằng chứng là, mặc dù các thông báo này xuất hiện rất nhiều khi biên dịch, nhưng nếu không có lỗi nào khác ngoài các thông báo này, thì việc build vẫn "success".

                    Trong chương trình của bạn, bạn truy xuất thanh ghi TRISB ở BANK 1 trong khi vẫn đang ở BANK 0. Như vậy là không đúng, và giả sử, không còn lỗi nào khác, thì trình biên dịch vẫn báo "build success", nhưng chương trình khi thực thi sẽ không đúng. Phải sửa dòng lệnh 00013 thành "bsf STATUS,RP0" mới đúng.

                    Error[122] : Illegal opcode (_cp_off)
                    Phải có thêm dấu "&" ở đằng trước mới được.

                    Vạn sự khởi đầu nan hả.

                    Như vậy, có một số điểm cần lưu ý khi soạn thảo chương trình asm cho trình biên dịch MPASM như sau:

                    Các label nên được viết ở cột đầu tiên của trình soạn thảo. Như vậy các cảnh báo "warning[207]" sẽ không xuất hiện khi biên dịch.

                    Các lệnh, kể cả lệnh END nên được viết ở các cột tiếp theo (nên cách một khoảng tab từ đầu dòng rồi viết lệnh). Khi đó các "warning[205]" sẽ không xuất hiện khi biên dịch.

                    Các thông báo (message) và cảnh báo (warning) không phải là lỗi. Trình biên dịch chỉ đưa ra các thông điệp này để lưu ý bạn rằng các chỗ này đã được kiểm tra chưa, đã bảo đảm đúng hay chưa, và không gây ảnh hưởng đến việc build chương trình có "successed" hay "failed".

                    Các thông báo lỗi (error) mới là những lỗi thực sự. Nếu không sửa lại cho đúng thì biên dịch không thành công (failed).

                    Vậy đó.

                    Last edited by ntc; 22-04-2006, 11:00 AM.

                    Comment

                    • ntc
                      Đệ tử 8 túi
                      • Oct 2005
                      • 264

                      #70
                      Parallel Slave Port _ Một phương pháp khá đơn giản để giao tiếp giữa các vi điều khiển PIC cũng như giữa PIC và các thiết bị ngoại vi.

                      Mọi người đọc rồi cho biết ý kiến nhá.



                      Cái này chủ yếu mang tính ... academic nhiều hơn. Mình xây dựng một số module cơ bản cho giao tiếp này dựa trên 2 vi điều khiển PIC16F877A.
                      Attached Files
                      Last edited by ntc; 24-05-2006, 04:56 PM.

                      Comment

                      • falleaf
                        PIC Bang chủ
                        • May 2005
                        • 2631

                        #71
                        Nguyên văn bởi ntc
                        Parallel Slave Port _ Một phương pháp khá đơn giản để giao tiếp giữa các vi điều khiển PIC cũng như giữa PIC và các thiết bị ngoại vi.

                        Mọi người đọc rồi cho biết ý kiến nhá.
                        F đặt ra vấn đề này cho mọi người suy nghĩ để giải quyết, và mong rằng có thể đưa ra những giải pháp tốt.

                        Giả sử, có một mạng 16 con vi điều khiển nằm chung với nhau. Bây giờ, chúng ta có một con master, chỉ làm nhiệm vụ truyền dữ liệu xuống cho 16 con kia. Hãy thiết kế mạch nguyên lý, và đưa ra giải pháp firmware cho mạng các vi điều khiển này.

                        Bài toán cụ thể đơn giản hơn:

                        Có 4 con slave, và 1 con master, tất cả đều là 16F877A. Cho một giá trị khởi tạo là b'11111111' đặt trong thanh ghi GIATRI của con master. Giảm đi 1 đơn vị sau mỗi lần thực hiện:

                        - Nếu GIATRI chia hết cho 4, gửi giá trị của GIATRI vào con slave 1 và hiển thị ra LED.
                        - Nếu GIATRI chia 4 dư 1, gửi giá trị của GIATRI vào slave 2 và hiển thị ra LED
                        - Nếu GIATRI chia 4 dư 2, gửi giá trị của GIATRI vào slave 3 và hiển thị ra LED
                        - Nếu GIATRI chia 4 dư 3, gửi giá trị của GIATRI vào slave 4 và hiển thị ra LED.

                        Hay nói cách khác, thực ra là cứ giảm GIATRI đi một đơn vị, rồi gửi theo thứ tự đến các slave, cứ lặp lại, cho đến khi GIATRI = 0.

                        Chú ý, thử dùng PSP để giao tiếp, và thử không dùng PSP mà chỉ nối port với port. Có nghĩa là tất cả các portD của các master và slave được nối chung với nhau, portD của master là ngõ xuất, portD của các slave là nhập.

                        Như vậy, chúng ta thử tìm giải pháp dùng giao tiếp PSP và giao tiếp song song giống như giao tiếp với cổng LPT của máy tính vậy.

                        Từ bài học này, chúng ta sắp nhấn một bước tới việc thực hành giao tiếp LPT, và một số thuật toán xử lý tín hiệu song song.

                        Mong rằng các bạn đầu tư thời gian để đưa ra một giải pháp tốt, phân tích tốc độ tính toán của giải pháp.

                        Chúc vui.
                        Công ty TNHH Thương mại và Giao nhận R&P
                        store.hn@rpc.vn - store.hcm@rpc.vn

                        Học PIC như thế nào?

                        Comment

                        • hungnp
                          Đệ tử 1 túi
                          • May 2006
                          • 15

                          #72
                          Chao ban nhh. ban co cong nhan voi toi la loi viet bai nhu cua ban ntc thi da co qua nhieu bai viet trong nuoc va nuoc ngoai roi khong? co can toi chi ra mot it khong?. ban doc lai tu dau den cuoi cai forum nay di. co bao nhieu ban cho bai moi cua ban ntc. nhu the chang qua cac bai viet truoc chang co y nghia gi nhieu voi ho ca. Con van de toi co viet bai hay khong con tuy thuoc trinh do cua toi den muc do nao nua. Toi cam thay minh chua the du nang luc de viet nhung bai co chat luong that su nen toi chua viet duoc.

                          Comment

                          • hungnp
                            Đệ tử 1 túi
                            • May 2006
                            • 15

                            #73
                            De thuc hien duoc mot mang nhu cua bac F co the su dung mang 485. cho phan cung va giao thuc master/slave cho phan mem. giao tiep uart

                            giao thuc master/slave co the tuy bien theo ý thich cua nguoi dung.

                            Uu diem cua mang nay la: co the ket noi duoc nhieu slave tren mang(tat nhien con tuy thuoc vao mach chuyen hoi 232-485). truoc day toi da lam den 6 slave bang 89c51 ma chua co van de gi ca.

                            co kha nang tuyen data di xa do tin hieu truyen di va nhan ve cua VĐk la hieu cua tin hieu tren 2 day cua 485. do vay khi bi nhieu thi nhieu tren 2 day la dong deu nhu nhau nen khi lay hieu cua chung thi nhieu do bi triet tieu.

                            thoi dang ban khi khac noi tiep neu nhu co ai quan tam den cai mang nay cua toi.
                            Last edited by hungnp; 29-05-2006, 03:57 PM.

                            Comment

                            • hungnp
                              Đệ tử 1 túi
                              • May 2006
                              • 15

                              #74
                              Sao không ai nói tiếp chuyện của bác F thế. Buồn Wá. Tôi đưa ra thuật toán thế này nhé. thuật toán này chỉ dùng cho mạng 485 của tôi.

                              Comment

                              • hungnp
                                Đệ tử 1 túi
                                • May 2006
                                • 15

                                #75
                                mạng 485

                                Các bác tham khảo và cho ý kiến nhé.
                                Attached Files

                                Comment

                                Working...