'****************************************************** '* АНАЛОГ DS18B20 * '* * '* ver.02 * '****************************************************** DEVICE = 18F2520 @CONFIG_REQ ' @__CONFIG CONFIG1H, OSC_HS_1 & FCMEN_OFF_1 & IESO_OFF_1 @__CONFIG CONFIG1H, OSC_HSPLL_1 & FCMEN_OFF_1 & IESO_OFF_1 @__CONFIG CONFIG2L, PWRT_ON_2 & BOREN_SBORDIS_2 & BORV_21_2 @__CONFIG CONFIG2H, WDT_OFF_2 & WDTPS_512_2 @__CONFIG CONFIG3H, MCLRE_ON_3 & LPT1OSC_OFF_3 & PBADEN_OFF_3 & CCP2MX_PORTC_3 @__CONFIG CONFIG4L, STVREN_OFF_4 & LVP_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4 @__CONFIG CONFIG5L, CP0_OFF_5 & CP1_OFF_5 & CP2_OFF_5 & CP3_OFF_5 @__CONFIG CONFIG5H, CPB_OFF_5 & CPD_OFF_5 @__CONFIG CONFIG6L, WRT0_OFF_6 & WRT1_OFF_6 & WRT2_OFF_6 & WRT3_OFF_6 @__CONFIG CONFIG6H, WRTB_OFF_6 & WRTC_OFF_6 & WRTD_OFF_6 @__CONFIG CONFIG7L, EBTR0_OFF_7 & EBTR1_OFF_7 & EBTR2_OFF_7 & EBTR3_OFF_7 @__CONFIG CONFIG7H, EBTRB_OFF_7 XTAL = 40 LCD_DTPIN = PORTB.4 LCD_RSPIN = PORTC.6 LCD_ENPIN = PORTC.7 LCD_INTERFACE = 4 LCD_LINES = 2 LCD_TYPE = 0 LCD_COMMANDUS = 2000 LCD_DATAUS = 50 DIM lines AS BYTE SYMBOL Line1 = 128 SYMBOL Line2 = 192 SYMBOL ClearD = 1 '---------------------------------------------------------------- SYMBOL DS_OUT_PIN = PORTB.0 SYMBOL DS_OUT_DIR = TRISB.0 '---------------------------------------------------------------- ' DIM Zahvat AS BIT DIM Zahvat_byte AS BYTE DIM Presence AS BIT' DIM Dani AS WORD DIM Dani_send AS WORD DIM Send AS BIT DIM Send_numb AS BYTE DIM Rec1 AS BYTE DIM Rec2 AS BYTE DIM Number AS BYTE DIM tmp AS BYTE DIM tmp1 AS BYTE DIM Impuls AS WORD DIM TIMER0 AS TMR0L.WORD init:'------------- инициализация------------------------------------- SYMBOL IPEN = RCON.7 SYMBOL INTEDG2 = INTCON2.4 SYMBOL INTEDG1 = INTCON2.5 SYMBOL NOT_RBPU = INTCON2.7 SYMBOL INT1IF = INTCON3.0 ' Флаг внешнего прерывания 1 SYMBOL INT2IF = INTCON3.1 ' Флаг внешнего прерывания 2 SYMBOL INT1IE = INTCON3.3 SYMBOL INT2IE = INTCON3.4 SYMBOL INT1IP = INTCON3.6 SYMBOL INT2IP = INTCON3.7 SYMBOL TMR0IF = INTCON.2 ' Флаг переполнения TMR0 '------ T0CON - 127 -------- ТАЙМЕР-0 ------------------------------------------------- SYMBOL T0PS0 = T0CON.0 ' Коэффициент пределителя Timer0 SYMBOL T0PS1 = T0CON.1 ' Коэффициент пределителя Timer0 SYMBOL T0PS2 = T0CON.2 ' Коэффициент пределителя Timer0 SYMBOL PSA = T0CON.3 ' Подключение пределителя Timer0 SYMBOL T0SE = T0CON.4 ' Выбор активного фронта тактов Timer0 SYMBOL T0CS = T0CON.5 ' Выбор источника тактов Timer0 SYMBOL T08BIT = T0CON.6 ' Timer0 8-bit или 16-bit SYMBOL TMR0ON = T0CON.7 ' Бит включения Timer0 T0CON = %00000000 IPEN = 1 ' Глобальное разрешение приоритетов прерываний NOT_RBPU = 1 'PORTB PULL-UP disable TMR0IF = 0 ' Флаг переполнения TMR0 INTEDG2 = 1 ' Выбор фронта внешнего прерывания 2 INTEDG1 = 0 ' Выбор фронта внешнего прерывания 1 INT1IE = 1 ' Разрешение внешнего прерывания 1 INT2IE = 1 ' Разрешение внешнего прерывания 2 INT1IP = 1 ' Приоритет внешнего прерывания 1 INT2IP = 1 ' Приоритет внешнего прерывания 2 'ADCON1 = %001111'AD-disable ALL digital ADCON1 = %001110'RA0-analog ADCON2 = %10000000 INPUT PORTA.0 INPUT PORTB.0' INPUT PORTB.1' INPUT PORTB.2' '------------------------------------------------------------------------------- INT1IF = 0 INT2IF = 0 TIMER0 = 0 Impuls = 0 ' Zahvat = 0 Zahvat_byte = 0 Presence = 0 Dani = 0 Number = 0 Send = 0 Send_numb = 0 Dani_send = $0000 ON INTERRUPT GOTO my_int DELAYMS 500 CLS DELAYMS 100 ENABLE GOTO main DISABLE my_int:'----------------------------------------------------------------- IF INT1IF = 1 THEN IF Send = 1 THEN'========================================= IF Dani_send.0 = 0 THEN LOW DS_OUT_PIN DELAYUS 40 Dani_send = Dani_send >> 1 Send_numb = Send_numb + 1 IF Send_numb = 16 THEN Send = 0 ENDIF DS_OUT_DIR = 1 ELSE LOW DS_OUT_PIN ASM NOP NOP ENDASM DS_OUT_DIR = 1 DELAYUS 40 Dani_send = Dani_send >> 1 Send_numb = Send_numb + 1 IF Send_numb = 16 THEN Send = 0 ENDIF ENDIF ELSE'===================================================== TIMER0 = 0 TMR0ON = 1 ENDIF INT1IF = 0 ENDIF IF INT2IF = 1 THEN TMR0ON = 0 Impuls.LOWBYTE = TMR0L Impuls.HIGHBYTE = TMR0H Impuls = Impuls / 5 IF Impuls > 480 THEN'Детект імпульса присутності і відповідь DELAYUS 2 LOW DS_OUT_PIN DELAYUS 200 Zahvat_byte = 0 Presence = 1 Dani = 0 Send = 0 DS_OUT_DIR = 1 ELSE IF Presence = 1 THEN IF Impuls < 15 THEN'Детект імпульса 1 Dani = Dani >> 1 Dani.15 = 1 Zahvat_byte = Zahvat_byte + 1 ENDIF IF Impuls > 15 AND Impuls < 200 THEN'Детект імпульса 0 Dani = Dani >> 1 Dani.15 = 0 Zahvat_byte = Zahvat_byte + 1 ENDIF ENDIF ENDIF INT2IF = 0 ENDIF IF TMR0IF = 1 THEN'переповнення таймера INT1IF = 0 INT2IF = 0 TMR0IF = 0 Zahvat_byte = 0 Presence = 0 Dani = 0 Send = 0 ENDIF RESUME ENABLE'--------------------------------------------------------- main:''------------------------------------------------ PRINT $FE, ClearD PRINT $FE, Line1, "READY" mainn: IF Zahvat_byte = 16 THEN IF Dani = $44CC THEN adcin 0,Dani_send ' PRINT $FE, Line2,DEC5 Dani_send ELSEIF Dani = $BECC THEN Send = 1 ENDIF Zahvat_byte = 0 Presence = 0 Dani = 0 ENDIF GOTO mainn END'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++