水果機硬件與軟件,共享
Altium Designer畫的果汁機電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
芯海單片機源程序如下:
- ;********************************************************************************************
- ;#######################################################################################
- ;【文件名】 LT-Y47.asm:主體程序文件 *** 18.01.09 ***
- ;#######################################################################################
- ;codeoption:FB01 checksum:B26E
- ;#######################################################################################
- ;---------- all rights reserved , Chipsea technology 2018 -------------
- ;======================================================================
- ; 【說明】:
- ;****************************************************
- ; prj desp. : 幻想果汁機
- ; target chip : CSU8RP3215
- ; crystal : 16MHZ
- ; author : dream
- ; date : 2018.01.09
- ;
- ;****************************************************
- ;****************************************************
- ;【型號定義】:
- ;****************************************************
- ;****************************************************
- ;【編譯選項】:
- ;_DEBUG_ equ 1
- ;****************************************************
- ;【OPTION選項】:
- ;
- ;****************************************************
- ;【修改記錄】:
- ;
- ;****************************************************
- ;【目標母體選擇】:
- include "CSU8RP3215.inc"
-
- ;【引用文件】:
- include "LT_Y47.h"
- ;**********************************************************************
- ;**********************************************************************
- org 000h
- nop
- nop
- nop
- goto start
- org 004h
- goto intService
- ;******************************************************************************
- ; org 010h
- ;******************************************************************************
- start:
- bcf gie
- call fnAllDefaultSet
- main:
- clrwdt
- call fnTaskMgr
- call fnKeyFunc
- call fnDispFunc
- call fnBatFunc
- call fnEnterSleep
- goto main
- ;******************************************************************************
- ;【說明】: 按鍵掃描程序
- ;【輸入】: 無
- ;【輸出】: fLongKey
- ;******************************************************************************
- fnTaskMgr:
- btfss fBase2ms
- goto lbTaskMgrExit
-
- bcf fBase2ms
- bcf led1_o
- btfsc ledBuf,0
- bsf led1_o
-
- bcf led2_o
- btfsc ledBuf,1
- bsf led2_o
-
- bcf led3_o
- btfsc ledBuf,2
- bsf led3_o
- bcf led4_o
- btfsc ledBuf,3
- bsf led4_o
-
- btfsc fHaveUsb
- goto lbChkUsbInfo
-
- btfss hall_i
- goto lbBottleLock
- lbBottleNotLock:
- clrf cHaveLock
- btfss fKGLock
- goto lbChkUsbInfo
- incf cNoLock,F
- movfw cNoLock
- sublw 29 ;30*2ms=60ms
- btfsc c
- goto lbChkKey
- bcf fKGLock
- btfsc fRunOn
- call lbChangeToOff
- bcf fBuzOn
- bcf buz_o
- bsf fEnWaitDly
- clrf tWaitDly
- clrf ledBuf
- goto lbChkUsbInfo
- lbBottleLock:
- clrf cNoLock
- btfsc fKGLock
- goto lbChkUsbInfo
- incf cHaveLock,F
- movfw cHaveLock
- sublw 29 ;30*2ms=60ms
- btfsc c
- goto lbChkUsbInfo
- bsf fKGLock
- btfsc fHaveUsb
- goto lbChkUsbInfo
- bsf fFstLock ;
- clrf tWaitDlyAssi ;延時1秒后關閉指示燈
- clrf tWaitDly ;
- bsf fBuzOn
- lbChkUsbInfo:
- btfss usb_i
- goto lbNoUsbInJug
- lbUsbInJug:
- clrf cUsbOut
- btfsc fHaveUsb
- goto lbTaskMgrExit
- incf cUsbExist,F
- movfw cUsbExist
- sublw 19 ;20*2ms=40ms
- btfsc c
- goto lbTaskMgrExit
- bsf fHaveUsb
- bcf fBat1ChgFull
- bcf fBat2ChgFull
- bcf fRunOn
- bcf motor_o
- bcf fBatLow
- bcf fEnWaitDly
- clrf cVolOffset
- bcf fMaskAlarm
- bcf fWorkedDly
- bcf fNeedCoolDown
- clrf cNormalWork
- movlw high(CHG_CUR_1000MA)
- movwf aimCurH
- movlw low(CHG_CUR_1000MA)
- movwf aimCurL
- goto lbTaskMgrExit
- lbNoUsbInJug:
- clrf cUsbExist
- btfss fHaveUsb
- goto lbChkKey
- incf cUsbOut,F
- movfw cUsbOut
- sublw 19 ;20*2ms=40ms
- btfsc c
- goto lbChkKey
- bcf fHaveUsb
- clrf ledBuf
- clrf cVolOffset
- bcf fEnWaitDly
- bcf pwm2out
- bcf pwm_o
- lbChkKey:
- btfsc fEnAlarmDly
- goto lbTaskMgrExit ;過載保護期間禁止按鍵
-
- movfw p_key
- andlw MASK_KEY_BIT
- xorlw MASK_KEY_BIT
- movwf var1
- btfsc z
- goto lbNoKeyPush ;沒有按鍵按下
-
- clrf tKeyRel
- xorwf lastKey,W
- btfss z
- goto lbNewKeyPush ;有新按鍵按下
-
- btfsc fKeyPush
- goto lbLongKeyPushCnt
-
- incf tKeyPush,F
- movfw tKeyPush
- sublw 30 ;31*2ms=62ms
- btfsc c
- goto lbTaskMgrExit
- movfw lastKey
- movwf keyName
- bsf fKeyOk
- bsf fKeyPush
- bcf fKeyRel
- lbTaskMgrExit:
- return
-
- lbNewKeyPush:
- movfw var1
- movwf lastKey
- bcf fKeyPush
- clrf tKeyPush
- goto lbTaskMgrExit
- lbLongKeyPushCnt:
- goto lbTaskMgrExit
- lbNoKeyPush:
- clrf tKeyPush
- bcf fKeyEr
- btfsc fKeyRel
- goto lbTaskMgrExit
- incf tKeyRel,F
- movfw tKeyRel
- sublw 23 ;24*2ms=48ms
- btfsc c
- goto lbTaskMgrExit
-
- bsf fKeyRel
- bcf fKeyPush
- goto lbTaskMgrExit
- ;******************************************************************************
- ;【說明】: 按鍵功能
- ;******************************************************************************
- fnKeyFunc:
- btfss fRstRun
- btfss fKeyOk
- goto lbKeyFuncExit
-
- bcf fKeyOk
- movfw keyName
- xorlw CONS_ON_KEY
- btfsc z
- goto lbOnKeyPr
- bsf fKeyEr
- lbKeyFuncExit:
- return
- lbOnKeyPr:
- btfsc fHaveUsb
- goto lbKeyFuncExit
- btfss fKGLock ;KG開關沒有鎖緊時,禁止運轉
- goto lbAlarmSet
-
- btfsc fNeedCoolDown ;10分鐘散熱期間,禁止開啟
- goto lbSetCoolDownDly
- btfsc fRunOn
- goto lbChangeToOff
-
- bsf fRunOn
- bsf fEnWaitDly ;馬達開啟后等待300ms尋找最大值
- clrf tWaitDly ;
- clrf cEmptyMotor
- clrf tRunSec
- clrf tRunMSec
- clrf tMotorDly
- clrf motorMaxCurH
- clrf motorMaxCurL
- clrf cVolOffset
- bcf fEmptyMotor
- bsf motor_o ;開啟馬達
- bsf fWorkGood
- clrf tWaterFlow
- movlw 1
- movwf ledBuf
- bsf fEnDisp
- goto lbKeyFuncExit
- lbChangeToOff:
- bcf fRunOn
- bcf motor_o
- clrf tWaitDly
- clrf tWaitDlyAssi
- clrf tRunMSec
- clrf cVolOffset
- bcf fWorkGood
- bsf fEnDisp
- goto lbKeyFuncExit
- lbAlarmSet:
- bsf fEnWaitDly
- clrf tWaitDly
- goto lbKeyFuncExit
-
- lbSetCoolDownDly:
- bsf fMaskAlarm ;開啟馬達需要散熱報警指示
- clrf tMaskSec
- clrf cMaskFlash
- bcf fEnDisp
- goto lbKeyFuncExit
- ;******************************************************************************
- ;【說明】: 顯示處理程序
- ;******************************************************************************
- fnDispFunc:
- btfss fDisp2ms
- goto lbDispFuncExit
-
- bcf fDisp2ms
- btfss fHaveUsb
- goto lbDischargeDisp
- lbChargeDisp:
- incf tFlashTime,F
- movfw tFlashTime
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto $+4
- clrf tFlashTime
- movlw 0x04 ;fEnFlash
- xorwf sysFlag2,F
-
- movfw volume
- addpcw
- goto lbDispChgVol0
- goto lbDispChgVol25
- goto lbDispChgVol50
- goto lbDispChgVol75
- goto lbDispChgVol100
- lbDispChgVol0: ;0%時,第一個燈閃爍
- movlw 0
- btfss fEnFlash
- movlw 1
- movwf ledBuf
- goto lbDispFuncExit
- lbDispChgVol25: ;25%時,25%常亮,50閃爍
- movlw 01b
- btfss fEnFlash
- movlw 11b
- movwf ledBuf
- goto lbDispFuncExit
- lbDispChgVol50: ;50%時,25%和50%常亮,75%閃爍
- movlw 011b
- btfss fEnFlash
- movlw 111b
- movwf ledBuf
- goto lbDispFuncExit
- lbDispChgVol75: ;75%時,25%、50%和75%常亮,100%閃爍
- movlw 0111b
- btfss fBat1ChgFull
- btfss fEnFlash
- movlw 1111b
- movwf ledBuf
- goto lbDispFuncExit
- lbDispChgVol100: ;100%時,充飽全亮
- movlw 1111b
- movwf ledBuf
- goto lbDispFuncExit
- lbDischargeDisp:
- btfss fKGLock
- goto lbChkAlarmDly ;沒有鎖緊,報警顯示
- btfsc fFstLock
- goto lbFirstLockDisp ;首次檢測到鎖緊顯示
-
- btfsc fMaskAlarm
- goto lbChkMaskDly ;需要散熱報警指示顯示
-
- btfss fEnDisp
- goto lbDispFuncExit
- btfss fWorkGood
- goto lbDispCurVolume ;顯示當前電量
-
- incf tWaterFlow,F
- movfw tWaterFlow
- sublw 149 ;150*2ms=300ms
- btfsc c
- goto lbDispFuncExit
- clrf tWaterFlow
- bcf c
- rlf ledBuf,F ;跑馬左移顯示
- movlw 1
- btfsc ledBuf,4
- movwf ledBuf
- goto lbDispFuncExit
-
- lbDispCurVolume:
- movfw volume
- addpcw
- goto lbDispDisVol0
- goto lbDispDisVol25
- goto lbDispDisVol50
- goto lbDispDisVol75
- goto lbDispDisVol100
- lbDispDisVol100:
- movlw 1111b
- movwf ledBuf
- goto lbDispDisVol25+2
- lbDispDisVol75:
- movlw 0111b
- movwf ledBuf
- goto lbDispDisVol25+2
- lbDispDisVol50:
- movlw 0011b
- movwf ledBuf
- goto lbDispDisVol25+2
- lbDispDisVol25:
- movlw 0001b
- movwf ledBuf
-
- incf tWaitDly,F
- movfw tWaitDly
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbDispFuncExit
- clrf tWaitDly
- incf tWaitDlyAssi,F
- movfw tWaitDlyAssi
- sublw 9 ;10*0.5s=5s
- btfsc c
- goto lbDispFuncExit
- clrf ledBuf
- bcf fEnDisp
- goto lbDispFuncExit
- lbDispDisVol0:
- incf tAlarmFlash,F
- movfw tAlarmFlash
- sublw 49 ;50*2ms=100ms
- btfsc c
- goto lbDispFuncExit
- clrf tAlarmFlash
- movlw 0x08 ;fAlarmFlash
- xorwf sysFlag2,F
-
- movlw 1111b
- btfss fAlarmFlash
- movlw 0000b
- movwf ledBuf
-
- incf tWaitDly,F
- movfw tWaitDly
- sublw 9
- btfsc c
- goto lbDispFuncExit
- clrf ledBuf ;關閉顯示
- bcf fEnDisp
- goto lbDispFuncExit
- lbFirstLockDisp:
- movlw 0x0f
- movwf ledBuf
- incf tWaitDly,F
- movfw tWaitDly
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbDispFuncExit
- clrf tWaitDly
- incf tWaitDlyAssi,F
- movfw tWaitDlyAssi
- sublw 1 ;0.5s*2=1s
- btfsc c
- goto lbDispFuncExit
- bcf fFstLock
- clrf ledBuf ;初次鎖緊滿1秒,關閉顯示
- bcf fBuzOn
- bcf buz_o
- goto lbDispFuncExit
- lbChkMaskDly:
- incf tMaskSec,F
- movfw tMaskSec
- sublw 49 ;50*2ms=100ms
- btfsc c
- goto lbDispFuncExit
-
- clrf tMaskSec
- movlw 0x0f
- xorwf ledBuf,F
- movlw 0x01 ;fBuzOn
- xorwf buzFlag,F
- incf cMaskFlash,F
- movfw cMaskFlash
- sublw 9 ;10次
- btfsc c
- goto lbDispFuncExit
- bcf fMaskAlarm
- clrf ledBuf
- bcf fBuzOn
- goto lbDispFuncExit
- lbChkAlarmDly:
- btfss fEnWaitDly
- goto lbDispFuncExit
- movlw 0xff
- movwf ledBuf
- incf tWaitDly,F
- movfw tWaitDly
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbDispFuncExit
- bcf fEnWaitDly
- clrf ledBuf ;關閉顯示
- lbDispFuncExit:
- return
- ;==============================================================================
- fnReadAnalog:
- movfw channelNum
- addpcw
- goto lbJudgeMotorCur
- goto lbJudgeBatVol1
- goto lbJudgeBatVol2
- goto lbJudgeUsbDc
- lbJudgeMotorCur:
- call fnSelectMotorCurrent
- goto lbStartReadAd
- lbJudgeBatVol1:
- call fnSelectBatVoltage1
- goto lbStartReadAd
- lbJudgeBatVol2:
- call fnSelectBatVoltage2
- goto lbStartReadAd
- lbJudgeUsbDc:
- call fnSelectUSBDc
- lbStartReadAd:
- movlw 20 ;
- movwf var1 ;
- decfsz var1,F ;切換通道delay
- goto $-1 ;
- call fnReadADC
-
- ;取和
- movfw var2
- addwf averageL,F
- movfw var1
- addwfc averageH,F
-
- ;更新最小值
- movfw var2
- subwf tempMinL,W
- movfw var1
- subwfc tempMinH,W
- btfss c
- goto $+5
- movfw var1
- movwf tempMinH
- movfw var2
- movwf tempMinL
-
- ;更新最大值
- movfw var2
- subwf tempMaxL,W
- movfw var1
- subwfc tempMaxH,W
- btfsc c
- goto $+5
- movfw var1
- movwf tempMaxH
- movfw var2
- movwf tempMaxL
-
- decfsz cAdcCnt,F
- goto lbCurrentJudgeExit
-
- ;減去最大值、最小值
- movfw tempMaxL
- subwf averageL,F
- movfw tempMaxH
- subwfc averageH,F
-
- movfw tempMinL
- subwf averageL,F
- movfw tempMinH
- subwfc averageH,F
-
- movfw channelNum
- addpcw
- goto lbSaveMotorCur
- goto lbSaveBatVol1
- goto lbSaveBatVol2
- goto lbSaveUsbDc
- lbSaveMotorCur:
- movfw averageH
- movwf motorCurH
- movfw averageL
- movwf motorCurL
- goto lbGotoNextChannel
-
- lbSaveBatVol1:
- movfw averageH
- movwf totVolH
- movfw averageL
- movwf totVolL
- goto lbGotoNextChannel
- lbSaveBatVol2:
- movfw averageH
- movwf batVol2H
- movfw averageL
- movwf batVol2L
-
- subwf totVolL,W
- movwf batVol1L
- movfw batVol2H
- subwfc totVolH,W
- movwf batVol1H
- btfsc c
- goto lbGotoNextChannel
- movfw totVolH
- movwf batVol1H
- movfw totVolL
- movwf batVol1L
- goto lbGotoNextChannel
- lbSaveUsbDc:
- movfw averageH
- movwf usbVolH
- movfw averageL
- movwf usbVolL
-
- ; movlw low(USB_3000MV)
- ; subwf usbVolL,W
- ; movlw high(USB_3000MV)
- ; subwfc usbVolH,W
- ; btfss c
- ; goto lbNoUsbInJug
- ;lbUsbInJug:
- ; clrf cUsbOut
- ; btfsc fHaveUsb
- ; goto lbGotoNextChannel
- ; incf cUsbExist,F
- ; movfw cUsbExist
- ; sublw 19 ;20*2ms=40ms
- ; btfsc c
- ; goto lbGotoNextChannel
- ; bsf fHaveUsb
- ; bcf fBat1ChgFull
- ; bcf fBat2ChgFull
- ; bcf fRunOn
- ; bcf motor_o
- ; bcf fBatLow
- ; bcf fEnWaitDly
- ; clrf cVolOffset
- ; bcf fMaskAlarm
- ; bcf fWorkedDly
- ; bcf fNeedCoolDown
- ; clrf cNormalWork
- ; movlw high(CHG_CUR_1000MA)
- ; movwf aimCurH
- ; movlw low(CHG_CUR_1000MA)
- ; movwf aimCurL
- ; goto lbGotoNextChannel
- ;lbNoUsbInJug:
- ; clrf cUsbExist
- ; btfss fHaveUsb
- ; goto lbChkKey
- ; incf cUsbOut,F
- ; movfw cUsbOut
- ; sublw 19 ;20*2ms=40ms
- ; btfsc c
- ; goto lbGotoNextChannel
- ; bcf fHaveUsb
- ; clrf ledBuf
- ; clrf cVolOffset
- ; bcf fEnWaitDly
- ; bcf pwm2out
- ; bcf pwm_o
- lbGotoNextChannel:
- call fnInitSamp
- incf channelNum,F
- movfw channelNum
- sublw 3
- btfsc c
- goto lbCurrentJudgeExit
- clrf channelNum
- bcf fRstRun
- ifdef _DEBUG_
- ;{
- btfss fBase1s
- goto lbCurrentJudgeExit
- bcf fBase1s
- movlw 0x55
- movwf data0
- movfw motorCurL
- movwf data1
- movfw motorCurH
- movwf data2
- movfw batVol1L
- movwf data3
- movfw batVol1H
- movwf data4
- movfw batVol2L
- movwf data5
- movfw batVol2H
- movwf data6
- movlw 7
- movwf txdNum
- bsf fEnTxd
- ;}
- endif
- lbCurrentJudgeExit:
- return
- ;----------------------------------------------------------
- fnInitSamp:
- movlw 3
- movwf cAdcCnt
- clrf averageH
- clrf averageL
- clrf tempMaxH
- clrf tempMaxL
- movlw 0xff
- movwf tempMinH
- movwf tempMinL
- return
- ;=================================================================
- fnReadADC:
- bsf srads ;開啟AD轉換
- btfsc srads
- goto $-1
-
- movfw sradl
- movwf var2
- movfw sradh
- andlw 0x0f
- movwf var1
-
- bsf offex ;翻轉輸入信號
- bsf srads
- btfsc srads
- goto $-1
-
- movfw sradl
- addwf var2,F
- movfw sradh
- andlw 0x0f
- addwfc var1,F
-
- bcf c
- rrf var1,F ;得到兩次輸入信號的平均值
- rrf var2,F ;
- return
- ;******************************************************************************
- ;【說明】: 電池充放電管理程序
- ;******************************************************************************
- fnBatFunc:
- btfss fBat2ms
- goto lbBatFuncExit
-
- bcf fBat2ms
- btfss fHaveUsb
- goto lbSystemDischarge
- lbSystemCharge:
- call fnReadAnalog ;模擬信號讀取
- call fnChgVolDet ;充電電量檢測
- call fnBatChgFullJug ;充飽檢測
- call fnChgVolControl ;充電電壓控制
- goto lbBatFuncExit
- lbSystemDischarge:
- call fnReadAnalog ;模擬信號讀取
- call fnDisVolDet ;放電電量檢測
- call fnMotorCtrl ;馬達控制
- call fnOverLoadCtrl
- call fnWaitCoolDown
- lbBatFuncExit:
- return
- ;==============================================================================
- ;充飽檢測
- fnBatChgFullJug:
- movlw low(BAT_VOL_4200MV)
- subwf batVol1L,W
- movlw high(BAT_VOL_4200MV)
- subwfc batVol1H,W
- btfss c
- clrf cBat1FullCnt
-
- incf cBat1FullCnt,F
- incf cBat1Cycle,F
- movfw cBat1Cycle
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbChkBat2ChgFull
- clrf cBat1Cycle
-
- movfw cBat1FullCnt
- clrf cBat1FullCnt
- sublw 249*60/100
- btfss c
- bsf fBat1ChgFull
- lbChkBat2ChgFull:
- movlw low(BAT_VOL_4200MV)
- subwf batVol2L,W
- movlw high(BAT_VOL_4200MV)
- subwfc batVol2H,W
- btfss c
- clrf cBat2FullCnt
-
- incf cBat2FullCnt,F
- incf cBat2Cycle,F
- movfw cBat2Cycle
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbBatChgFullJugExit
- clrf cBat2Cycle
-
- movfw cBat2FullCnt
- clrf cBat2FullCnt
- sublw 249*60/100
- btfss c
- bsf fBat2ChgFull
- lbBatChgFullJugExit:
- return
- ;==============================================================================
- ;充電電壓控制
- fnChgVolControl:
- ; movlw low(BAT_VOL_4200MV)
- ; subwf batVol1L,W
- ; movlw high(BAT_VOL_4200MV)
- ; subwfc batVol1H,W
- ; btfsc c
- ; goto lbBatChgFull
- ;
- ; movlw low(BAT_VOL_4200MV)
- ; subwf batVol2L,W
- ; movlw high(BAT_VOL_4200MV)
- ; subwfc batVol2H,W
- ; btfsc c
- ; goto lbBatChgFull
-
- call fnSelectMotorCurrent
- movlw 20
- movwf var1 ;
- decfsz var1,F ;切換通道delay
- goto $-1 ;
- call fnReadADC
- movfw var2
- movwf chgCurL
- movfw var1
- movwf chgCurH
- call fnReadADC
- movfw var2
- addwf chgCurL,F
- movfw var1
- addwfc chgCurH,F
- call fnReadADC
- movfw var2
- addwf chgCurL,F
- movfw var1
- addwfc chgCurH,F
- call fnReadADC
- movfw var2
- addwf chgCurL,F
- movfw var1
- addwfc chgCurH,F
- bcf c
- rrf chgCurH,F
- rrf chgCurL,F
- bcf c
- rrf chgCurH,F
- rrf chgCurL,F
-
- movfw batVol1H
- movwf var1
- movfw batVol1L
- movwf var2
-
- movfw batVol1L
- subwf batVol2L,W
- movfw batVol1H
- subwfc batVol2H,W
- btfss c
- goto $+5
- movfw batVol2H
- movwf var1
- movfw batVol2L
- movwf var2
- movlw low(USB_4600MV)
- subwf usbVolL,W
- movlw high(USB_4600MV)
- subwfc usbVolH,W
- btfss c
- goto lbPwmDec
-
- movfw aimCurL
- subwf chgCurL,W
- movfw aimCurH
- subwfc chgCurH,W
- btfsc c
- goto lbPwmDec ;實際電流大了,PWM--
-
- movlw low(BAT_VOL_4200MV)
- subwf var2,W
- movlw high(BAT_VOL_4200MV)
- subwfc var1,W
- btfsc c
- goto lbPwmDec
- lbPwmInc:
- movfw pwmBuf
- xorlw 0xff
- btfss z
- incf pwmBuf,F
- goto lbUpdateChargeCur
- lbPwmDec:
- movfw pwmBuf
- xorlw 0x0
- btfss z
- decf pwmBuf,F
- lbUpdateChargeCur:
- movfw pwmBuf
- movwf tm2r
- bsf pwm2out
- return
- lbBatChgFull:
- clrf pwmBuf
- clrf tm2r
- bcf pwm2out
- bcf pwm_o
- return
-
- ;******************************************************************************
- ;【說明】: 睡眠進入程序
- ;【輸入】: 無
- ;【輸出】: 無
- ;******************************************************************************
- fnEnterSleep:
- btfss fRunOn
- btfsc fHaveUsb
- goto lbEnterSleepExit
-
- btfsc fBatLow
- goto lbBatLowAlarm
-
- btfsc fEnAlarmDly
- goto lbEnterSleepExit
-
- btfss fWorkedDly
- btfsc fNeedCoolDown
- goto lbEnterSleepExit
-
- movfw ledBuf
- xorlw 0
- btfss z
- goto lbEnterSleepExit
- btfss fKeyPush
- btfss fSleep10ms
- goto lbEnterSleepExit
-
- bcf fSleep10ms
- incfsz tWaitSleep,F
- goto lbEnterSleepExit
- lbGotoSleepNow:
- clrwdt
- bcf fBuzOn
- bcf led1_o
- bcf led2_o
- bcf led3_o
- bcf led4_o
- bcf buz_o
- bsf pwr_o
- bcf sraden
- clrf sradcon0
- clrf sradcon1
- clrf sradcon2
- bcf pt3con,0
- bcf wdten
- movlw 0x13 ;使能按鍵和充電喚醒睡眠
- ; btfsc fBatLow
- ; movlw 0x03 ;電池低時,禁止按鍵喚醒,只可以充電喚醒
- movwf pt1con
- movlw 0x08
- movwf pt1con1 ;使能PT3.1狀態改變時喚醒睡眠
- bsf e0ie
- bsf e1ie ;使能外部中斷1
- clrf intf
- sleep
- nop
- nop
- nop
- bcf e0ie
- bcf e1ie
- clrf pt1con ;關閉PT1.3/PT3.0口中斷喚醒功能
- clrf pt1con1 ;關閉PT3.1口中斷喚醒功能
- bsf wdten
- bcf fBatLow
- movlw 00110000b ;ADC輸入信號獲取時間:2個ADC時鐘,采樣時間:CPUCLK
- movwf sradcon0
- movlw 00000000b ;參考電壓:VDD
- movwf sradcon1
- clrf sradl
- clrf sradh
- clrf sroftl
- clrf srofth
- bsf sraden ;使能ADC
- call fnInitSamp
- bsf pwr_o
- lbEnterSleepExit:
- return
- lbBatLowAlarm:
- clrf var1
- clrf var2
- bcf led1_o
- bcf led2_o
- bcf led3_o
- bcf led4_o
- lbAlarmFlash:
- clrwdt
- btfss fBase2ms
- goto $-2
- bcf fBase2ms
- incf var1,F
- movfw var1
- sublw 49 ;50*2ms=100ms
- btfsc c
- goto lbAlarmFlash
- clrf var1
- movlw 0x80 ;led1_o
- xorwf pt1,F
- incf var2,F
- movfw var2
- sublw 9
- btfsc c
- goto lbAlarmFlash
- goto lbGotoSleepNow
-
- ;******************************************************************************
- ;【說明】: 充電電量檢測
- ;【輸入】: 無
- ;【輸出】: 無
- ;******************************************************************************
- fnChgVolDet:
- movlw high(tblChgVolLevel)
- movwf eadrh
- movfw volume
- addlw low(tblChgVolLevel)
- movwf eadrl
- btfsc c
- incf eadrh,F
- movp
- subwf totVolL,W
- movfw edath
- subwfc totVolH,W
- btfss c
- clrf cVolOffset
-
- incfsz cVolOffset,F
- goto lbChgVolDetExit
- movfw volume
- xorlw BAT_VOLUME_100
- btfss z
- incf volume,F
- lbChgVolDetExit:
- return
-
- ;******************************************************************************
- ;【說明】: 放電電量檢測
- ;【輸入】: 無
- ;【輸出】: 無
- ;******************************************************************************
- fnDisVolDet:
- btfsc fRunOn
- goto lbChkBatteryLow
-
- movlw high(tblDisVolLevel)
- movwf eadrh
- movfw volume
- addlw low(tblDisVolLevel)
- movwf eadrl
- btfsc c
- incf eadrh,F
- movp
- subwf totVolL,W
- movfw edath
- subwfc totVolH,W
- btfsc c
- clrf cVolOffset
-
- incfsz cVolOffset,F
- goto lbDisVolDetExit
- movfw volume
- xorlw 0
- btfss z
- decf volume,F
- movfw volume
- xorlw 0
- btfsc z
- bsf fBatLow
- lbDisVolDetExit:
- return
- lbChkBatteryLow:
- movlw low(TOT_VOL_5500MV)
- subwf totVolL,W
- movlw high(TOT_VOL_5500MV)
- subwfc totVolH,W
- btfsc c
- clrf cVolOffset
-
- incfsz cVolOffset,F
- goto lbDisVolDetExit
- bsf fBatLow
- clrf volume
- call lbChangeToOff ;電池低電,關機報警
- goto lbDisVolDetExit
- ;==================================
- fnSelectMotorCurrent:
- movlw 0x82 ;內部1.4V
- movwf sradcon1
- movlw CH_MOTOR_CUR
- movwf sradcon2
- movlw 00100000b
- movwf pt3con ;pt3.5為AD口
- return
- fnSelectBatVoltage1:
- movlw 0x80
- movwf sradcon1
- movlw CH_BAT_VOL1
- movwf sradcon2
- movlw 00010000b
- movwf pt3con ;pt3.4為AD口
- return
- fnSelectBatVoltage2:
- movlw 0x80
- movwf sradcon1
- movlw CH_BAT_VOL2
- movwf sradcon2
- movlw 01000000b
- movwf pt3con ;pt3.6為AD口
- return
- fnSelectUSBDc:
- movlw 0x80
- movwf sradcon1
- movlw CH_USB_DC
- movwf sradcon2
- movlw 00000001b
- movwf pt3con ;pt3.0為AD口
- return
- ;******************************************************************************
- ;【說明】: 馬達控制
- ;【輸入】: 無
- ;【輸出】: 無
- ;******************************************************************************
- fnMotorCtrl:
- btfss fRunOn
- goto lbMotorCtrlExit
- ; 1、馬達啟動時,在剛啟動300ms之內尋找最大值,300ms之后比較電流值和最大值,如果電流值比最大值小10MV以上,認為
- ; 馬達工作正常,否則認為堵轉;
- ; 2、在馬達正常工作中,尋找最大值,如果最大值比正常值大于10MV以上時,認為發生堵轉。
- movlw low(EMPTY_MIN_CUR)
- movwf var2
- movlw high(EMPTY_MIN_CUR)
- movwf var1
- btfss fEmptyMotor
- goto $+5
- movlw low(EMPTY_MAX_CUR)
- movwf var2
- movlw high(EMPTY_MAX_CUR)
- movwf var1
-
- movfw var2
- subwf motorCurL,W
- movfw var1
- subwfc motorCurH,W
- btfss c
- incf cEmptyMotor,F
-
- incf cMotorPeriod,F
- movfw cMotorPeriod
- sublw 99 ;100*2ms=200ms
- btfsc c
- goto lbChkBlockCur
-
- clrf cMotorPeriod
- movfw cEmptyMotor
- sublw 70 ;100*70%=70
- btfss c
- bsf fEmptyMotor ;>70%時,認為空載
-
- movfw cEmptyMotor
- sublw 30 ;100*30%=30
- btfsc c
- bcf fEmptyMotor ;<30%時,認為正常負載
-
- clrf cEmptyMotor
- btfss fEmptyMotor
- clrf tMotorDly ;沒有空載時,清計數器
- lbChkBlockCur:
- btfsc fEmptyMotor
- goto lbMotorRunDly ;空載延時控制
- btfss fEnWaitDly
- goto lbNormalRunChk
- ;馬達啟動時,堵轉監測
- movfw motorCurL
- subwf motorMaxCurL,W
- movfw motorCurH
- subwfc motorMaxCurH,W
- btfsc c
- goto $+5
- movfw motorCurH
- movwf motorMaxCurH
- movfw motorCurL
- movwf motorMaxCurL
-
- incfsz tWaitDly,F ;256*2ms=512ms
- goto lbMotorRunDly
-
- bcf fEnWaitDly
- movlw 2;5;10;40;87 ;13mV
- addwf motorCurL,F
- movlw 0
- addwfc motorCurH,F
- movfw motorCurL
- subwf motorMaxCurL,W
- movfw motorCurH
- subwfc motorMaxCurH,W
- btfss c
- goto lbMotorCurTooBig ;最大值-當前值 < 13mV時,認為堵轉
- movlw 0xff
- movwf motorMinCurH
- movwf motorMinCurL
- goto lbMotorRunDly
- lbMotorCurRisingHigh:
- bsf fEnWaitDly
- clrf tWaitDly
- movfw motorCurH
- movwf motorMaxCurH
- movfw motorCurL
- movwf motorMaxCurL
- goto lbMotorRunDly
-
- lbNormalRunChk: ;正常運轉時,堵轉監測
- movfw motorCurL
- subwf motorMinCurL,W
- movfw motorCurH
- subwfc motorMinCurH,W
- btfss c
- goto $+5
- movfw motorCurH
- movwf motorMinCurH
- movfw motorCurL
- movwf motorMinCurL
- movlw 160 ;55mV
- addwf motorMinCurL,F
- movlw 0
- addwfc motorMinCurH,F
- movfw motorCurL
- subwf motorMinCurL,W
- movfw motorCurH
- subwfc motorMinCurH,W
- btfss c
- goto lbMotorCurRisingHigh ;lbMotorCurTooBig ;當前值-最小值 > 55mV以上時,認為堵轉
- movlw 160
- subwf motorMinCurL,F
- movlw 0
- subwfc motorMinCurH,F
-
- movlw low(BLOCK_CURRENT)
- subwf motorCurL,W
- movlw high(BLOCK_CURRENT)
- subwfc motorCurH,W
- btfsc c
- goto lbMotorCurTooBig ;當前值太大,認為堵轉
- lbMotorRunDly:
- incf tRunMSec,F
- movfw tRunMSec
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbMotorCtrlExit
-
- clrf tRunMSec
- incf tMotorDly,F
- movfw tMotorDly
- sublw 10 ;10*0.5s=5s
- btfss c
- goto lbCloseMotor
- incf tRunSec,F
- movfw tRunSec
- sublw 59 ;60*0.5s=30s
- btfsc c
- goto lbMotorCtrlExit
- ;開啟一分鐘延時,如果一分鐘之內再次開啟,則累加次數,
- ;連續工作5次后,需等待10分鐘才能重新啟動
- bsf fWorkedDly
- clrf tWorkedDlySec
- clrf tWorkedDlyMsec
-
- incf cNormalWork,F
- movfw cNormalWork
- sublw 4 ;5次
- btfsc c
- goto lbCloseMotor
- bsf fNeedCoolDown
- clrf tCoolMin
- clrf tCoolSec
- clrf tCoolMsec
- lbCloseMotor:
- call lbChangeToOff
- lbMotorCtrlExit:
- return
- lbMotorCurTooBig:
- call lbChangeToOff
- bsf fEnAlarmDly
- clrf tAlarmDly ;三秒內不能按鍵
- clrf tWaitDly
- bsf fBuzOn
- movlw 5
- movwf cBuzTime ;響三次
- clrf tBuzTime
- goto lbMotorCtrlExit
- ;********************************************************************
- fnOverLoadCtrl:
- btfss fEnAlarmDly
- goto lbOverLoadCtrlExit
-
- movfw cBuzTime
- xorlw 0
- btfsc z
- goto lbOverLoadDlyCnt
-
- incf tBuzTime,F
- movfw tBuzTime
- sublw 61 ;62*2ms=124ms
- btfsc c
- goto lbOverLoadDlyCnt
-
- clrf tBuzTime
- movlw 1 ;fBuzOn
- xorwf buzFlag,F
- btfss fBuzOn
- bcf buz_o ;暫停期間,輸出低電平
- decfsz cBuzTime,F
- goto lbOverLoadDlyCnt
- bcf fBuzOn
- bcf buz_o
- lbOverLoadDlyCnt:
- incf tWaitDly,F
- movfw tWaitDly
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbOverLoadCtrlExit
-
- clrf tWaitDly
- incf tAlarmDly,F
- movfw tAlarmDly
- sublw 5 ;6*0.5s=3s
- btfsc c
- goto lbOverLoadCtrlExit
- bcf fEnAlarmDly
- lbOverLoadCtrlExit:
- return
- ;********************************************************************
- fnWaitCoolDown:
- btfss fWorkedDly
- goto lbChkCoolDownDly
-
- incf tWorkedDlyMsec,F
- movfw tWorkedDlyMsec
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbChkCoolDownDly
-
- clrf tWorkedDlyMsec
- incf tWorkedDlySec,F
- movfw tWorkedDlySec
- sublw 119 ;120*0.5s=60s
- btfsc c
- goto lbChkCoolDownDly
-
- clrf tWorkedDlySec
- bcf fWorkedDly ;滿1分鐘,重新累加次數
- clrf cNormalWork ;清除累加次數
- lbChkCoolDownDly:
- btfss fNeedCoolDown
- goto lbWaitCoolDownExit
-
- incf tCoolMsec,F
- movfw tCoolMsec
- sublw 249 ;250*2ms=500ms
- btfsc c
- goto lbWaitCoolDownExit
-
- clrf tCoolMsec
- incf tCoolSec,F
- movfw tCoolSec
- sublw 119 ;120*0.5s=60s
- btfsc c
- goto lbWaitCoolDownExit
-
- clrf tCoolSec
- incf tCoolMin,F
- movfw tCoolMin
- sublw 9 ;10*1min=10min
- btfsc c
- goto lbWaitCoolDownExit
- bcf fNeedCoolDown
- clrf cNormalWork
- lbWaitCoolDownExit:
- return
- ;********************************************************************
- ;【說明】: 初始化
- ;********************************************************************
- ;程序開始
- fnAllDefaultSet:
- ;====================================================================
- ;MCK寄存器說明:建議按位操作,默認值為1010uuu0
- ;bit7:CST: 1=外部晶振關閉
- ; 0=外部晶振打開
- ;bit6:CST_IN: 1=內部晶振關閉
- ; 0=內部晶振打開
- ;bit5:CST_WDT: 1=內部WDT晶振關閉
- ; 0=內部WDT晶振打開
- ;bit4:EO_SLP : 1=如果選擇的是外部低速晶振,在sleep模式下不關閉外部晶振、
- ; 0=sleep模式下關閉外部晶振
- ;bit0:CLK_SEL: 1=外部晶振系統時鐘
- ; 0=內部晶振系統時鐘
- ;====================================================================
- bcf cst_in
- bsf cst
- bcf cst_wdt
- bcf eo_slp
- bcf clksel
-
- ;====================================================================
- ;INTF中斷標志寄存器,硬件置位,軟件清零
- ;bit7: 未定義
- ;bit6: TM2IF 1=12-Bit定時/計數器2發生定時中斷
- ; 0=12-Bit定時/計數器2未發生定時中斷
- ;bit5: 未定義
- ;bit4: TM0IF 1=8-Bit定時器0發生定時中斷
- ; 0=8-Bit定時器0未發生定時中斷
- ;bit3: SRADIF 1=AD發生中斷
- ; 0=AD未發生中斷
- ;bit2: 未定義
- ;bit1: E1IF 1=外部中斷1發生中斷
- ; 0=外部中斷1未發生中斷
- ;bit0: E0IF 1=外部中斷0發生中斷
- ; 0=外部中斷0未發生中斷
- ;====================================================================
- clrf intf ;清除中斷標志
- ;====================================================================
- ;INTF2中斷標志寄存器,硬件置位,軟件清零
- ;bit7: 未定義
- ;bit6: 未定義
- ;bit5: TM4IF 1=12-Bit定時/計數器4發生定時中斷
- ; 0=12-Bit定時/計數器4未發生定時中斷
- ;bit4: TM3IF 1=12-Bit定時/計數器3發生定時中斷
- ; 0=12-Bit定時/計數器3未發生定時中斷
- ;====================================================================
- clrf intf2
-
- ;====================================================================
- ;INTF3中斷標志寄存器,硬件置位,軟件清零
- ;bit7: CMPIF 1=比較器發生中斷
- ; 0=比較器未發生中斷
- ;bit6~bit2: 未定義
- ;bit1: URTIF 1=串口通訊發生發送中斷
- ; 0=串口通訊未發生發送中斷
- ;bit0: URRIF 1=串口通訊發生接收中斷
- ; 0=串口通訊未發生接收中斷
- ;====================================================================
- clrf intf3
- ;====================================================================
- ;INTE中斷使能寄存器:
- ;bit7: GIE 1=使能所有非屏蔽中斷
- ; 0=不使能所有中斷
- ;bit6: TM2IE 1=使能12-Bit定時/計數器2中斷
- ; 0=禁能12-Bit定時/計數器2中斷
- ;bit5: 未定義
- ;bit4: TM0IE 1=使能8-Bit定時器0中斷
- ; 0=禁能8-Bit定時器0中斷
- ;bit3: SRADIE 1=使能AD中斷
- ; 0=禁能AD中斷
- ;bit2: 未定義
- ;bit1: E1IE 1=使能外部中斷1
- ; 0=禁能外部中斷1
- ;bit0: E0IE 1=使能外部中斷0
- ; 0=禁能外部中斷0
- ;====================================================================
- clrf inte
- ;====================================================================
- ;INTE2中斷使能寄存器:
- ;bit7: 未定義
- ;bit6: 未定義
- ;bit5: TM4IE 1=使能12-Bit定時/計數器4中斷
- ; 0=禁能12-Bit定時/計數器4中斷
- ;bit4: TM3IE 1=使能12-Bit定時/計數器3中斷
- ; 0=禁能12-Bit定時/計數器3中斷
- ;bit3~bit0: 未定義
- ;====================================================================
- clrf inte2
- ;====================================================================
- ;INTE3中斷使能寄存器:
- ;bit7: CMPIE 1=使能比較器中斷
- ; 0=禁能比較器中斷
- ;bit6~bit2: 未定義
- ;bit1: URTIE 1=使能UART的發送中斷
- ; 0=禁能UART的發送中斷
- ;bit0: URRIE 1=使能UART的接收中斷
- ; 0=禁能UART的接收中斷
- ;====================================================================
- clrf inte3
- ;====================================================================
- ;PT1CON:外部中斷1、0中斷觸發沿設定
- ;bit7: PT11OD 1=使能PT1.1漏極開路
- ; 0=禁能PT1.1漏極開路
- ;bit6: PT1W3 1=使能PT1.5外部中斷1
- ; 0=禁能PT1.5外部中斷1
- ;bit5: PT1W2 1=使能PT1.4外部中斷1
- ; 0=禁能PT1.4外部中斷1
- ;bit4: PT1W1 1=使能PT1.3外部中斷1
- ; 0=禁能PT1.3外部中斷1
- ;bit3: PT1W0 1=使能PT1.1外部中斷1
- ; 0=禁能PT1.1外部中斷1
- ;bit2: E1M 1=外部中斷1為下降沿觸發
- ; 0=外部中斷1為狀態改變時觸發
- ;bit1~0:E0M 11=外部中斷0為狀態改變時觸發
- ; 10=外部中斷0為狀態改變時觸發
- ; 01=外部中斷0為上升沿觸發
- ; 00=外部中斷0為下降沿觸發
- ;====================================================================
- ;本例程沒有使用該功能,若用戶使用,請自行添加
- ;====================================================================
- ;PT1CON1:外部中斷1設定
- ;bit7~bit4: 未定義
- ;bit3: PT1W23 1=使能PT3.1外部中斷1
- ; 0=禁能PT3.1外部中斷1
- ;bit2: PT1W22 1=使能PT1.7外部中斷1
- ; 0=禁能PT1.7外部中斷1
- ;bit1: PT1W21 1=使能PT1.6外部中斷1
- ; 0=禁能PT1.6外部中斷1
- ;bit0: PT1W20 1=使能PT1.2外部中斷1
- ; 0=禁能PT1.2外部中斷1
- ;====================================================================
- ;本例程沒有使用該功能,若用戶使用,請自行添加
- ;====================================================================
- ;-----------SRADCON0-----------:
- ;bit7/bit6: 未定義
- ;bit5/bit4: SRADACKS[1:0]ADC輸入信號獲取時間
- ; 00=16個ADC時鐘 01=8個ADC時鐘 10=4個ADC時鐘 11=2個ADC時鐘
- ;bit3/bit2: 未定義
- ;bit1/bit0: SRADCKS[1:0]ADC時鐘
- ; 00=CPUCLK 01=CPUCLK/2 10=CPUCLK/4 11=CPUCLK/8
- ;-----------SRADCON1-----------:
- ;bit7: SRADEN :ADC使能位 1=使能 0=禁止
- ;bit6: SRADS :ADC啟動位/狀態控制位 1=開始,轉換過程中 0=停止,轉換結束
- ;bit5: OFTEN :轉換結果選擇控制位 1=存放在SROFT寄存器 0=存放在SRAD寄存器
- ;bit4: CALIF :矯正控制位(OFTEN為0時有效) 1=使能矯正 0=禁止矯正
- ;bit3: ENOV :使能比較器溢出模式(CALIF為1時有效) 1=使能 0=禁止
- ;bit2: OFFEX :OFFSET交換 1=比較器兩端信號交換 0=不交換(正端為信號,負端為參考電壓)
- ;bit1/bit0:VREFS[1:0]ADC參考電源選擇,不同參考電源切換,建議延遲10us再做AD轉換
- ; 00=VDD
- ; 01=PT3.0外部參考電源輸入
- ; 10=內部參考電壓
- ; 11=內部參考電壓,PT3.0可外接電容做為內置參考電壓濾波使用,以提高精度
- ;-----------SRADCON2-----------:
- ;bit7~bit4: CHS[3:0]ADC輸入通道選擇位
- ; 0000=AIN0 0001=AIN1 0010=AIN2 0011=AIN3
- ; 0100=AIN4 0101=AIN5 0110=AIN6 0111=AIN7
- ; 1000=AIN8 1001=內部1/8VDD 1010=內部參考電壓
- ;bit3/bit2: 未定義
- ;bit1/bit0: REF_SEL[1:0] VREFS[1:0]配置為10或11,則可通過REF_SEL[1:0]選擇如下
- ; 參考電壓,若VREFS[1:0]不是配置為10或11,以下位無效
- ; 00=1.4V 01=2.0V 10=3.0V 11=4.0V
- ;-----------SRADH/SRADL--------:
- ;SRADH: SRAD[11:8]ADC數據高4位,只可讀
- ;SRADL: SRAD[7:0]ADC數據低8位,只可讀
- ;-----------SROFTH/SROFTL------:
- ;SROFTH:SROFT[11:8]矯正值數據的高4位
- ;SROFTL:SROFT[7:0]矯正值數據的低8位
- ;-----------METCH--------------:
- ;bit5: REFOEN: 內部參考電壓從PT3.0輸出使能位,輸出REF_SEL[1:0]選擇的內部參考電壓
- ; 0=禁止內部參考電壓輸出
- ; 1=使能內部參考電壓輸出
- ;bit4: REFIN: 外部參考電壓輸入端口選擇
- ; 0=選擇PT3.0作為參考電壓輸入
- ; 1=選擇PT3.2作為參考電壓輸入
- ;bit3: METCH[3]:0=禁止ERC時鐘輸出
- ; 1=使能ERC時鐘通過PT1.5口輸出
- ;bit2: METCH[2]:0=使能寄存器TRIM_EX的值來微調ERC頻率
- ; 1=禁止ERC頻率微調控制
- ;bit0: P13OD: PT1.3開漏輸出使能
- ; 0=做為輸入口 1=開漏輸出
- ;====================================================================
- movlw 00110000b ;ADC輸入信號獲取時間:2個ADC時鐘,采樣時間:CPUCLK
- movwf sradcon0
- movlw 00000000b ;參考電壓:VDD
- movwf sradcon1
- movlw 01000000b ;AIN4
- movwf sradcon2
- clrf sradl
- clrf sradh
- clrf sroftl
- clrf srofth
- bsf sraden ;使能ADC
- ;====================================================================
- ;SYSCFG0:輸入邏輯電平電壓配置
- ;bit7:VTHSEL --------------------------------------------------
- ; | |符號| 參數 |最小值 |典型值|最大值 |單位|
- ; |--+----+--------------+-------+------+-------+----|
- ; | | |數字輸入高電平|0.75Vdd| | | V |
- ; | |VIH1|--------------+-------+------+-------+----|
- ; | | |復位輸入高電平|0.8Vdd | | | V |
- ; | 0|----+--------------+-------+------+-------+----|
- ; | | |數字輸入低電平| | |0.3Vdd | V |
- ; | |VIL1|--------------+-------+------+-------+----|
- ; | | |復位輸入低電平| | |0.2Vdd | V |
- ; |--+----+--------------+-------+------+-------+----|
- ; | | |數字輸入高電平|0.5Vdd | | | V |
- ; | |VIH2|--------------+-------+------+-------+----|
- ; | | |復位輸入高電平|0.5Vdd | | | V |
- ; | 1|-------------------+-------+------+-------+----|
- ; | | |數字輸入低電平| | |0.2Vdd | V |
- ; | |VIL2|--------------+-------+------+-------+----|
- ; | | |復位輸入低電平| | |0.1Vdd | V |
- ; --------------------------------------------------
- ;bit5~4:VTHP30-----------------------------------------------
- ; | |符號| 參數 |最小值 |典型值 |最大值 |單位|
- ; |--+----+----------+-------+-------+-------+----|
- ; | |VIH1|輸入高電平|0.75Vdd| | | V |
- ; |00|----+----------+-------+-------+-------+----|
- ; | |VIL1|輸入低電平| | |0.3Vdd | V |
- ; |--+----+----------+-------+-------+-------+----|
- ; | |VIH |輸入高電平| | 0.7 | | V |
- ; |01|----+----------+-------+-------+-------+----|
- ; PT3.0 | |VIL |輸入低電平| | 0.7 | | V |
- ; |--+----+----------+-------+-------+-------+----|
- ; | |VIH |輸入高電平| |Vdd-0.7| | V |
- ; |10|----+----------+-------+-------+-------+----|
- ; | |VIL |輸入低電平| |Vdd-0.7| | V |
- ; |--+----+----------+-------+-------+-------+----|
- ; | |VIH2|輸入高電平|0.5Vdd | | | V |
- ; |11|----+----------+-------+-------+-------+----|
- ; | |VIL2|輸入低電平| | |0.2Vdd | V |
- ; -----------------------------------------------
- ;bit3:P30REFEN 0=關閉內部基準
- ; 1=打開內部基準
- ;====================================================================
- ;====================================================================
- ;定時器0配置,相關寄存器為:INTF/INTE/TM0CON/TM0IN/TM0CNT
- ;TM0CON:
- ;bit7(T0EN):0=禁止定時器0; 1=使能定時器0
- ;bit6~4(T0RATE2:0):定時器0時鐘分頻選擇
- ; 000=CKT0 001=CKT0/2 010=CKT0/4 011=CKT0/8
- ; 100=CKT0/16 101=CKT0/32 110=CKT0/64 111=CKT0/128
- ;bit3:未定義
- ;bit2:(T0RSTB):定時器0復位 0=使能定時器0復位 1=禁止定時器0復位
- ;bit1~0(T0SEL[1:0]):時鐘源選擇 00=CPUCLK
- ; 01=MCK
- ; 10=外部32768Hz晶振時鐘
- ; 11=內部32768 WDT時鐘
- ;TM0IN:定時器0溢出值
- ;TM0CNT:定時器0計數寄存器
- ;====================================================================
- ifdef _DEBUG_
- ;{
- movlw 0x20
- movwf tm0con
- movlw 103 ;9600bps
- movwf tm0in
- ;}
- else
- ;{
- movlw SYS_BAS_CLK
- movwf tm0con
- movlw SYS_BAS_CNT
- movwf tm0in
- ;}
- endif
- bcf t0rstb
- bsf t0en
- bsf tm0ie
- ;====================================================================
- ;定時/計數器2配置,相關寄存器為:INTF/INTE/TM2CON/TM2IN/TM2CNT/TM2R
- ;/TM2INH/TM2CNTH/TM2RH/TMCON/TMCON2
- ;TM2CON:
- ;;bit7(T2EN):0=禁止定時器2; 1=使能定時器2
- ;bit6~4(T2RATE2:0):定時器2時鐘分頻選擇
- ; 000=CKT2 001=CKT2/2 010=CKT2/4 011=CKT2/8
- ; 100=CKT2/16 101=CKT2/32 110=CKT2/64 111=CKT2/128
- ;bit3:T2CKS
- ; 1=PT3.0做為時鐘源 0=CKT2的分頻時鐘做為時鐘源
- ;bit2:(T2RSTB):定時器2復位 0=使能定時器2復位 1=禁止定時器2復位
- ;bit1:T2OUT PT1.4口輸出控制 PWM2PO PWM2OUT T2OUT
- ;bit0:PWM2OUT 0 0 0 IO輸出
- ; 0 0 1 蜂鳴器輸出
- ; 0 1 0 PWM2輸出
- ; 0 1 1 PWM2輸出
- ; 1 x x IO輸出
- ;TM2IN: 定時器2溢出值
- ;TM2CNT:定時器2計數寄存器
- ;TM2R: 定時/計數器2的PWM高電平占空比控制寄存器
- ;TM2INH:定時/計數器2溢出值高4位
- ;TM2CNTH:定時/計數器2計數寄存器高4位
- ;TM2RH :定時/計數器2的PWM高電平占空比控制寄存器高4位
- ;====================================================================
- bcf t2sel1 ;MCK做為時鐘源
- bsf t2sel0 ;
- movlw 0x00 ;1:1,關閉PWM2輸出
- movwf tm2con
- movlw 127
- movwf tm2in ;125kHZ
- clrf tm2inh
- clrf tm2r
- clrf tm2rh
- bcf t2rstb
- bcf pwm2po ;使能PT1.4口做為TM2的輸出
- bsf t2en
- ;====================================================================
- ;定時/計數器3配置,相關寄存器為:INTF2/INTE2/TM3CON/TM3IN/TM3CNT/TM3R
- ;/TM3INH/TM3CNTH/TM3RH/TMCON/TM3CON2/TMCON2
- ;TM3CON:
- ;;bit7(T3EN):0=禁止定時器3; 1=使能定時器3
- ;bit6~4(T3RATE2:0):定時器3時鐘分頻選擇
- ; 000=CKT3 001=CKT3/2 010=CKT3/4 011=CKT3/8
- ; 100=CKT3/16 101=CKT3/32 110=CKT3/64 111=CKT3/128
- ;bit3:T3CKS
- ; 1=PT3.1做為時鐘源 0=CKT3的分頻時鐘做為時鐘源
- ;bit2:(T3RSTB):定時器3復位 0=使能定時器3復位 1=禁止定時器3復位
- ;bit1:T3OUT PT1.5口輸出控制 PWM3PO PWM3OUT T3OUT
- ;bit0:PWM3OUT 0 0 0 IO輸出
- ; 0 0 1 蜂鳴器輸出
- ; 0 1 0 PWM3輸出
- ; 0 1 1 PWM3輸出
- ; 1 x x IO輸出
- ;TM3IN: 定時器3溢出值
- ;TM3CNT:定時器3計數寄存器
- ;TM3R: 定時/計數器3的PWM高電平占空比控制寄存器
- ;TM3INH:定時/計數器3溢出值高4位
- ;TM3CNTH:定時/計數器3計數寄存器高4位
- ;TM3RH :定時/計數器3的PWM高電平占空比控制寄存器高4位
- ;====================================================================
- ;====================================================================
- ;定時/計數器4配置,相關寄存器為:INTF2/INTE/TM4CON/TM4IN/TM4CNT/TM4R
- ;/TM4INH/TM4CNTH/TM4RH/TMCON/TMCON2
- ;TM4CON:
- ;;bit7(T4EN):0=禁止定時器4; 1=使能定時器4
- ;bit6~4(T4RATE2:0):定時器4時鐘分頻選擇
- ; 000=CKT4 001=CKT4/2 010=CKT4/4 011=CKT4/8
- ; 100=CKT4/16 101=CKT4/32 110=CKT4/64 111=CKT4/128
- ;bit3:T4CKS
- ; 1=PT1.4做為時鐘源 0=CKT4的分頻時鐘做為時鐘源
- ;bit2:(T4RSTB):定時器4復位 0=使能定時器4復位 1=禁止定時器4復位
- ;bit1:T4OUT PT1.6口輸出控制 PWM4PO PWM4OUT T4OUT
- ;bit0:PWM4OUT 0 0 0 IO輸出
- ; 0 0 1 蜂鳴器輸出
- ; 0 1 0 PWM4輸出
- ; 0 1 1 PWM4輸出
- ; 1 x x IO輸出
- ;TM4IN: 定時器4溢出值
- ;TM4CNT:定時器4計數寄存器
- ;TM4R: 定時/計數器4的PWM高電平占空比控制寄存器
- ;TM4INH:定時/計數器4溢出值高4位
- ;TM4CNTH:定時/計數器4計數寄存器高4位
- ;TM4RH :定時/計數器4的PWM高電平占空比控制寄存器高4位
- ;====================================================================
-
- ;====================================================================
- bsf tm0ie
- bsf gie
-
- btfsc to
- goto lbAllDefaultSetEnd ;看門狗復位時不初始化RAM
- lbClrRam:
- ;--------清除RAM----------
- movlw 0x80
- movwf fsr0
- lbClrRamLoop:
- clrf ind0
- incfsz fsr0,F
- goto lbClrRamLoop
-
- bsf fRstRun
- call fnInitSamp
- lbPwrRstWait:
- btfss fBat2ms
- goto $-1
- bcf fBat2ms
- incf var1,F
- movfw var1
- sublw 49 ;50*2ms=100ms
- btfsc c
- goto lbPwrRstWait
- clrf var1
-
- ;====================================================================
- ;IO口初始化部分(x代表1/3)
- ;PTx............IO口寄存器
- ;
- ;PTxEN..........輸入/輸出控制寄存器:0=輸入,1=輸出
- ;
- ;PTxPU..........上拉電阻控制寄存器: 0=禁能,1=使能
- ;
- ;PT1CON[7...0]..見上描述
- ;
- ;PT3CON[7...0]..模擬/數字口使能控制:0=數字口 1=模擬口
- ;
- ;PT3OD[6.5].....PT3.6/PT3.5開漏設定:0=禁止開漏輸出,1=使能開漏輸出
- ;
- ;PT5[2...0]
- ;
- ;PT5EN[2...0]
- ;
- ;PT5PU[2...0]
- ;
- ;PT5CON[2...0]:bit2: 0=PT5.1禁止開漏輸出,1=使能PT5.1開漏輸出
- ; bit1: 0=PT5.0禁止開漏輸出,1=使能PT5.1開漏輸出
- ; bit0: 0=PT5.0為數字口,1=PT5.0為模擬口
- ;
- ;EX0CFG.........PT3.0口輸入控制
- ;bit7~bit6......PWMRL[1:0]:外部中斷0觸發模式 00=外部中斷0不受PWM2/PWM3/PWM4影響
- ; 01=外部中斷0只受PWM2影響,只有在PWM2輸出特定極性時有效
- ; 10=外部中斷0只受PWM3影響,只有在PWM3輸出特定極性時有效
- ; 11=外部中斷0只受PWM4影響,只有在PWM4輸出特定極性時有效
- ;bit5...........POLSEL:外部中斷0觸發極性選擇,只在PWMRL[1:0]不為00時有效
- ; 0=PWM輸出為高時外部中斷0有效,PWM輸出為低時,外部中斷0被屏蔽
- ; 1=PWM輸出為低時外部中斷0有效,PWM輸出為高時,外部中斷0被屏蔽
- ;bit1~bit0......EX0FILT[1:0]:外部中斷0濾波時間選擇 00=濾波時間為0us
- ; 01=濾波時間為5us
- ; 10=濾波時間為10us
- ; 11=濾波時間為15us
- ;
- ;CURCON:端口輸出電流選擇寄存器
- ; bit7: P36CUR 0=PT3.6輸出電流Ioh/Iol為20mA/20mA@5V
- ; 1=PT3.6輸出電流Ioh/Iol為54mA/57mA@5V
- ; bit6: P35CUR 0=PT3.5輸出電流Ioh/Iol為20mA/20mA@5V
- ; 1=PT3.5輸出電流Ioh/Iol為54mA/57mA@5V
- ; bit5~4:P14CUR[1:0] 00=PT1.4輸出電流Ioh/Iol為20mA/20mA@5V...\
- ; 01=PT1.4輸出電流Ioh/Iol為54mA/57mA@5V... |com[0]為0時有效
- ; 1x=PT1.4輸出電流Ioh/Iol為31mA/35mA@5V.../
- ; bit2~1:CURP17[1:0] 00=PT1.7輸出電流Ioh/Iol為20mA/20mA@5V...\
- ; 01=PT1.7輸出電流Ioh/Iol為1.5mA/20mA@5V...|com[3]為0時有效
- ; 1x=PT1.7輸出電流Ioh/Iol為31mA/35mA@5V.../
- ;
- ;SYSCFG1:
- ; bit7: PDP13 0=PT1.3不接下拉電阻
- ; 1=PT1.3接400K下拉電阻
- ; bit6: PDP31 0=PT3.1不接下拉電阻
- ; 1=PT3.1接1K下拉電阻
- ; bit5: PDP34 0=PT3.4不接下拉電阻
- ; 1=PT3.4接10K下拉電阻(默認)
- ; bit4: PDP36 0=PT3.6不接下拉電阻
- ; 1=PT3.6接10K下拉電阻(默認)
- ; bit3~2: CURP16 00=PT1.6輸出電流Ioh/Iol為20mA/20mA@5V...\
- ; 01=PT1.6輸出電流Ioh/Iol為1.3mA/20mA@5V...|com[2]為0時有效
- ; 1x=PT1.6輸出電流Ioh/Iol為31mA/35mA@5V.../
- ; bit1~0: CURP15 00=PT1.5輸出電流Ioh/Iol為20mA/20mA@5V...\
- ; 01=PT1.5輸出電流Ioh/Iol為1.3mA/20mA@5V...|com[1]為0時有效
- ; 10=PT1.5輸出電流Ioh/Iol為2.6mA/20mA@5V...|
- ; 11=PT1.5輸出電流Ioh/Iol為31mA/35mA@5V.../
- ;====================================================================
- clrf curcon ;關閉大電流
- clrf syscfg1 ;關閉內部下拉電阻
-
- movlw 0x00
- movwf pt1
- movlw 00001000b
- movwf pt1pu
- movlw 11110111b
- movwf pt1en ;led1/motor/led2/pwm/key/led4/led3/x
-
- movlw 0x08
- movwf pt3
- clrf pt3pu
- movlw 01110001b
- movwf pt3con
- movlw 10001100b ;x/bat2/cur/bat1/pwr/buz/hall/usb
- movwf pt3en
- lbFirstChkUsb:
- call fnSelectUSBDc
- call fnReadADC
- movlw low(USB_3000MV)
- subwf var2,W
- movlw high(USB_3000MV)
- subwfc var1,W
- btfss c
- goto lbNoUsbPlug
- lbUsbPlugIn:
- clrf var4
- incf var3,F
- movfw var3
- sublw 10
- btfsc c
- goto lbFirstChkUsb
- clrf volume
- goto lbContinueInit
- lbNoUsbPlug:
- clrf var3
- incf var4,F
- movfw var4
- sublw 10
- btfsc c
- goto lbFirstChkUsb
- movlw BAT_VOLUME_100
- movwf volume
- lbContinueInit:
- ;====================================================================
- ;WDTCON
- ;bit7(WDTEN) :0=禁止WDT 1=使能WDT
- ;bit2~0(WDTS) :當WDTIN=0xFF時
- ; :000=2048ms 001=1024ms 010=512ms 011=256ms
- ; :100=128ms 101=64ms 110=32ms 111=16ms
- ;====================================================================
- movlw 0x02
- movwf wdtcon
- movlw 0xff
- movwf wdtin
- bsf wdten
- bcf cst_wdt
- lbAllDefaultSetEnd:
- return
- ;******************************************************************************
- ;【說明】:中斷處理程序,T0做為系統時鐘的定時基準,為2ms
- ;******************************************************************************
- intService:
- push
- btfss tm0ie
-
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
V0.0.111.zip
(54.15 KB, 下載次數: 21)
2018-8-14 16:03 上傳
點擊文件名下載附件
果汁-V05.zip
(1 MB, 下載次數: 20)
2018-8-14 16:02 上傳
點擊文件名下載附件
|