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

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

Сообщение Chuma_v_Chume »

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

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

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

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

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

Сообщение Chuma_v_Chume »

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

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

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

Сообщение Chuma_v_Chume »

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

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

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

Сообщение Chuma_v_Chume »

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

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

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

Сообщение Chuma_v_Chume »

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

Сообщение BorisSPB »

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

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

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

Сообщение BOB51 »

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

Сообщение 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»