PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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 ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-02-2007, 02:47 PM   #16
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Trong hai cách sửa XORLW, thì cách đảo INCF với MOVF của bạn hungpq hiệu quả hơn và chuẩn hơn so với cách sửa XORLW 0x00.

Tuy nhiên bạn dùng lệnh RETURN rất không ổn. Bản thân lệnh RETURN nó không làm gì hết, nhưng có có một nhiệm vụ là lôi cái Top of Stack ra và nhảy tới đó.

Giả sử đoạn chương trình trên của bạn, bạn viết dạng CALL thì lập tức nó nhảy về chỗ CALL đó mà không thực hiện tiếp lệnh bên dưới. Nhưng nếu bạn không sử dụng CALL, và TOS đang trống!!?

Do vậy, cách viết an toàn là GOTO $+3
Rồi nếu bạn dùng CALL thì ngay sau dòng GOTO LOOP, bạn sử dụng RETURN. Nếu bạn không dùng CALL, thì bạn có thể làm gì đó cũng được, ngay sau đó.

Hồi F viết, F hay đặt một cái nhãn chỗ RETURN và nếu cần RETURN thì F nhảy tới đó. Viết như vậy để giữ cấu trúc:

Code:
CALL LOOP
...
...
LOOP
..
RETLOOP        RETURN
Đây chỉ là một gợi ý, có thể bạn không thích kiểu viết này, chỉ là một cái recommend, không quan trọng lắm.

Về phần bạn hỏi về ghi WR, đã gần 3 năm F không đụng tới PIC, cho nên F không thực sự nhớ rõ lắm. Tuy nhiên, bạn thử kiểm tra lại đoạn này. Đó là khi ghi Flash thì WR sẽ được tự xóa, và nó hoàn toàn được thực hiện bởi phần cứng. Khi đó nó không hề được xử lý gì cả. Có nghĩa là việc thì bạn có quyền bật trong chương trình, nhưng sau đó, thì bạn sẽ không thấy gì cả mà tự động tắt.

Trong MPLAB, nó cho bạn xem EEPROM bằng MPLAB SIM. Vì vậy, bạn có thể theo dõi kết quả EEPROM có được ghi hay chưa. Bạn cũng có thể xem PROGRAMME MEMORY. Bạn chọn View và chọn các mục tương ứng để quan sát tại các địa chỉ mà bạn tương tác.

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2007, 08:49 AM   #17
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Tôi xin lỗi vì một số nhận định không chính xác ở các post trước. Tôi (và có lẽ nhiều người dùng lâu năm) thường tin tưởng một cách chủ quan vào các datasheet của nhà sản xuất.

Tôi xin xác nhận là những ý kiến của bạn hungpq về sai sót của đoạn code mẫu trong datasheet của PIC16F87xA là chính xác: đoạn code đó chỉ thực thi 1 lần nếu đúng theo các điều kiện ban đầu được đặt ra, và cách sửa tốt là bỏ lệnh XOR và đổi BTFSC thành BTFSS.

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, 18-02-2007 lúc 12:36 AM. Lý do: bổ sung thông tin
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2007, 10:18 AM   #18
hungpq
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 19
:
Chào các bác mải ăn tết lâu quá nay mới ghé thăm, cáo lỗi các bác. Thưa các bác như vậy là chúng ta đã thống nhất với nhau rằng đoạn code mẫu thực hiện ghi vào bộ nhớ FLASH trong datasheet của con PIC16f877A là bị sai. Thú thực là tôi không bất ngờ với việc code mẫu trong các datasheet bị sai bởi vì tôi đã gặp rất nhiều lần rồi. Còn việc sửa lại đoạn code này như thế nào cho hợp lý thì theo tôi không cần thiết. Bởi vì với mỗi ứng dụng, với mỗi chương trình, đều có những cách thể hiện riêng của nó để cho nó tối ưu nhất. Đúng như vậy không các bác. Còn nếu có thể thì các bác cho một yêu cầu về một hàm ghi dữ liệu vào bộ nhớ Flash của con 16f877a để mọi người cùng thảo luận và xây dựng.
hungpq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2007, 04:06 PM   #19
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Trong datasheet thực tế là sai rất nhiều chỗ, lúc trước F mở ra cái box MPASM này là có ý đồ để các bạn viết MPASM và chuẩn hóa lại các đoạn code.

Thực tế như các bạn thấy, nếu như F có viết những lời mào đầu, thì giả sử như có đúng, có sai... Như vậy, nếu F có viết thì cũng làm sao bằng cái kho datasheet của Microchip, và cũng không thể bằng được cái kho thư viện thuật toán của piclist.

Tuy nhiên, một điều hơi sai ý đồ, đó là vì nghĩ như vậy, cho nên F dành thời gian ban đầu, tập trung vào Cơ bản về PIC, và chính cái tên cơ bản về PIC cũng thu hút rất nhiều người đọc. Cuối cùng, ngay cả bài viết này, các bạn cũng tập trung vào box Cơ bản về PIC này, mà không chú ý viết bài ở phần MPASM

Một số vấn đề về thuật toán cao cấp hơn, vd như các bạn chưa ai thử viết một mạch lọc bằng MPASM, hoặc viết các đoạn biến đổi số,...

Hãy bắt đầu bằng các thảo luận ở đây nếu các bạn muốn.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-02-2007, 02:17 PM   #20
hungpq
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 19
:
Thực ra ở đây ý của tôi là muốn mọi người cùng xây dựng một hàm ghi số liệu vào bộ nhớ Flash của con 16f877a, để cho mọi người có nhu cầu sử dụng thì có thể lấy về để dùng. Bởi vì tôi nghĩ rằng có nhiều người làm trong lĩnh vực thu thập số liệu và điều khiển phân tán (SCADA), cho nên sẽ cần phải ghi, lưu trữ số liệu. Còn đối với các bài toán dạng như xây dựng các bộ lọc số, biến đổi số... thì có lẽ phải dùng công cụ khác thì mới có hiệu quả hơn.
hungpq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-02-2007, 04:58 PM   #21
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Mình ủng hộ hoạt động này của bạn, mình sẽ dán luồng này lên cao dạng Chú ý để hỗ trợ hoạt động của bạn.

Chúng ta có thể cùng nhau xây dựng từ từ, và F mong rằng hoạt động này sẽ được sự ủng hộ của các thành viên.

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2007, 03:38 PM   #22
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Ví Dụ Ghi Dọc:
Code:
            #INCLUDE "P16F877A.INC"
           __CONFIG  0x3F72
           CBLOCK 0x20
             BYTE_CAO
	BYTE_THAP
             TAM
	DU_LIEU
	endc
;***************************************
;********* MACRO DEFINITIONS ***********
;***************************************
 INCLUDE "BANK.INC"
;***************************************
        org        0000
BANK0
MOVLW B'0000010'
MOVWF BYTE_CAO
MOVLW B'00000000'
MOVWF BYTE_THAP
MOVLW B'00000000'
MOVWF DU_LIEU
BANK1
MOVLW .00
MOVWF TRISB
CALL DL
CALL DL
BANK0
MOVF BYTE_CAO,0
BANK2
MOVWF EEADRH
BANK0
MOVF BYTE_THAP,0
BANK2
MOVWF EEADR
LOOP
BANK0
MOVF DU_LIEU,0
BANK2
MOVWF EEDATH
MOVWF EEDATA
BANK3
BSF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
nop
nop
BCF EECON1,WREN
BANK2
MOVF EEADR,W 
ANDLW 0x03 
XORLW 0x03
BTFSC STATUS,Z ;
GOTO DOC_DU_LIEU
INCF EEADR,1
BANK0
INCF DU_LIEU,1
GOTO LOOP
DOC_DU_LIEU
LAP_LAI
BANK0
MOVLW .4
MOVWF TAM
BANK2
MOVLW 0xFF
MOVWF EEDATA
BANK0
MOVF BYTE_CAO,0
BANK2
MOVWF EEADRH
BANK0
MOVF BYTE_THAP,0
BANK2
MOVWF EEADR
LAP
BANK3
BSF EECON1,EEPGD
BSF EECON1,RD
NOP
NOP
BCF EECON1,RD
BANK2
MOVF EEDATA,0
BANK0
MOVWF PORTB;XUAT DU LIEU RA PORTB
CALL DL
BANK2
INCF EEADR,1
BANK0
DECFSZ TAM,1
GOTO LAP
GOTO LAP_LAI
;******DL*********
DL
BANK0
CLRF T1CON
CLRF TMR1H
CLRF TMR1H
CLRF INTCON
BANK1
CLRF PIE1
BANK0
CLRF PIR1
MOVLW 0x30  ;1:8 
MOVWF T1CON
BSF T1CON,TMR1ON
CHO 
BTFSS PIR1,TMR1IF
GOTO CHO 
BCF  T1CON,TMR1ON
BCF PIR1,TMR1IF
CLRF TMR1H
CLRF TMR1H
RETLW .00
END

thay đổi nội dung bởi: namqn, 03-03-2007 lúc 07:06 PM.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-03-2007, 05:15 PM   #23
hungpq
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 19
:
Dạo này bận quá đã không xây dựng được một hàm ghi dữ liệu vào bộ nhớ FLASH của con 16f877a được để cho các bác cho ý kiến. Bác TDM và các bác thân mến tôi định xây dựng một hàm ghi sao cho về mặt cấu trúc phải rõ ràng, chặt chẽ, code ngắn gọn, tốc độ nhanh, và dễ sử dụng để nhiều người sử dụng được. Đại loại như thế này.
- Các tham số đầu vào của hàm:
+ Dữ liệu cần ghi.
+ Địa chỉ ghi dữ liệu.
+ ................
- Các tham số đầu ra:
+ Kết quả ghi
+ ...............
- Nội dung cơ bản của hàm:
+ Kiểm tra các tham số đầu vào.
+ Ghi dữ liệu.
+ Trả kết quả.
Mong các bác chỉ giúp xem như thế có được chưa, cần bổ sung thêm bớt gì không? Nếu được mong các bác cùng xây dựng giúp? Cám ơn các bác nhiều.
hungpq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-03-2007, 05:33 PM   #24
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Nếu viết thì nên viết dạng gọi hàm. Chúng ta cần thống nhất một số thông số như sau:

Dữ liệu vào: DATATOROM
Địa chỉ ROM: ROMADDR
Tên hàm ghi: SAVETOROM
Dữ liệu ra: ROMTODATA
Tên hàm đọc: READFRROM

Quá trình ghi sẽ được thực hiện như sau:
1) Chọn giá trị ROMADDR
2) Ghi giá trị từ biến bất kỳ vào DATATOROM
3) CALL SAVETOROM

Quá trình đọc sẽ được thực hiện như sau:
1) Chọn giá trị ROMADDR
2) CALL READFRROM (dữ liệu đã nằm trong biến ROMTODATA)
3) Chuyển dữ liệu từ ROMTODATA vào biến cần dùng

F nghĩ, trước tiên cần thực hiện cái việc đơn giản này trước, sau đó, sẽ mở rộng lên, cho phép ghi mảng dữ liệu, và khai báo mảng. Sau đó sẽ mở rộng ra ghi nhiều mảng.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-03-2007, 05:34 PM   #25
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi hungpq View Post
Dạo này bận quá đã không xây dựng được một hàm ghi dữ liệu vào bộ nhớ FLASH của con 16f877a được để cho các bác cho ý kiến. Bác TDM và các bác thân mến tôi định xây dựng một hàm ghi sao cho về mặt cấu trúc phải rõ ràng, chặt chẽ, code ngắn gọn, tốc độ nhanh, và dễ sử dụng để nhiều người sử dụng được. Đại loại như thế này.
- Các tham số đầu vào của hàm:
+ Dữ liệu cần ghi.
+ Địa chỉ ghi dữ liệu.
+ ................
- Các tham số đầu ra:
+ Kết quả ghi
+ ...............
- Nội dung cơ bản của hàm:
+ Kiểm tra các tham số đầu vào.
+ Ghi dữ liệu.
+ Trả kết quả.
Mong các bác chỉ giúp xem như thế có được chưa, cần bổ sung thêm bớt gì không? Nếu được mong các bác cùng xây dựng giúp? Cám ơn các bác nhiều.
Nếu tôi chỉ ghi 1, 2 word thì như thế nào? Có giới hạn gì đối với địa chỉ ghi dữ liệu không?

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-03-2007, 08:48 AM   #26
hungpq
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 19
:
Cám ơn các bác đã góp ý. Tôi nghĩ rằng trước tiên chỉ cần xây dựng một hàm ghi thật cơ bản trước sau đó mới thực hiện các hàm tiếp theo. Để xây dựng hàm ghi này cần phải dựa vào đặc điểm bộ nhớ flash của con 16f877a: đó là phải ghi đồng thời liên tiếp 4 Word.
Còn về gợi ý của bác namqn để có thể ghi vào địa chỉ bất kỳ trong vùng bộ nhớ thì hoàn toàn có thể thực hiện được không khó khăn gì lắm. Nhưng tôi nghĩ rằng trước tiên cần xây dựng một hàm ghi thật cơ bản trước đã.
hungpq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2009, 04:40 PM   #27
ThieuQP
Nhập môn đệ tử
 
Tham gia ngày: Nov 2008
Bài gửi: 4
:
Flash Program memnory!

Trích:
Nguyên văn bởi namqn View Post
Nếu tôi chỉ ghi 1, 2 word thì như thế nào? Có giới hạn gì đối với địa chỉ ghi dữ liệu không?

Thân,
Em chào thầy.
Em tìm mãi trên diễn đàn không thấy được hàm nào ghi vào Flash cả, mặc dù nhắc đến khá nhiều.
ThieuQP vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2009, 04:43 PM   #28
ThieuQP
Nhập môn đệ tử
 
Tham gia ngày: Nov 2008
Bài gửi: 4
:
Flash Program memnory!

Trích:
Nguyên văn bởi falleaf View Post
Nếu viết thì nên viết dạng gọi hàm. Chúng ta cần thống nhất một số thông số như sau:

Dữ liệu vào: DATATOROM
Địa chỉ ROM: ROMADDR
Tên hàm ghi: SAVETOROM
Dữ liệu ra: ROMTODATA
Tên hàm đọc: READFRROM

Quá trình ghi sẽ được thực hiện như sau:
1) Chọn giá trị ROMADDR
2) Ghi giá trị từ biến bất kỳ vào DATATOROM
3) CALL SAVETOROM

Quá trình đọc sẽ được thực hiện như sau:
1) Chọn giá trị ROMADDR
2) CALL READFRROM (dữ liệu đã nằm trong biến ROMTODATA)
3) Chuyển dữ liệu từ ROMTODATA vào biến cần dùng

F nghĩ, trước tiên cần thực hiện cái việc đơn giản này trước, sau đó, sẽ mở rộng lên, cho phép ghi mảng dữ liệu, và khai báo mảng. Sau đó sẽ mở rộng ra ghi nhiều mảng.

Chúc vui.
Anh ơi cho em hỏi đã ai viết hàm này chưa ạ? em tìm trên diễn đàn mà không có.
ThieuQP vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

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


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam