Автодолив для аквариума на PIC16F54, не работает прошивка

Поклонники продукции Microchip Technology Inc тусуются тут.
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Автодолив для аквариума на PIC16F54, не работает прошивка

Сообщение Shk_Alex »

Доброй ночи коты.
Пару лет назад попал мне в руки ПИК, и мои шаловливые руки начали его ковырять не без вашей помощи. Но отсутствие стимулов в виде реального применения на тот момент отвлекли меня от этого занятия, хотя кое-чему я научился.
Сейчас мое увлечение аквариумистикой дало возможность изготовить нужную вещь - автодолив. (можно купить готовый, но это не интересно)

Естественно столкнулся с трудностями. И так:
Система состоит из 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      
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение КРАМ »

С какого перепуга программа будет стартовать с 0х1FF?
И почему с нуля размещен какой то вызов заканчивающийся return ?
Вы понимаете смысл того, что пишите?

Код: Выделить всё

ORG     0x1FF             ; processor reset vector
      goto    start
      ORG     0x000
pr_pause
................
................
     return
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение pyzhman »

ORG 0x1FF
Навеяно, надо полагать, тем, что где-то в конце стоит какая-то команда, которая что-то возвращает.
Docendo discimus
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение КРАМ »

Возможно и навеяно, но по факту там будет goto, а программа начнет с порчи стека.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение dosikus »

КРАМ, ты не застал что ли сию древность? У него вектор сброса там...
Реклама
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Shk_Alex »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3363163#p3363163"]С какого перепуга программа будет стартовать с 0х1FF?[/uquote]
Честно? не до конца. С векторами сброса и прерываний планировал разбираться позже. Конкретно этот кусок списано... эээ... т.е. взят из примеров на сайте микрочипа и из стандартного файла начального к нему.
Если немного разжуете, буду рад.
[quote="КРАМ",url="/forum/viewtopic.php?p=3363163#p3363163"]И почему с нуля размещен какой то вызов заканчивающийся return ?
Вы понимаете смысл того, что пишите?
[/quote]
Я правильно понял по интонации, что мне требуется убрать вызовы ниже основного тела?
Если бы я все понимал я бы не задавал вопросов.
dosikus писал(а):КРАМ, ты не застал что ли сию древность? У него вектор сброса там...
Таки да.

Добавлено after 8 minutes 7 seconds:
Re: Автодолив для аквариума на PIC16F54, не работает прошивка
Ну и еще, если верить симуляции, программа нормальностартует и работает именно до стечения обстоятельств, что процедура Pr_pause вызыаается из процедуры No_osmos.
Практика подтверждает это за тем отличием, что на симуляции все потом выходит на нормальный режим, а на реальном железе где то уходит в разнос не зависая.
Это действительно может быть связано с тем что я неправильно пользуюсь векторами? Если да, то еще раз прошу пояснить. Чуть подробнее.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение КРАМ »

Странно, что Вы не увидели, что стартовая позиция симулятора - адрес НОЛЬ.
Все программы для PIC10...PIC16 имеют стандартный код начала программного флеша:

Код: Выделить всё

    ORG  0x000  ; это вектор сброса
  nop
  goto   Start
    ORG  0x004  ; это вектор прерываний
  <код обработчика прерываний>
..............
..............
..............
Start
   <начало программы>
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение dosikus »

КРАМ, здесь шаблон 16F54TMPO.ASM с мЫпЫАСМ ...
Увы, для меня совершенно непонятно -на кой товарищу нужно сношаться с этим г. мамонта...

Код: Выделить всё

    list      p=16F54             ; list directive to define processor
    #include <p16F5x.inc>         ; processor specific variable definitions

    __CONFIG   _CP_OFF & _WDT_OFF & _RC_OSC

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file. 
; See respective data sheet for additional information on configuration word.

;***** VARIABLE DEFINITIONS
TEMP_VAR    UDATA
temp        RES     1             ;example variable definition

;**********************************************************************
RESET_VECTOR   CODE   0x1FF       ; processor reset vector
        goto    start

MAIN    CODE    0x000
start    
        nop                       ; example code
        movlw   0xFF              ; example code
        movwf   temp              ; example code

; remaining code goes here

Изображение
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение КРАМ »

Опаньки, какого же он года?
:dont_know:
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение dosikus »

Точно не помню, я таким в 90х баловался причем был один единственный . Еще были 16С84 ...

Упс, вру . В 90х был 16C54, а 16F54 это его реинкарнация 2003г.
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Shk_Alex »

Как приятно послушать диалог умных и опытных людей. :)) ( ни малейшей иронии в утверждении, если что. )
И так, мы вроде разобрались, что:
КРАМ писал(а):Странно, что Вы не увидели, что стартовая позиция симулятора - адрес НОЛЬ.
Все программы для PIC10...PIC16 имеют стандартный код начала программного флеша:

Код: Выделить всё

    ORG  0x000  ; это вектор сброса
      ORG  0x004  ; это вектор прерываний
 Start
   
У F54 нет вектора прерываний от слова совсем, и мой код не совсем мертвый вроде?
Единственное сомнение у меня в этом направлении осталось в правильности расположения переменных. т.е. вроде и они с нулевого адреса, и программа, а в банке отдельного раздела под переменные я не вижу. Но в примерах опять же было так же.

Но и хотелось бы вернуться к первоначальной проблеме.
dosikus писал(а):КРАМ, здесь шаблон 16F54TMPO.ASM с мЫпЫАСМ ...
Увы, для меня совершенно непонятно -на кой товарищу нужно сношаться с этим г. мамонта...
Все же считаю нужным ответить. :-) они мне достались "по наследству" в горсти, и для моей цели (в т.ч. изучение азов работы с МК) меня устраивают. В т.ч. тем что у них нет ни какой переферии, с которой надо пол-года разбираться прежде чем начать хотя-бы моргать светодиодами. Как только освою этот - подумаю, что бы перейти на другие ( так же лежит 16f685 и еще какой то, достаточно современный с 54 ногами. можель не помню, лежит далеко в коробке.)
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Albert_V »

Shk_Alex, Примите мои поздравления. Вам удалось обрушить STACK.
У PIC16F54 только два уровня STACK-а. В вашей программе, после 3-го я уже смотреть не стал.
Из main: call fulling > call No_osmos > call pr_pause
Аватара пользователя
бабай
Друг Кота
Сообщения: 9925
Зарегистрирован: Чт апр 19, 2007 16:10:43
Откуда: г.Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение бабай »

Правило для российского гражданина: Во всем принимай сторону России, независимо от того, кто Россию возглавляет в данный момент, и какая страна или страны ей противостоят. Руководствуйся мудростью: "Россия, - всё, остальное - ничто!"
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Shk_Alex »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3364327#p3364327"]Shk_Alex, Примите мои поздравления. Вам удалось обрушить STACK.
У PIC16F54 только два уровня STACK-а. В вашей программе, после 3-го я уже смотреть не стал.
Из main: call fulling > call No_osmos > call pr_pause[/uquote]

Спасибо.
тут понятнее. Спасибо. Действительно, забыл, что это требуется контролировать.
И три уровня там только в этом месте.
Тогда вопрос. Будут ли правильными прыжки:
Main > fulling > no_osmos > fulling > no_osmos > fulling >no_osmos > fulling > main

Или обязательно спускаться до конца стека?
Main > fulling > no_osmos > fulling > main
Есть ли способы "обойти" эти ограничения?

Добавлено after 4 minutes 2 seconds:
[uquote="бабай",url="/forum/viewtopic.php?p=3364340#p3364340"][/uquote]

Информативно. Но не понятно...
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Albert_V »

Максимум может быть два уровня по CALL от main. Превысите - программа обрушится.
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Shk_Alex »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3364370#p3364370"]Максимум может быть два уровня по CALL от main. Превысите - программа обрушится.[/uquote]

Это я понял, хоть и прощелкал.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Albert_V »

Если там сейчас не более 3-х вложений - перетащите fulling в main.
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Shk_Alex »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3364377#p3364377"]Если там сейчас не более 3-х вложений - перетащите fulling в main.[/uquote]
Лучше немного логику переделаю все-таки. а то запутаюсь с включением выключением... помпу сжечь или воду в аквариум перелить.....

А так всем спасибо за помощь. завалился на ерунде, сам бы не нашел.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение КРАМ »

замените вызовы макросами и можно ничего не переделывать
Shk_Alex
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср сен 24, 2014 11:14:53
Откуда: Москва

Re: Автодолив для аквариума на PIC16F54, не работает прошивк

Сообщение Shk_Alex »

После коррекции все заработало.
Смущает, что при дебаггинге MPLAB ругается cannot be resolved to a valid program memory address
На строках
ORG 0x1FF ; processor reset vector
INIT
CALL INIT


Ну и буду очень благодарен если покажете пальцем где читать, или просто дадите совет по вопросу:
[uquote="Shk_Alex",url="/forum/viewtopic.php?p=3364299#p3364299"]Единственное сомнение у меня в этом направлении осталось в правильности расположения переменных. т.е. вроде и они с нулевого адреса, и программа, а в банке отдельного раздела под переменные я не вижу.[/uquote]

Короче не ломаю ли я как раз правильную адресацию? куда класть переменные правильно?
Ответить

Вернуться в «PIC»