Универсальный прибор для автомобиля

Универсальный прибор для автомобиля: Часы, термометр, вольтметр, тахометр.

Данное устройство предназначено для контроля напряжения в бортовой сети с точностью 0.1в, измерения температуры в диапазоне от -50 до +125 градусов, измерения частоты вращения коленчатого вала от 0 до 9990 об/мин с точностью 100 об/мин в первом режиме и 10 об/мин во втором ( четырех цилиндровый двигатель), и имеет часы с питанием от встроеной литиевой батарейки. Предусмотрено изменение яркости индикатора - 10 уровней, режим корректировки часов, звуковая сигнализация при частоте вращения двигателя более 4000 об/мин, и напряжении более 14,9 вольт или менее 12 вольт.

Устройство имеет
- входы питания - от замка зажигания
- измерительный вход напряжения - к аккумулятору
- вход датчика цифрового термометра DS18b20
- вход датчика тахометра - подключается к клеме катушки зажигания , куда подходит провод от электронного коммутатора
- две кнопки управления

Питание осуществляется от бортсети автомобиля.Есть встроенная защита от переполюсовки.

Одной кнопкой осуществляется короткий выбор режимов - часы, термометр, вольтметр, тахометр.

Второй кнопкой осуществляется выбор всех режимов -часы, термометр, вольтметр, тахометр, регулировка яркости, коррекция минут, коррекция часов, тахометр с точностью 10 об/мин. При этом в режимах регулировка яркости, коррекция минут, коррекция часов - первой осуществляются изменения.

При включении зажигания прибор устанвливается в режим отображения времени, звуковая индикая отключена.

Схема


Кварц установить 4 МГц. Если есть проблема с вольтметром, то подключить 5 ногу процессора к +5 вольт.

Исходный текст программы

;**********************************************************************
; *
; Filename: AUTO_CH.asm *
; Date: 27.09.2004 *
; File Version: 1.2 *
; *
; Author: BY GARMASH G.V. *
; Company: *
; *
; *
;**********************************************************************

listp=16f73; list directive to define processor
#include; processor specific variable definitions

__CONFIG _CP_OFF _WDT_OFF _BODEN_ON _PWRTE_ON _HS_OSC



;***** VARIABLE DEFINITIONS * IRQ *****

w_tempEQU0x20; variable used for context saving
w_temp1EQU0xA0; reserve bank1 equivalent of w_temp
status_tempEQU0x21; variable used for context saving
pclath_tempEQU0x22; variable used for context saving

;********* 1 WIRE************

fCOUNTER: EQU 0x23 ; Счетчик только для локального пользования.
fCOUNTER2: EQU0x24 ; Счетчик2.
fBIT_CNT: EQU0x25; Счетчик прочитанных битов.
fBYTE_CNT: EQU0x26 ; Счетчик прочитанных байтов.
fTEMP: EQU0x27 ; Временный регистр только для локального использования.
CRC: EQU0x28 ; Контрольная сумма.
#define _1WIRE PORTA,4 ; Выход на MicroLAN.

;*****************************

FLAGEQU0x29; БИТОВЫЙ РЕГИСТР ФЛАГОВ

#define FLAG_CHANGE_LEVEL FLAG,0 ;
#define FLAG_CHANGE_LEVEL_1 FLAG,1 ;
#define FLAG_BEEP FLAG,2 ;
#define FLAG_3 FLAG,3 ;
#define FLAG_4 FLAG,4 ; FLAG
#define FLAG_5 FLAG,5 ; FLAG
#define FLAG_6 FLAG,6 ; FLAG
#define FLAG_7 FLAG,7 ; FLAG

;***************TEMP***************

TEMPEQU0x2A
TEMP1EQU0x2B
TEMP2EQU0x2C

;********** I2C *************

_i2c_byteEQU0x2D
_tmpEQU0x2E
EE_DATAEQU0x2F
EE_ADDREQU0x30

; ***********
#define SCL PORTA,2 ; I2C SCL PIN
#define SDA PORTA,5 ; I2C SDA PIN

#define TRIS_SCL TRISA^80,2 ; I2C SCL PIN
#define TRIS_SDA TRISA^80,5 ; I2C SDA PIN

;******** ЧАСЫ I2C *************
;БИТЫ | 8| 4| 2| 1| 8| 4| 2| 1|
SECONDSEQU 0x31;Секунды |CH| 10 SEC | SECOND | 00-59
MINUTESEQU 0x32;Минуты | 0| 10 MIN | MINUTS | 00-59
HOURSEQU 0x33;Часы |12/24| -|10hr | HOUR | 00-23/1-12 ;BIT8 = 0-24 HOUR
DAYEQU 0x34;День недели | 0| 0| 0| 0| 0 | DAY | 1-7
DATEEQU 0x35;День месяца| 0| 0|10DAT| DATE | 1-31
MONTHEQU 0x36;МЕСЯЦ | 0| 0| 0|10| MONTH | 1-12
YEAREQU 0x37;ГОД | 10 YEAR | YEAR | 00-99
;|OUT|0|0|SQWE|0|0|RS1|RS0|

;*********** BEEP **************

#define BEEP_PINPORTC,0
#define KEY1_PINPORTB,1
#define KEY2_PINPORTB,2
#define IN_N_PINPORTB,0

;*********** DISPLAY ***********
#define SEGMENT_1PORTB,6
#define SEGMENT_2PORTB,5
#define SEGMENT_3PORTB,4
#define SEGMENT_4PORTB,3
#define SEGMENT_5PORTB,7


#define SEGMENT_APORTC,6
#define SEGMENT_BPORTC,7
#define SEGMENT_CPORTC,3
#define SEGMENT_DPORTC,1
#define SEGMENT_EPORTC,4
#define SEGMENT_FPORTC,2
#define SEGMENT_GPORTC,5
;*********** DASPLAY RAM ******

DISPLAY_S1EQU 0x38
DISPLAY_S2EQU 0x39
DISPLAY_S3EQU 0x3A
DISPLAY_S4EQU 0x3B
DISPLAY_S5EQU 0x3C



fROM_ID0EQU 0x3D
fROM_ID1EQU 0x3E
fROM_ID2EQU 0x3F
fROM_ID3EQU 0x40
fROM_ID4EQU 0x41
fROM_ID5EQU 0x42
fROM_ID6EQU 0x43
fROM_ID7EQU 0x44

cicle EQU 0x45; НОМЕР ПРОХОДА ИНДИКАТОРА

MENU_LEVELEQU 0x46

R0EQU 0x47
R1EQU 0x48
R2EQU 0x49
R3EQU 0x4A
R4EQU 0x4B
R5EQU 0x4C

LIGHTEQU 0x4D

CNT_KEY1EQU 0x4E
CNT_KEY2EQU 0x4F

POWER_LEVEL_BATEQU 0x50
CNT_BEEPEQU 0x51

TTEMPEQU 0x52
DECIMALEQU 0x53

TEMP_CICLE1EQU 0x54
TEMP_CICLE2EQU 0x55

COUNT_N1EQU 0x56
COUNT_N2EQU 0x57
N_COUNT1EQU 0x58
N_COUNT2EQU 0x59

LONG_COUNT_N1EQU 0x5A
LONG_COUNT_N2EQU 0x5B
LONG_N_COUNT1EQU 0x5C
LONG_N_COUNT2EQU 0x5D

COUNT_IRQEQU 0x5E
LONG_COUNT_IRQEQU 0x5F

; МАКРОСЫ
;***************
BANK0 macro;------------------------------------------;
BCFSTATUS,RP1
BCFSTATUS,RP0
endm
;***************
BANK1 macro;------------------------------------------;
BCFSTATUS,RP1
BSFSTATUS,RP0
endm
;***************
BANK2 macro;------------------------------------------;
BSFSTATUS,RP1
BCFSTATUS,RP0
endm
;***************
BANK3 macro;------------------------------------------;
BSFSTATUS,RP1
BSFSTATUS,RP0
endm
;***************



;**********************************************************************
ORG 0x000 ; processor reset vector

clrf PCLATH ; ensure page bits are cleared
goto START ; go to beginning of program


;**********************************************************************

ORG 0x004 ; interrupt vector location

movwf w_temp ; save off current W register contents
movfSTATUS,w ; move status register into W register
bcf STATUS,RP0 ; ensure file register bank set to 0
movwfstatus_temp ; save off contents of STATUS register
movfPCLATH,w ; move pclath register into w register
movwfpclath_temp ; save off contents of PCLATH register

movlw HIGH RETIRQ ;load high 8-bit address of Table
movwf PCLATH
; узнавания источника прерывания
BTFSSINTCON,INTF
GOTO IRQ_TIMER
BCFINTCON,INTF
; обработка прерывания не от таймера


INCFSZCOUNT_N1,F
GOTORETIRQ_INT


INCFCOUNT_N2,F


RETIRQ_INT

INCFSZLONG_COUNT_N1,F
GOTORETIRQ


INCFLONG_COUNT_N2,F




GOTORETIRQ

IRQ_TIMER
; обработка прерывания таймера

BCFINTCON,T0IF; RESET FLAG TIMER


CLRFTMR0
; СЧИТАТЬ ДО 256
MOVLW.22; таймер считает +1 от загруженного значения при переполнении
MOVWFTMR0; ЗДЕСЬ МЫ 25.6MKS+2,4= 29 MKS

INCFCOUNT_IRQ,F
MOVLW.20
XORWFCOUNT_IRQ,W
BTFSSSTATUS,Z
GOTOIRQ_TIMER_1


CLRFCOUNT_IRQ ; 0,3 SEC ON CICLE

MOVFCOUNT_N1,W
MOVWFN_COUNT1
MOVFCOUNT_N2,W
MOVWFN_COUNT2
CLRFCOUNT_N1
CLRFCOUNT_N2



IRQ_TIMER_1

INCFLONG_COUNT_IRQ,F
MOVLW.201
XORWFLONG_COUNT_IRQ,W
BTFSSSTATUS,Z
GOTORETIRQ


CLRFLONG_COUNT_IRQ ; 3 SEC ON CICLE

MOVFLONG_COUNT_N1,W
MOVWFLONG_N_COUNT1
MOVFLONG_COUNT_N2,W
MOVWFLONG_N_COUNT2
CLRFLONG_COUNT_N1
CLRFLONG_COUNT_N2

GOTORETIRQ



RETIRQ
bcf STATUS,RP0 ; ensure file register bank set to 0
movfpclath_temp,w ; retrieve copy of PCLATH register
movwfPCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwfSTATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;**********************************************************************


;=================== LCD TABLE ==================================
; Подпрограмма вывода на семисегментный индикатор
;порт В0 -А ........ В7 - Н
;Исходные данные: В регистре W число от 0 до 7F
;Выходные данные: В регистре W код для индикатора
movlw HIGH LCDTable;load high 8-bit
;address of Table
movwf PCLATH ;into PCLATH



LCDTable
ANDLWb'00001111'

addwf PCL,F ; W + PC -> PC
; retlw ; AFBDGCHE = '8,'hXX
retlw b'00100000' ; 0
retlw b'01110110' ; 1
retlw b'00001100' ; 2
retlw b'00010100' ; 3
retlw b'01010010' ; 4
retlw b'10010000' ; 5
retlw b'10000000' ; 6
retlw b'00110110' ; 7
retlw b'00000000' ; 8
retlw b'00010000' ; 9
retlw b'11111110' ;
retlw b'11111110' ;
retlw b'11111110' ;
retlw b'10001000' ; C
retlw b'11100100' ; u
retlw b'11000110' ; n

;**********************************************************************




;##########################################################
; Начало нашей программы
START
CALL_INIT

CLRFEE_ADDR; ПРОВЕРИМ ЛОЯЛЬНОСТЬ ПОКАЗАНИЙ ЧАСОВ ЕСЛИ ВЫКЛЮЧЕНЫ(
CALLDSTIME_READ_BYTE
BTFSCEE_DATA,7
CALL INIT_TIMER;СЕЛА БАТАРЕЯ ? ПРОИНИЦИАЛИЗМРУЕМ

CLRFMENU_LEVEL






START_MAIN
MOVLW.252
BTFSSFLAG_BEEP
MOVWFCNT_BEEP


BTFSCFLAG_BEEP
BSFBEEP_PIN
BTFSSFLAG_BEEP
BCFBEEP_PIN


CALLDISPLAY_CICLE;ОТРАБОТКА ИНДИКАТОРА


INCFSZTEMP1,F
GOTOSTART_MAIN_2

; РАБОТА СО ЗВУКОМ

INCFSZCNT_BEEP,F
GOTOSTART_MAIN_BEEP
BCF FLAG_BEEP




START_MAIN_BEEP







; РАБОТА С КЛАВОЙ - КАЖДЫЕ 10 мс


BTFSSFLAG_CHANGE_LEVEL; CMEНА РЕЖИМА БЕЗ СЕРВИСА
GOTOSTART_MAIN_1A

INCFMENU_LEVEL,F
MOVLWb'00000011'
ANDWFMENU_LEVEL,F
BCFFLAG_CHANGE_LEVEL

START_MAIN_1A

BTFSSFLAG_CHANGE_LEVEL_1; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
GOTOSTART_MAIN_1

INCFMENU_LEVEL,F
MOVLWb'000000111'
ANDWFMENU_LEVEL,F
BCFFLAG_CHANGE_LEVEL_1




START_MAIN_1

CALLSCAN_KEY ; 10 MS


START_MAIN_2


; STANDART MODE

MOVLW.0
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLTIME_MODE

MOVLW.1
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLVOLT_MODE

MOVLW.2
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLTEMPERATUR_MODE

MOVLW.3
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLTAHOMETR_MODE


MOVLW.4
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLLIGHT_MODE

MOVLW.5
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLCHANGE_MIN_MODE

MOVLW.6
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLCHANGE_HOUR_MODE

MOVLW.7
XORWFMENU_LEVEL,W
BTFSCSTATUS,Z
CALLLONG_TAHOMETR_MODE

;SERVICE MODE



GOTOSTART_MAIN

;**********************************************************************
;********* ПОДПРОГРАММЫ *********************************************
;**********************************************************************
;**********************************************************************
TAHOMETR_MODE

INCFSZTEMP,F; ИЗМЕРЯТЬ иногда
RETURN



MOVLW.255
MOVWFDISPLAY_S1

MOVLWb'11000111'
MOVWFDISPLAY_S4

MOVLWb'11110101'
MOVWFDISPLAY_S5

;N_COUNT1
; Деление.
; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.

MOVFN_COUNT1,W
MOVWFR2

MOVLW.10
MOVWFR4

CLRFR5
CALLdiv_16

MOVFR2,W
CALLLCDTable
MOVWFDISPLAY_S2

MOVFR0,W
CALLLCDTable
MOVWFDISPLAY_S3

;> 4000 ОБ.МИН
MOVLW.4
SUBWFR0,W
BTFSCSTATUS,C
BSFFLAG_BEEP



RETURN
;**********************************************************************
LONG_TAHOMETR_MODE



;MOVLW.255
;MOVWFDISPLAY_S1
;MOVWFDISPLAY_S2
;MOVWFDISPLAY_S3
;

MOVLWb'11000111'
MOVWFDISPLAY_S4

MOVLWb'01111101'
MOVWFDISPLAY_S5


incfszTEMP2,f
;BTFSSSTATUS,Z
RETURN





;BTFSSFLAG_CHANGE_LEVEL; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
;RETURN
;
;BCFFLAG_CHANGE_LEVEL

; ДЕЙСТВИЕ
;LONG_N_COUNT1
;LONG_N_COUNT2
; Деление.
; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.
MOVFLONG_N_COUNT1,W
MOVWFR2

MOVFLONG_N_COUNT2,W
MOVWFR3

MOVLW.10
MOVWFR4
CLRFR5

CALLdiv_16_L

MOVFR2,W
CALLLCDTable
MOVWFDISPLAY_S1

MOVFR1,W
MOVWFR3

MOVFR0,W
MOVWFR2

MOVLW.10
MOVWFR4
CLRFR5
CALLdiv_16_L

MOVFR2,W
CALLLCDTable
MOVWFDISPLAY_S2

MOVFR0,W
CALLLCDTable
MOVWFDISPLAY_S3


;> 4000 ОБ.МИН
MOVLW.4
SUBWFR0,W
BTFSCSTATUS,C
BSFFLAG_BEEP


RETURN

;**********************************************************************
CHANGE_HOUR_MODE

CALLTIME_MODE


MOVLW.255
MOVWFDISPLAY_S1
MOVWFDISPLAY_S2



MOVFTEMP1,W
BTFSSSTATUS,Z
RETURN

BTFSSFLAG_CHANGE_LEVEL; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
RETURN

BCFFLAG_CHANGE_LEVEL

; ДЕЙСТВИЕ

MOVLW.2
MOVWFEE_ADDR; HOUR

CALLDSTIME_READ_BYTE

MOVFEE_DATA,W

ANDLWb'00001111' ;HOUR
MOVWFR0

SWAPFEE_DATA,W

ANDLWb'00001111'; DES HOUR
MOVWFR2

INCFR0,F

MOVLW.10
XORWFR0,W

BTFSCSTATUS,Z
GOTOINC_DES_HOUR


MOVFR2,W
XORLW.2
BTFSSSTATUS,Z
GOTOINC_DES_HOUR_2

MOVFR0,W
XORLW.4
BTFSCSTATUS,Z
GOTOINC_DES_HOUR_1



INC_DES_HOUR_2
SWAPFR2,W
IORWFR0,W
MOVWFEE_DATA
CALLDSTIME_SAVE_BYTE

RETURN


INC_DES_HOUR

CLRFR0

INCFR2,F

MOVLW.3
XORWFR2,W

BTFSCSTATUS,Z
GOTOINC_DES_HOUR_1

SWAPFR2,W
IORWFR0,W
MOVWFEE_DATA
CALLDSTIME_SAVE_BYTE

RETURN

INC_DES_HOUR_1
CLRFEE_DATA
CALLDSTIME_SAVE_BYTE

RETURN

;**********************************************************************


;**********************************************************************
CHANGE_MIN_MODE

CALLTIME_MODE


MOVLW.255
MOVWFDISPLAY_S4
MOVWFDISPLAY_S3



MOVFTEMP1,W
BTFSSSTATUS,Z
RETURN

BTFSSFLAG_CHANGE_LEVEL; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
RETURN

BCFFLAG_CHANGE_LEVEL

; ДЕЙСТВИЕ

MOVLW.1
MOVWFEE_ADDR; MIN

CALLDSTIME_READ_BYTE

MOVFEE_DATA,W

ANDLWb'00001111' ;MIN
MOVWFR0

SWAPFEE_DATA,W

ANDLWb'00001111'; DES MIN
MOVWFR2

INCFR0,F

MOVLW.10
XORWFR0,W

BTFSCSTATUS,Z
GOTOINC_DES_MIN

SWAPFR2,W
IORWFR0,W
MOVWFEE_DATA
CALLDSTIME_SAVE_BYTE

RETURN


INC_DES_MIN

CLRFR0

INCFR2,F

MOVLW.6
XORWFR2,W

BTFSCSTATUS,Z
GOTOINC_DES_MIN_1

SWAPFR2,W
IORWFR0,W
MOVWFEE_DATA
CALLDSTIME_SAVE_BYTE

RETURN

INC_DES_MIN_1
CLRFEE_DATA
CALLDSTIME_SAVE_BYTE

RETURN

;**********************************************************************


LIGHT_MODE

MOVLW.255
MOVWFDISPLAY_S4
MOVWFDISPLAY_S5
MOVLWb'11101001'
MOVWFDISPLAY_S3

MOVLWb'11011111'
MOVWFDISPLAY_S2

MOVLW.5
SUBWFLIGHT,W
MOVWFR0
RRFR0,W

CALLLCDTable
MOVWFDISPLAY_S1



MOVFTEMP1,W
BTFSSSTATUS,Z
RETURN

BTFSSFLAG_CHANGE_LEVEL; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
RETURN

BCFFLAG_CHANGE_LEVEL

DECFLIGHT,F ; (5 - 50_)
MOVFLIGHT,W
XORLW.5
MOVLW.25
BTFSCSTATUS,Z
MOVWFLIGHT

DECFLIGHT,F ; (5 - 50_)
MOVFLIGHT,W
XORLW.5
MOVLW.25
BTFSCSTATUS,Z
MOVWFLIGHT


RETURN

;**********************************************************************

VOLT_MODE
INCFSZTEMP,F; ИЗМЕРЯТЬ иногда
RETURN


GET_VOLUME_POWER
BCFADCON0,ADON; DISABLE ADC

BCFADCON0,CHS0; SELECT CHANNEL 0
BCFADCON0,CHS1
BCFADCON0,CHS2

BSFADCON0,ADON; ENABLE ADC

CALLDELAY_15MKS; 16 MKS

BSFADCON0,GO_DONE; START DAC
WAIT_CH0_DAC
BTFSCADCON0,GO_DONE
GOTOWAIT_CH0_DAC
; DAC-OK
MOVFADRES,W

MOVWFPOWER_LEVEL_BAT
; CHANNEL 0 - END
;*****
BCFADCON0,ADON; DISABLE ADC


MOVFPOWER_LEVEL_BAT,W
ANDLWb'00001111'

movwfR2
movwfR4

RLFR2,1
RLFR2,1
RLFR2,0

ADDWFR4,0
ADDWFR4,0
movwfR2;DECIMAL*10

movlw.16
movwfR4
; Деление.
;div_16 ; R0 = R2 / R4
; В R2 остаток.
CALLdiv_16
movfR0,W

CALLLCDTable
MOVWFDISPLAY_S2





SWAPFPOWER_LEVEL_BAT,W
ANDLWb'00001111'
MOVWF R2; Деление.
;div_16 ; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.

MOVLW.10
MOVWF R4
CALLdiv_16

MOVFR0,W
CALLLCDTable
MOVWFDISPLAY_S4

MOVFR2,W
CALLLCDTable
MOVWFDISPLAY_S3


MOVLWb'11111101';XX.Xv
MOVWFDISPLAY_S5


MOVLWb'11100101'
MOVWFDISPLAY_S1



;> 15 V
MOVLW.5
XORWFR2,W
BTFSCSTATUS,Z
BSFFLAG_BEEP

MOVLW.6
XORWFR2,W
BTFSCSTATUS,Z
BSFFLAG_BEEP

MOVLW.7
XORWFR2,W
BTFSCSTATUS,Z
BSFFLAG_BEEP

;-------------RB0 INT 0 to 1
; ||>------------TMR0 CONNECT TO CLK/4
; |||>-----------
; ||||>----------PRESCALER TO TMR0
; |||||>--\ Prescaler -> Timer0, Для часов
; ||||||>-->-----; 1:64, rising edge
; |||||||>/
movlw b'01000101'
movwf OPTION_REG^80
;*****************
; ПОКА ЕЩЕ БАНК 1
BCF TXSTA^80,TXEN ; ПЕРЕДАЧА OFF

; >--------------IRQ PSP
; |>-------------IRQ AD
; ||>------------IRQ USART RX
; |||>-----------IRQ USART TX
; ||||>----------IRQ SPP
; |||||>---------IRQ CPP1
; ||||||>--------IRQ TMR2
; |||||||>-------IRQ TMR1
;MOVLW b'11110000';

MOVLW b'00000000';
MOVWFPIE1^80;

; | >-------IRQ CCP2
;MOVLW b'11110000';
MOVLW b'00000000'; IRQ MODULE
MOVWFPIE2^80;


BANK0

BSF_1WIRE ; ДЛЯ 1 WIRE
BCF RCSTA,SPEN; USART OFF

; >--------------IRQ ON
; |>-------------IRQ ON PEREPHERIAL
; ||>------------IRQ ON TMR0
; |||>-----------IRQ ON RB0 INT
; ||||>----------OFF CHANGE PORTB
; |||||>---------
; ||||||>--------
; |||||||>-------
MOVLW b'10110000'; IRQ ON
;MOVLW b'00000000'; IRQ off
MOVWFINTCON;
;**********************************************************************
; ЗАВЕРШЕНИЕ ИНИЦИАЛИЗАЦИИ *
;**********************************************************************

CLRFFLAG
CLRFDISPLAY_S1
CLRFDISPLAY_S2
CLRFDISPLAY_S3
CLRFDISPLAY_S4
CLRFDISPLAY_S5

MOVLW.10
MOVWFLIGHT


BCFBEEP_PIN; OFF

RETURN

;**********************************************************************

DISPLAY_CICLE

; покажем индикатор полностью за 5 проходов

;MOVLWb'00000111'; ПОТУШИМ индикатор
;ANDWFPORTB,F

MOVLWb'11111000'; ПОТУШИМ индикатор
IORWFPORTB,F



MOVFLIGHT,W
XORWFcicle,W

BTFSCSTATUS,Z
CLRFcicle




; узнаем номер прохода
MOVFcicle,W; в W номер прохода
; табличное ветвление
btfsc STATUS,Z
GOTO MCICLE1

MOVLW.1
XORWFcicle,W
btfsc STATUS,Z
GOTO MCICLE2


MOVLW.2
XORWFcicle,W
btfsc STATUS,Z
GOTO MCICLE3

MOVLW.3
XORWFcicle,W
btfsc STATUS,Z
GOTO MCICLE4

MOVLW.4
XORWFcicle,W
btfsc STATUS,Z
GOTO MCICLE5

INCFcicle,F

RETURN

MCICLE1:
INCFcicle,F
MOVLWb'00000001'
ANDWFPORTC,F

MOVF DISPLAY_S1,W
ANDLWb'11111110'
IORWFPORTC,F

;BSFSEGMENT_1; зажжем этот разряд
BcFSEGMENT_1; зажжем этот разряд

RETURN

MCICLE2:
INCFcicle,F
MOVLWb'00000001'
ANDWFPORTC,F

MOVF DISPLAY_S2,W
ANDLWb'11111110'
IORWFPORTC,F

;BSFSEGMENT_2; зажжем этот разряд
BcFSEGMENT_2; зажжем этот разряд


RETURN

MCICLE3:
INCFcicle,F
MOVLWb'00000001'
ANDWFPORTC,F

MOVF DISPLAY_S3,W
ANDLWb'11111110'
IORWFPORTC,F

;BSFSEGMENT_3; зажжем этот разряд
BcFSEGMENT_3; зажжем этот разряд

RETURN

MCICLE4:
INCFcicle,F
MOVLWb'00000001'
ANDWFPORTC,F

MOVF DISPLAY_S4,W
ANDLWb'11111110'
IORWFPORTC,F

;BSFSEGMENT_4; зажжем этот разряд
BcFSEGMENT_4; зажжем этот разряд

RETURN

MCICLE5:
INCFcicle,F

MOVLWb'00000001'
ANDWFPORTC,F

MOVF DISPLAY_S5,W
ANDLWb'11111110'
IORWFPORTC,F

;BSFSEGMENT_5; зажжем этот разряд
BcFSEGMENT_5; зажжем этот разряд

RETURN
; *********************************************************************
;Примеры использования процедур I2C
; *********************************************************************
DSTIME_READ_BYTE
CALL i2c_start
MOVLW0xD0
MOVWF_i2c_byte ; // control байт с битом WR
CALLi2c_write
MOVF EE_ADDR,W
MOVWF _i2c_byte ; младший байт адреса памяти
CALL i2c_write;
CALL i2c_start;
MOVLW0xD1
MOVWF_i2c_byte ;// control байт с битом RD
CALL i2c_write
CALL i2c_read
CALL i2c_stop
MOVF _i2c_byte,W
MOVWF EE_DATA

RETURN

; *********************************************************************
DSTIME_SAVE_BYTE

CALL i2c_start
MOVLW0xD0
MOVWF_i2c_byte; ; //control байт с битом WR
CALL i2c_write
MOVF EE_ADDR,W
MOVWF _i2c_byte ;// младший байт адреса памяти
CALL i2c_write
MOVF EE_DATA,W
MOVWF _i2c_byte ;// записываемые данные
CALL i2c_write
GOTO i2c_stop

;RETURN

;**********************************************************************

; *********************************************************************
;Подпрограммы для работы с шиной I2C . 100 kHz ДЛЯ 4 мГц ;
; *********************************************************************
;/*--------- начало примера-----------
; Требуется 2 байта ОЗУ - i2c_byte - в него помещается байт,
; который необходимо вывести на шину, в нем оказывается байт,
; считанный с шины; tmp - счетчик, используемый в цикле. */
; *********************************************************************
;char i2c_byte; /* рабочий регистр */
;char tmp; /* счетчик */

i2c_start
BANK1
bcf TRIS_SDA ; SDA - вывод
bcf TRIS_SCL ; SCL - вывод
BANK0
bsf SCL ; SCL - 1
NOP
NOP
bsf SDA ; SDA - 1
NOP
NOP
bcf SDA ; SDA - 0
NOP
NOP
bcf SCL ; SCL - 0
RETURN
; ***********
i2c_stop
BANK0
bcf SDA ; SDA - 0
NOP
NOP
bsf SCL ; SCL - 1
NOP
NOP
bsf SDA ; SDA - 1
RETURN
; ***********
i2c_write
movlw 0x08
movwf _tmp
BANK1
bcf TRIS_SDA ; SDA - вывод
bcf TRIS_SCL ; SCL - вывод
BANK0
bcf SCL ; SCL - 0
NOP
NOP
send_bit
bsf SDA ; SDA - 1 выводим 1 на SDA
NOP
NOP
btfss _i2c_byte, 7 ; бит данных - 1 ?
bcf SDA ; нет - выводим 0 на SDA
NOP
NOP
bsf SCL ; SCL - 1
NOP
NOP
rlf _i2c_byte, F ; сдвигаем влево байт данных

bcf SCL ; SCL - 0
NOP
NOP
decfsz _tmp, F ; конец цикла ?
goto send_bit ; нет - переход

bsf SDA ; осв. SDA SDA - 1
NOP
NOP
bsf SCL ; SCL - 1, получаем ACK-бит и игнорируем его (!)
NOP
NOP
bcf SCL ; SCL - 0
RETURN
; ***********

i2c_read
movlw 0x08
movwf _tmp
BANK1
bsf TRIS_SDA ; SDA - на ввод
bcf TRIS_SCL ; SCL - вывод
BANK0
bcf SCL ; SCL - на 0
NOP
NOP

read_bit
rlf _i2c_byte, F ; сдвигаем байт влево
bsf SCL ; SCL - 1
NOP
NOP
bsf _i2c_byte, 0 ; устанавливаем бит в 1 ; -NOP
NOP
NOP
btfss SDA ; SDA - 1?
bcf _i2c_byte, 0 ; нет - устанавливаем бит в 0

bcf SCL ; SCL - 0
NOP
NOP
decfsz _tmp, F ; конец цикла ?
goto read_bit ; нет - переход
BANK1
bcf TRIS_SDA ; SDA - вывод
BANK0
RETURN
; ***********
;**********************************************************************
INIT_TIMER
CLRFEE_DATA
CALLDSTIME_SAVE_BYTE ;0

INCFEE_ADDR,F
CALLDSTIME_SAVE_BYTE;1

INCFEE_ADDR,F
CALLDSTIME_SAVE_BYTE;2

INCFEE_ADDR,F
CALLDSTIME_SAVE_BYTE;3

INCFEE_ADDR,F
CALLDSTIME_SAVE_BYTE;4

INCFEE_ADDR,F
CALLDSTIME_SAVE_BYTE;5

INCFEE_ADDR,F
CALLDSTIME_SAVE_BYTE;6

INCFEE_ADDR,F
MOVLWb'10010000'
MOVWFEE_DATA
gotoDSTIME_SAVE_BYTE;7

;RETURN


;----------------------------------------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@ Процедуры для работы с сетью MicroLAN со стороны ведущего.   @
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
;******** 4 MHZ *************

;******************** MicroLAN ***************************
; Команды сетевого уровня.
READ_ROM_CMD equ 033h ; Команда "Чтение ПЗУ"
READ_R1990_CMD equ 00Fh ; Для DS1990A этот код используется вместо 33h.
MATCH_ROM_CMD equ 055h ; Команда "Совпадение ПЗУ".
SKIP_ROM_CMD equ 0CCh ; Команда "Пропуск ПЗУ".
;*********************************************************
; W=0 - 772 мкс.
delay:
movwf fCOUNTER
D_Loop36:
decfsz fCOUNTER,1
goto D_Loop36
return
;-----------------------------------------------------------------------------
Reset_1Wire: ; Сбрасываем линию на около 500 мкс.
bcf _1WIRE
movlw .166
call delay ; 500 мкс.
bsf _1WIRE
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
; Пропускаем импульс присутствия.
movlw .166
call delay ; 500 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
return
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое ПЗУ в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_TEMP:
clrf CRC
; Сбрасываем все приборы на линии.
; call Reset_1Wire
; Выдаем команду "Чтение ".
movlw 0xBE
call RW_Byte
; Читаем ПЗУ.
movlw 0xFF
call RW_Byte ; byte 0.
movwf fROM_ID0
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 1.
movwf fROM_ID1
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 2.
movwf fROM_ID2
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 3.
movwf fROM_ID3
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 4.
movwf fROM_ID4
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 5.
movwf fROM_ID5
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 6.
movwf fROM_ID6
call DO_CRC
; Читаем CRC.
movlw 0xFF
call RW_Byte ; byte 7 (CRC).
movwf fROM_ID7
subwf CRC,1
return
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое ПЗУ в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_ROM_ID:
clrf CRC
; Сбрасываем все приборы на линии.
call Reset_1Wire
; Выдаем команду "Чтение ПЗУ".
movlw READ_ROM_CMD
call RW_Byte
; Читаем ПЗУ.
movlw 0xFF
call RW_Byte ; byte 0.
movwf fROM_ID0
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 1.
movwf fROM_ID1
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 2.
movwf fROM_ID2
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 3.
movwf fROM_ID3
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 4.
movwf fROM_ID4
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 5.
movwf fROM_ID5
call DO_CRC
movlw 0xFF
call RW_Byte ; byte 6.
movwf fROM_ID6
call DO_CRC
; Читаем CRC.
movlw 0xFF
call RW_Byte ; byte 7 (CRC).
movwf fROM_ID7
subwf CRC,1
return

;-----------------------------------------------------------------------------
; Ф-ция ввода/вывода на линию 1-Wire.
; Выводим из W и читаем в W.
RW_Byte:
movwf fTEMP
movlw d'8' ; 8 бит.
movwf fBIT_CNT
RBLoop:
bcf _1WIRE ; Обнуляем выход.
; Ждем 2 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
nop
btfsc fTEMP,0
bsf _1WIRE ; Устанавливаем выход.
rrf fTEMP,1
; Ждем ~12 мкс.
movlw 3
call delay
bcf fTEMP,7 ; Принимаем в тот же TEMP, из которого передаем.
btfsc _1WIRE
bsf fTEMP,7
; Далее даем время на освобождение линии ведомым.
movlw d'20'
call delay
; Отпускаем линию.
bsf _1WIRE
; Чуть-чуть даем отдохнуть (для медленных эмуляторов). Для Dallas не нужно.
movlw d'1' ; Впоследствии можно удалить при нормальной работе.
call delay
; Если 8 бит, то выходим.
decfsz fBIT_CNT,1
goto RBLoop
; Принятый байт в W.
movf fTEMP,0
return
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в W.
DO_CRC: ; Размер CRC - 8 бит.
movwf CRC
movlw 0x08
movwf fBIT_CNT
movf CRC,0
DoCRC_Loop:
xorwf CRC,0
movwf fTEMP
rrf fTEMP,0
movf CRC,0
btfsc STATUS,0
xorlw 0x18
movwf fTEMP
rrf fTEMP,0
movwf CRC
bcf STATUS,0
rrf CRC,1
movf CRC,0
decfsz fBIT_CNT,1
goto DoCRC_Loop
return
;-----------------------------------------------------
;*****************************************************************************
;* ПРОЦЕДУРА ДЕЛЕНИЯ *
;*****************************************************************************

; Деление.
div_16_L ; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.
clrf R0
clrf R1
movf R4,w
btfss STATUS,Z
goto div16_Loop_L
movf R5,w
btfss STATUS,Z
goto div16_Loop_L
return
div16_Loop_L:
; Вычитаем RR5:RR4 из RR3:RR2.
movf R4,w
subwf R2,f ; F = F - W
btfss STATUS,C
decf R3,f ; Перенос.
btfsc R3,7
goto div16_exit_L
movf R5,w
subwf R3,f
btfss STATUS,C
goto div16_exit_L
; Увеличиваем частное на 1.
movlw 1
addwf R0,f
btfsc STATUS,C
incf R1,f
clrwdt
goto div16_Loop_L
; Выход.
div16_exit_L:
movf R4,w
addwf R2,f
; btfss STATUS,C
incf R3,f ; Перенос.
movf R5,w
addwf R3,f
return
;;-----------------------------------------------------------------------------
;


;**********************************************************************

;*****************************************************************************
;* ПРОЦЕДУРА ДЕЛЕНИЯ *
;*****************************************************************************

; Деление.
div_16 ; R0 = R2 / R4
; В R2 остаток.
clrf R0
movf R4,w
btfss STATUS,Z
goto div16_Loop
return
div16_Loop:
; Вычитаем RR4 из RR2.
movf R4,w
subwf R2,f ; F = F - W
btfss STATUS,C
goto div16_exit

; Увеличиваем частное на 1.
INCFR0,f
clrwdt
goto div16_Loop
; Выход.
div16_exit:
movf R4,w
addwf R2,f
return
;-----------------------------------------------------------------------------



;**********************************************************************


;**********************************************************************
;********* КОНЕЦ 1 БЛОКА *********************************************
;**********************************************************************


;**********************************************************************
ORG 0x800
;**********************************************************************
NOP
NOP
NOP


;********* ПОДПРОГРАММЫ *********************************************
;**********************************************************************
; ПОДПРОГРАММЫ *
;**********************************************************************


;**********************************************************************



END ; directive 'end of program'




Прошивка процессора

:020000040000FA
:040000008A014F28FA
:08000800A00003088312A1000F
:100010000A08A20000308A008B1C16288B10D60F0D
:100020001228D70ADA0F3328DB0A33280B11810193
:1000300016308100DE0A14305E06031D2628DE011C
:100040005608D8005708D900D601D701DF0AC930B1
:100050005F06031D3328DF015A08DC005B08DD0062
:10006000DA01DB013328831222088A002108830089
:10007000A00E200E090000308A000F3982072034BC
:1000800076340C34143452349034803436340034A2
:100090001034FE34FE34FE348834E434C63428226E
:1000A000B0019222AF1B0A23C601FC30291DD100EA
:1000B00029190714291D07104F22AB0F6F28D10FE4
:1000C00062282911291C6828C60A0330C605291090
:1000D000A91C6E28C60A0730C605A910E021003009
:1000E00046060319F5210130460603194B2102305B
:1000F000460603198E21033046060319902004306A
:10010000460603192B210530460603190021063047
:1001100046060319CD20073046060319A9205528A5
:10012000AA0F0800FF30B800C730BB00F530BC0094
:100130005808C9000A30CB00CC01BB2349083D2038
:10014000B90047083D20BA000430470203182915BA
:100150000800C730BB007D30BC00AC0F08005C0855
:10016000C9005D08CA000A30CB00CC019C234908B5
:100170003D20B8004808CA004708C9000A30CB0033
:10018000CC019C2349083D20B90047083D20BA0016
:1001900004304702031829150800F521FF30B80084
:1001A000B9002B08031D0800291C08002910023083
:1001B000B00092222F080F39C7002F0E0F39C90047
:1001C000C70A0A3047060319F2284908023A031DF4
:1001D000ED284708043A0319FD28490E4704AF00EB
:1001E000A2220800C701C90A033049060319FD28E5
:1001F000490E4704AF00A2220800AF01A222080066
:10020000F521FF30BB00BA002B08031D0800291C94
:10021000080029100130B00092222F080F39C700C2
:100220002F0E0F39C900C70A0A30470603191D29C6
:10023000490E4704AF00A2220800C701C90A0630D0
:10024000490603192829490E4704AF00A2220800D5
:10025000AF01A2220800FF30BB00BC00E930BA00A9
:10026000DF30B90005304D02C700470C3D20B80013
:100270002B08031D0800291C08002910CD034D0878
:10028000053A19300319CD00CD034D08053A193050
:100290000319CD000800AA0F08001F109F111F129C
:1002A0009F121F14DD211F151F1954291E08D0008D
:1002B0001F1050080F39C900CB00C90DC90D490DD9
:1002C0004B074B07C9001030CB00BB2347083D202C
:1002D000B900500E0F39C9000A30CB00BB234708C4
:1002E0003D20BB0049083D20BA00FD30BC00E53090
:1002F000B8000530490603192915063049060319C7
:100300002915073049060319291500304706031936
:10031000291501304906031929150800CD30B80008
:10032000BC1E9A29DF30B900BA00BB00D40180306E
:10033000D5001922DD30BC00D40F0800D50F08000D
:100340008030D500212219223C153E0E0F390319A9
:10035000AC293C11BD09BE093D080F39D300BD0CC5
:10036000BD0CBD0CBD0CBD0CD20CBD0CD20CBD0C1B
:10037000D20CBD0CD20CBE0CD20CBE0CD20CBE0CDE
:10038000D20CBE0CD20C5208C9000A30CB00BB23E1
:1003900047083D20BB0049083D20BA005308C9006A
:1003A000C90DC90D490D53075307C9001030CB00C3
:1003B000BB2347083D20B900080003301C2B080070
:1003C0008618CE010619CF01861CCE0A061DCF0A5B
:1003D000CE19ED29CF19F12908002914CE012915CC
:1003E0000800A914CF012915080005304506031D92
:1003F0000800AA0F0800E630AA000230B0009222DE
:100400002F083D20BA002F0E3D20BB000130B00068
:1004100092222F083D20B8002F0E3D20B900003059
:10042000B0009222FF30BC002F1C0800BC103C1210
:1004300008008B132023CC307223443072238B1797
:1004400008008B132023CC30722329238B1708003C
:10045000031383121F108501860187018101831612
:1004600005309F002D308500073086000030870062
:1004700045308100981200308C0000308D0003134D
:10048000831205169813B0308B00A901B801B90189
:10049000BA01BB01BC010A30CD0007100800F830DA
:1004A00086044D0845060319C501450803196A2A43
:1004B000013045060319722A0230450603197A2ACB
:1004C000033045060319822A0430450603198A2A97
:1004D000C50A0800C50A013087053808FE398704B7
:1004E00006130800C50A013087053908FE3987045C
:1004F00086120800C50A013087053A08FE398704CC
:1005000006120800C50A013087053B08FE3987043A
:1005100086110800C50A013087053C08FE398704AA
:1005200086130800AD22D030AD00C8223008AD00DF
:10053000C822AD22D130AD00C822EB22BE222D0848
:10054000AF000800AD22D030AD00C8223008AD00A9
:10055000C8222F08AD00C822BE2A031383168512B5
:100560000511031383120515000000008516000015
:10057000000085120000000005110800031383121B
:100580008512000000000515000000008516080017
:100590000830AE000313831685120511031383126E
:1005A000051100000000851600000000AD1F851237
:1005B00000000000051500000000AD0D0511000051
:1005C0000000AE0BD32A85160000000005150000C0
:1005D0000000051108000830AE00031383168516CD
:1005E000051103138312051100000000AD0D051560
:1005F000000000002D1400000000851E2D100511C4
:1006000000000000AE0BF62A0313831685120313B5
:1006100083120800AF01A222B00AA222B00AA222CD
:10062000B00AA222B00AA222B00AA222B00AA222D2
:10063000B00A9030AF00A22AA300A30B1D2B080024
:100640000512A6301C2305166400A6301C23640086
:100650000800A801BE307223FF307223BD00892339
:10066000FF307223BE008923FF307223BF0089232D
:10067000FF307223C0008923FF307223C100892319
:10068000FF307223C2008923FF307223C300892305
:10069000FF307223C400A8020800A80120233330D1
:1006A0007223FF307223BD008923FF307223BE0006
:1006B0008923FF307223BF008923FF307223C000DB
:1006C0008923FF307223C1008923FF307223C200C7
:1006D0008923FF307223C3008923FF307223C400B3
:1006E000A8020800A7000830A50005126400000059
:1006F00027180516A70C03301C23A713051AA717E4
:1007000014301C23051601301C23A50B752B27085C
:100710000800A8000830A50028082806A700270C14
:1007200028080318183AA700270CA8000310A80CE3
:100730002808A50B8D2B0800C701C8014B08031D15
:10074000A52B4C08031DA52B08004B08C902031C50
:10075000CA03CA1BB52B4C08CA02031CB52B0130B7
:10076000C7070318C80A6400A52B4B08C907CA0AA3
:100770004C08CA070800C7014B08031DC02B08001E
:100780004B08C902031CC72BC70A6400C02B4B08C7
:04079000C90708008D
:06100000000000000000EA
:02400E00F23F7F
:00000001FF

Устройство размещается в стандартном пластмассовом корпусе размерами 60*80*15 мм.

Статья была взята с

Гармаш Генадий.Bn-P.Ru






Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.