Страница 1 из 1
Зарядное устройство на PIC16
Добавлено: Сб апр 26, 2014 14:24:16
Chuma_v_Chume
Здравствуйте. В 2012г. закончил институт. В институте проходили контроллеры PIC16, но как и у большинства студентов знания весьма поверхностные. Решил это исправить и написать программу зарядного устройства для кислотных аккумуляторов. Программу написал давно, но вот с отладкой возникли проблемы, при чём такие, что я не как не могу понять как такое вообще бывает:
-при вычитание 1 из 0 командой SUBWF флаг С не взводится.
-не всегда пересылается из аккумулятора константа в переменную
-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh). Выравнивание делал по правому краю.
Если кто то сможет помочь в данных вопросах буду благодарен. Если необходимо скину код программы в ассемблере.
Re: Зарядное устройство на PIC16
Добавлено: Сб апр 26, 2014 14:57:32
dr.doc
Скидывайте код. По участкам помогу, по алгоритму в целом, извиняйте...
Re: Зарядное устройство на PIC16
Добавлено: Сб апр 26, 2014 21:47:08
Chuma_v_Chume
Мне конкретно проверка и нужна по отдельным участкам. Ну и до проверки ШИМа еще не добрался. Сразу приношу извинения за возможные ошибки в орфографии.
Поясню.
Start
Stop
Razrady
Ustanovit
Uvelichit
Umenshit
Regim_Trener
Битовые переменные. Что бы не связываться со стимулами при проверки были переправлены (на время) в обычные переменные.
Прошу проверить работоспособность подпрограммы
;----------------------------------------------------------------------------------------
;------------Подпрограмма Опрос датчиков -----------------------------------------------
;-----------------------------------------------------------------------------------------
oprdatch
И в основном цикле программы при нулевом значении Ua_H флаг С не взводится
bcf STATUS,C ;проверяем напряжение на клеммах не меньше ли оно 1В
movf Ua_H,W
movwf Temp_Ua
movlw .1
subwf Temp_Ua
btfsc STATUS,C
call avariy ;если нет то авария
; btfsc Start ;опрос кнопки старт
btfsc Start,0
Re: Зарядное устройство на PIC16
Добавлено: Вс апр 27, 2014 00:03:28
dr.doc
А у Вас АЦП измеряет сразу в вольтах, раз Вы выполняете вычитание переменной из 1?
По коду:
movf Ua_H,W - скопировали значение
; movwf Temp_Ua - отправили во временный регистр (зачем?)
movlw .1
; subwf Temp_Ua - выполняем (Ua_H-1) с сохранением ответа в Temp_Ua, а можно:
subwf Ua_H,W - ответ сохраняем в аккумуляторе
btfsc STATUS,C - пропустим команду, если Carry очищен (результат отрицательный)
call avariy ;если нет то авария
Re: Зарядное устройство на PIC16
Добавлено: Вс апр 27, 2014 09:08:43
Chuma_v_Chume
Как и все АЦП оно измеряет в попугаях. А уже подпрограммами деления и умножения я перевожу значения в вольты и амперы. Перенос во временную переменную нужен для того что бы значения оставались неизменными (действительные) так как они потом учитываются в последующих ветвлениях. Скажите, а как такое в принципе возможно? Что бы от 0-1 и флаг С не взвелся?
Скажите, не каких фатальных ошибок там нет, типа переполнение памяти или использование переменных зарезервированных программой. По синтаксису то ошибок там нет, но предупреждений много.
Re: Зарядное устройство на PIC16
Добавлено: Вс апр 27, 2014 11:33:44
dr.doc
MPLab пишет предупреждения "как хочет". Т.е. дофига и много.
0-1 и флаг С не взвелся?
- иногда встречается подобный глюк в симуляторе.
переполнение памяти
- для этого поставьте брекпоинт на старт программы - в случае переполнения стека или неверного перехода окажитесь там.
использование переменных зарезервированных программой
- это только регистры специального назначения, либо задействованные компилятором регистры при написании на С.
Re: Зарядное устройство на PIC16
Добавлено: Пн апр 28, 2014 18:02:57
Chuma_v_Chume
А что там на счет настройки АЦП?? Верное?
Re: Зарядное устройство на PIC16
Добавлено: Чт май 01, 2014 15:51:58
dr.doc
Порядок настройки верен, в константы особо не вдавался (номер канала АЦП). Задержка перед преобразованием в 26 мС нужна только после переключения входа мультиплексора (выбора канала АЦП). Если преобразование вести с одного канала, то задержка не нужна.
Re: Зарядное устройство на PIC16
Добавлено: Пт май 02, 2014 16:20:30
Chuma_v_Chume
Ну с задержкой то все ясно. У меня в симуляторе MPLab SIM не получалось 10 циклов, в переменную Caunt не заносилось число 10 и от 0 отнимая 1 получалось число 255 и получалось 255 циклов
Re: Зарядное устройство на PIC16
Добавлено: Чт май 08, 2014 22:08:02
dr.doc
Так это нормально, также устанавливается Carry в STATUS.
Re: Зарядное устройство на PIC16
Добавлено: Сб май 10, 2014 16:20:31
Chuma_v_Chume
Так в том то и дело! Мне надо 10 циклов а не 255. В регистр Caunt не заносится число 10.
Re: Зарядное устройство на PIC16
Добавлено: Чт май 15, 2014 14:48:26
BorisSPB
Chuma_v_Chume писал(а):-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh).
Следует обратить внимание на то что эти регистры находятся в разных банках. И вообще при доступе к
SPECIAL FUNCTION REGISTERS и переменным надо обращать внимание какой банк выбран...
Re: Зарядное устройство на PIC16
Добавлено: Чт май 15, 2014 15:26:58
Хатуль_мадан
dr.doc писал(а):MPLab пишет предупреждения "как хочет". Т.е. дофига и много.
0-1 и флаг С не взвелся?
- иногда встречается подобный глюк в симуляторе.
MPLab обычно предупреждает много о несоответствии банка, все остальные предупреждения желательно анализировать и искать причину.
Флаг С и не должен взводиться! Это флаг переполнения/заема, т.е. при переполнении регистра свыше 255 он устанавливается, в случае заема он сбрасывается в 0. Значит при вычитании от малого числа бОльшего числа он сбросится ( 0-1 результат отрицательный), при вычитании 2-1 он установится, т.е. работает аналогично переполнению при сложении, но с инверсией.
А где "В регистр Caunt не заносится число 10"?
если тут:
Код: Выделить всё
;----------------------------Второй опрос АЦП AN1(Ia)-------------------
clrf Temp_Ia_L
clrf Temp_Ia_H
clrf Caunt
bcf STATUS,Z
bsf STATUS,RP0
movlw .10
movwf Caunt
тогда надо сначала вернуть нулевой банк, или заносить туда число до команды ( bsf STATUS,RP0)
P.S.
Посмотрел далее, похоже всю программу надо пересматривать на соответствие банков, даже в малом кусочке есть ошибки:
Код: Выделить всё
Wait0
btfsc ADCON0,GO ;Ожидание завершения
goto Wait0 ;A/D преобразования
movf ADRESH,W
movwf Ua_H
banksel ADRESL ; (1-банк)
movf ADRESL,W
movwf Ua_L ; (а заносить надо в 0-банке)
NOP
Видел в программе разрешение прерываний, а самого обработчика по 0004 адресу нет.
Попадаются переходы к П.П. по goto а выход через return (явный глюк)
Дальше смотрите сами. Всю программу проверять долго....
Очень рекомендую почитать
статьи тут.
Re: Зарядное устройство на PIC16
Добавлено: Пн май 19, 2014 11:18:39
BOB51
При вычитании флаг С у среднемладших (и нетолько) ведет себя несколько "нестандартно" относительно аналогичных ситуаций у INTEL8080/Z80/MCS51&AVR(tiny/mega) - на то они и PICи!
Еще разок самолапную шпору приложу:

Re: Зарядное устройство на PIC16
Добавлено: Пн май 19, 2014 16:32:21
Guaho_150
По флагу С согласен, с ним МикроЧип-овцы перемудрили. После Z80 и i286 так и не привык, поэтому использую макросы:
Код: Выделить всё
;------ Макросы для переходов по состоянию переноса (заём/переполнение)-------------------------------------------
; Здесь надо дать чёткое определение:
; - будем называть заёмом событие, возникающее при вычитании большего числа из меньшего;
; - будем называть переполнением событие, возникающее при сложении, когда результат > 255).
; Введение таких макросов связано с тем, что флаг переноса в процессорах от MICROCHIP
; вопреки здравому смыслу работает по-разному: при заёме он инверсный, а при переполнении байта - неинверсный.
;Переход, если БЫЛ заём.
jza macro metka
btfss STATUS,0
goto metka
endm
;Переход, если НЕ БЫЛО заёма.
jnza macro metka
btfsc STATUS,0
goto metka
endm
;Переход, если БЫЛО переполнение.
jpe macro metka
btfsc STATUS,0
goto metka
endm
;Переход, если НЕ БЫЛО переполнения.
jnpe macro metka
btfss STATUS,0
goto metka
endm
Пример использования в программе:
Код: Выделить всё
movf Ones,w
sublw 72
jnza pskor3 ;Переход, если время оборота - не меньше минимально возможного...
movlw 72
movwf Ones ;...иначе приравниваем его к минимально возможному.