PDA

View Full Version : thac mac ve timer0


kidmaster08
17-10-2011, 04:24 PM
tinh hinh la minh viet cho 16f877a 1 chuong trinh vi du nhu sau
processor 16f877a
include <p16f877a.inc>
count1 equ 0x20
counta equ 0x21
countb equ 0x22
hangdonvi equ 0x23
hangchuc equ 0x24
wsave equ 0x25 ; cac thanh ghi dung de cat cac noi dung cua cac thanh ghi quan trong khi thuc thi chuong trinh ngat
pclathsave equ 0x26
statussave equ 0x27
fsrsave equ 0x28
org 0x004
goto isr
isr
movwf wsave
swapf STATUS,W
clrf STATUS
movwf statussave
movf PCLATH,W
movwf pclathsave
clrf PCLATH
movf FSR,W
movwf fsrsave
banksel PORTB
btfss INTCON,TMR0IF ; bang 1 thi tiep tuc minh nghi cau lenh nay la thua
goto exitint ; neu co ngat chua duoc set thi thoat khoi chuong trinh ngat
bcf INTCON,TMR0IF ; neu co ngat duoc set thi xoa co ngat de cho phep nhan biet thoi diem tiep theo xay ra ngat
incf hangdonvi,1 ; tang hang don vi len 1 don vi, ket qua luu o hangdonvi
movlw 0x0a
xorlw hangdonvi ;so sanh hang don vi co bang 10 ko?
btfss STATUS,Z
goto exitint ;neu chua bang 10 thi thoat khoi chuong trinh ngat
clrf hangdonvi ; neu bang 10 thi hang don vi =0 va tang chu so hang chuc len 1 don vi
incf hangchuc,1
movlw 0x0a
xorwf hangchuc,0 ;neu chu so hang chuc
btfss STATUS,Z ; neu hang chuc chua 10, thoat khoi chuong trinh ngat
goto exitint
clrf hangchuc ; neu bang 10 di resetlai hang chuc = 0 va thoat khoi chuong trinh
goto exitint
exitint ; thu tuc thoat khoi chuong trinh con phuc vu ngat
movf fsrsave,W
movwf FSR
movf pclathsave,W
movwf PCLATH
swapf statussave,W
movwf STATUS
swapf wsave,1
swapf wsave,0
retfie ; ket thuc chuong trinh ngat
org 0x000
goto start
org 0x050
start ; nhan start o dia chi 0x050
banksel TRISD
clrf TRISD
movlw b'11111100' ; rp1 va rb0 la cac chan ra
movwf TRISB
banksel PORTD ; xoa cong ra
clrf PORTD
movlw b'11111111' ; tat cac led hang don vi
movwf PORTB
clrf hangchuc ; bat dau vao chuong trinh xoa cac thanh ghi hangchuc va hang don vi
clrf hangdonvi
clrf TMR0 ; khoi tao gia tri dinh thoi TMR0
clrf INTCON ;
banksel OPTION_REG
movlw b'10000001' ; ko cho chon chuc nang dien tro keo duong o cong B va chon he so cho prescaler la 1:4
movwf OPTION_REG
bcf STATUS,RP0 ;
bsf INTCON,TMR0IE
bsf INTCON,PEIE ; cho phep ngat ngoasai vi
bsf INTCON,GIE ; cho phep toan bo cac ngat, bo dinh thoi TMR0 lam viec ngay tu cau lenh nay
; vong lap chinh
main
call hienthi
goto main ;vong lap vo han
hienthi
movlw b'00000001'
movwf PORTB
movf hangchuc,0 ; w = hangchuc
call table
movwf PORTD ; hien thi chu so hang chuc xong
call delay1ms ; tre 1ms
movlw b'00000010'
movwf PORTB
movf hangdonvi,0
call table
movwf PORTD ; hien thi chu so hang don vi xong
call delay1ms
return
table
addwf PCL,1
retlw 0xc0 ; hien thi so o
retlw 0xf9 ;1
retlw 0xa4 ;2
retlw 0xb0 ;3
retlw 0x99 ;4
retlw 0x92 ;5
retlw 0x82 ;6
retlw 0xf8 ;7
retlw 0x80 ;8
retlw 0x90 ;9
delay1ms
movlw d'1'
MOVWF count1
d1
movlw d'199'
movwf counta
movlw d'1'
movwf countb
d2
decfsz counta,1
goto $+2
decfsz countb,1
goto d2
decfsz count1
goto d1
return
return
end

tuy nhien sau khi bien dich proteus bao loi nhu sau
- stack overflow pushing return address of interupt
- stack underflow excuting RETURN instruction
mình không hiểu tại sao lại có 2 lỗi trên dẫn đến mô phỏng cua mình trên thiết bị ảo không thể thực hiện được. Mình dung proteus 7.5 Sp3 va trình biên dịch MPlab 7.52, khi biên dịch trên MPlab thi không báo lỗi, mong các ban chỉ hộ mình với nhé. Vì mình cung mới học Pic nên cũng chưa có kinh nghiệm j nhiều lám. Thank các bạn nhiều

hangocminh1989
29-10-2011, 11:12 AM
chà cũng công phu, cho mình hỏi chương trình này bạn tự viết hay copy ở đâu? nếu copy thiếu thì coi lại vì mình chẳng tháy dòng configuration của bạn ở đâu hết.
vấn đề nữa là, chưa có khả năng kiểm soát chương trình lớn thì hãy viết 1 chương trình nhỏ trước.
thán,

kidmaster08
30-12-2011, 12:22 PM
hi,cám ơnbạn đã cho lời khuyên đúng. chương trình này minh đọc trong sách lập trình cho Pic 16f877a. Minh sử dụng biên dich MPlab.các bít cấu hình cho pic này trong MPlap đã định nghĩa nên minh chỉ cần chọn thôi. Đây la chương trình hiển thị 2 led 7 đoạn theo thứ tự tăng dần ấy mà. Minh ko biêt CCS nên dùng ASM cho cơ bản. Mình đã kiểm lại nhưng ko biết sai chỗ nào. mình viết và lam lại từ đầu và chuyển sang 1 project mới thì lại được.Mình muốn viết cho quen cấu trúc chương trình ngắt và sử dụng ctrinh con và tiện ích của bộ định thời nên muốn kiểm soát thất kỹ con pic này. Hiện tại tớ đang đầu tư cho kỹ thuật tương nên cũng ko có thời gian dể ý đến pic thân yêu nữa.hj