如何有效利用Timer在Background運作,而程式依然繼續往下執行!!
|
||||
---|---|---|---|---|
新會員
|
最近在寫一個小練習,想利用timer不斷產一個序列(7、11、13、14),而程式繼續執行其它部分,且程式執行過程中,要以timer產生的序列做為判斷(match)的依據。也就是說要讓timer動作後,就算程式跳開了,依然會繼續執行。
如果那位前輩有寫過類似的程式,麻煩提供程式或給些建議吧,謝謝!!
發表於: 2006/8/11 9:01
|
|||
|
PIC18F452可以正常執行的鍵盤掃描同時做WAKEUP動作的程式,竟然用在PIC18F4520就不正常了。附程式,認為程度夠的人看看吧,並提供些意見吧。
|
||||
---|---|---|---|---|
新會員
|
鍵盤掃描同時做WAKEUP動作的程式附上如下,實在搞不懂,PIC18452和PIC184520的各項設定不同處都找過了,為何在452可以正常動作,而4520就做異常的動作。
LIST P = 18F4520 #INCLUDE <P18F4520.INC> CONFIG OSC = XT,LVP = OFF,IESO = ON TEMP EQU 0x00 ORG 0x00 GOTO START ORG 0x08 GOTO ServiceInterrupt ORG 0x20 START MOVLW 0xF7 ; 共有F7、FB、FD、FE四種模式 MOVWF TEMP CLRF TRISA GOTO InitPortB ;initalize port B InitInt BSF RCON,IPEN BSF INTCON,GIEH LOOP SLEEP ;sleep till key is hit NOP GOTO LOOP ServiceInterrupt BTFSC INTCON,RBIF ;change on rb int? GOTO ServiceWakup ;yes then service RETURN ;or return to sleep ServiceWakup BCF INTCON,RBIE ;clear mask BCF INTCON,RBIF ;clear flag ;****** 判斷跳到哪個COLUMN ************ MOVF PORTB,W ANDLW B'00001000' BZ COLUMN1 MOVF PORTB,W ANDLW B'00000100' BZ COLUMN2 MOVF PORTB,W ANDLW B'00000010' BZ COLUMN3 MOVF PORTB,W ANDLW B'00000001' BZ COLUMN4 ;************************************** RETFIE ;************* 鍵盤掃描 4x4 *********************** ;**** COLUMN 1 *************** COLUMN1 MOVF PORTB,W ANDLW B'10001000' BZ BUTTON0 MOVF PORTB,W ANDLW B'01001000' BZ BUTTON1 MOVF PORTB,W ANDLW B'00101000' BZ BUTTON2 MOVF PORTB,W ANDLW B'00011000' BZ BUTTON3 MOVLW 0xFB MOVWF TEMP GOTO InitPortB ;****************************** ;**** COLUMN 2 *************** COLUMN2 MOVF PORTB,W ANDLW B'10000100' BZ BUTTON4 MOVF PORTB,W ANDLW B'01000100' BZ BUTTON5 MOVF PORTB,W ANDLW B'00100100' BZ BUTTON6 MOVF PORTB,W ANDLW B'00010100' BZ BUTTON7 MOVLW 0xFD MOVWF TEMP GOTO InitPortB ;****************************** ;**** COLUMN 3 *************** COLUMN3 MOVF PORTB,W ANDLW B'10000010' BZ BUTTON8 MOVF PORTB,W ANDLW B'01000010' BZ BUTTON9 MOVF PORTB,W ANDLW B'00100010' BZ BUTTONA MOVF PORTB,W ANDLW B'00010010' BZ BUTTONB MOVLW 0xFE MOVWF TEMP GOTO InitPortB ;****************************** ;**** COLUMN 4 *************** COLUMN4 MOVF PORTB,W ANDLW B'10000001' BZ BUTTONC MOVF PORTB,W ANDLW B'01000001' BZ BUTTOND MOVF PORTB,W ANDLW B'00100001' BZ BUTTONE MOVF PORTB,W ANDLW B'00010001' BZ BUTTONF MOVLW 0xF7 MOVWF TEMP GOTO InitPortB ;****************************** ;****************** 鍵盤掃描 4x4 ********************** ;*************** Service Buttons *********************** BUTTON0 MOVLW 0x00 MOVWF PORTA MOVLW 0xFB MOVWF TEMP GOTO InitPortB BUTTON1 MOVLW 0x01 MOVWF PORTA MOVLW 0xFB MOVWF TEMP GOTO InitPortB BUTTON2 MOVLW 0x02 MOVWF PORTA MOVLW 0xFB MOVWF TEMP GOTO InitPortB BUTTON3 MOVLW 0x03 MOVWF PORTA MOVLW 0xFB MOVWF TEMP GOTO InitPortB BUTTON4 MOVLW 0x04 MOVWF PORTA MOVLW 0xFD MOVWF TEMP GOTO InitPortB BUTTON5 MOVLW 0x05 MOVWF PORTA MOVLW 0xFD MOVWF TEMP GOTO InitPortB BUTTON6 MOVLW 0x06 MOVWF PORTA MOVLW 0xFD MOVWF TEMP GOTO InitPortB BUTTON7 MOVLW 0x07 MOVWF PORTA MOVLW 0xFD MOVWF TEMP GOTO InitPortB BUTTON8 MOVLW 0x08 MOVWF PORTA MOVLW 0xFE MOVWF TEMP GOTO InitPortB BUTTON9 MOVLW 0x09 MOVWF PORTA MOVLW 0xFE MOVWF TEMP GOTO InitPortB BUTTONA MOVLW 0x0A MOVWF PORTA MOVLW 0xFE MOVWF TEMP GOTO InitPortB BUTTONB MOVLW 0x0B MOVWF PORTA MOVLW 0xFE MOVWF TEMP GOTO InitPortB BUTTONC MOVLW 0x0C MOVWF PORTA MOVLW 0xF7 MOVWF TEMP GOTO InitPortB BUTTOND MOVLW 0x0D MOVWF PORTA MOVLW 0xF7 MOVWF TEMP GOTO InitPortB BUTTONE MOVLW 0x0E MOVWF PORTA MOVLW 0xF7 MOVWF TEMP GOTO InitPortB BUTTONF MOVLW 0x0F MOVWF PORTA MOVLW 0xF7 MOVWF TEMP GOTO InitPortB ;******************************************************* InitPortB CLRF PORTB CLRF LATB MOVLW 0x0F ; 使PORTB、 MOVWF ADCON1 ; Digital I/O MOVLW 0xF0 ; RB0-RB3 outputs MOVWF TRISB ; RB4-RB7 inputs MOVFF TEMP,PORTB BCF INTCON2,RBPU ;enable pull up BCF INTCON,RBIE ;disable mask MOVF PORTB,W ;read port BCF INTCON,RBIF ;clear flag BSF INTCON,RBIE ;enable mask GOTO InitInt END
發表於: 2006/8/1 8:41
|
|||
|
PIC18F452和PIC18F4520的差別!?
|
||||
---|---|---|---|---|
新會員
|
一個在PIC18F452可以正常執行的鍵盤掃描同時做WAKEUP動作的程式,竟然用在PIC18F4520就不正常了,真奇怪。該作的設定都改過了,不知道有沒有人有任何經驗或建議!!
發表於: 2006/7/31 19:55
|
|||
|
關於之前的提問,在此做一修正,謝謝大家的指教!!
|
||||
---|---|---|---|---|
新會員
|
不好意思,我剛剛的意思是我的PORTB的Bit4到Bit7應該要被Pull high才對,所以應該是0xF0,而不是0x30(因為我使用了RBPU的功能來做到Interrupt on Change)。所以麻煩各位如果有人有能力解決這個問題的話給點主意吧
發表於: 2006/7/25 12:52
|
|||
|
請教f312380及各位先進,我的程式依然存在相同的問題,沒有改變!!
|
||||
---|---|---|---|---|
新會員
|
我的程式再附上如下,之前f312380先生告知的這個訊息,我之前也試過,但其實最大的問題點在於InitPortB這個subroutine初始化完之後,PORTB的值被強迫為0x30,而不是0x00,所以會有非預期的輸出(實際接板子抓出的問題),所以麻煩各位如果有人有能力解決這個問題的話給點主意吧:
list p = 18F452 #include <p18F452.inc> TEMP EQU 0x02 ORG 0x00 GOTO START ORG 0x08 GOTO ServiceInterrupt org 0x20 START call InitPortB ;initalize port B bsf RCON,IPEN bsf INTCON,GIEH loop sleep ;sleep till key is hit nop goto loop ServiceInterrupt btfsc INTCON,RBIF ;change on rb int? goto ServiceWakup ;yes then service bcf INTCON,TMR0IE ;clear TMR0 int mask bcf INTCON,TMR0IF ;clear flag return ServiceWakup bcf INTCON,RBIE ;clear mask MOVF PORTB,W ;read PORTB bcf INTCON,RBIF ;clear flag call delay16 ;do de-bounce for 16mSecs MOVF PORTB,W ;read port B again andlw B'11110000' ;mask outputs movwf TEMP ;save in temp swapf TEMP,F ;switch low and high movfF TEMP,LATB ;send as outputs. call KeyRelease ;check for key release RETFIE KeyRelease call delay16 ;do debounce MOVF PORTB,W ;read PORTB bcf INTCON,RBIF ;clear flag bsf INTCON,RBIE ;enable mask andlw B'11110000' ;clear outputs btfsc STATUS,Z ;key still pressed? return ;no then return sleep ;else save power bcf INTCON,RBIE ;on wake up clear mask MOVF PORTB,W bcf INTCON,RBIF ;clear flag goto KeyRelease ;try again InitPortB CLRF PORTB CLRF LATB MOVLW 0x0F ; 使PORTB為 MOVWF ADCON1 ; Digital I/O MOVLW 0xF0 MOVWF TRISB bcf INTCON2,RBPU ;enable pull up bcf INTCON,RBIE ;disable mask movf PORTB,W ;read port bcf INTCON,RBIF ;clear flag bsf INTCON,RBIE ;enable mask RETURN delay16 movlw B'11000111' ;fosc/256 --> TMR0 movwf T0CON ; / clrf TMR0L bcf INTCON,TMR0IF ;clear flag bsf INTCON,TMR0IE ;enable mask CheckAgain btfss INTCON,TMR0IF ;timer overflowed? goto CheckAgain ;no check again bcf INTCON,TMR0IE ;else clear mask bcf INTCON,TMR0IF ;clear flag return end
發表於: 2006/7/25 11:46
|
|||
|
之前發問過有關PORTB的Interrupt on change應用的問題,小弟將程式附上如下,麻煩各位先進提供解決的方法
|
||||
---|---|---|---|---|
新會員
|
之前發問過有關PORTB的Interrupt on change應用的問題,小弟將程式附上如下,麻煩各位先進提供解決的方法(應該是Read-Modify-Write造成wake up之後輸出不正常的情況)
list p = 18F452 #include <p18F452.inc> TEMP EQU 0x02 ORG 0x00 GOTO START ORG 0x08 GOTO ServiceInterrupt org 0x20 START call InitPortB ;initalize port B bsf RCON,IPEN bsf INTCON,GIEH loop sleep ;sleep till key is hit nop goto loop ServiceInterrupt btfsc INTCON,RBIF ;change on rb int? goto ServiceWakup ;yes then service bcf INTCON,TMR0IE ;clear TMR0 int mask bcf INTCON,TMR0IF ;clear flag return ServiceWakup bcf INTCON,RBIE ;clear mask MOVF LATB,W ;read PORTB bcf INTCON,RBIF ;clear flag call delay16 ;do de-bounce for 16mSecs MOVF LATB,W ;read port B again andlw B'11110000' ;mask outputs movwf TEMP ;save in temp swapf TEMP,F ;switch low and high movfF TEMP,LATB ;send as outputs. call KeyRelease ;check for key release RETFIE KeyRelease call delay16 ;do debounce MOVF LATB,W ;read PORTB bcf INTCON,RBIF ;clear flag bsf INTCON,RBIE ;enable mask andlw B'11110000' ;clear outputs btfsc STATUS,Z ;key still pressed? return ;no then return sleep ;else save power bcf INTCON,RBIE ;on wake up clear mask MOVF LATB,W bcf INTCON,RBIF ;clear flag goto KeyRelease ;try again InitPortB CLRF PORTB CLRF LATB MOVLW 0x0F ; 使PORTB為 MOVWF ADCON1 ; Digital I/O MOVLW 0xF0 ; RB0-RB3 outputs MOVWF TRISB ; RB4-RB7 inputs bcf INTCON2,RBPU ;enable pull up bcf INTCON,RBIE ;disable mask movf LATB,W ;read port bcf INTCON,RBIF ;clear flag bsf INTCON,RBIE ;enable mask RETFIE delay16 movlw B'11000111' ;fosc/256 --> TMR0 movwf T0CON ; / clrf TMR0L bcf INTCON,TMR0IF ;clear flag bsf INTCON,TMR0IE ;enable mask CheckAgain btfss INTCON,TMR0IF ;timer overflowed? goto CheckAgain ;no check again bcf INTCON,TMR0IE ;else clear mask bcf INTCON,TMR0IF ;clear flag return end
發表於: 2006/7/25 8:39
|
|||
|
有沒有人會用PORTB的Interrupt on change功能啊,有那麼難嗎?!
|
||||
---|---|---|---|---|
新會員
|
目前小弟試著用PIC18F452實作PORTB的Interrupt on change功能,我確認過程式功能,確實有產生wake up的動作,不過動作一直不是很正常(感覺wake up之後有些I/O腳位會被強迫拉到高或低電位,產生非預期的輸出)。網站上的App Note,如AN552、AN556等,寫得不是很仔細,而且AN552的程式還有部分寫錯。不知道有沒有"真正的高手"有這方面的經驗或是"可以動"的程式和小弟交流一下。(或者是如果Microchip的工程師如果會的話也可能交流一下)
發表於: 2006/7/24 19:55
|
|||
|