Не советую меня учить что красиво , а что нет. У человека 2 руки и ими он пишет и программу и сообщения. У ТСа явный копипаст. Поэтому он даже не знает в чём написана программа. Если сильно нужно я могу найти эту прогу в инете. И попахивает от него студнем. Красиво прикидывается.
Что за набор файлов в папке проекта? Чем он запускается ?
Это проект MPLAB X
Извините - это я правда не подумал про различие с Х и без Х т.к. в программе без Х я не работал. MPLAB X.
NStorm писал(а):
Не по факту, а в протеусе.
Не только, на окне уже год висит термометр на 18B20 - работает без сбоев - там та же программа и 750 микросекунд. На макетке тоже работает. Может в даташите ошибка?
NStorm писал(а):
PORTDQ equ PORTA TRISDQ equ TRISA
Я не сам, конечно, из головы выдумывал код - а по шпаргалкам и подсказкам в интернете - но не ctrl V+ctrl C, а все вдумчиво и руками написано - где-то встретил что если присваивать имя порту и номеру порта - то потом проще менять код для разных МК, например pic16f676 PORTC, pic16f628А PORTB, и также с ножкой вывода. Про отрицательные значения в термометре написан такой код: Opredelenie_Znaka clrf Ind_Znak;0 movf Temp,0 btfss Temp,7 return incf Ind_Znak,1 comf Temp,0 addlw .1 return Но мне он тут не нужен, т.к. если от датчика получено отрицательное значение - то программа ветвится по goto на включение ножки 5 и далее на начало программы.
T4 equ b'00000100'; 0x04 T6 equ b'11111001'; 0xF9 Это что ?
Это моя задумка реализации условия больше/меньше цифры 4 и 249 записываются в 2 регистра общего назначения. Если из чисел от 0 до 3-х вычесть число 4 - тобудет займ в регистре STATUS - так мы отследим, что число температуры находится от 0 до 4. Далее т.к. в 8-битном регистре максимальное число это 255 То если прибавить число 249 и число больше 6 (от 7 до 255) то в регистре STATUS можно отследить перенос теми же флагами, что и с займом.
Нашел ошибки в своем коде - вот исправленный вариант - но пока еще не работает: bcf STATUS,C bcf STATUS,DC bcf STATUS,Z MOVF T4,0 SUBWF Temp,0 ;vichitanie is Temp-4=? BTFSC STATUS,Z ; 0? goto VKL ; esli 0 to vkl BTFSC STATUS,DC ;proveriaem zaim desyatok goto VKL ;bil zaim to vkl BTFSC STATUS,C ;proveriaem zaim edinic goto VKL ;bil zaim to vkl MOVF Temp,0 ;W=temp bcf STATUS,C bcf STATUS,DC bcf STATUS,Z ADDWF T6,0 ;slozenie temp i 6 BTFSC STATUS,Z ; 0? goto VIKL ; esli 0 to vikl BTFSC STATUS,DC ;proveriaem zaim desyatok goto VIKL ;bil zaim to vikl BTFSC STATUS,C ;proveriaem zaim edinic goto VIKL ;bil zaim to vkl
STATUS,5 - нужно применять однозначные имена флагов C,Z,RP и т.д.
С DC и Z - флаги переноса/заема, десятичного переноса/заема и нулевого результата, 0, 1 и 2 RP5 и RP6 флаги выбора банка 0,1,2,3 (у pic16f628 4 банка) Имеете ввиду в шапке присваивать значения: С equ 0 DC equ 1 Z equ 2 RP0 equ 5 RP1 equ 6 и дальше использовать имена для наглядности?
Последний раз редактировалось profradio Ср дек 02, 2020 13:35:21, всего редактировалось 1 раз.
3-й вариант правки кода: bcf STATUS,0 bcf STATUS,1 bcf STATUS,2 movlw .4 SUBWF Temp,0 ;vichitanie is W-4=? BTFSC STATUS,2 ; 0? goto VKL ; esli 0 to vkl BTFSC STATUS,1 ;proveriaem zaim desyatok goto VKL ;bil zaim to vkl BTFSC STATUS,0 ;proveriaem zaim edinic goto VKL ;bil zaim to vkl bcf STATUS,0 bcf STATUS,1 bcf STATUS,2 movlw .249 ;slozenie temp i 249 BTFSC STATUS,2 ; 0? goto VIKL ; esli 0 to vikl BTFSC STATUS,1 ;proveriaem zaim desyatok goto VIKL ;bil zaim to vikl BTFSC STATUS,0 ;proveriaem zaim edinic goto VIKL ;bil zaim to vkl
otest писал(а):
T4 equ b'00000100'; T6 equ b'11111001'; Это что ?
Были правы - фигню написал:) Но код все еще не работает - почему если из 7 вычесть 4 - в аккумуляторе W сохраняется 3 - все верно, но 0(С) и 1(DC) бит регистра STATUS равны 1?
Последний раз редактировалось profradio Ср дек 02, 2020 17:13:16, всего редактировалось 1 раз.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
температура задается двумя десятичными цифрами .4 - нижний порог включения 4 градуса и по формулуле 256-6=250 - верхний порог выключения 6 градусов - задумка рабочая.
Удалось отладить и понять ошибки с помощью дебагера - отличная штука!
Причесал код - выкинул лишний флаг DC - он как-то непонятно расписан в документации - оказывается, это займ между полубайтами и лишнюю проверку флага Z при сложении - т.к. 250+6 поднимает флаг С - осталось 13 строчек: movlw .4 bcf STATUS,C bcf STATUS,Z SUBWF Temp,0 ;vichitanie is Temp-4=? BTFSC STATUS,Z ; 0? goto VKL ; esli 0 to vkl BTFSS STATUS,C ;proveriaem zaim edinic goto VKL ;bil zaim to vkl bcf STATUS,C movlw .250 ;slozenie temp i 250 ADDWF Temp,0 BTFSC STATUS,C ;proveriaem zaim edinic goto VIKL ;ne bil zaim to vikl
А если нижний порог вычислять по формуле t + 1 = 5 в моем случае - то код можно сократить до 10 строчек:
movlw .5 bcf STATUS,C SUBWF Temp,0 ;vichitanie is Temp-5=? BTFSS STATUS,C ;proveriaem zaim edinic goto VKL ;bil zaim to vkl bcf STATUS,C movlw .250 ;slozenie temp i 250 ADDWF Temp,0 BTFSC STATUS,C ;proveriaem zaim edinic goto VIKL ;ne bil zaim to vikl
А если не делать гистерезис (вернее он будет в 1 градус 4вкл и до 5выкл и наоборот) - то можно код сократить по одному порогу (допустим как у меня - 4 градуса) до 6 строчек:
movlw .5 bcf STATUS,C SUBWF Temp,0 ;vichitanie is Temp-5=? BTFSS STATUS,C ;proveriaem zaim edinic goto VKL ;bil zaim to vkl goto VIKL ;ne bil zaim to vikl
Думал дело уже в шоколаде - но нет, танцы с бубнами продолжаются! Купил уже второй датчик 18В20 - не могу понять почему не работает. Может быть МК не исправный. В протеусе все работает. На макетке нет. Макетка Посмотрел осциллографом Длительность сигналов совпадает с программируемой Что там считывается не разглядеть, правда, но на выходе МК всегда нули. Последний код:
Не понял? Придумал тест МК - убрать датчик и прочитать при подключенном резисторе к земле и к шине питания - должны прочитаться все нули либо все единицы - читаются только нули. Кажется понял - в данном МК нужно инициализировать PORTA на вход выставляя значение 111 в регистре CMCON movlw .7 movwf CMCON Да, верно - температуру измеряет.
Спасибо за советы! Датчики у меня DS18B20. Я сейчас программирую pic16f628A - такой сейчас нашел у себя. Тему назвал 630 т.к думал делать на нем, но он куда-то задевался. У 630 не нужно было Настраивать CMCON - работало и так. Я тут разобрался почему работает с задержкой 750микросекунд на измерение температуры- на самом деле не работает, сначала выдаётся значение температуры по умолчанию 85 градусов, а далее измерение температуры датчик продолжает и при последующих опросах выдаётся измеренное значение как-бы с запаздыванием. После настройки CMCON Макетка стала измерять температуру (сделал вывод двоичного кода на порт В) при пересчете получается вполне достоверное значение 27 градусов. Завтра доразбираюсь с включением по температуре. Про АЦП почитаю в даташите. В Протеусе схема почему- то работает и без настраивания CMCON - сбивает с толку.
В pic16f628A тоже нет АЦП, так что CMCON достаточно. Ну а протеус... это ж симуляция. Там не вся периферия может симулироваться или могут быть неточности, нельзя ему на 100% доверять. Хотя для отладки логики кода средство хорошее.
Сделал вывод значения температуры в двоичном коде на порт В для наглядности, а вывод термостата на первую ногу МК - RA2. ВКЛ при 4 градусах, ВЫКЛ при 5 градусах. Фото макетки с разной температурой: -1 градус (зеленый светодиод - знак минус) ВКЛ: Плюс 4 градуса ВКЛ Плюс пять градусов ВЫКЛ Теперь вот задумался - тут есть нехороший момент - т.к. я беру только целую часть значения температуры - то при значении 4.99 градуса будет вкл, а при значении 5.0 градусов выкл - может постоянно переключатся туда-сюда - это не хорошо. Думаю самый простой вариант делать 3 градуса вкл (а по факту 3,93 при 12 битной разрядности) а выкл 5 градусов - по факту 5.0.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения