Зарядное устройство на PIC16

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Chuma_v_Chume
Родился
Сообщения: 6
Зарегистрирован: Сб апр 26, 2014 14:14:02

Зарядное устройство на PIC16

Сообщение Chuma_v_Chume »

Здравствуйте. В 2012г. закончил институт. В институте проходили контроллеры PIC16, но как и у большинства студентов знания весьма поверхностные. Решил это исправить и написать программу зарядного устройства для кислотных аккумуляторов. Программу написал давно, но вот с отладкой возникли проблемы, при чём такие, что я не как не могу понять как такое вообще бывает:
-при вычитание 1 из 0 командой SUBWF флаг С не взводится.
-не всегда пересылается из аккумулятора константа в переменную
-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh). Выравнивание делал по правому краю.
Если кто то сможет помочь в данных вопросах буду благодарен. Если необходимо скину код программы в ассемблере.
Реклама
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Re: Зарядное устройство на PIC16

Сообщение dr.doc »

Скидывайте код. По участкам помогу, по алгоритму в целом, извиняйте...
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Chuma_v_Chume
Родился
Сообщения: 6
Зарегистрирован: Сб апр 26, 2014 14:14:02

Re: Зарядное устройство на PIC16

Сообщение 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
Вложения
zaradnik.asm
(40.54 КБ) 499 скачиваний
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Re: Зарядное устройство на PIC16

Сообщение 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 ;если нет то авария
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Эиком - электронные компоненты и радиодетали
Chuma_v_Chume
Родился
Сообщения: 6
Зарегистрирован: Сб апр 26, 2014 14:14:02

Re: Зарядное устройство на PIC16

Сообщение Chuma_v_Chume »

Как и все АЦП оно измеряет в попугаях. А уже подпрограммами деления и умножения я перевожу значения в вольты и амперы. Перенос во временную переменную нужен для того что бы значения оставались неизменными (действительные) так как они потом учитываются в последующих ветвлениях. Скажите, а как такое в принципе возможно? Что бы от 0-1 и флаг С не взвелся?
Скажите, не каких фатальных ошибок там нет, типа переполнение памяти или использование переменных зарезервированных программой. По синтаксису то ошибок там нет, но предупреждений много.
Реклама
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Re: Зарядное устройство на PIC16

Сообщение dr.doc »

MPLab пишет предупреждения "как хочет". Т.е. дофига и много.
0-1 и флаг С не взвелся?
- иногда встречается подобный глюк в симуляторе.
переполнение памяти
- для этого поставьте брекпоинт на старт программы - в случае переполнения стека или неверного перехода окажитесь там.
использование переменных зарезервированных программой
- это только регистры специального назначения, либо задействованные компилятором регистры при написании на С.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Chuma_v_Chume
Родился
Сообщения: 6
Зарегистрирован: Сб апр 26, 2014 14:14:02

Re: Зарядное устройство на PIC16

Сообщение Chuma_v_Chume »

А что там на счет настройки АЦП?? Верное?
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Re: Зарядное устройство на PIC16

Сообщение dr.doc »

Порядок настройки верен, в константы особо не вдавался (номер канала АЦП). Задержка перед преобразованием в 26 мС нужна только после переключения входа мультиплексора (выбора канала АЦП). Если преобразование вести с одного канала, то задержка не нужна.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Chuma_v_Chume
Родился
Сообщения: 6
Зарегистрирован: Сб апр 26, 2014 14:14:02

Re: Зарядное устройство на PIC16

Сообщение Chuma_v_Chume »

Ну с задержкой то все ясно. У меня в симуляторе MPLab SIM не получалось 10 циклов, в переменную Caunt не заносилось число 10 и от 0 отнимая 1 получалось число 255 и получалось 255 циклов
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Re: Зарядное устройство на PIC16

Сообщение dr.doc »

Так это нормально, также устанавливается Carry в STATUS.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Chuma_v_Chume
Родился
Сообщения: 6
Зарегистрирован: Сб апр 26, 2014 14:14:02

Re: Зарядное устройство на PIC16

Сообщение Chuma_v_Chume »

Так в том то и дело! Мне надо 10 циклов а не 255. В регистр Caunt не заносится число 10.
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Зарядное устройство на PIC16

Сообщение BorisSPB »

Chuma_v_Chume писал(а):-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh).
Следует обратить внимание на то что эти регистры находятся в разных банках. И вообще при доступе к SPECIAL FUNCTION REGISTERS и переменным надо обращать внимание какой банк выбран...
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1007
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

Re: Зарядное устройство на PIC16

Сообщение Хатуль_мадан »

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 (явный глюк)
Дальше смотрите сами. Всю программу проверять долго....
Очень рекомендую почитать статьи тут.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15574
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Зарядное устройство на PIC16

Сообщение BOB51 »

При вычитании флаг С у среднемладших (и нетолько) ведет себя несколько "нестандартно" относительно аналогичных ситуаций у INTEL8080/Z80/MCS51&AVR(tiny/mega) - на то они и PICи!
Еще разок самолапную шпору приложу:
шпора_PIC10_12_16.pdf
(39.77 КБ) 198 скачиваний
8)
Аватара пользователя
Guaho_150
Открыл глаза
Сообщения: 59
Зарегистрирован: Чт сен 12, 2013 17:10:37

Re: Зарядное устройство на PIC16

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

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