Перейти к содержанию

crazz

Рекомендуемые сообщения

Спасибо за оперативный ответ. Я так понимаю, что надёжнее и лучше будет 18-е пики использовать. изделие единичное, не в серию, так что цена микроконтроллера не очень критична. если принять скорость счёта 50 Мгц, переполнения 8мибитного таймера будет происходить каждые 50 000 / 255 = 200кгцб при частоте кристалла 20Мгц instruction cycle будет 5Мгц, итого, каждые 25 инструкций будет переполнение...

Изменено пользователем DJ_Quake
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Начнем с того, что максимальной частотой асинхронного режима будет 30 МГц, а не 50. Т.е. конечно считать будет, но без гарантий.

В 16-х пиках реализация счета на лету программная. Читаем старший байт, затем младший, затем опять старший. Сравниваете первое и последнее показания старшего байта и выясняете наличие межбайтного переноса между чтениями младшего и старшего.

И переполнение будет происходить в 16-разрядных счетчиках раз в 65536 тиков счета... Т.е. при 20 нс периоде счета получится 1,3 мс...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Почеиу при отладке в МПлаб, содержание регистра ОптионР бесконца инкрементируется , даже если даю команду клрф опртионР?

Как очистить регистры в окне Watch, в исходное состояние?

Инкрементируется в пошаговом режиме, то есть на любои команде. В протеусе то же самое.

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

; signpic2.asm      Сигнализация часть2
;PIC16F84А          кварц 4мГц
           list            p=16f84a
           __config        03ff1h
;=====================================
OptionR     equ         01h         ; Option - банк1
Status      equ         03h         ; Регистр Status
PortB       equ         06h         ; Порт B
TrisB       equ         06h         ; Tris B - Банк1
IntCon      equ         0Bh         ; Регистр IntCon

SecL        equ         0ch
SecM        equ         0Dh
SecH        equ         0Eh
Trig        equ         0Fh
St_Temp     equ         10h
W_Temp      equ         11h
Reg         equ         12h         ; Еще счетчик 
;=================================
F           equ         1
RP0         equ         5
           org         0
           goto        START
           org         4  
INT         movwf       W_Temp      ; W в регистр W_Temp.
           movf        Status,W    ; Status в регистр W.
           movwf       St_Temp     ; в регистр Stat_Temp.
           movlw       .255
           movwf       SecM         ; Отсчет 0,5сек
           movlw       .2
           movwf       SecH    
Sec         bsf         PortB,3     ; Звуковои сигнал
           movlw       .166        ; Положит Пол период.
           movwf       SecL
           decfsz      SecL,F
           goto        $-1
           nop
           bcf         PortB,3      ; Отрицат пол период
           movlw       .166
           movwf       SecL
           decfsz      SecL,F
           goto        $-1
           nop
           decfsz      SecM,F
           goto        Sec
           decfsz      SecH,F
           goto        Sec
           incf        Trig,F       ; Инкремент триггера (+1)
           bcf         PortB,4      ; Потух диод.если горел.

EndInt      bcf         IntCon,1     ; Сброс флага прерывания по INT.
           movf        St_Temp,W    ; Скопировать содержимое регистра Stat_Temp в регистр W.
           movwf       Status       ; Скопировать содержимое регистра W в регистр Status.
           swapf       W_Temp,F     ; Поменять местами старший и младший полубайты регистра W_Temp
                                    ; с сохранением результата операции в нем же.
           swapf       W_Temp,W     ; Поменять местами старший и младший полубайты регистра W_Temp
                                    ; с сохранением результата операции в регистре W.
           retfie                   ; Возврат из прерывания.
;=================================
START       bsf         Status,RP0
           clrf        OptionR
           movlw       B'00000000'  ; Вкл подт рег.
           movwf       OptionR      ; Прер по 1/0
           clrf        IntCon
           movlw       B'10010000'  ; Прерывание на INT
           movwf       IntCon       ; Разрешаю. 
           movlw       B'00000011'  ; RB0, RB1 на вход
           movwf       TrisB        ; остальные на выход.
           bcf         Status,RP0 

Deg         bcf         PortB,4      ; Потушим диод ожидания. 
           btfsc       Trig,0       ; Смотрим на триггер
           goto        Ohr          ; если "1" то охраняем
           goto        Deg          ; если "0" то еще-раз
Ohr         btfsc       PortB,1      ; Смотрим на датчик.      
           goto        Alarm        ; Если "1" , то тревога!!!
           goto        Deg          ; Если "0", то еще-раз

Alarm       clrf        IntCon
           movlw       B'10010000'  ; Разрешаю прерывания.
           movwf       IntCon
           clrf        PortB
           bsf         PortB,4      ; Диод ожидания отмены тревоги.
           movlw       .223
           movwf       SecL
           movlw       .187
           movwf       SecM
           movlw       .51
           movwf       SecH
           decfsz      SecL,F
           goto        $-1
           decfsz      SecM,F
           goto        $-3
           decfsz      SecH,F
           goto        $-5
           nop
           btfss       PortB,1     ; Здесь еще на датчик посмотреть надо.
           goto        Deg
           btfss       Trig,0      ; Спрашиваем тригер, на отмену
           goto        Ohr
           bcf         PortB,4     ; Потушим диод ожидания.
           movlw       .5          ; Конст. отчета цикла 
           movwf       Reg         ; времени вызова
VIZOV       bsf         PortB,2     ; Вызов
           movlw       .13
           movwf       SecL
           movlw       .57
           movwf       SecM
           movlw       .16
           movwf       SecH
           decfsz      SecL,F
           goto        $-1
           decfsz      SecM,F
           goto        $-3
           decfsz      SecH,F
           goto        $-5
           nop
           nop
           bcf         PortB,2    ; Конец вызова
Pause       movlw       .101       ; Пауза между нажатиями 50сек
           movwf       SecL       ; интервале 5 минут
           movlw       .167
           movwf       SecM
           movlw       .254
           movwf       SecH
           decfsz      SecL,F
           goto        $-1
           decfsz      SecM,F
           goto        $-3
           decfsz      SecH,F
           goto        $-5
           nop
           nop
           decfsz      Reg,F       ; Декр.что-бы отсчитать 5минут
           goto        VIZOV
           goto        START
           end

2rkihefdat.jpg

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Понятно...

Отчего такая нелюбовь к хедерам? Вы же пишите в МПЛАбе. Так пользуйтесь inc-файлами.

В папке MPASM Suite находится файл p16f84a.inc.

Его нужно присоединить к проекту в окне проекта - ветка хедер-файлов и вписать в шапке кода:

  #include  <p16f84a.inc>

Далее необходимо придерживаться синтаксиса определений регистров из этого хедера, а все свои описания регистров спецназначения из шапки убрать.

Диагноз. Адрес регистра OPTION_REG - 0х81

Вы же смотрите под видом этого регистра содержимое TMR0, который и находится по адресу 0х01

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Но ведь назначая регистрам, одинаковые адреса, при переходе из нулегого банка в первый я имею ввиду адресс 81Н, который должен сработать програмно.( вместо ноля подставляется 8ка) Это делается для того что-б Мплаб не ругался на неправильный выбор банков.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Еще раз. Ничего никому не нужно назначать. Пользуйтесь готовым из хедера.

МПЛАБ не ругается, а предупреждает. Не желаете видеть эти предупреждения - отключите их в шапке директивой:

         errorlevel   -302

Что касается адресов, то они ровно такие, как я Вам написал. Просто в формате команды нет места восьмому разряду адреса операнда, поэтому этот разряд контроллер берет из STATUS, RP0.

Когда Вы смотрите содержимое регистров в Watch или окне SFR, то там отображаются настояшие физические адреса.

То что Вы сделали могу объяснить. Вы назвали именем OptionR регистр с адресом 01. Затем в окне Watch вызвали этот регистр. МПЛАБ посмотрел что за адрес соответствует обозначенному имени и выдал содержимое.

Однако МПЛАБ не забыл показать и настоящий физ.адрес рядом. Это Вас и выдало....:D

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Несомненно вы правы, и я пользовался хеддером, но в этои перввои программе я делал так и не только с этим регистром, так-же ТрисБ и ПортБ прописаны по одинаковым адресам но с ними все работает.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Есть предложение не мудрить, а делать правильно. Что и как Вы делали с Трисами мне не ведомо, но одно могу сказать точно - если разобрать тот код, что с ТРИС, то вполне можно объяснить почему в тот раз у Вас все прокатило.

Дело ведь не в коде. А в том, что Вы смотрите в окне Воча НЕ ТОТ АДРЕС. Не желаете менять подход, смотрите в этом окне 81-ый адрес (можно назначить не имя, а физический адрес в соответствующей колонке окна).

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

y8v6j.jpg

Вобщем запутался, с адресами 01Н и 81Н это не проходит, а 06Н и 86Н все нормально. Ради эксперимента добавил NVH0? смотрите что получается.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Тогда в показанном Вами окошке нажмите стрелку слева сверху на окошке Add SFR и выбирите OPTION_REG

PS Непонятно, зачем Вы занимаетесь мазохизмом. Сделайте как я сказал, чуть скорректируйте имена в соответствии с хедером и не будет никаких проблем...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

спасибо, спасибо, разобрался. Но мне так удобнее, там ведь не так много регистров используется. я вчера ошибся не досмотрел что окне Ватч, регистры ПортБ и ТрисБ по разным адресам, а ОптионР и ТМРО на одном адресе 01Н, вот и запутался. еще и взял подписал адрес 01Н, как ОптионР)))

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

спасибо, спасибо, разобрался. Но мне так удобнее..........

Чем удобнее? :blink: Писать всякую лишнюю хрень в шапке и еще к тому же помнить какой регистр описан, а какой нет... Вы, вероятно, мазохист, все таки...

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Ладно проехали :), вопрос назрел по ходу отладки программы. Можно ли управлять стеком? То-есть записать в него нужный адресс?

Bp прерывания программа уходит в одном случае по одному адресу а в другом по другому.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Нет, стек программно не доступен.

Только я не понял намерений. Нужно возврат делать не в точку выхода, а в другую?

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

В первом случае надо сделать точку выхода по стека, но если произошло прерывание еще раз, то в другую.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Так сделать нельзя.

Так делать порочно, в принципе.

Для управления программой из прерываний пользуются флагами-семафорами.

Скорее всего неверно построена программа вцелом, я имею ввиду взаимодействие прерываний и суперлупа.

Приведите алгоритм, который требует подобных извратов.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

nvwtA.jpg

Ну вот такои алгоритм, не пинаите сильно:)

Тригер (ТРИГ)- это регистр, который инкрементируется в прерывании, в дальнеишем программа ориентируется на него.

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Это ужасно... особенно полсекунды в прерывании...

Давайте подойдем с другого конца. То, что Вы привели - это граф алгоритма, а мне нужен он сам. Т.е. опишите задачу (своими словами) и укажите что является источником прерываний для МК (например внешний пин INT или что другое).

Я Вам набросаю структуру программы...

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

включаем сигналку, кнопкои без фиксации,ждем 10 сек чтоб уити из помещения.

сработал датчик движения, ждем 10 сек, чтоб отменить: если отмена, то в начало

если нет отмены по истечении 10сек, то тревога.

схема должна прояснить кое что

hDi6z.jpg

да, чуть не забыл прерывание на RB0, когда нажимаю кнопку без фиксации регистр инкрементируется, запоминает нажатие, что впоследствие пригождается.

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Первый шаг.

Таймер.

Необходимо сделать системные тики.

Для этого запускаем нулевой таймер с предделителем 256 - получаем прерывания приблизительно через 65 мс. (для кварца 4МГц)

153 прерывания от таймера = 10 сек

В этом прерывании декрементируем переменную задержки(с ограничением до нуля). Т.е. в момент запуска задержки устанавливаем эту переменную в 153, а затем просто контролируем в цикле программы пока она обнулится.

Теперь основной алгоритм.

Первое. Для кнопки и датчика совершенно не нужны прерывания. Скорость обработки суперлупа на несколько порядков выше, чем человек способен уловить задержку реакции программы на кнопку или датчик.

Второе. Создаем машину состояний. Для этого описываем стационарные позиции программы (узлы).

Для описанного алгоритма имеется незавершенность, которая сейчас будет видна.

Итак, узлы:

- нет охраны

- охрана(ожидание)

- охрана(сигнал)

Каждый узел соединяется с другим узлом связью-событием(условием).

На каждый узел создаем свой цикл (вообще если узлов очень много, то цикл лучше иметь общий(универсальный), но в Вашем случае лучше упростить реализацию).

В каждом таком цикле проверяются условия перехода в иные состояния и исполняются задержки.

Незавершенность Вашего алгоритма в отсутствии всех возможных вариантов переходов между узлами...

Вот собственно и все...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Еще раз. Для формирования интервала берете переменную задержки и записываете в нее необходимую задержку равную 65*Т (мс), где Т - переменная задержки. Далее просто опрашиваете эту переменную на предмет равенства нулю...

Пример.

Нужно сделать кнопку со счетом (два или более состояний). значит нужна защита от дребезга.

Выглядит это так.

Опрашиваем кнопку. После фиксации нажатия пишем в переменную задержки 1 или 2. Затем опрашиваем эту переменную, проверяя на ноль. Как только ноль, снова проверяем кнопку. Если осталась нажата (дребезг закончен) - значит делаем по кнопке необходимый счет (инкремент, декремент, инверсию). Псле этого ждем отпускания кнопки. Как только отпускание произошло, снова пишем в переменную задержки 1 или 2. И снова ожидаем нуля этой переменной. Как только ноль, проверяем отжатое состояние кнопки (дребезг закончен), если отжата переходим на начало и ждем нажатия...

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

В тему.

Фрагмент обработчика таймера. Декремент с ограничением по нулю.

delay1 - переменная задержки (их может быть несколько).

..................
movf    delay1,  f
btfss    STATUS, Z
decf     delay1,  f
.................

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...