;************************************************************* ; Vers 1.1 регулятор температуры с индикацией ; для прямоточного котла ;************************************************************ ; Filename: kotel1_1.asm ; Date: nojab 2005 ; Assembler: mpasm 3.20 ; Author: Bogdanov Andrew ; E-Mail: bogdanov@tsrv.ru ;************************************************************ ; LIST p=16C73 ; cp=off=1. 3pwrt|on=1. 2wdt|on=1. =HS * ; __CONFIG b'00000011000010' ; биты конфиг CP on * ;************************************************************ #include C:/PHYTON/MY_INC/pic73.mac ; * ;******************** Ports Bits **************************** #define Led_A PORTB,5 ; разряд индикатора #define Led_B PORTB,7 ; разряд индикатора #define Led_C PORTB,1 ; разряд индикатора #define Led_D PORTB,3 ; разряд индикатора #define Led_E PORTB,4 ; разряд индикатора #define Led_F PORTB,6 ; разряд индикатора #define Led_G PORTB,0 ; разряд индикатора #define Led_T PORTB,2 ; разряд индикатора ;************************************************************ #define Led_Low PORTA,3 ; цифра индикатора #define Led_Midl PORTA,2 ; цифра индикатора #define Led_High PORTA,5 ; цифра индикатора ;************************************************************ NogDS1821 equ 5 ; Определение портов (Датчик №1) #define DS1821_1 PORTC,5 ; выход DS1821 ;************************************************************ #define Kotel PORTC,3 ; выход на реле котла #define ButtonUP PORTA,0 ; кнопка уровня #define ButtonDOWN PORTA,1 ; кнопка уровня ;************************************************************ ; Register Definitions 20h - 7fh ;****** вращалки Roller ************************************* mCountTimer equ 0x21 ; nbmer mCountIND equ 0x22 ; время регенерации mPosHigh equ 0x23 ; отсюда считываются mPosMidl equ 0x24 ; коды и выпихиваются mPosLow equ 0x25 ; в индикатор mCountBcuc equ 0x26 ; mCountBlink equ 0x27 ; mCountDown equ 0x28 ; mCountKeyOut equ 0x29 ; время после отпускания кнопки ;************************************************************* uTempUp equ 0x30 ; тепература выключения uTempDown equ 0x31 ; температура включения uTempDelta equ 0x32 ; разница температур ust-on/ust+off uTempUst equ 0x33 ; температура котла установленная uTempReal equ 0x34 ; температура котла реальная ;---------------------------------------------------------- mDelay equ 0x3A ; Переменная для установки задержек mToDS1821 equ 0x3B ; Байт для передачи датчику 1 mFromDS1821 equ 0x3C ; Принятый байт от датчика 1 ;************************************************************* wDdsHex equ 0x40 ; преобразование HEX->DDS wDdsLow equ 0x41 ; ячеекi wDdsMid equ 0x42 ; wDdsHigh equ 0x43 ; ;---------------------------------------------------------- wTEMP equ 0x44 ; DS1821 wlocal1 equ 0x45 ; DS1821 wlocal2 equ 0x46 ; DS1821 ;************************************************************* ORG 0 ; Вектор Сброса ;*********************************************************************** goto Start ; переход на начало программы ;************************************************************* hex: ; преобразование мл. тетрады в код ASCII ;************************************************************* andlw 0x0F ; всего 16 символов addwf PC,f ; goto Simbol_0 ; установка разрядов goto Simbol_1 ; индикатора goto Simbol_2 ; goto Simbol_3 ; goto Simbol_4 ; goto Simbol_5 ; goto Simbol_6 ; goto Simbol_7 ; goto Simbol_8 ; goto Simbol_9 ; goto Simbol_T1 ; 10 goto Simbol_T2 ; 11 goto Simbol_c ; 12 градусы goto Simbol_dw ; 13 вниз goto Simbol_ust ; 14 вверх goto Simbol_F ; 15 ;*********************************************************************** ORG 100H ; Вектор Начала ;*********************************************************************** Start: ; Main Programm bsf STATUS,RP0 ; cтраница 1 movlw b'00010011' ; A0-4 =in movwf TRISA ; A5 = out movlw b'00000000' ; B0-B7 - inputs movwf TRISB ; DMX address movlw b'10000111' ; C0-C6-out stepmotor movwf TRISC ; C7=RX,C6=TX movlw b'00000000' ; 1:256S->Presc->Tmr0, movwf OPTIONR ; movlw b'00000111' ; цифровые movwf ADCON1 ; movlw b'00100000' ; прерывание от movwf PIE1 ; USART movlw d'025' ; Скорость=0, brg=0 movwf SPBRG ; USART movlw b'00000010' ; УПРАВЛЕНИЕ BRGH =1 high movwf TXSTA ; USART bit2 =0 low bcf STATUS,RP0 ; cтраница 0 ;************************************************************* movlw b'10011101' ; установка режима movwf ADCON0 ; ADC movlw b'00010000' ; УПР приемником movwf RCSTA ; USART movlw b'00000000' ; (bit 5 = 0 значит нет data movwf PIR1 ; USART - Флажок !!! clrf INTCON ; NO прерывания ;------------------------------------------------------------- clrwdt ; сброс WDT таймера clrf PORTB ; выкл. clrf PORTA ; выкл. mvi mCountDown,.10 ; mvi uTempUst,.80 ; температура по умолчанию call USTdelta ; уст. разница температур ust-on/ust+off CALL initDS1821 ; Инициализация датчика №1 ;************************************************************* ZastCuc: ; считает от 9 до 0 ;************************************************************* mvi mPosHigh,.11 ; отсюда mov mPosMidl,wDdsLow ; считываются mvi mPosLow,.10 ; mov wDdsHex,mCountDown; преобразование HEX->DDS call HexToDec ; dds_hex -> дв.десятичный - 3 разряда call TimerWait cpi mCountDown,0xff jnz ZastCuc ;************************************************************* BaseCuc: ; измерение температуры ;************************************************************* mov wDdsHex,uTempReal ; температура котла реальная call HexToDec ; dds_hex -> дв.десятичный - 3 разряда mvi mPosLow,.12 ; отсюда считываются mov mPosMidl,wDdsLow ; отсюда считываются mov mPosHigh,wDdsMid ; отсюда считываются call TimerWait call CheckTemp ; измерение температуры ;------------------------------------------------------------- btfss ButtonUP goto UstTempcuc btfss ButtonDOWN goto UstTempcuc mvi mCountBlink,.240; задержка clrf mCountKeyOut ; время после отпускания кнопки goto BaseCuc ;************************************************************* UstTempcuc: ; установка поддерживаемой температуры ;************************************************************* mvi mPosHigh,.14 ; отсюда считываются mov wDdsHex,uTempUst ; температура поддержания call HexToDec ; dds_hex -> дв.десятичный - 3 разряда mov mPosMidl,wDdsMid ; отсюда считываются mov mPosLow,wDdsLow ; отсюда считываются call TimerWait btfss ButtonUP goto UstTempUp btfss ButtonDOWN goto UstTempDOWN UstTempReset: mvi mCountBlink,.1 ; задержка cpi mCountKeyOut,.25 ; время после отпускания кнопки jz BaseCuc goto UstTempcuc ; повтор основного цикла ;------------------------------------------------------------- UstTempUp: clrf mCountKeyOut ; время после отпускания кнопки cpi mCountBlink,.2 ; дребезг и повторы jnz UstTempcuc clrf mCountBlink cpi uTempUst,.94 ; мах = 95!!! jnc UstTempcuc ; повтор основного цикла incf uTempUst,f ; температура поддержания goto UstTempcuc ; повтор основного цикла ;------------------------------------------------------------- UstTempDOWN: clrf mCountKeyOut ; время после отпускания кнопки cpi mCountBlink,.2 ; дребезг и повторы jnz UstTempcuc clrf mCountBlink cpi uTempUst,.15 ; мin 35 jc UstTempcuc ; повтор основного цикла decf uTempUst,f ; температура поддержания goto UstTempcuc ; повтор основного цикла ;************************************************************* CountCuc: ; считает от 0 до 255 ;************************************************************* call TimerWait mov wDdsHex,mCountBlink ; преобразование HEX->DDS call HexToDec ; dds_hex -> дв.десятичный - 3 разряда mov mPosHigh,wDdsHigh ; отсюда считываются mov mPosMidl,wDdsMid ; отсюда считываются mov mPosLow,wDdsLow ; отсюда считываются goto CountCuc ; повтор основного цикла ;************************************************************* ;///////////////////////////////////////////////////////////// ;************************************************************** TimerWait: ;************************************************************** clrwdt ; сброс WDT таймера btfss TMR0,5 ; ! goto TimerWait ; бит =0 -> пропускаем clrf TMR0 ; бит =1 -> сбросить таймер incf mCountTimer,f jnz TimerWait ; еще не дошел до уровня ;-------------------------------------------------------------- ; сравнение верхних и нижних пределов и вкл-выкл реле ;-------------------------------------------------------------- call USTdelta ; уст. разница температур ust-on/ust+off ;-------------------------------------------------------------- cmp uTempReal,uTempDown jnc noDown bsf Kotel ; ON - выход на реле котла noDown: cmp uTempReal,uTempUp jc noUP bcf Kotel ; OFF - выход на реле котла noUP: ; cmp uTempReal,uTempUp ; jnc noUP ; bsf xxx ; on alarm ;noUP: ;-------------------------------------------------------------- incf mCountBcuc,f; cpi mCountBcuc,.30 jnz NoBlink clrf mCountBcuc incf mCountKeyOut,f; время после отпускания кнопки incf mCountBlink,f ; decf mCountDown,f ; заставка NoBlink: ;-------------------------------------------------------------- clrf PORTB ; выкл все разряды call DigitOFF cpi mCountIND,1 jz w1 cpi mCountIND,2 jz w2 clrf mCountIND ;-------------------------------------------------------------- incf mCountIND,f ; по программе movf mPosHigh,w ; отсюда считываются call hex ; преобр. в код ASCII goto DigitHigh ; вкл старшего разряда ;-------------------------------------------------------------- w1: incf mCountIND,f ; по программе movf mPosMidl,w ; отсюда считываются call hex ; преобр. в код ASCII goto DigitMidl ; вкл старшего разряда ;-------------------------------------------------------------- w2: incf mCountIND,f ; по программе movf mPosLow,w ; отсюда считываются call hex ; преобр. в код ASCII goto DigitLow ; вкл старшего разряда ;************************************************************** ;//////////////////////////////////////////////////////////// ;************************************************************** DeltaCuc: ; ;************************************************************* call USTdelta ; уст. разница температур ust-on/ust+off mov mPosHigh,wDdsHigh ; mov mPosMidl,wDdsMid ; mov mPosLow,wDdsLow ; ;----------------------------------- ; mov wDdsHex,uTempUp mov wDdsHex,uTempDown ; mov wDdsHex,uTempDelta; ;----------------------------------- call HexToDec ; dds_hex -> дв.десятичный - 3 разряда call TimerWait goto DeltaCuc ;************************************************************* ; CALL PIN_HI ; CALL initDS1821 ; Инициализация датчика №1 ;************************************************************** ;//////////////////////////////////////////////////////////// ;************************************************************** DigitOFF: bsf Led_Low ; цифра индикатора bsf Led_Midl ; цифра индикатора bsf Led_High ; цифра индикатора return ;************************************************************** DigitLow: bsf Led_Midl ; цифра индикатора bsf Led_High ; цифра индикатора bcf Led_Low ; цифра индикатора return ;************************************************************** DigitMidl: bsf Led_Low ; цифра индикатора bsf Led_High ; цифра индикатора bcf Led_Midl ; цифра индикатора return ;************************************************************** DigitHigh: bsf Led_Low ; цифра индикатора bsf Led_Midl ; цифра индикатора bcf Led_High ; цифра индикатора return ;************************************************************** ;//////////////////////////////////////////////////////////// ;************************************************************** PointON: ; установка точки bsf Led_T return ;************************************************************** Simbol_0: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_G return ;************************************************************** Simbol_1: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_B bsf Led_C return ;************************************************************** Simbol_2: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_F bcf Led_C return ;************************************************************** Simbol_3: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_F bcf Led_E return ;************************************************************** Simbol_4: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_F bsf Led_G bsf Led_B bsf Led_C return ;************************************************************** Simbol_5: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_B bcf Led_E return ;************************************************************** Simbol_6: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_B return ;************************************************************** Simbol_7: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_A bsf Led_B bsf Led_C return ;************************************************************** Simbol_8: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды return ;************************************************************** Simbol_9: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_E return ;************************************************************** Simbol_A: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_D return ;************************************************************** Simbol_b: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_A bcf Led_B return ;************************************************************** Simbol_C: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_G bcf Led_B bcf Led_C return ;************************************************************** Simbol_d: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_A bcf Led_F return ;************************************************************** Simbol_E: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_B bcf Led_C return ;************************************************************** Simbol_F: ; установка разрядов индикатора mvi PORTB,b'11111011' ; вкл все разряды bcf Led_B bcf Led_C bcf Led_D return ;************************************************************** Simbol_up: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_B bsf Led_G bsf Led_F return ;************************************************************** Simbol_ust: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_B bsf Led_G bsf Led_F bsf Led_D bsf Led_C return ;************************************************************** Simbol_dw: ; устаовка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_C bsf Led_G bsf Led_E return ;************************************************************** Simbol_T1: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_G bsf Led_E bsf Led_F return ;************************************************************** Simbol_T2: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_G bsf Led_B bsf Led_C return ;************************************************************** Simbol_c: ; установка разрядов индикатора clrf PORTB ; выкл все разряды bsf Led_G bsf Led_A bsf Led_F bsf Led_B return ;************************************************************* HexToDec: ; dds_hex -> дв.десятичный - 3 разряда ;************************************************************* clrwdt ; сброс WDT таймера clrf wDdsLow ; очистка ячеек clrf wDdsMid ; будущих clrf wDdsHigh ; значений ;--------------------------------------------------------- sot_cuc: ; вычисляем сначала incf wDdsHigh,f ; сотни movlw .100 ; subwf wDdsHex,f ; jc sot_cuc ; decf wDdsHigh,f ; movlw .100 ; addwf wDdsHex,f ; ;--------------------------------------------------------- dec_cuc: ; вычисляем десятки incf wDdsMid,f ; movlw .10 ; subwf wDdsHex,f ; jc dec_cuc ; decf wDdsMid,f ; movlw .10 ; addwf wDdsHex,f ; ;--------------------------------------------------------- ed_cuc: ; вычисляем единицы incf wDdsLow,f ; movlw .1 ; subwf wDdsHex,f ; jc ed_cuc ; decf wDdsLow,f ; ;--------------------------------------------------------- clrwdt ; сброс WDT таймера return ; ;************************************************************* USTdelta: ; уст. разница температур ust-on/ust+off ;************************************************************* mov uTempDelta,PORTC; comf uTempDelta,f ; movlw 0x07 ; andwf uTempDelta,f ; incf uTempDelta,f ; Не может быть равен 0 ;------------------------------------------------------------- movf uTempDelta,w ; subwf uTempUst,w ; нижний предел включения movwf uTempDown ; нижний предел включения ;------------------------------------------------------------- movf uTempDelta,w ; addwf uTempUst,w ; верхний предел выключения movwf uTempUp ; верхний предел выключения ;------------------------------------------------------------- return ; ;************************************************************** ;///////////////////////////////////////////////////////// ;************************************************************** CheckTemp: ; измерение температуры CALL startDS1821 ; Старт преобразования датчика №1 CALL readDS1821 ; Чтение датчика №1 MOVWF uTempReal ; Результат чтения в регистре Т_С CALL stopDS1821 ; Остановка преобразования датчика №1 incf uTempReal,f ; return ; ;************************************************************** ;********************************************************* ;///////////////////////////////////////////////////////// ;********************************************************* initDS1821: ;********************************************************* call init1wire ; инициализация интерфейса DS1821 MOVLW 0CH ; запись статуса MOVWF mToDS1821 call OutByte1wire ; байт из mToDS1821 в DS1821 MOVLW 03H ; Однократный режим, активный уровень 1 MOVWF mToDS1821 call OutByte1wire ; байт из mToDS1821 в DS1821 MOVLW .20 ; Задержка 20 мс для программирования датчика MOVWF wlocal1 CALL DelayMs RETURN ;********************************************************* startDS1821: ;********************************************************* call init1wire ; инициализация интерфейса DS1821 MOVLW 0EEH ; начать преобразование MOVWF mToDS1821 call OutByte1wire ; байт из mToDS1821 в DS1821 MOVLW .1 ; (=100) Задержка 100 мс MOVWF wlocal1 CALL DelayMs RETURN ;********************************************************* readDS1821: ; чтение температуры ;********************************************************* call init1wire ; инициализация интерфейса DS1821 MOVLW 0AAH ; читать температуру MOVWF mToDS1821 CALL OutByte1wire ; байт из mToDS1821 в DS1821 CALL InByte1wire ; чтение байта из DS1821 в W MOVF mFromDS1821, W RETURN ;********************************************************* stopDS1821: ; прекратить преобразование ;********************************************************* call init1wire ; инициализация интерфейса DS1821 MOVLW 22H ; прекратить преобразование MOVWF mToDS1821 CALL OutByte1wire ; байт из mToDS1821 в термостат RETURN ;********************************************************* ; Стандартные процедуры для интерфейса 1-Wire ;********************************************************* ;///////////////////////////////////////////////////////// ;********************************************************* init1wire: ; инициализация интерфейса DS1821 ;********************************************************* CALL PIN_HI ; порт на ввод и вывод в -1- (R=4,7k->+5v) CALL PIN_LO ; порт на выход и вывод в -0- MOVLW .50 ; Задержка 500 мкс CALL DELAY_10USEC CALL PIN_HI ; порт на ввод и вывод в -1- (R=4,7k->+5v) MOVLW .50 ; Задержка 500 мкс CALL DELAY_10USEC RETURN ;********************************************************* Wait1wire: ; ожидание готовности ;********************************************************* CALL InByte1wire ; Прием байта в W MOVLW 0FFH ; SUBWF mFromDS1821, W ; BTFSS STATUS, ZR ; GOTO Wait1wire ; RETURN ;********************************************************* InByte1wire: ; чтение байта в W ;********************************************************* MOVLW .8 MOVWF mDelay CLRF mFromDS1821 IN_BYTE_1: CALL PIN_LO ; порт на выход и вывод в -0- NOP NOP NOP NOP CALL PIN_HI ; порт на ввод и вывод в -1- (R=4,7k->+5v) nop16mhz ; макрос 28 пустых операций MOVF PORTC, W ; 7 usecs later, fetch from NogaDS1821 MOVWF wTEMP BTFSS wTEMP, NogDS1821 BCF STATUS,CR ; its a zero BTFSC wTEMP, NogDS1821 BSF STATUS, CR ; its a one RRF mFromDS1821, F MOVLW .6 ; now delay 60 usecs CALL DELAY_10USEC DECFSZ mDelay, F GOTO IN_BYTE_1 MOVFW mFromDS1821 ; return the result in W RETURN ;********************************************************* OutByte1wire: ; байт из mToDS1821 в термостат ;********************************************************* MOVLW .8 ; 8 циклов - бит MOVWF mDelay OUT_BYTE_1: RRF mToDS1821, F BTFSS STATUS, CR GOTO OUT_0 GOTO OUT_1 OUT_BYTE_2: DECFSZ mDelay, F GOTO OUT_BYTE_1 RETURN ;------------------------------------------- OUT_0: CALL PIN_LO ; порт на выход и вывод в -0- MOVLW .6 ; for 60 usecs CALL DELAY_10USEC CALL PIN_HI ; порт на ввод и вывод в -1- (R=4,7k->+5v) GOTO OUT_BYTE_2 OUT_1: CALL PIN_LO ; порт на выход и вывод в -0- CALL PIN_HI ; порт на ввод и вывод в -1- (R=4,7k->+5v) MOVLW .6 CALL DELAY_10USEC GOTO OUT_BYTE_2 ;********************************************************* PIN_HI: ; порт на ввод ;********************************************************* BSF STATUS, RP0 BSF TRISC, NogDS1821 ; high impedance BCF STATUS, RP0 RETURN ;********************************************************* PIN_LO: ; порт на выход и вывод в -0- ;********************************************************* BCF PORTC, NogDS1821 BSF STATUS, RP0 BCF TRISC, NogDS1821 ; low impedance zero BCF STATUS, RP0 RETURN ;********************************************************* DelayMs: ;********************************************************* OUTTER: MOVLW .110 ; Задержка 1 мс MOVWF wlocal2 INNER: nop16mhz ; макрос 28 пустых операций DECFSZ wlocal2, F GOTO INNER DECFSZ wlocal1, F GOTO OUTTER RETURN ;********************************************************* DELAY_10USEC: ; Задержка определяется как W * 10 мкс ;********************************************************* MOVWF wlocal1 DELAY_10USEC_1: nop16mhz ; макрос 28 пустых операций DECFSZ wlocal1, F GOTO DELAY_10USEC_1 RETURN ;************************************************************** ;///////////////////////////////////////////////////////// ;************************************************************** End ; BrSoft Copyright (C) 2005 Bogdanov Andrew ;**************************************************************