• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::

論壇索引


Board index » All Posts (brianttn)




請教Datasheet - DS33014J上的範例,請問有無高人能說清楚、講明白
#1
新會員
新會員


這是在Datasheet中看到的範例,看了很久,不知為什麼用這種架構寫,不是不懂如何寫程式,而是不知道為何這麼寫和每個動作的實際作為,有高人能以加以解釋一下嗎,感恩啊。

#include p16F877A.inc

udata 0x20
Dly0 res 1 ;Stores 4 bytes of data for the delay count
Dly1 res 1 ;Dly0 is the least significant byte
Dly2 res 1 ;while Dly3 is the most significant byte
Dly3 res 1

Dly32 MACRO DLY
goto $+1 ;delay 2 cycles
goto $+1 ;delay total of 4 cycles

;Take the delay value argument from the macro, precalculate
;the required 4 RAM values and load the The RAM values Dly3
;though Dly0.

BANKSEL Dly3
movlw (DLY-1) & H'FF'
movwf Dly0
movlw (DLY-1) >>D'08' & H'FF'
movwf Dly1
movlw (DLY-1) >>D'16' & H'FF'

;Bytes are shifted and anded by the assembler to make user
;calculations easier.

movwf Dly2
movlw (DLY-1) >>D'24' & H'FF'
;Call DoDly32 to run the delay loop.
movwf Dly3
call DoDly32
ENDM ;End of Macro definition

RST CODE 0x00 ;Reset Vector
pagesel TestCode
goto TestCode

CODE ;Code starts here
TestCode
Dly32 D'50000' ;Max 4 billion+ (runs Dly32 Macro,
;1 sec in this case).
nop ;ZERO STOPWATCH, put breakpoint here

goto TestCode ;Go back to top of program and
;run the delay again.
;Subroutine, called by the Macro Dly32 (20 Tcy per loop)

DoDly32
movlw H'FF' ;Start with -1 in W
addwf Dly0,F ;LSB decrement
btfsc STATUS,C ;was the carry flag set?
clrw ;If so, 0 is put in W
addwf Dly1,F ;Else, we continue.
btfsc STATUS,C
clrw ;0 in W
addwf Dly2,F
btfsc STATUS,C
clrw ;0 in W
addwf Dly3,F
btfsc STATUS,C
clrw ;0 in W
iorwf Dly0,W ;Inclusive-OR all variables
iorwf Dly1,W ;together to see if we have reached
iorwf Dly2,W ;0 on all of them.
iorwf Dly3,W
btfss STATUS,Z ;Test if result of Inclusive-OR's is 0
goto DoDly32 ;It was NOT zero, so continue counting
retlw 0 ;It WAS zero, so exit this subroutine.

END

發表於: 2006/10/31 22:45
頂部


如何有效利用Timer在Background運作,而程式依然繼續往下執行!!
#2
新會員
新會員


最近在寫一個小練習,想利用timer不斷產一個序列(7、11、13、14),而程式繼續執行其它部分,且程式執行過程中,要以timer產生的序列做為判斷(match)的依據。也就是說要讓timer動作後,就算程式跳開了,依然會繼續執行。
如果那位前輩有寫過類似的程式,麻煩提供程式或給些建議吧,謝謝!!

發表於: 2006/8/11 9:01
頂部


PIC18F452可以正常執行的鍵盤掃描同時做WAKEUP動作的程式,竟然用在PIC18F4520就不正常了。附程式,認為程度夠的人看看吧,並提供些意見吧。
#3
新會員
新會員


鍵盤掃描同時做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的差別!?
#4
新會員
新會員


一個在PIC18F452可以正常執行的鍵盤掃描同時做WAKEUP動作的程式,竟然用在PIC18F4520就不正常了,真奇怪。該作的設定都改過了,不知道有沒有人有任何經驗或建議!!

發表於: 2006/7/31 19:55
頂部


關於之前的提問,在此做一修正,謝謝大家的指教!!
#5
新會員
新會員


不好意思,我剛剛的意思是我的PORTB的Bit4到Bit7應該要被Pull high才對,所以應該是0xF0,而不是0x30(因為我使用了RBPU的功能來做到Interrupt on Change)。所以麻煩各位如果有人有能力解決這個問題的話給點主意吧

發表於: 2006/7/25 12:52
頂部


請教f312380及各位先進,我的程式依然存在相同的問題,沒有改變!!
#6
新會員
新會員


我的程式再附上如下,之前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應用的問題,小弟將程式附上如下,麻煩各位先進提供解決的方法
#7
新會員
新會員


之前發問過有關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功能啊,有那麼難嗎?!
#8
新會員
新會員


目前小弟試著用PIC18F452實作PORTB的Interrupt on change功能,我確認過程式功能,確實有產生wake up的動作,不過動作一直不是很正常(感覺wake up之後有些I/O腳位會被強迫拉到高或低電位,產生非預期的輸出)。網站上的App Note,如AN552、AN556等,寫得不是很仔細,而且AN552的程式還有部分寫錯。不知道有沒有"真正的高手"有這方面的經驗或是"可以動"的程式和小弟交流一下。(或者是如果Microchip的工程師如果會的話也可能交流一下)

發表於: 2006/7/24 19:55
頂部






:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------