Страница 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и!
Еще разок самолапную шпору приложу:
шпора_PIC10_12_16.pdf
(39.77 КБ) 200 скачиваний
8)

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		;...иначе приравниваем его к минимально возможному.