Зарядное устройство на PIC16
-
Chuma_v_Chume
- Родился
- Сообщения: 6
- Зарегистрирован: Сб апр 26, 2014 14:14:02
Зарядное устройство на PIC16
Здравствуйте. В 2012г. закончил институт. В институте проходили контроллеры PIC16, но как и у большинства студентов знания весьма поверхностные. Решил это исправить и написать программу зарядного устройства для кислотных аккумуляторов. Программу написал давно, но вот с отладкой возникли проблемы, при чём такие, что я не как не могу понять как такое вообще бывает:
-при вычитание 1 из 0 командой SUBWF флаг С не взводится.
-не всегда пересылается из аккумулятора константа в переменную
-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh). Выравнивание делал по правому краю.
Если кто то сможет помочь в данных вопросах буду благодарен. Если необходимо скину код программы в ассемблере.
-при вычитание 1 из 0 командой SUBWF флаг С не взводится.
-не всегда пересылается из аккумулятора константа в переменную
-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh). Выравнивание делал по правому краю.
Если кто то сможет помочь в данных вопросах буду благодарен. Если необходимо скину код программы в ассемблере.
- Реклама
- dr.doc
- Это не хвост, это антенна
- Сообщения: 1368
- Зарегистрирован: Вс мар 28, 2010 12:52:22
- Откуда: Беларусь
Re: Зарядное устройство на PIC16
Скидывайте код. По участкам помогу, по алгоритму в целом, извиняйте...
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
-
Chuma_v_Chume
- Родился
- Сообщения: 6
- Зарегистрирован: Сб апр 26, 2014 14:14:02
Re: Зарядное устройство на PIC16
Мне конкретно проверка и нужна по отдельным участкам. Ну и до проверки ШИМа еще не добрался. Сразу приношу извинения за возможные ошибки в орфографии.
Поясню.
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
Поясню.
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
А у Вас АЦП измеряет сразу в вольтах, раз Вы выполняете вычитание переменной из 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 ;если нет то авария
По коду:
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
Как и все АЦП оно измеряет в попугаях. А уже подпрограммами деления и умножения я перевожу значения в вольты и амперы. Перенос во временную переменную нужен для того что бы значения оставались неизменными (действительные) так как они потом учитываются в последующих ветвлениях. Скажите, а как такое в принципе возможно? Что бы от 0-1 и флаг С не взвелся?
Скажите, не каких фатальных ошибок там нет, типа переполнение памяти или использование переменных зарезервированных программой. По синтаксису то ошибок там нет, но предупреждений много.
Скажите, не каких фатальных ошибок там нет, типа переполнение памяти или использование переменных зарезервированных программой. По синтаксису то ошибок там нет, но предупреждений много.
- Реклама
- dr.doc
- Это не хвост, это антенна
- Сообщения: 1368
- Зарегистрирован: Вс мар 28, 2010 12:52:22
- Откуда: Беларусь
Re: Зарядное устройство на PIC16
MPLab пишет предупреждения "как хочет". Т.е. дофига и много.
- иногда встречается подобный глюк в симуляторе.0-1 и флаг С не взвелся?
- для этого поставьте брекпоинт на старт программы - в случае переполнения стека или неверного перехода окажитесь там.переполнение памяти
- это только регистры специального назначения, либо задействованные компилятором регистры при написании на С.использование переменных зарезервированных программой
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
-
Chuma_v_Chume
- Родился
- Сообщения: 6
- Зарегистрирован: Сб апр 26, 2014 14:14:02
Re: Зарядное устройство на PIC16
А что там на счет настройки АЦП?? Верное?
- dr.doc
- Это не хвост, это антенна
- Сообщения: 1368
- Зарегистрирован: Вс мар 28, 2010 12:52:22
- Откуда: Беларусь
Re: Зарядное устройство на PIC16
Порядок настройки верен, в константы особо не вдавался (номер канала АЦП). Задержка перед преобразованием в 26 мС нужна только после переключения входа мультиплексора (выбора канала АЦП). Если преобразование вести с одного канала, то задержка не нужна.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
-
Chuma_v_Chume
- Родился
- Сообщения: 6
- Зарегистрирован: Сб апр 26, 2014 14:14:02
Re: Зарядное устройство на PIC16
Ну с задержкой то все ясно. У меня в симуляторе MPLab SIM не получалось 10 циклов, в переменную Caunt не заносилось число 10 и от 0 отнимая 1 получалось число 255 и получалось 255 циклов
- dr.doc
- Это не хвост, это антенна
- Сообщения: 1368
- Зарегистрирован: Вс мар 28, 2010 12:52:22
- Откуда: Беларусь
Re: Зарядное устройство на PIC16
Так это нормально, также устанавливается Carry в STATUS.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
-
Chuma_v_Chume
- Родился
- Сообщения: 6
- Зарегистрирован: Сб апр 26, 2014 14:14:02
Re: Зарядное устройство на PIC16
Так в том то и дело! Мне надо 10 циклов а не 255. В регистр Caunt не заносится число 10.
Re: Зарядное устройство на PIC16
Следует обратить внимание на то что эти регистры находятся в разных банках. И вообще при доступе к SPECIAL FUNCTION REGISTERS и переменным надо обращать внимание какой банк выбран...Chuma_v_Chume писал(а):-судя по листингу регистры результата после преобразования АЦП ADRESH и ADRESL имеют одинаковый адрес (1Eh).
- Хатуль_мадан
- Электрический кот
- Сообщения: 1007
- Зарегистрирован: Ср мар 03, 2010 11:48:00
- Откуда: Уфа
Re: Зарядное устройство на PIC16
MPLab обычно предупреждает много о несоответствии банка, все остальные предупреждения желательно анализировать и искать причину.dr.doc писал(а):MPLab пишет предупреждения "как хочет". Т.е. дофига и много.- иногда встречается подобный глюк в симуляторе.0-1 и флаг С не взвелся?
Флаг С и не должен взводиться! Это флаг переполнения/заема, т.е. при переполнении регистра свыше 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 CauntP.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Попадаются переходы к П.П. по goto а выход через return (явный глюк)
Дальше смотрите сами. Всю программу проверять долго....
Очень рекомендую почитать статьи тут.
Re: Зарядное устройство на PIC16
При вычитании флаг С у среднемладших (и нетолько) ведет себя несколько "нестандартно" относительно аналогичных ситуаций у INTEL8080/Z80/MCS51&AVR(tiny/mega) - на то они и PICи!
Еще разок самолапную шпору приложу:
Еще разок самолапную шпору приложу:
Re: Зарядное устройство на PIC16
По флагу С согласен, с ним МикроЧип-овцы перемудрили. После 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 ;...иначе приравниваем его к минимально возможному.

