|
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 |
|
22-12-2007, 10:17 AM | #1 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Chương trình ngắt cho timer1 thế này mà chạy không được !
Chào mọi người!
Em có đoạn khai báo ngắt timer1 như sau trong chương trình đồ án của mình: Code:
CLRF T1CON CLRF INTCON CLRF TMR1H CLRF TMR1L BSF STATUS,RP0 CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 CLRF PIR1 MOVLW 0X00 MOVWF T1CON MOVLW 0XC3 MOVWF TMR1H MOVLW 0X50 MOVWF TMR1L BSF T1CON,TMR1ON BSF INTCON,TMR1IE BSF INTCON,PEIE BSF INTCON,GIE Code:
BTFSS PIR1,TMR1IF GOTO exit_int BCF T1CON,TMR1ON CLRF TMR1L CLRF TMR1H MOVLW 0XC3 MOVWF TMR1H MOVLW 0X50 MOVWF TMR1L BSF T1CON,TMR1ON BCF PIR1,TMR1IF DECFSZ demtimer1,1 GOTO tiep1 GOTO tiep2 tiep1: MOVLW B'10100110' MOVWF PORTB MOVLW D'20' MOVWF demtimer1 GOTO exit_int tiep2: MOVLW B'11000110' MOVWF PORTB exit_int MOVF FSR_save,W MOVWF FSR MOVF PCLATH_save MOVWF PCLATH SWAPF STATUS_save,W MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 RETFIE Cũng chương trình trên, em copy ra thành một chương trình riêng biệt thì chạy tốt. Em không biết có những yếu tố nào làm cho việc kích khởi timer1 hoạt động lại trong chương trình phục vụ ngắt "không bao giờ" hoạt động được. Rất mong được sự hướng dẫn as soon as possible của mọi người. Chân thành cảm ơn. D. À quên, biến demtimer1 em đã khai báo trước bằng 20 thay đổi nội dung bởi: uydanh, 22-12-2007 lúc 10:20 AM. Lý do: Quên chú thích biến demtimer1 |
22-12-2007, 06:01 PM | #2 |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 100
: |
1. Chương trình của bạn khi copy thành một chương trình riêng biệt đã chạy tốt thì chắc là bị sai ở chỗ khác, không do ngắt không thực hiện được.
2. Đoạn chương trình của bạn đưa ra rất chung chung, vì vậy đã có 17 người đọc rồi mà không ai trả lời. 3. Nếu có thể, bạn nên post toàn bộ chương trình và nói ý tưởng thực hiện lên đây thì sẽ hiệu quả hơn và chắc chắn sẽ tìm được hướng giải quyết. 4. Nếu bạn ko muốn public chương trình của mình thì có thể gửi mail cho tôi: hiendl2k42@yahoo.com
__________________
Do more than exist, LIVE |
22-12-2007, 07:00 PM | #3 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Mình mới phát hiện một chuyện "kỳ lạ". Cái mạch nạp của mình có kèm theo cả mạch test, nạp xong là test trên đó luôn. Khi viết chương trình cho ngắt timer1 trên, nạp vào là chạy được luôn. Tuy nhiên nếu gỡ con PIC ra, để hơi lâu chút xíu cho "nguội", sau đó gắn vào lại thì lại chưa chắc chạy được. Nhấn reset không ăn thua, phải "nhấp" cái phích cấm nguồn cho mạch liên tục vài lần thì nó mới bắt đầu chạy được ( giống như làm cho "nóng" con PIC vậy). Còn trên mạch đồ án của mình thì tệ hơn chút xíu nhưng lâu lâu vẫn chạy đúng (phải rút ra rút vào dây nguồn liên tục cả chục lần).
Như vậy là sao các bạn, có phải con PIC của mình có vấn đề không? Mình mua nó ở chợ Nhật Tảo, có 50000 ngàn/1 con à. Cảm ơn mọi người. |
23-12-2007, 12:09 AM | #4 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Đuối lắm rồi!!!!
Mới thử con PIC khác của thằng bạn, vần không được. Đoạn chương trình của mình như sau :
1. Quét phím (không dùng ngắt), 12 phím 4 chân (10 phím số 0 đến 9, 1 phím cho động cơ chạy xuôi, 1 phím cho động cơ chạy ngượac) được nối trực tiếp với với PORTD. Phải nhập đủ 4 chữ số tương ứng tốc độ đặt của động cơ thì mới làm việc khác tiếp được, nếu chưa nhập đủ 4 số mà nhấn nhầm sang 2 phím chiều quay của động cơ thì vẫn ko sao, nhập lại tốc độ bình thường. 2. Sau khi nhập đủ 4 chứ số tốc độ đặt, bạn phải bắt buộc nhấn phím QUAY NGƯỢC hoặc QUAY XUÔI. Nhấn một trong 2 phím đó, chương trình sẽ chuyển tới đoạn phục vụ cho việc quay ngược, quay xuôi. 2 bước trên mình đã thực hiện xong, chạy rất tốt. Tuy nhiên bước tiếp theo thì đang "rất kẹt" cái vụ ngắt Timer1. Mình muốn dùng timer1 định thời gian 1ms rồi nhảy vào trình phục vụ ngắt rồi đọc xung encorder từ timer0 để tìm tốc độ đo. Làm riêng chương trình đọc xung vào timer0 thì OK. Nhưng khi dùng ngắt timer1 định thời 1ms thì ko được. Nó chỉ chạy vào trình phục vụ ngắt có 1 lần, sau đó không vào nữa cho dù trong chương trình ngắt timer1 đã bật timer1 chạy lại. Mình đã thử mọi cách vẫn ko xong. Không biết làm sao nữa. Nhờ mọi người giúp. Lẽ ra mình ko muốn post đoạn code lên lúc này vì còn rất....lung tung. Mình chú thích, chỉnh sửa lung tung trên đó, để khi nào xong, làm cho nó đàng hoàng rồi post lên luôn để người học sau có cái tham khảo. Nhưng bây giờ đành thua rồi. Post lên luôn, các đoạn code sau dấu ; là những gì mình viết thêm để thử trong quá trình tìm chổ sai, chứ ko có ý nghĩa gì. (đoạn chương trình trong ngắt chỉ để tìm chổ sai). Mình sử dụng L293 làm driver cho động cơ ( dùng PortC tác động các chân của L293). IC7447 để chuyển từ mã BCD sang mã led 7 đoạn. Code:
;CHUONG TRINH DIEU KHIEN ON_OFF DONG CO DC ;SINH VIEN THUC HIEN : NGUYEN UY DANH ;=================================================================================================== ;KHAI BAO VI DIEU KHIEN; ;=================================================================================================== processor 16f877a ;vi dieu khien duoc su dung la PIC16F877A cua Microchip include <p16f877a.inc> ;header file kem theo __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;=================================================================================================== ;KHOI TAO CAC BIEN ;=================================================================================================== ;NHOM CAC BIEN SU DUNG TRONG CHUONG TRINH DELAY count1 EQU 0x20 counta EQU 0x21 countb EQU 0x22 ;=================================================================================================== ;NHOM CAC BIEN SU DUNG TRONG CHUONG TRINH QUET PHIM VA NHAN BIET PHIM cols EQU 0x23 key EQU 0x24 ;bien key chua ma ASCII cua phim duoc nhan ;=================================================================================================== ;NHOM CAC THANH GHI HIEN THI LEN 4 LED 7 DOAN TOC DO DAT dem EQU 0x25 hangngan EQU 0x26 hangtram EQU 0x27 hangchuc EQU 0x28 hangdonvi EQU 0x29 ;=================================================================================================== ;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT W_save EQU 0x2A PCLATH_save EQU 0x2B STATUS_save EQU 0x2C FSR_save EQU 0x2D demtimer1 EQU 0x2E TMR0_save EQU 0x2F highbyte EQU 0x30 lowbyte EQU 0x31 h_byte_save EQU 0X32 l_byte_save EQU 0x33 ;=================================================================================================== ;NHOM CAC THANH GHI DUNG TRONG CHUONG TRINH DOI TU HEX SANG BCD aar0 EQU 0x34 ;binary number low byte aar1 EQU 0x35 ;binary number high byte aac0 EQU 0x36 ;bcd number ones aac1 EQU 0x37 ;bcd number tens aac2 EQU 0x38 ;bcd number hundreds aac3 EQU 0x39 ;bcd number thousands aac4 EQU 0x3A ;bcd number ten-thousands ;=================================================================================================== ;=================================================================================================== ;CHUONG TRINH NGAT ;=================================================================================================== ORG 0x004 GOTO ISR ISR ;--------------------------------------------------------------------------------------------------- ;CHUONG TRINH BAT BUOC DAU CHUONG TRINH NGAT ;--------------------------------------------------------------------------------------------------- MOVWF W_save SWAPF STATUS_save,W CLRF STATUS MOVWF STATUS_save MOVF PCLATH,W MOVWF PCLATH_save CLRF PCLATH MOVF FSR,W MOVWF FSR_save ;--------------------------------------------------------------------------------------------------- ;NOI DUNG CHUONG TRINH NGAT ;--------------------------------------------------------------------------------------------------- BTFSS PIR1,TMR1IF GOTO exit_int BCF T1CON,TMR1ON CLRF TMR1L CLRF TMR1H MOVLW 0X27 MOVWF TMR1H MOVLW 0X10 MOVWF TMR1L BSF T1CON,TMR1ON BCF PIR1,TMR1IF ; MOVF TMR0,W ; MOVWF lowbyte ; CLRF highbyte DECFSZ demtimer1,1 GOTO tiep1 GOTO tiep2 ; MOVF TMR0,W ; MOVWF lowbyte ; CLRF highbyte tiep1: MOVLW B'11000110' MOVWF PORTB ; MOVLW D'20' ; MOVWF demtimer1 GOTO exit_int tiep2: MOVLW B'00000000' MOVWF PORTB exit_int MOVF FSR_save,W MOVWF FSR MOVF PCLATH_save MOVWF PCLATH SWAPF STATUS_save,W MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 BSF T1CON,TMR1ON BCF PIR1,TMR1IF RETFIE ;================================================================================================= ORG 0x0000 GOTO start ORG 0x050 start BCF STATUS,RP1 ;chon Bank1 co chua thanh ghi TRISD BSF STATUS,RP0 ;thiet lap 4 bit cao cua PORTD la output tuong ung voi cols MOVLW 0x0F ;thiet lap 4 bit thap cua PORTD la input tuong ung voi rows MOVWF TRISD ;TRISD=00001111B MOVLW 0x00 MOVWF TRISB ;thiet lap chan cua PORTB la port output MOVLW b'00000000' ;thiet lap chan cua PORTC la port output MOVWF TRISC MOVLW 0xFF ;thiet lap chan cua portA la port input MOVWF TRISA BCF STATUS,RP0 ;chon Bank0 ;=================================================================================================== ;BAN DAU CHO TAT CA CAC LED HIEN THI 0 HET ;=================================================================================================== MOVLW b'00000000' MOVWF PORTC MOVLW b'00000000' MOVWF PORTB MOVLW b'00100000' MOVWF PORTB MOVLW b'01000000' MOVWF PORTB MOVLW b'01100000' MOVWF PORTB MOVLW b'10000000' MOVWF PORTB MOVLW b'10100000' MOVWF PORTB MOVLW b'11000000' MOVWF PORTB MOVLW b'11100000' MOVWF PORTB ;================================================================================================== ;KHOI TAO TIMER1 ;================================================================================================== CLRF T1CON CLRF INTCON CLRF TMR1H CLRF TMR1L BSF STATUS,RP0 CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 CLRF PIR1 MOVLW 0X00 MOVWF T1CON MOVLW 0X27 MOVWF TMR1H MOVLW 0X10 MOVWF TMR1L ;================================================================================================ ;KHOI TAO CAC BIEN ;================================================================================================= CLRF dem ;xoa bien dem ve 0 CLRF highbyte CLRF lowbyte CLRF h_byte_save CLRF l_byte_save CLRF aar0 CLRF aar1 CLRF aac0 CLRF aac1 CLRF aac2 CLRF aac3 CLRF aac4 MOVLW D'20' MOVWF demtimer1 ;=================================================================================================== ;BAT DAU CHUONG TRINH CHINH ;=================================================================================================== Mainpro CALL Chk_keys ;goi chuong trinh quet phim va nhan biet phim MOVF key,W GOTO Xuatled Chk_keys ;chuong trinh CON quet phim ;=================================================================================================== ;DOAN CHUONG TRINH KIEM TRA CO BI KET PHIM TRUOC KHI NHAN PHIM HAY KHONG ;DOAN CHUONG TRINH NAY CHAY NGAY KHI KHOI DONG CHUONG TRINH ;=================================================================================================== MOVLW 0x00 ;trang thai ban dau cua cac port cols la 0 MOVWF PORTD ;trang thai ban dau cua cac port rows la muc 1 CALL delay20 ;goi chuong trinh delay20ms MOVF PORTD,W ;lay trang thai hien tai cua PORTD dua vao thanh ghi W ANDLW 0x0F ;thuc hien phep AND thanh ghi W voi 0FH SUBLW 0x0F ;thuc hien phep TRU voi gia tri thiet lap ban dau cho PORTD la OFH BTFSC STATUS,Z ;neu gia tri hien tai cua PORTD van khong doi so voi thiet lap ban dau GOTO Keys ;nghia la khong bi ket phim, co Z=1 thi nhay toi keys la chuong trinh con bat phim nhan CALL delay20 ;con neu Z=0 nghia la bi ket phim thi dalay20 de nguoi dung xu ly viec ket phim nay GOTO Chk_keys ;==================================================================================================== ;DOAN CHUONG TRINH CON BAT PHIM NHAN ;==================================================================================================== Keys CALL Scan_keys ;goi chuong trinh Scan_keys xem thu co phim nao nhan khong MOVLW d'12' ;nap vao W gia tri 12 SUBWF key,0 ;lay gia tri trong key tra ve tru cho 12 BTFSS STATUS,Z ;truong hop khong co phim nhan thi key=12,delay 20ms va quay lai scan de phat hien GOTO Key_found ;truong hop key<12 nghi la co nhan phim thi di vao chuong trinh con nhan dang phim CALL delay20 GOTO Keys Key_found MOVF key,0 ;lay lai gia tri key luu vao W ANDLW 0x0F ;chi nham loai bi 4 bit cao khong co y nghi gi trong key(mac dinh co the ton tai) CALL Key_table ;goi chuong trinh tra bang gia tri MOVWF key ;luu lai gia tri bang vao bien key RETURN Scan_keys CLRF key ;xoa gia tri trong key ve 0, chuan bi chua ma cua phim duoc nhan MOVLW 0x70 ;thiet lap cho tat ca cac cols deu len 1 MOVWF PORTD ;cac rows thi luon luon la 1 MOVLW 0x03 MOVWF cols ;thiet lap gia tri bien cols BSF STATUS,C ;set co C len 1 trong thanh ghi Status, chuan bi shift vao PORTD Scan RRF PORTD,1 ;dich PORTD tung buoc kem theo co C BTFSS PORTD,3 ;neu bit thu 3 cua PORTD bang 0 nghi la phim noi giua hang 3 va cot 3 nhan GOTO press ;ung voi phim REVERSE, tro lai chuong trinh Keys de nhan biet phim INCF key,1 ;neu sai thi tang key len 1 BTFSS PORTD,2 ;neu bit thu 2 cua PORTD bang 0 nghi la phim noi giua hang 2 va cot 3 duoc nhan GOTO press ;ung voi phim so 8, tro lai chuong trinh keys de nhan biet phim INCF key,1 BTFSS PORTD,1 GOTO press INCF key,1 BTFSS PORTD,0 GOTO press INCF key,1 DECFSZ cols,1 ;giam rows, neu bang khac 0 thi scan tiep, bang 0 thi tro ve GOTO Scan press RETURN ;tro ve chuong trinh scan phim ;======================================================================================================= ;BANG TRA Key_Table ;======================================================================================================= Key_table ADDWF PCL,1 RETLW d'11' ;key=0 ung voi phim REVERSE co ma la 11D RETLW 0x08 ;key=1 ung voi phim so 8 co ma la 08H RETLW 0x05 ;key=2 ung voi phim so 5 RETLW 0x02 ;key=3 ung voi phim so 2 RETLW d'10' ;key=4 ung voi phim FORWARD co ma la 10D RETLW 0x07 ;key=5 ung voi phim so 7 RETLW 0x04 ;key=6 ung voi phim so 4 RETLW 0x01 ;key=7 ung voi phim so 1 RETLW 0x09 ;key=8 ung voi phim so 9 RETLW 0x06 ;key=9 ung voi phim so 6 RETLW 0x03 ;key=10 ung voi phim so 3 RETLW 0x00 ;key=11 ung voi phim so 0 ;====================================================================================================== ;CHUONG TRINH HIEN THI RA LED GIA TRI LUU TRONG BIEN key SAU KHI SCAN PHIM ;CO SU DUNG BIEN dem DE THEO DOI SO LAN NHAN PHIM ;====================================================================================================== Xuatled INCF dem ;cu moi lan bat duoc 1 phim thi tang bien dem len 1 MOVLW d'1' XORWF dem,W ;so sanh gia tri luu trong bien dem va 1 BTFSC STATUS,Z ;neu dem=1 thi nhay den chuong trinh xu ly phim nhan thu 1 GOTO dem1 ;neu dem#1 thi kiem tra tiep theo MOVLW d'2' XORWF dem,W ;so sanh gia tri luu trong bien dem va 2 BTFSC STATUS,Z ;neu dem=2 thi nhay den chuong trinh xu ly phim nhan thu 2 GOTO dem2 ;neu dem#2 thi kiem tra tiep theo MOVLW d'3' XORWF dem,W ;so sanh gia tri luu trong bien dem va 3 BTFSC STATUS,Z ;neu dem=3 thi nhay den chuong trinh xu ly phim nhan thu 3 GOTO dem3 ;neu dem#2 thi kiem tra tiep theo MOVLW d'4' XORWF dem,W ;so sanh gia tri luu trong bien dem va 4 BTFSC STATUS,Z ;neu dem=4 thi nhay den chuong trinh xu ly phim nhan thu 4 GOTO dem4 ;neu dem#4 thi kiem tra tiep theo ;sau 4 lan nhan phim, da nhan du 4 so de cai dat toc do, nhan phim so 5 bat buoc la phim FORWARD or REVERSE MOVLW d'10' XORWF key,W ;so sanh ma phim trong key co phai la phim FORWARD khong? BTFSC STATUS,Z ;neu dung la phim FORWARD thi Z=1 GOTO FORWARD ;se nhay den chuong trinh FORWARD MOVLW d'11' ;neu khong la FORWARD XORWF key,W ;thi so sanh ma phim trong key co phai la phim REVERSE khong? BTFSC STATUS,Z ;neu dung la phim REVERSE THI Z=1 GOTO REVERSE ;se nhay den chuong trinh REVERSE DECF dem,1 ;neu khong la FORWARD or REVERSE thi giam xuong dem=4 GOTO Mainpro ;nguoi dung phai nhan dung phim moi tiep tuc duoc ;cac chuong trinh xu ly cac phim nhan dem1 dem2 dem3 va dem4 dem1 ;dem1 la doan chuong trinh xuat led va save gia tri hang ngan cua toc do dat CALL nhannhamphim? ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong? MOVF key,W ;neu nhan dung phim thi bat dau xu ly MOVWF hangngan ;luu gia tri do vao bien hangngan MOVLW b'00000000' CALL xuatraled7doan_toc_do_dat GOTO Mainpro dem2 CALL nhannhamphim? ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong? MOVF key,W ;neu nhan dung phim thi bat dau xu ly MOVWF hangtram ;luu gia tri do vao bien hangtram MOVLW b'00100000' CALL xuatraled7doan_toc_do_dat GOTO Mainpro dem3 CALL nhannhamphim? ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong? MOVF key,W ;neu nhan dung phim thi bat dau xu ly MOVWF hangchuc ;luu gia tri do vao bien hangchuc MOVLW b'01000000' CALL xuatraled7doan_toc_do_dat GOTO Mainpro dem4 CALL nhannhamphim? ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong? MOVF key,W ;neu nhan dung phim thi bat dau xu ly MOVWF hangchuc ;luu gia tri do vao bien hangchuc MOVLW b'01100000' CALL xuatraled7doan_toc_do_dat GOTO Mainpro ;---------------------------------------------------------------------------------------------------------- ;CAC CHUONG TRINH CON CUA CHUONG TRINH xuatled xuatraled7doan_toc_do_dat BCF STATUS,C ;xoa co C cua thanh ghi STATUS ADDWF key,W ;cong voi gia tri trong W, luu lai vao trong thanh ghi W MOVWF PORTB ;chuyen ra PORTB,thuc hien duoc viec xuat hangngan ra led 7 doan RETURN nhannhamphim? MOVLW d'10' XORWF key,W ;kiem tra thu co phai la nhan nham FORWARD khong? BTFSC STATUS,Z ;neu nhan nham FORWARD thi phai NHANPHIMLAI GOTO nhanphimlai MOVLW d'11' ;kiem tra thu co phai nhan nham REVERSE khong? XORWF key,W BTFSC STATUS,Z GOTO nhanphimlai ;neu nhan nham REVERSE thi phai NHANPHIMLAI RETURN ;------------------------------------------------------------------------------------------------------------ nhanphimlai DECF dem,1 GOTO Mainpro ;============================================================================================================ ;CHUONG TRINH REVERSE VA FORWARD ;============================================================================================================ REVERSE BSF T1CON,TMR1ON BSF INTCON,TMR1IE BSF INTCON,PEIE BSF INTCON,GIE ; CLRF TMR0 ;xoa thanh ghi TMR0 ; CLRF INTCON ;xoa thanh ghi INTCON ; BSF STATUS,RP0 ;chon Bank1 ; MOVLW b'11101000' ;tat chuc nang keo dien tro len cua PORTB ; MOVWF OPTION_REG ;timer0 o che do dem xung, tac dong boi canh len, prescaler 1:1 ; BCF STATUS,RP0 ;chon Bank0 ; BSF INTCON,TMR0IE ;cho phep ngat timer0 ; BSF INTCON,PEIE ;cho phep ngat ngoai vi ; BSF INTCON,GIE ;cho phep toan bo cac ngat MOVLW b'01100000' MOVWF PORTC ; BSF T1CON,TMR1ON MOVLW B'10101001' MOVWF PORTB loop2 GOTO loop2 ;LOOP2 ; MOVLW 0x00 ; MOVWF highbyte ; MOVF TMR0,W ; MOVWF lowbyte ; MOVLW 0x11 ; MOVWF highbyte ; MOVLW 0x11 ; MOVWF lowbyte ; MOVF highbyte,W ; MOVWF aar1 ; MOVF lowbyte,W ; MOVWF aar0 ; CALL b16_d5 ; MOVLW b'10000000' ; ADDWF aac3,W ; MOVWF PORTB ; MOVLW b'10100000' ; ADDWF aac2,W ; MOVWF PORTB ; MOVLW b'11000000' ; ADDWF aac1,W ; MOVWF PORTB ; MOVLW b'11100000' ; ADDWF aac0,W ; MOVWF PORTB ; GOTO LOOP2 FORWARD MOVLW b'01100000' MOVWF PORTC GOTO $ ;CHUONG TRINH DELAY 20ms ;============================================================== delay20 MOVLW d'10' ;nap 20 cho count1 de tao tre 20ms MOVWF count1 lap1 MOVLW d'199' MOVWF counta MOVLW d'1' MOVWF countb delay1 DECFSZ counta,1 GOTO $+2 DECFSZ countb,1 GOTO delay1 DECFSZ count1,1 GOTO lap1 ;het doan chuong trinh delay 100ms RETURN b16_d5 swapf aar0,w ; partial ones sum in low byte addwf aar0,w ; andlw 0x0f ; skpndc ; addlw 0x16 ; skpndc ; addlw 0x06 ; addlw 0x06 ; skpdc ; addlw -0x06 ; wmax=3:0 ; btfsc aar0,4 ; complete ones sum in low byte addlw 0x15+0x06 skpdc addlw -0x06 ; wmax=4:5 movwf aac0 ; save sum in aac0 ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 20 ; 100 60 30 15+ ; ---------------------------------------------------- ; 128 64 32 16 8 4 2 1 ; swapf aar1,w ; partial ones sum in high byte addwf aar1,w ; andlw 0x0f ; skpndc ; addlw 0x16 ; skpndc ; addlw 0x06 ; addlw 0x06 ; skpdc ; addlw -0x06 ; wmax=3:0 ; btfsc aar1,0 ; complete ones sum in high byte addlw 0x05+0x06 skpdc addlw -0x06 ; wmax=3:5 ; btfsc aar1,4 addlw 0x15+0x06 skpdc addlw -0x06 ; wmax=5:0 ; addlw 0x06 ; include previous sum addwf aac0,w skpdc addlw -0x06 ; wmax=9:5, ones sum ended ; movwf aac0 movwf aac1 swapf aac1,f movlw 0x0f andwf aac0,f ; save total ones sum in aac0 andwf aac1,f ; save partial tens sum in aac1 ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 5+ ; 60 80 90 10+ 5+ ; 700 300 100 80 40 20 10 50 ; 32000 16000 8000 4000 2000 1000 500 200 ; ------------------------------------------------------ ; 32768 16384 8192 4096 2048 1024 512 256 ; ; complete tens sum in low and high byte rrf aar1,w ; rotate right high byte once andlw 0x0f ; clear high nibble addlw 0x06 ; adjust bcd skpdc addlw -0x06 ; wmax=1:5 ; addlw 0x06 ; include previous sum addwf aac1,w skpdc addlw -0x06 ; wmax=2:4 ; btfsc aar0,5 addlw 0x03+0x06 skpdc addlw -0x06 ; wmax=2:7 ; btfsc aar0,6 addlw 0x06+0x06 skpdc addlw -0x06 ; wmax=3:3 ; btfsc aar0,7 addlw 0x12+0x06 skpdc addlw -0x06 ; wmax=4:5 ; btfsc aar1,0 addlw 0x25+0x06 skpdc addlw -0x06 ; wmax=7:0 ; btfsc aar1,5 addlw 0x09+0x06 skpdc addlw -0x06 ; wmax=7:9 ; btfsc aar1,6 addlw 0x08+0x06 skpdc addlw -0x06 ; wmax=8:7 ; btfsc aar1,7 addlw 0x06+0x06 skpdc addlw -0x06 ; wmax=9:3, tens sum ended ; movwf aac1 ; save total tens sum in aac1 swapf aac1,w andlw 0x0f ; load partial hundreds sum in w ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 20+ 5+ ; 100+ 60+ 30+ 10+ ; ---------------------------------------------------- ; 128 64 32 16 8 4 2 1 ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 5+ ; 60+ 80+ 90+ 10+ 5+ ; 700 300 100 80+ 40+ 20+ 10+ 50+ ; 32000 16000 8000 4000 2000 1000 500 200+ ; ------------------------------------------------------ ; 32768 16384 8192 4096 2048 1024 512 256 ; ; complete hundreds sum in high byte btfsc aar1,1 addlw 0x05+0x06 skpdc addlw -0x06 ; wmax=1:4 ; btfsc aar1,5 addlw 0x01+0x06 skpdc addlw -0x06 ; wmax=1:5 ; btfsc aar1,6 addlw 0x03+0x06 skpdc addlw -0x06 ; wmax=1:8 ; btfsc aar1,7 addlw 0x07+0x06 skpdc addlw -0x06 ; wmax=2:5, hundreds sum ended ; movwf aac2 ; save total hundreds sum in aac2 swapf aac2,w movwf aac3 ; save partial thousands sum in aac3 movlw 0x0f ; clear high nibble andwf aac1,f ; andwf aac2,f ; andwf aac3,f ; ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 5+ ; 60+ 80+ 90+ 10+ 5+ ; 700+ 300+ 100+ 80+ 40+ 20+ 10+ 50+ ; 32000 16000 8000 4000 2000 1000 500+ 200+ ; ------------------------------------------------------ ; 32768 16384 8192 4096 2048 1024 512 256 ; ; complete thousands sum in low and high byte rrf aar1,w ; rotate right high byte twice movwf aac4 ; rrf aac4,w ; andlw 0x0f ; clear high nibble addlw 0x06 ; adjust bcd skpdc ; addlw -0x06 ; wmax=1:5 ; addlw 0x06 ; include previous sum addwf aac3,w skpdc addlw -0x06 ; wmax=1:7 ; btfsc aar1,6 addlw 0x16+0x06 skpdc addlw -0x06 ; wmax=3:3 ; btfsc aar1,7 addlw 0x32+0x06 skpdc addlw -0x06 ; wmax=6:5, thousands sum ended ; movwf aac3 ; save total thousands sum in aac3 movwf aac4 ; swapf aac4,f ; save ten-thousands sum in aac4 movlw 0x0f ; clear high nibble andwf aac3,f ; andwf aac4,f ; return END thay đổi nội dung bởi: uydanh, 23-12-2007 lúc 10:38 AM. Lý do: Sửa nhầm |
23-12-2007, 10:23 AM | #5 |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 100
: |
Đoạn code phục vụ ngắt bạn thử làm như sau:
Code:
BTFSS PIR1,TMR1IF GOTO exit_int BCF PIR1,TMR1IF CLRF TMR1L CLRF TMR1H MOVLW 0XC3 MOVWF TMR1H MOVLW 0X50 MOVWF TMR1L DECFSZ demtimer1,1 GOTO tiep1 GOTO tiep2 tiep1: MOVLW B'10100110' MOVWF PORTB MOVLW D'20' MOVWF demtimer1 GOTO exit_int tiep2: MOVLW B'11000110' MOVWF PORTB exit_int MOVF FSR_save,W MOVWF FSR MOVF PCLATH_save MOVWF PCLATH SWAPF STATUS_save,W MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 RETFIE
__________________
Do more than exist, LIVE |
23-12-2007, 10:01 PM | #6 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Không thể nào chạy được. Buồn quá.
Mình không hiểu nổi tại sao đoạn chương trình kích cho timer1 chạy lại trong ngắt không bao giờ hoạt động được. |
24-12-2007, 12:56 AM | #7 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Mình thử viết một chương trình chớp tắt led đơn giản, sử dụng ngắt timer1. Chương trình như sau :
Code:
processor 16f877a ;vi dieu khien duoc su dung la PIC16F877A cua Microchip include <p16f877a.inc> ;header file kem theo __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;=================================================================================================== ;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT W_save EQU 0x20 PCLATH_save EQU 0x21 STATUS_save EQU 0x22 FSR_save EQU 0x23 DEM EQU 0X24 count1 EQU 0x25 counta EQU 0x26 countb EQU 0x27 ;=================================================================================================== ORG 0X004 GOTO ISR ISR ;=================================================================================================== ;DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT MOVWF W_save SWAPF STATUS_save,W CLRF STATUS MOVWF STATUS_save MOVF PCLATH,W MOVWF PCLATH_save CLRF PCLATH MOVF FSR,W MOVWF FSR_save ;=================================================================================================== ;CHUONG TRINH CHINH CUA NGAT ;=================================================================================================== BTFSS PIR1,TMR1IF GOTO exit_int BCF PIR1,TMR1IF BCF T1CON,TMR1ON CLRF T1CON CLRF TMR1L CLRF TMR1H MOVLW 0X00 MOVWF T1CON MOVLW 0XC3 MOVWF TMR1H MOVLW 0X50 MOVWF TMR1L BSF T1CON,TMR1ON DECFSZ DEM,1 GOTO exit_int COMF PORTB,1 MOVLW D'100' MOVWF DEM GOTO exit_int ;=================================================================================================== ;DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT exit_int MOVF FSR_save,W MOVWF FSR MOVF PCLATH_save MOVWF PCLATH SWAPF STATUS_save,W MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 RETFIE ORG 0X0000 GOTO start ORG 0X050 ;================================================================================================= ;CHUONG TRINH CHINH ;================================================================================================= start BCF STATUS,RP1 BSF STATUS,RP0 MOVLW 0X00 MOVWF TRISB BCF STATUS,RP0 MOVLW D'100' MOVWF DEM ;------------------------------------------------------------------------------------------------ ;KHOI TAO TIMER 1 ;------------------------------------------------------------------------------------------------ CLRF T1CON CLRF INTCON CLRF TMR1H CLRF TMR1L BSF STATUS,RP0 CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 CLRF PIR1 MOVLW 0X00 MOVWF T1CON MOVLW 0XC3 MOVWF TMR1H MOVLW 0X50 MOVWF TMR1L BSF T1CON,TMR1ON BSF INTCON,TMR1IE BSF INTCON,PEIE BSF INTCON,GIE BSF PIR1,TMR1IF MOVLW B'00000011' MOVWF PORTC MOVLW B'11111111' MOVWF PORTB GOTO $ delay20 MOVLW d'10' ;nap 20 cho count1 de tao tre 20ms MOVWF count1 lap1 MOVLW d'199' MOVWF counta MOVLW d'1' MOVWF countb delay1 DECFSZ counta,1 GOTO $+2 DECFSZ countb,1 GOTO delay1 DECFSZ count1,1 GOTO lap1 ;het doan chuong trinh delay 100ms RETURN END To Jerry : mình đã thử không dùng lệnh xóa và đặt bit TMR1ON nhưng chương trình ko chạy được. Cho mình hỏi cách khai báo sử dụng cùng một lúc timer0 và timer1 và ngắt của chúng như thế nào? (mình khai báo như bình thường nhưng ko chạy được) Xin cảm ơn. |
24-12-2007, 11:23 AM | #8 |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 100
: |
1. Thiếu phần định nghĩa các chân cổng là digital I/O
Code:
BSF STATUS, RP0 ; Select Bank 1 MOVLW 0x06 ; Configure all pins MOVWF ADCON1 ; as digital inputs BCF STATUS, RP0 ; Select Bank 0 3. Trong chương trình chưa thấy phần định nghĩa hướng dữ liệu (vào/ra) cho PORTC và PORTB, vậy mà lại out dữ liệu ra: Code:
MOVLW B'00000011' MOVWF PORTC MOVLW B'11111111' MOVWF PORTB
__________________
Do more than exist, LIVE |
24-12-2007, 12:07 PM | #9 | |||
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Trích:
Trích:
Trích:
Bạn giúp mình những vấn đề khác đi. Thực sự mình đang rất rối, mọi chuyện đang như đám rừng. bó tay. Do thời gian học về PIC của mình ngắn quá nên có nhiều chổ chưa hiểu đúng bản chất vấn đề. Rất mong các đọc qua đoạn code của mình, xem thử có lỗi sai nào trầm trọng về kiến thức thì cho mình biết để mình giải quyết vấn đề timer1 này. thay đổi nội dung bởi: uydanh, 24-12-2007 lúc 12:21 PM. |
|||
24-12-2007, 01:10 PM | #10 |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 100
: |
Bây giờ phân tích tiếp phần chương trình chính điều khiển động cơ của bạn nhé.
1. Phần khởi tạo các cổng vào ra, bạn cũng thiếu phần định nghĩa các chân cổng là digital I/O Code:
BSF STATUS, RP0 ; Select Bank 1 MOVLW 0x06 ; Configure all pins MOVWF ADCON1 ; as digital inputs BCF STATUS, RP0 ; Select Bank 0 2. Code:
MOVLW b'00000000' MOVWF PORTC MOVLW b'00000000' MOVWF PORTB MOVLW b'00100000' MOVWF PORTB MOVLW b'01000000' MOVWF PORTB MOVLW b'01100000' MOVWF PORTB MOVLW b'10000000' MOVWF PORTB MOVLW b'10100000' MOVWF PORTB MOVLW b'11000000' MOVWF PORTB MOVLW b'11100000' MOVWF PORTB Code:
MOVLW b'00000000' MOVWF PORTC MOVLW b'00000000' MOVWF PORTB Code:
MOVLW b'00000000' MOVWF PORTC MOVLW b'11100000' MOVWF PORTB Không hiểu bạn thay đổi liên tục giá trị ghi vào cổng B như vậy để làm gì. Nhưng nên nhớ là 1 lệnh của PIC thường chiếm có 1 chu kỳ máy, nghĩa là nếu bạn dùng thạch anh dao động 4 MHz, mỗi lệnh chỉ xảy ra trong 1us, rất rất nhỏ. Vậy bạn thay đổi PORTB liên tục như thế chẳng có ý nghĩa gì cả. Ở phần khởi tạo Timer1 chỉ viết thế này là đủ: Code:
CLRF T1CON CLRF INTCON BSF STATUS,RP0 CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 CLRF PIR1 MOVLW 0X27 MOVWF TMR1H MOVLW 0X10 MOVWF TMR1L Code:
TMR1H = 0xFC TMR1H = 0x17 Tạm thời như thế. Bạn sửa đi và nói lại cho tôi biết những lỗi xảy ra khi thiết bị hoạt động. Thân.
__________________
Do more than exist, LIVE |
24-12-2007, 01:21 PM | #11 |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 100
: |
Thêm nữa, trong phần khởi tạo cho Timer1, bạn xoá thanh ghi INTCON, điều này làm cho bit GIE và PEIE trong thanh ghi này bị xóa. Hai bit này bị xoá thì không bao giờ có bất cứ ngắt nào xảy ra. Do vậy đoạn khởi tạo cho Timer1 bạn sửa như sau:
Code:
;================================================================================================== ;KHOI TAO TIMER1 ;================================================================================================== CLRF T1CON CLRF INTCON CLRF PIR1 MOVLW 0XFC MOVWF TMR1H MOVLW 0X17 MOVWF TMR1L BSF STATUS,RP0 CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 BSF INTCON,PEIE BSF INTCON,GIE
__________________
Do more than exist, LIVE |
24-12-2007, 04:05 PM | #12 | |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Làm như bạn hướng dẫn nó đã chạy được nhưng vẫn không ổn định, luc được lúc không (mình thử trên mạch test riêng chứ ko phải mạch đồ án)
Trích:
Cái quan trọng với mình là : trong một chương trình chỉ sử dụng ngắt timer1 (vào đầu chương trình là ngắt chạy luôn) mà chạy còn thiếu ổn định ,lúc được lúc không nên khi đưa vào đồ án, chương trình chạy theo tuần tự, trong đó việc ngắt timer1 xảy ra sau các đoạn chương trình khác nên nó ko bao giờ chạy được cả, ngắt chỉ xảy ra một lần rồi thôi. |
|
24-12-2007, 04:26 PM | #13 |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 100
: |
Mạch test đó bạn làm những việc gì? Chương trình viết như thế nào? không ổn định như thế nào? Lúc chạy lúc không hay thế nào? Bây giờ bạn có thể làm như thế này để Test ngắt Timer1: Giả dụ bạn có 1 cái mạch nào đó có gắn LED trên chân cổng, bạn viết chương trình trễ để chớp tắt LED đi. Còn cái ngắt Timer1 thì chỉ có thế, không quá phức tạp. Không có chuyện nó chạy thiếu ổn định, chỉ là do mình quản lý hệ thống chương trình chưa tốt.
__________________
Do more than exist, LIVE |
24-12-2007, 05:14 PM | #14 | |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Trích:
Những hiện tượng trên chỉ xảy ra khi mình viết ngắt timer1, những chương trình khác như quét phím, đọc xung từ timer0 chạy rất tốt, không việc gì cả. Mình không hiểu tại sao nữa. Chương trình nhâp nháy led . Code:
processor 16f877a ;vi dieu khien duoc su dung la PIC16F877A cua Microchip include <p16f877a.inc> ;header file kem theo __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;=================================================================================================== ;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT W_save EQU 0x20 PCLATH_save EQU 0x21 STATUS_save EQU 0x22 FSR_save EQU 0x23 DEM EQU 0X24 count1 EQU 0x25 counta EQU 0x26 countb EQU 0x27 ;=================================================================================================== ORG 0X004 GOTO ISR ISR ;=================================================================================================== ;DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT MOVWF W_save SWAPF STATUS_save,W CLRF STATUS MOVWF STATUS_save MOVF PCLATH,W MOVWF PCLATH_save CLRF PCLATH MOVF FSR,W MOVWF FSR_save ;=================================================================================================== ;CHUONG TRINH CHINH CUA NGAT ;=================================================================================================== BTFSS PIR1,TMR1IF GOTO exit_int BCF PIR1,TMR1IF BCF T1CON,TMR1ON CLRF T1CON CLRF TMR1L CLRF TMR1H MOVLW 0X00 MOVWF T1CON MOVLW 0XFC MOVWF TMR1H MOVLW 0X17 MOVWF TMR1L BSF T1CON,TMR1ON DECFSZ DEM,1 GOTO exit_int COMF PORTB,1 MOVLW D'100' MOVWF DEM GOTO exit_int ;=================================================================================================== ;DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT exit_int MOVF FSR_save,W MOVWF FSR MOVF PCLATH_save MOVWF PCLATH SWAPF STATUS_save,W MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 RETFIE ORG 0X0000 GOTO start ORG 0X050 ;================================================================================================= ;CHUONG TRINH CHINH ;================================================================================================= start BSF STATUS, RP0 ; Select Bank 1 MOVLW 0x06 ; Configure all pins MOVWF ADCON1 ; as digital inputs BCF STATUS, RP0 ; Select Bank 0 BCF STATUS,RP1 BSF STATUS,RP0 MOVLW 0X00 MOVWF TRISB BCF STATUS,RP0 MOVLW D'100' MOVWF DEM ;------------------------------------------------------------------------------------------------ ;KHOI TAO TIMER 1 ;------------------------------------------------------------------------------------------------ CLRF T1CON CLRF INTCON BSF STATUS,RP0 CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 CLRF PIR1 MOVLW 0XFC MOVWF TMR1H MOVLW 0X17 MOVWF TMR1L BSF T1CON,TMR1ON BSF INTCON,TMR1IE BSF INTCON,PEIE BSF INTCON,GIE MOVLW B'10000110' MOVWF PORTB GOTO $ END |
|
30-12-2007, 03:01 AM | #15 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Đã tìm được nguyên nhân, nhưng chưa biết giải thích tại sao.
Đoạn code chổ này Code:
DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT MOVWF W_save SWAPF STATUS_save,W CLRF STATUS MOVWF STATUS_save MOVF PCLATH,W MOVWF PCLATH_save CLRF PCLATH MOVF FSR,W MOVWF FSR_save Code:
MOVWF W_save ;W_TEMP=W SWAPF STATUS,0 ;W=SWAP STATUS MOVWF STATUS_save Code:
DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT exit_int MOVF FSR_save,W MOVWF FSR MOVF PCLATH_save MOVWF PCLATH SWAPF STATUS_save,W MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 Code:
SWAPF STATUS_save,0 MOVWF STATUS SWAPF W_save,1 SWAPF W_save,0 |
|
|