PDA

View Full Version : Các bạn xem giúp mình làm sai chỗ nào


OHayNhi
12-02-2009, 02:49 PM
Mình thấy cai proteus hay hay. Lên làm một chương trình chạy thử :D. Mình delay lâu(mắt thường có thể thấy được hiện tượng quét) thì thấy nó chạy đúng. Nhưng delay nhanh thì lại sai bét nhè :(. Nhức đầu quá nên nhờ các bạn tư vấn :((
TITLE "P16F877A_REG1"
PROCESSOR P16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _CPD_OFF & _WRT_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
delay_reg1 equ 0x20
delay_reg2 equ 0x21
delay_reg3 equ 0x22
constant buflength = 8
variable j = 0
cblock 0x23 ; bo dem du lieu hien thi ra man hinh
bodem : buflength
endc
#define clock PORTB,0 ; xung kick hoat
#define dieukhien_quetcot PORTB,1 ; dieu khien xung quet cot


org 0x0000
goto Main
;org 0x0005
Main
banksel TRISB
bcf TRISB,0
bcf TRISB,1
banksel PORTB
bcf clock
bcf dieukhien_quetcot
banksel TRISD
clrf TRISD
banksel PORTD
clrf PORTD
; Dam bao an toan truoc khi di ^_^
j = 0
while j < 8
bcf dieukhien_quetcot
bsf clock
bcf clock
j += 1
endw
; Xoabodem
j = 0
while j<buflength
clrf bodem+j
j += 1
endw
;Load du lieu vao bo dem
j = 0
while j < buflength
movlw j
call Table0
movwf bodem+j
j += 1
endw


Hienthi
clrw
bsf dieukhien_quetcot
j = buflength-1
while j>=0
movf bodem+j,W
movwf PORTD
call Delay_10ms
bsf clock
call Delay_10ms
bcf dieukhien_quetcot
bcf clock
j -= 1
endw
goto Hienthi
Delay_10ms
movlw d'1'
movwf delay_reg1
Loop1
movlw 0xc7
movwf delay_reg2
movlw 0x01
movwf delay_reg3
Loop2
decfsz delay_reg2,1
goto Loop2
decfsz delay_reg3,1
goto Loop2
decfsz delay_reg1,1
goto Loop1
return
;org 0xc0
;Table1
; addwf PCL,1
; retlw b'11100111'
; retlw b'11110011'
; retlw b'11111001'
; retlw b'00000000'
; retlw b'00000000'
; retlw b'00000000'
; retlw b'00000000'
; retlw b'00000000'
org 0xe0
Table0
addwf PCL,1
retlw b'11111111'
retlw b'10000001'
retlw b'00000000'
retlw b'00111100'
retlw b'00000000'
retlw b'10000001'
retlw b'11111111'
retlw b'11111111'
end

uydanh
12-02-2009, 05:28 PM
Tư vấn cho bạn là: LÀM MẠCH THẬT.

lequocbao
12-02-2009, 07:00 PM
Bạn xem luồn này nè:
http://www.picvietnam.com/forum/showthread.php?t=3111

OHayNhi
12-02-2009, 07:09 PM
mình đã bảo là thử delay chậm lại thì thấy nó quét đúng. Nhưng giảm thời gian delay đến một lúc nào đó mà không nhìn thấy hiện tượng quét nữa thì lại thấy thiếu nét :F. Nếu giúp đc thì chạy thử rồi cho ý kiến giùm :(

OHayNhi
12-02-2009, 07:14 PM
hình đây nè X_X

namqn
12-02-2009, 07:16 PM
mình đã bảo là thử delay chậm lại thì thấy nó quét đúng. Nhưng giảm thời gian delay đến một lúc nào đó mà không nhìn thấy hiện tượng quét nữa thì lại thấy thiếu nét :F. Nếu giúp đc thì chạy thử rồi cho ý kiến giùm :(
Ở luồng kia tôi đã có ý kiến rằng Proteus không được thiết kế cho mục đích này. Màn hình của máy tính cũng phải quét nhiều lần trong mỗi giây để hiển thị hình ảnh. Nếu bạn giảm thời gian delay khi quét LED ma trận thì sẽ có nhiều cơ hội để Proteus chụp cùng trạng thái LED ma trận khi đang cập nhật hàng/cột nhiều lần, dẫn đến thấy thiếu nét.

LED ma trận của bạn dùng phương pháp quét để hiển thị, và màn hình máy tính cũng vậy, dẫn đến nếu tần số quét của LED là bội số của tần số quét của màn hình (khả năng này xảy ra càng cao khi thời gian delay giữa những lần quét là càng nhỏ) thì bạn sẽ gặp hiệu ứng trên, tương tự như dùng máy quay phim để quay hình ảnh các màn hình máy tính (bạn sẽ thấy màn hình máy tính thường bị rung).

Thân,

OHayNhi
13-02-2009, 10:50 AM
Nhân tiện các bác cho hỏi là với tập lệnh mở rộng của MPASM thì với các lệnh khai báo biến nó có ngốn thêm bộ nhở của PIC không, nếu có thì nó quy định bộ nhớ theo kiểu j :(. và các lệnh điều khiển vòng lặp. trong vòng lặp...

namqn
13-02-2009, 05:59 PM
Nhân tiện các bác cho hỏi là với tập lệnh mở rộng của MPASM thì với các lệnh khai báo biến nó có ngốn thêm bộ nhở của PIC không, nếu có thì nó quy định bộ nhớ theo kiểu j :(. và các lệnh điều khiển vòng lặp. trong vòng lặp...
Còn tùy vào việc bạn dùng khai báo nào, và đang quan tâm đến bộ nhớ nào. Bạn nêu cụ thể các lệnh/directive mà bạn quan tâm, nếu như bạn vẫn chưa nắm rõ sau khi đọc tài liệu sau (nên đọc nó trước):
http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf

Thân,

OHayNhi
19-02-2009, 01:28 PM
cảm ơn bác :D, tìm hiểu rồi, chỉ băn khoăn cái lệnh variable i và while i, ++i ; xem MPASM có dùng thanh ghi nào của pic không; Hóa ra không. mà nó bê nguyên đoạn code đó xuống dưới i lần :D.

namqn
19-02-2009, 04:37 PM
cảm ơn bác :D, tìm hiểu rồi, chỉ băn khoăn cái lệnh variable i và while i, ++i ; xem MPASM có dùng thanh ghi nào của pic không; Hóa ra không. mà nó bê nguyên đoạn code đó xuống dưới i lần :D.
Có lẽ bạn đang nói đến những chỉ dẫn được dùng trong các macro. Các macro khi được khai triển bởi trình hợp dịch sẽ lặp lại khối lệnh trong thân macro nếu bạn dùng cấu trúc while. Chú ý phân biệt các cấu trúc lặp của macro với việc hiện thực các cấu trúc lặp thực sự trong chương trình.

Thân,

OHayNhi
20-02-2009, 09:36 AM
cái macro thì mình không nói. Cái chính la mình lúc đầu còn băn khoăn là khai báo variable , do có thể thay đổi đc gia trị của biến lên băn khoăn MPASM có dùng thanh ghi nào của VDK để cất giá trị này không. Sau khi xem lại thì hóa ra MPASM chỉ dùng 1 bảng lưu các khai báo directive, ví dụ như mình khai báo variable i = 0. ++i thì nó thay bằng 0 và 1. nói chung là mình không có năng khiếu diễn đạt nên nói nôm na như thế :(. Dù sao thì xài asemble vẫn khoái hơn cái macro while(i) :(