Микроконтроллерный расходомер топлива из Радио №11/2001

В этом форуме обсуждаются статьи напечатанные в журнале "Радио"

Микроконтроллерный расходомер топлива из Радио №11/2001

Сообщение AlexSSX » 23 янв 2015, 13:52

Приветствую всех.
У меня вопрос по поводу Микроконтроллерный расходомер топлива опубликованного в далеком 2001 году в " Радио" №11, автор публикации - А. Долгий, не уверен что он отслеживает что нибудь касаемо этого устройства (хотя очень хотелось бы). Пытаюсь разобраться с программированием PIC , в частности доработать данный расходомер - необходимо изменить "Литры в час" на "Литры в минуту" . Но с программированием сложновато одному разбираться. Вопрос ко всем кто может помочь (и к автору , если вдруг увидит это сообщение) - ниже исходник расходомера. Помогите пожалуйста разобраться с тремя вопросами: 1-й Как изменить время "отсчета" с "Литров в час" на "Литры в минуту"? 2-й вопрос - что за коэффициент (в программе)
Код: Выделить всё
K05   equ   d'500000'/(d'16'*d'256')
? 3-й вопрос - как изменить параметр на который настроен датчик - т.е. в программе задается количество импульсов на 0.1 литра, как сменить что бы было количество импульсов на 1 литр или на 10 литров к примеру?
Заранее спасибо за помощь.
Код: Выделить всё
   #DEFINE   RADIO
   LIST   P=PIC16F628
   NOLIST
   #include <P16F628.inc>
   #include <fuel_cfg.inc>
             

FUE0   equ   d'100'   ;Число импульсов на 0,1 л
K05   equ   d'500000'/(d'16'*d'256')

; Разряды порта B
; Входы
bDRT   equ   0   ;INT
bMODE   equ   6
bBUTN   equ   7
;Выходы
   ifdef   RADIO
bDC0   equ   2
bDC1   equ   4
bDC2   equ   5
bDC3   equ   1
   else
bDC0   equ   1
bDC1   equ   2
bDC2   equ   4
bDC3   equ   5
   endif

bPWM   equ   3   ;PWM

mDRT   equ   1 << bDRT
mPWM   equ   1 << bPWM
mMODE   equ   1 << bMODE
mBUTN   equ   1 << bBUTN
mDC0   equ   1 << bDC0
mDC1   equ   1 << bDC1
mDC2   equ   1 << bDC2
mDC3   equ   1 << bDC3
mDC   equ     mDC0|mDC1|mDC2|mDC3


ANODE   equ   PORTA
; Разряды порта A
   ifdef   RADIO
;Вход
bIGN   equ   5
;Выходы
bAN1   equ   3   ;0,1
bAN2   equ   0   ;1
bAN3   equ   7   ;10
   else
;Вход
bIGN   equ   5
;Выходы
bAN1   equ   0   ;0,1
bAN2   equ   3   ;1
bAN3   equ   7   ;10
   endif

mIGN   equ   1 << bIGN
mAN1   equ   1 << bAN1
mAN2   equ   1 << bAN2
mAN3   equ   1 << bAN3
mAN   equ   mAN1|mAN2|mAN3

; Разряды PSW

b01L   equ   1   ;Израсходовано 0,1 л
b2Hz   equ   2   ;~2 Гц
bSB1   equ   bAN3
bSB2   equ   bAN2
bSB3   equ   bAN1

   
   cblock   H'70'
   DCD
   FigPtr
   FigSel
   W_copy   
   STATUS_copy
   FSR_copy
   PSW
   NL
   NH
   endc

   cblock H'20'
; Израсходовано
   EXP_S,EXP_D,EXP_E,EXP_T
; В баке
   TNK_S,TNK_D,TNK_E,TNK_T
; Часовой расход
   ;LPH_L,LPH_H
   LPH_S,LPH_D,LPH_E,LPH_T   
; Напряжение батареи
   U_OLD,U_NEW
   UBT_S,UBT_D,UBT_E,UBT_T
   T0CTR   ;Счетчик прерываний от таймера
   FUE_L   ;Счетчик импульсов ДРТ
   FUE_H
   FUE0_L   ;Число импульсов на 0,1 л
   FUE0_H
   AN_copy
   TEMP
   endc

   #include <fuel_mac.inc>

;*********************************
   ORG   0
   goto   START
   ORG   4
   movwf   W_copy   ; Сохраняем копии содержимого
   movf   STATUS,w   ; регистров W, STATUS и FSR,
   movwf   STATUS_copy   ; которое в процессе обработки
   movf   FSR,w      ; прерывания может измениться.
   movwf   FSR_copy
   
L   btfss   INTCON,INTF
   goto   T0SERV
   bcf   INTCON,INTF
   decf   FUE_L,F
   btfss   STATUS,Z
   goto   T0SERV
   movf    FUE_H,f       
   btfsc   STATUS,Z
   goto   L1   
   decf   FUE_H,F
        goto   T0SERV
L1    bsf   PSW,b01L
   movf   FUE0_L,W
   movwf   FUE_L
   movf   FUE0_H,W
   movwf   FUE_H
T0SERV   btfss   INTCON,T0IF
   goto   T0END
   movlw   mDC
   movwf   PORTB      ; Гасим все цифры.
   btfss   PORTB,bBUTN
   goto   B1
   movfw   AN_copy
   iorwf   PSW,F
B1   comf   AN_copy,W
   btfsc   PORTB,bBUTN
   goto   B2
   andwf   PSW,F
B2   decf   FigSel,F
   movf   FigSel,W
   BNZ   FG1      
   movlw   3
   movwf   FigSel
FG1   movfw   FigSel
   call   AN
   movwf   AN_copy
   movwf   ANODE
   movfw   FigSel
   addwf   FigPtr,W
   movwf   FSR      
   movfw   INDF
FG3   btfss   STATUS,Z
   goto   FG2
   btfss   AN_copy,bAN2
   xorlw   H'FF'
FG2   call   CDC
   movwf   PORTB   ; Зажигаем цифру

T0END   decfsz   T0CTR,F
        goto   ENDINT
   movlw   K05
   movwf   T0CTR
   bsf   PSW,b2Hz
ENDINT
   movf   FSR_copy,w   ; Восстанавливаем состояние
   movwf   FSR      ; спецрегистров, пользуясь их
   movf   STATUS_copy,w
   movwf   STATUS   ; сохраненными копиями.
   swapf   W_copy,f
   swapf   W_copy,w
   bcf   INTCON,T0IF   ; Сбрасываем флаг запроса
   clrwdt
   retfie         ; прерывания и возвращаемся

; Порядок работы индикаторов
AN   addwf   PCL,F
   nop
   DT   mAN3,mAN2,mAN1   

; Коды, подаваемые на дешифратор
CDC   andlw H'0F'
   addwf   PCL,F
   retlw   0      ;0
   retlw   mDC0      ;1
   retlw   mDC1      ;2
   retlw   mDC0|mDC1   ;3
   retlw   mDC2      ;4
   retlw   mDC2|mDC0   ;5
   retlw   mDC2|mDC1   ;6
   retlw   mDC2|mDC1|mDC0   ;7
   retlw   mDC3      ;8
   retlw   mDC3|mDC0   ;9
   retlw   mDC      ;A
   retlw   mDC      ;B
   retlw   mDC      ;C
   retlw   mDC      ;D
   retlw   mDC      ;E
   retlw   mDC      ;F

INITADR
   andlw   H'07'
   addwf   PCL,F
   DT   FUE0_L,FUE0_H
   DT   TNK_D,TNK_E,TNK_T
   DT   EXP_D,EXP_E,EXP_T

; Главная программа

START
   movlw   5
   movwf   CMCON      ;Один компаратор COM2
   bsf   STATUS,RP0
   bsf   PCON,OSCF   ;4 МГц
   movlw   B'00000011'   ;t0pre 1:16
   movwf   OPTION_REG
   bcf   STATUS,RP0
   movlw   8
   movwf   TEMP
INI1   decf   TEMP
   movfw   TEMP
   call   INITADR
   movwf   FSR
   movfw   TEMP
   call   EEREAD
   movwf   INDF
   movf   TEMP,W
   btfss   STATUS,Z
   goto   INI1
   movfw   FUE0_L
   movwf   FUE_L
   movfw   FUE0_H
   movwf   FUE_H

   clrf   LPH_S
   movlw   8
   movwf   LPH_D
   movwf   LPH_E
   movwf   LPH_T
   SETTRIS   ~mAN,~(mDC|mPWM)
   movlw   K05+1
   movwf   T0CTR
   movlw   3
   movwf   FigSel
   movlw   TNK_S
   movwf   FigPtr
   clrf   PSW
I2   PWMSet
   call   VCONV
   bsf   INTCON,T0IE
   bsf   INTCON,INTE
   bsf   INTCON,GIE

LOOP:   
   btfss   PORTA,bIGN   
   goto   IGN_OFF      ;Если выключено зажигание...
   btfss   PSW,b2Hz
   goto   L01L      ;Если не прошло 0,5 с...
; А это делаем 2 раза в секунду...
   bcf   PSW,b2Hz
   btfsc   CMCON,C2OUT   ;Исправлено ss на sc!
   goto   MORE
   incf   CCPR1L
   goto   VOLT
MORE   decf   CCPR1L
VOLT   call   VCONV
   btfss   PORTB, bMODE
   goto   TANK
; Режим "РАСХОД"      
   btfss   PSW,bSB1
   goto   EX1
   clrf   EXP_D
   clrf   EXP_E
   clrf   EXP_T
EX1   movlw   EXP_S   
   btfsc   PSW,bSB2
   movlw   UBT_S
   btfsc   PSW,bSB3
   movlw   LPH_S
   movwf   FigPtr
   goto   LOOP
;
TANK   
; Режим "ОСТАТОК"
   movlw   TNK_S
   movwf   FigPtr
   btfss   PSW,bSB1
   goto   TN1
   INCR   TNK_D
TN1   btfss   PSW,bSB2
   goto   TN2
   INCR   TNK_E
TN2   btfss   PSW,bSB3
   goto   LOOP
   INCR   TNK_T
;
L01L   btfss   PSW,b01L
   goto LOOP
; Израсходовано 0,1 л
   bcf   PSW,b01L   
   EXP_INC
   TNK_DEC
   goto   LOOP
; Зажигание выключено
IGN_OFF bcf   INTCON,GIE
   clrf   PORTA
   movlw   mDC
   movwf   PORTB
; Сохраняем счетчики
STORE   EEWRITE 2,TNK_D
   EEWRITE   3,TNK_E
   EEWRITE   4,TNK_T
   EEWRITE   5,EXP_D
   EEWRITE   6,EXP_E
   EEWRITE   7,EXP_T
   bsf   STATUS,RP0
   bcf   EECON1,WREN
   bcf   STATUS,RP0   
GO_ON   ;sleep
   btfsc   PORTA,bIGN
   goto START
   goto GO_ON
;
; Подпрограммы
;
VCONV   movfw   U_NEW
   movwf   U_OLD
   movfw   CCPR1L
   movwf   U_NEW
   movwf   NL
   movfw   U_OLD
   addwf   NL,F
   rrf   NL   
   clrf   NH
   movlw   UBT_T
   movwf   FSR
CONVERT
;Перед вызовом FSR=>разряд 0,1
   clrf   INDF   ;1
   decf   FSR
   clrf   INDF   ;10
   decf   FSR
   clrf   INDF   ;100
   decf   FSR
   clrf   INDF   ;1000
CV1000   add16c   NL,NH,-.1000
   incf   INDF
   btfsc   STATUS,C
   goto   CV1000
   add16c   NL,NH,.1000
   decf   INDF
   incf   FSR
CV100   add16c   NL,NH,-.100
   incf   INDF
   btfsc   STATUS,C
   goto   CV100
   add16c   NL,NH,.100
   decf   INDF
   incf   FSR
CV10   add16c   NL,NH,-.10
   incf   INDF
   btfsc   STATUS,C
   goto   CV10
   add16c   NL,NH,.10
   decf   INDF
   incf   FSR
   movf   NL,W
   movwf   INDF
   return
EEREAD   
;Чтение из ячейки EEPROM в регистр W
   bsf   STATUS,RP0
   movwf   EEADR
   bsf   EECON1,RD
   movfw   EEDATA
   bcf   STATUS,RP0
   return
; Исходные данные в EEPROM
   ORG   H'2100'
   DE   Low(FUE0),High(FUE0);
   DE   3,9,9
   DE   0,0,0
   
   end
AlexSSX
 
Сообщения: 1
Зарегистрирован: 23 янв 2015, 13:28

Вернуться в Журнал "РАДИО"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19