|
Tài trợ cho PIC Vietnam |
MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ... |
|
Ðiều Chỉnh | Xếp Bài |
|
02-02-2007, 03:50 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Các bác ơi giúp tôi với. Tôi muốn ghi dữ liệu vào bộ nhớ Flash của con 16f877a mà không sao ghi được. Tôi đã làm theo hướng dẫn trong datasheet nhưng vẫn không được. Mong các cao thủ giúp đỡ.
|
05-02-2007, 10:31 AM | #2 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Cám ơn bác namqn đã quan tâm giúp đỡ. Tôi dùng hợp ngữ để lập trình cho PIC và dùng Mplap để mô phỏng. Tôi sử dụng đoạn Code dưới đây trong datasheet của con pic16f877a để thực hiện, nhưng mô phỏng chẳng thấy nó chạy đúng gì cả. Không hiểu là nó sai hay mình mô phỏng không đúng. Mong bác chỉ giúp.
Code:
; This write routine assumes the following: ; ; 1. A valid starting address (the least significant bits = ‘00’)is loaded in ADDRH:ADDRL ; 2. The 8 bytes of data are loaded, starting at the address in DATADDR ; 3. ADDRH, ADDRL and DATADDR are all located in shared data memory 0x70 - 0x7f ; BSF STATUS,RP1 ; BCF STATUS,RP0 ; Bank 2 MOVF ADDRH,W ; Load initial address MOVWF EEADRH ; MOVF ADDRL,W ; MOVWF EEADR ; MOVF DATAADDR,W ; Load initial data address MOVWF FSR ; LOOP MOVF INDF,W ; Load first data byte into lower MOVWF EEDATA ; INCF FSR,F ; Next byte MOVF INDF,W ; Load second data byte into upper MOVWF EEDATH ; INCF FSR,F ; BSF STATUS,RP0 ; Bank 3 BSF EECON1,EEPGD ; Point to program memory BSF EECON1,WREN ; Enable writes BCF INTCON,GIE ; Disable interrupts (if using) MOVLW 55h ; Start of required write sequence: MOVWF EECON2 ; Write 55h MOVLW AAh ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit to begin write NOP ; Any instructions here are ignored as processor ; halts to begin write sequence NOP ; processor will stop here and wait for write complete ; after write processor continues with 3rd instruction BCF EECON1,WREN ; Disable writes BSF INTCON,GIE ; Enable interrupts (if using) BCF STATUS,RP0 ; Bank 2 INCF EEADR,F ; Increment address MOVF EEADR,W ; Check if lower two bits of address are ‘00’ ANDLW 0x03 ; Indicates when four words have been programmed XORLW 0x03 ; BTFSC STATUS,Z ; Exit if more than four words, GOTO LOOP ; Continue if less than four words thay đổi nội dung bởi: namqn, 05-02-2007 lúc 06:21 PM. |
06-02-2007, 06:45 PM | #3 | |
Trưởng lão PIC bang
|
Trích:
Bạn cần cho biết thêm 'chẳng thấy nó chạy đúng' là như thế nào, và đọc thêm phần nói về mô phỏng ngoại vi của PIC16 trong tài liệu "MPLAB IDE User's Guide" (DS51519), mục 16.3.3. 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 |
|
07-02-2007, 10:26 AM | #4 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Bác namqn ơi tôi đã đọc đoạn tài liệu đó rồi nhưng nó chỉ nói sơ qua về việc thực hiện mô phỏng với bộ nhớ EEPROM thôi. Còn ở đây tôi muốn hỏi bác về việc thực hiện ghi vào bộ nhớ Flash cơ. Tôi đã thực hiện chạy debug bình thường và sau khi chạy xong đoạn code đó thì xem lại bộ nhớ Flash xem có ghi được không, nhưng không thấy ghi được. Không biết đoạn code đó sai hay là MPLAB không cho mình xem dữ liệu ghi vào Flash.
thay đổi nội dung bởi: namqn, 07-02-2007 lúc 08:43 PM. |
07-02-2007, 08:42 PM | #5 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
08-02-2007, 09:11 AM | #6 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Nếu nói về mặt thời gian chờ cho hết chu kỳ ghi thì có lẽ là hơi nhiều so với thực tế thời gian ghi của Flash. Bởi vì khi ta debug thì thời gian là rất lớn. Chỉ có điều tôi thấy rằng không hiểu tại sao khi thực hiện lệnh set bit WR của thanh ghi EECON1 thì không thấy bit này được set lên. Theo tôi ở đây có hai giả thiết được đặt ra:
- Thời gian bit này được set là rất nhỏ ( trong thực tế sẽ là như vậy) và khi ta dùng MPLAB để mô phỏng thì không nhìn thấy được trạng thái set lên của nó. - Thứ hai là MPLAB không thực hiện mô phỏng việc ghi vào bộ nhớ Flash. Vậy theo bác namqn thì giả thiết nào đúng hay có vấn đề nào khác ở đây. Trong thực tế việc ghi vào Flash thì bác dùng những lệnh nào và với những dòng code như trên thì có ghi được vào Flash hay không? |
08-02-2007, 10:05 AM | #7 | ||
PIC Bang chủ
|
Trích:
Trích:
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? thay đổi nội dung bởi: falleaf, 08-02-2007 lúc 10:12 AM. |
||
08-02-2007, 08:20 PM | #8 | |
Trưởng lão PIC bang
|
Trích:
Trong thực tế thì tôi cũng chỉ dùng các lệnh trong đoạn required sequence đó thôi. Có điều trong thực tế thì ghi vào thanh ghi đệm 4 lần mới thực sự xảy ra việc xóa và ghi vào block 1 lần. 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 |
|
08-02-2007, 03:02 PM | #9 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Cám ơn bác falleaf đã quan tâm. Về mặt dùng MPLAB để debug từng dòng lệnh một, quan sát sự thay đổi nội dung của các thanh ghi thì tôi thực hiện hoàn toàn đúng và dòng datasheet mà bác giới thiệu thì tôi cũng đã đọc rất nhiều lần. Nhưng quả thật là tôi không quan sát thấy bit WR của thanh ghi EECON1 được set lên. Cho nên tôi mới đặt ra giả thiết rằng MPLAB không hỗ trợ việc mô phỏng ghi vào bộ nhớ chương trình (FLASH). Không biết như vậy có đúng không mong các bác quan tâm giúp đỡ.
|
12-02-2007, 08:31 PM | #10 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
13-02-2007, 09:17 AM | #11 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Báo cáo với bác namqn là cái datasheet mà tôi tham khảo là DS39582B. Còn đoạn code đầy đủ của nó tôi đã đưa lên nhờ bác xem giúp rồi đó.
Code:
LOOP..... . . INCF EEADR,F MOVF EEADR,W ANDLW 0X03 XORLW 0X03 BTFSC STATUS,Z GOTO LOOP - Thứ nhât: Giá trị thanh ghi EEADR được tăng trước khi nó được kiểm tra, cho nên nó không bao giờ tăng đủ giá trị cần thiết cả (tăng 4 địa chỉ so với địa chỉ ban đầu). - Thứ hai: Khi dùng câu lệnh BTFSC STATUS,Z GOTO LOOP Đoạn code này chỉ được thực hiện một lần duy nhất. Trong khi đó để ghi vào bộ nhớ Flash thì cần phải thực hiện ghi dữ liệu vào 4 thanh ghi đệm của nó ( Đoạn code trên cần phải được thực hiện 4 lần). Tôi đã thực hiện sửa lại đoạn code trên một cách đơn giản như sau: Code:
LOOP..... . . MOVF EEADR,W ANDLW 0X03 XORLW 0X03 BTFSC STATUS,Z RETURN INCF EEADR,F GOTO LOOP thay đổi nội dung bởi: namqn, 13-02-2007 lúc 09:22 PM. |
13-02-2007, 09:29 PM | #12 | |
Trưởng lão PIC bang
|
Trích:
Theo điều kiện đã ghi chú thì ở đầu vòng lặp phải có 2 bit thấp nhất của EEADR là '00', như vậy thì ghi dữ liệu trước rồi tăng địa chỉ sau là đúng. Và các giá trị lần lượt của 2 bit thấp nhất đó sẽ là 00, 01, 10, và 11, khi đó đến lần tăng thứ năm thì 2 bit đó sẽ về lại '00', và chúng ta đã ghi đủ giá trị vào 4 thanh ghi đệm. 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 |
|
14-02-2007, 08:53 AM | #13 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Trời ơi bác namqn bác tính lại đi, vòng lặp này của nó chỉ chạy được 3 vòng thôi. Tôi nghĩ rằng đây là vấn đề đơn giản nên không giải thích rõ.
Giá trị ban đầu của hai bit D1, D0 của thanh ghi EEADR là '00'. Ta tạm gán cho nó 1 cái tên V, gái trị ban đầu V = 00. - Lần 1: V = 00 -> V tăng lên 1 -> V = 01 -> kiểm tra V, lúc này V = 01 => Tiếp tục vòng lặp. - Lần 2: V = 01 -> V tăng lên 1 -> V = 10 -> kiểm tra V, lúc này V = 10 => Tiếp tục vòng lặp. - Lần 3: V = 10 -> V tăng lên 1 -> V = 11 -> kiểm tra V, lúc này V = 11 => Thoát khỏi vòng lặp và kết thúc. Như vậy vòng lặp này chỉ chạy được 3 vòng và không bao giờ ghi được vào đủ 4 thanh ghi đệm. |
14-02-2007, 06:57 PM | #14 | |
Trưởng lão PIC bang
|
Trích:
Trước đó bạn nói vòng lặp chỉ chạy được 1 lần nên tôi mới khẳng định là nó chạy được nhiều lần. Phân tích kỹ hơn thì có thể thấy là lệnh XORLW bị thừa, vì khi ANDLW với 0x03 thì đồng thời đã che các bit cao và kiểm tra 2 bit thấp có bằng '00' luôn rồi. 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 thay đổi nội dung bởi: namqn, 14-02-2007 lúc 07:08 PM. |
|
15-02-2007, 09:41 AM | #15 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 19
: |
Bác namqn phân tích hoàn toàn đúng, ở đây câu lệnh XORLW bị thừa. Nhưng nếu để nguyên như cũ của nó thì vòng lặp này đúng là chỉ chạy được một vòng duy nhất thôi bác ah.
namqn: bạn nói chính xác, đã được xác nhận từ các người dùng có kinh nghiệm trên diễn đàn của Microchip: http://forum.microchip.com/tm.aspx?m...1&key=𸁴. thay đổi nội dung bởi: namqn, 17-02-2007 lúc 08:39 AM. |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Chuỗi được lưu trong Flash | bien_van_khat | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 24 | 15-12-2010 09:43 AM |
về Pickit 1 FLASH Starter Kit | hawinter | Cơ bản về vi điều khiển và PIC | 2 | 19-12-2006 01:16 AM |