Пару лет назад попал мне в руки ПИК, и мои шаловливые руки начали его ковырять не без вашей помощи. Но отсутствие стимулов в виде реального применения на тот момент отвлекли меня от этого занятия, хотя кое-чему я научился.
Сейчас мое увлечение аквариумистикой дало возможность изготовить нужную вещь - автодолив. (можно купить готовый, но это не интересно)
Естественно столкнулся с трудностями. И так:
Система состоит из 3-х поплавков-герконов. Поплавок замкнут, если он висит, и разомкнут, если плавает.
1-й поплавок - контролирует уровень воды в емкости с осмосом ( чистая вода для долива)
2- других находятся в аквариуме немного на разной высоте.
Логика работы такая:
Если первый поплавок упал, выключаем все что можно, зажигаем светодиод ошибки, ждем, пока нерадивый хозяин нальет воду.
Если упал один поплавок, зажигаем другой светодиод ( готовность) и ждем дальше.
Если упали оба поплавка, включаем помпу, пока оба не всплывут ( для исключения коротковременных включений помпы, что бы не сгорела). Моргаем светодиодом "готовность для визуального контроля - требуется для определения, какой автодолив работает при наличии нескольких банок.
За одно, для контроля работы моргаем еще одним светодиодом, для понимания, что девайс работает.
Далее планирую сделать засыпание контроллера, и еще немного ерунды.
Проблемы:
Пока не трогаю поплавок в резервуаре - все ок. Когда "кончается вода" в симуляции в MPLAB все сбивается на один круг -
при вызове паузы из подпрограммы No_osmos, возврат идет не обратно, а в один из вызовов из основного тела. При заходе на второй круг все возвращается в норму.
На реальном контроллере все еще хуже, и не могу поймать где разница.
после выхода из подпрограммы No_osmos включается помпа не зависимо от положения поплавков (а она включается вроде только в соответствующей подпрограмме) и больше не выключается. При этом, при одном поплавке зеленый индикатор мигает ( подпрограмма долива в работе), при обоих всплывших поплавках индикаторный светодиод горит постоянно и работает помпа.
Но это не зависание на доной строке, как я подумал вначале, т.к. при опускании поплавка индикатор опять начинает мигать.
Очень прошу помочь найти косяк, а так же готов выслушать комментарии по конкретным решениям.
Сама прошивка:
Спойлер
Код: Выделить всё
list p=16F54 ; list directive to define processor
#include <p16f54.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _RC_OSC
;***** VARIABLE DEFINITIONS
;temp EQU 0x07 ;example variable definition
pause EQU 0x07 ; for delays
pause2 EQU 0x08
pause3 EQU 0x09
port_a_temp EQU 0x0a ; PORTA
time EQU 0x0b ;used for define pause
Ch_Float_Count EQU 0x0c ;counters for float normalise
Ch_Float_Osm EQU 0x0d
Ch_Float_1 EQU 0x0e
Ch_Float_2 EQU 0x0f ;_____________
Port_b_tmp EQU 0x10 ;for any case
diag_led EQU 0x11 ;debug var not used now
Float_stat EQU 0x12 ;Float flags bit0 - osmos, bit1 first float bit2...
Float_tmp EQU 0x13 ; used while pump workong
My_flag EQU 0x14; 0-bit - error, 1 - 1_float_flag
;**********************************************************************
ORG 0x1FF ; processor reset vector
goto start
ORG 0x000
;**********************************************************************
;Variable pause
pr_pause MOVLW time
MOVWF pause
MOVLW b'11111111'
MOVWF pause2
MOVWF pause3
timer decfsz pause3,1
GOTO timer
decfsz pause2,1
GOTO timer
decfsz pause,1
GOTO timer
RETURN
;end of pr_pause
;**********************************************************************
;**********************************************************************
; Check float status
Check_float
MOVLW b'00001111'
MOVWF Ch_Float_Count ;set normalise counter
MOVLW b'00000000' ;--------------------
MOVWF Float_stat
MOVWF Ch_Float_Osm ;reset counters
MOVWF Ch_Float_1
MOVWF Ch_Float_2 ;________
Loop DECFSZ Ch_Float_Count ; Wile Ch_Float_Count>0
GOTO contin ;show must go on
;Set float status reg
MOVLW b'00001000' ;constant for normalise
;Osmos level
BCF STATUS,0
SUBWF Ch_Float_Osm,1 ; if float counter more b1000
BTFSC STATUS,0 ; we got STATUS0 =1
BSF Float_stat,0 ; and set bit for osm_float to 1
;first float level
BCF STATUS,0 ;same as Osm_float only for float_1
SUBWF Ch_Float_1,1
BTFSC STATUS,0
BSF Float_stat,1
;second float level
BCF STATUS,0 ;same as Osm_float only for float_2
SUBWF Ch_Float_2,1
BTFSC STATUS,0
BSF Float_stat,2
RETURN
contin MOVF PORTB ;check ports
BTFSC PORTB, 4
INCF Ch_Float_Osm ;incrase counters for each float if need
BTFSC PORTB, 5
INCF Ch_Float_1
BTFSC PORTB, 6
INCF Ch_Float_2
goto Loop
;end of Check_float
;**********************************************************************
;**********************************************************************
;No_osmos
No_osmos BCF port_a_temp,1 ;stop pump
BSF port_a_temp,2 ;raise alarm led
MOVF port_a_temp,0
MOVWF PORTA
Wait_water MOVLW b'11111111'
MOVWF time
call pr_pause
call Check_float
BTFSC Float_stat,0 ;wait wile Osm_float swim up
GOTO Wait_water
BCF port_a_temp,2 ;swich off alarm led
MOVF port_a_temp,0
MOVWF PORTA
RETURN
;end No_osmos
;**********************************************************************
;**********************************************************************
;One_float (switch on RA3 led - green indicator)
One_float
BSF port_a_temp,3
MOVF port_a_temp,0
MOVWF PORTA
RETURN
;end One_float
;**********************************************************************
;**********************************************************************
fulling BSF port_a_temp,1 ;-----------
MOVF port_a_temp,0 ;switch on pump
MOVWF PORTA ;___________
;TODO set timer for ovewer_level
fulling_lp MOVLW b'00000001' ;-----
MOVWF time ;Pause
call pr_pause ;______
BCF port_a_temp,3 ;-----------------
MOVF port_a_temp,0 ;switch off RA3 blink
MOVWF PORTA ;___________________
MOVLW b'00000001' ;-----
MOVWF time ;Pause
call pr_pause ;______
call Check_float
BTFSC Float_stat,0
call No_osmos;
;BCF port_a_temp,2 ;osmos level control
;
BSF port_a_temp,3 ;switch on RA3 blink
BSF port_a_temp,1 ;SW_on pump after No_osmos
MOVF port_a_temp,0 ; This part used for restore
MOVWF PORTA ;pump if No_osmos called
call Check_float
MOVLW b'00000000' ;--------------------
MOVWF Float_tmp ;used only 2 bits
BTFSC Float_stat,1 ; if one float switched on
INCF Float_tmp ; first bit set only
BTFSC Float_stat,2 ; If two float
INCF Float_tmp ;second bit set only
MOVLW b'00000001' ;
BSF STATUS,0 ; STATUS 0 RESET
SUBWF Float_tmp,1 ; Float_tmp - 1 -- If both float off
; 0-1 =-1 STATUS 0 get 0
;________
BTFSS STATUS,0 ; if STATUS 0 get 0
GOTO fulling_lp_end ; stop procedure
;BSF port_a_temp,2
BSF port_a_temp,3 ;switch off RA3 blink
MOVF port_a_temp,0
MOVWF PORTA
GOTO fulling_lp ;loop.
fulling_lp_end
BCF port_a_temp,1 ;pump off
;BCF port_a_temp,2
BCF port_a_temp,3 ;indicator off
MOVF port_a_temp,0
MOVWF PORTA
RETURN
;end fulling
;**********************************************************************
;**********************************************************************
;func
;end func
;**********************************************************************
INIT
MOVLW b'00000000'
tris PORTA
MOVLW b'11111111'
tris PORTB
clrf port_a_temp
MOVLW b'00000000'
MOVWF port_a_temp
MOVWF PORTA
MOVWF My_flag
; MOVWF port_a_temp
RETURN
; remaining code goes here
;**********************************************************************
start
CALL INIT
main
;________________swich on heartbeat LED _______________________
MOVLW b'00000001'
MOVWF time
call pr_pause
BCF port_a_temp,0
MOVF port_a_temp,0
MOVWF PORTA
;________________swich on heartbeat LED end _____________________
call Check_float ; Check_float :-)
BTFSC Float_stat,0 ; if no_osmos
call No_osmos ;No_osmos :-)
BCF port_a_temp,2 ;reset all
BCF port_a_temp,3 ;reset all
MOVLW b'00000000' ;reset all
MOVWF Float_tmp ;reset all
BTFSC Float_stat,1 ; if first float dropped
INCF Float_tmp ;inc Float_tmp
BTFSC Float_stat,2 ;same for second one
INCF Float_tmp
BTFSC Float_tmp,0 ;if only one float dropped - bit0 will set
call One_float
BTFSC Float_tmp,1 ;if both float dropped bit1 will set
call fulling ;start pump & control level
;sleep
;________________swich off heartbeat LED _______________________
MOVLW b'00000001'
MOVWF time
call pr_pause
BSF port_a_temp,0
MOVF port_a_temp, 0
MOVWF PORTA
;________________swich off heartbeat LED end_____________________
Goto main
END 


