PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   Các bạn xem giúp mình làm sai chỗ nào (http://www.picvietnam.com/forum/showthread.php?t=3529)

OHayNhi 12-02-2009 02:49 PM

Các bạn xem giúp mình làm sai chỗ nào
 
1 Attachment(s)
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 :((
Code:

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

1 Attachment(s)
hình đây nè X_X

namqn 12-02-2009 07:16 PM

Trích:

Nguyên văn bởi OHayNhi (Post 22559)
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

Trích:

Nguyên văn bởi OHayNhi (Post 22575)
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/e...Doc/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

Trích:

Nguyên văn bởi OHayNhi (Post 22736)
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) :(


Múi giờ GMT. Hiện tại là 06:58 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