Заголовок сообщения: Автодолив для аквариума на PIC16F54, не работает прошивка
Добавлено: Чт апр 26, 2018 01:11:17
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
Доброй ночи коты. Пару лет назад попал мне в руки ПИК, и мои шаловливые руки начали его ковырять не без вашей помощи. Но отсутствие стимулов в виде реального применения на тот момент отвлекли меня от этого занятия, хотя кое-чему я научился. Сейчас мое увлечение аквариумистикой дало возможность изготовить нужную вещь - автодолив. (можно купить готовый, но это не интересно)
Естественно столкнулся с трудностями. И так: Система состоит из 3-х поплавков-герконов. Поплавок замкнут, если он висит, и разомкнут, если плавает. 1-й поплавок - контролирует уровень воды в емкости с осмосом ( чистая вода для долива) 2- других находятся в аквариуме немного на разной высоте. Логика работы такая: Если первый поплавок упал, выключаем все что можно, зажигаем светодиод ошибки, ждем, пока нерадивый хозяин нальет воду. Если упал один поплавок, зажигаем другой светодиод ( готовность) и ждем дальше. Если упали оба поплавка, включаем помпу, пока оба не всплывут ( для исключения коротковременных включений помпы, что бы не сгорела). Моргаем светодиодом "готовность для визуального контроля - требуется для определения, какой автодолив работает при наличии нескольких банок. За одно, для контроля работы моргаем еще одним светодиодом, для понимания, что девайс работает. Далее планирую сделать засыпание контроллера, и еще немного ерунды.
Проблемы: Пока не трогаю поплавок в резервуаре - все ок. Когда "кончается вода" в симуляции в MPLAB все сбивается на один круг - при вызове паузы из подпрограммы No_osmos, возврат идет не обратно, а в один из вызовов из основного тела. При заходе на второй круг все возвращается в норму.
На реальном контроллере все еще хуже, и не могу поймать где разница. после выхода из подпрограммы No_osmos включается помпа не зависимо от положения поплавков (а она включается вроде только в соответствующей подпрограмме) и больше не выключается. При этом, при одном поплавке зеленый индикатор мигает ( подпрограмма долива в работе), при обоих всплывших поплавках индикаторный светодиод горит постоянно и работает помпа. Но это не зависание на доной строке, как я подумал вначале, т.к. при опускании поплавка индикатор опять начинает мигать.
Очень прошу помочь найти косяк, а так же готов выслушать комментарии по конкретным решениям. Сама прошивка: Спойлер
Код:
list p=16F54 ; list directive to define processor #include <p16f54.inc> ; processor specific variable definitions
;********************************************************************** ; 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 ;**********************************************************************
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 _____
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____________________________________
С какого перепуга программа будет стартовать с 0х1FF? И почему с нуля размещен какой то вызов заканчивающийся return ? Вы понимаете смысл того, что пишите?
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Shk_Alex
Заголовок сообщения: Re: Автодолив для аквариума на PIC16F54, не работает прошивк
Добавлено: Пт апр 27, 2018 00:05:11
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
С какого перепуга программа будет стартовать с 0х1FF?
Честно? не до конца. С векторами сброса и прерываний планировал разбираться позже. Конкретно этот кусок списано... эээ... т.е. взят из примеров на сайте микрочипа и из стандартного файла начального к нему. Если немного разжуете, буду рад.
И почему с нуля размещен какой то вызов заканчивающийся return ? Вы понимаете смысл того, что пишите?
Я правильно понял по интонации, что мне требуется убрать вызовы ниже основного тела? Если бы я все понимал я бы не задавал вопросов.
dosikus писал(а):
КРАМ, ты не застал что ли сию древность? У него вектор сброса там...
Таки да.
Добавлено after 8 minutes 7 seconds: Re: Автодолив для аквариума на PIC16F54, не работает прошивка Ну и еще, если верить симуляции, программа нормальностартует и работает именно до стечения обстоятельств, что процедура Pr_pause вызыаается из процедуры No_osmos. Практика подтверждает это за тем отличием, что на симуляции все потом выходит на нормальный режим, а на реальном железе где то уходит в разнос не зависая. Это действительно может быть связано с тем что я неправильно пользуюсь векторами? Если да, то еще раз прошу пояснить. Чуть подробнее.
Странно, что Вы не увидели, что стартовая позиция симулятора - адрес НОЛЬ. Все программы для PIC10...PIC16 имеют стандартный код начала программного флеша:
КРАМ, здесь шаблон 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.
Заголовок сообщения: Re: Автодолив для аквариума на PIC16F54, не работает прошивк
Добавлено: Пт апр 27, 2018 17:19:26
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
Как приятно послушать диалог умных и опытных людей. ( ни малейшей иронии в утверждении, если что. ) И так, мы вроде разобрались, что:
КРАМ писал(а):
Странно, что Вы не увидели, что стартовая позиция симулятора - адрес НОЛЬ. Все программы для PIC10...PIC16 имеют стандартный код начала программного флеша:
Код:
ORG 0x000 ; это вектор сброса ORG 0x004 ; это вектор прерываний Start
У F54 нет вектора прерываний от слова совсем, и мой код не совсем мертвый вроде? Единственное сомнение у меня в этом направлении осталось в правильности расположения переменных. т.е. вроде и они с нулевого адреса, и программа, а в банке отдельного раздела под переменные я не вижу. Но в примерах опять же было так же.
Но и хотелось бы вернуться к первоначальной проблеме.
dosikus писал(а):
КРАМ, здесь шаблон 16F54TMPO.ASM с мЫпЫАСМ ... Увы, для меня совершенно непонятно -на кой товарищу нужно сношаться с этим г. мамонта...
Все же считаю нужным ответить. они мне достались "по наследству" в горсти, и для моей цели (в т.ч. изучение азов работы с МК) меня устраивают. В т.ч. тем что у них нет ни какой переферии, с которой надо пол-года разбираться прежде чем начать хотя-бы моргать светодиодами. Как только освою этот - подумаю, что бы перейти на другие ( так же лежит 16f685 и еще какой то, достаточно современный с 54 ногами. можель не помню, лежит далеко в коробке.)
Shk_Alex, Примите мои поздравления. Вам удалось обрушить STACK. У PIC16F54 только два уровня STACK-а. В вашей программе, после 3-го я уже смотреть не стал. Из main: call fulling > call No_osmos > call pr_pause
_________________ Правило для российского гражданина: Во всем принимай сторону России, независимо от того, кто Россию возглавляет в данный момент, и какая страна или страны ей противостоят. Руководствуйся мудростью: "Россия, - всё, остальное - ничто!"
Shk_Alex, Примите мои поздравления. Вам удалось обрушить STACK. У PIC16F54 только два уровня STACK-а. В вашей программе, после 3-го я уже смотреть не стал. Из main: call fulling > call No_osmos > call pr_pause
Спасибо. тут понятнее. Спасибо. Действительно, забыл, что это требуется контролировать. И три уровня там только в этом месте. Тогда вопрос. Будут ли правильными прыжки: Main > fulling > no_osmos > fulling > no_osmos > fulling >no_osmos > fulling > main
Или обязательно спускаться до конца стека? Main > fulling > no_osmos > fulling > main Есть ли способы "обойти" эти ограничения?
Заголовок сообщения: Re: Автодолив для аквариума на PIC16F54, не работает прошивк
Добавлено: Сб апр 28, 2018 10:45:52
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
После коррекции все заработало. Смущает, что при дебаггинге MPLAB ругается cannot be resolved to a valid program memory address На строках ORG 0x1FF ; processor reset vector INIT CALL INIT
Ну и буду очень благодарен если покажете пальцем где читать, или просто дадите совет по вопросу:
Единственное сомнение у меня в этом направлении осталось в правильности расположения переменных. т.е. вроде и они с нулевого адреса, и программа, а в банке отдельного раздела под переменные я не вижу.
Короче не ломаю ли я как раз правильную адресацию? куда класть переменные правильно?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения