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

crazz

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

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

Подумайте еще, насколько много нужно коментариев чтобы полностью описать работу алгоритма, чтобы он стал понятен любому человеку?

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

Сколько раз встречался с программами котрые необходимо было изменять, но это было крайне сложно сделать из-за очень сокращенного(типа быстрее выполняется?) и не совсем понятного алгоритма.

И потом, если опрашивать таким образом состояние кнопки через интервалы не меньше чем 10мс - никакого антидребезга не нужно.

Учение - изучение правил. Опыт - изучение исключений.

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

Жаль я в си не силен, наверное хороший пример. Хочу разобраться с примером от 623 поста.

Не поиму , почему получилось четыре состояния кнопки из двух

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

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

Goodefine

ИМХО, зачем такие сложности разводить?..

Где Вы там сложности увидели? Нарочно оставил часть кода для примера... Это часть, вписывающаяся по логике и стилю в основную программу. Обычные автоматы состояний, примененные к к линии. В объемной программе, со сложной логикой работы, куда удобнее пользоваться именно таким подходом. И не только в отношении кнопок. Автоматы, при правильном использовании, могут здорово упростить и ускорить программирование. Но к этому надо придти самому...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Goodefine

ИМХО, зачем такие сложности разводить?..

Где Вы там сложности увидели? Нарочно оставил часть кода для примера... Это часть, вписывающаяся по логике и стилю в основную программу. Обычные автоматы состояний, примененные к к линии. В объемной программе, со сложной логикой работы, куда удобнее пользоваться именно таким подходом. И не только в отношении кнопок. Автоматы, при правильном использовании, могут здорово упростить и ускорить программирование. Но к этому надо придти самому...

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

Это всё ИМХО.

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

Вот тут не соглашусь, во первых всё откомментировано, каждая строчка. И что долгого разбираться в двух условиях ? Хотя в принципе каждому своё. :)

Лучше пусть человеку подскажет кто-нибудь кто в асме разбирается, потомучто тут я пасс :).

Придёт my504 и всё объяснит я думаю.

Будьте проще и люди к вам потянутся.

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Коментарии не очень информативны.

вот что я выдрал из рабочего проекта (на 16F84A)

FLAGS           EQU     25h  ; бит 0 - предыдущее состояние датчика двери
                            ; бит 5 - состояние света
FLAGS2          EQU     26h  ; бит 2 - состояние датчика двери

.....
START
{задержка 50мс}
.....
 BCF FLAGS2,2           ;Состояние датчика двери, установить в 0
 BTFSS   PORTB,3        ;Датчик двери 0 - дверь открыта, иначе пропустить следующую команду
 BSF FLAGS2,2           ;1 - дверь открыта
.....
;Проверяем состояние датчика двери если = 1, а предыдущее значение = 0 - дверь открылась
 BTFSC   FLAGS,0        ;на следующую проверку, если бит = 0 (предыдущее состояние)
 GOTO    START_N4
 BTFSS  FLAGS2,2        ;на следующую проверку, если бит = 1 (текущее состояние)
 GOTO   START_N4
   ;Событие - дверь открылась
 MOVLW  B'00100000'     ;Изменяем состояние света (бит 5)
 XORWF  FLAGS
 BTFSS  FLAGS,5         ;если 1 - Включен  свет, пропускаем следующий переход
 GOTO   START_N3        ;0 - Выключен свет,
 CALL TIMERLAMPON       ; запуск таймера плавного включения света
 GOTO START_N4          ; на выход ...
START_N3
 CALL TIMERLAMPOFF         ;запуск таймера плавного выключения света 
START_N4      ;выход из проверки
.....
{много всякого кода}

GOTO   START

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

Учение - изучение правил. Опыт - изучение исключений.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

evyXh.jpg

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

В прерывании декрементирую все переменные задержек, но задержка при отработки кнопки на отпускание 20мс, при выключеном прерывании.

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

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

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

Вот именно что ничего происходить не будет ... такую сигнализацию легко отключить - нажать на кнопку и держать ...

Бери алгоритм что выше приведен, он то самое что тебе нужно. в подпрограммах TIMERLAMPON TIMERLAMPOFF прописываешь отсчет времени на снятие сигнализации и постановку. Это часть алгоритма из работающей схемы дверного выключателя кладовки и подобных помещений. Фактически, состояние "включена лампа" соответствует рабочему режиму сигнализации.

Учение - изучение правил. Опыт - изучение исключений.

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

Потом вместо кнопки сделаю на ключе i-button. Слегка подправил прогу - вместо обычнои временнои задержки- петли, в 20мсек сделал на прерывании.

То-есть, ставлю делитель перед TMR0 1:16, получилось у меня, переполнение таймера за 4мсек, в прерывании декрементирую переменную .5 и получил 20мсек.Правильно? Как таким образом отсчитать 5 минут?

Т

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

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

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

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

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

теперь надо расчитать сколько записывать в два баита,

Если таимер переполняется за 65мс, а в одном баите можно записать 256 значений, то 65х256=16.64секунды.

Нет, с другого боку заиду. мне надо отчитать 5минут =300 000мс. 300000/65=4675

теперь это в два баита, 4675/256=18 вродебы так. Получается в младшем баите =256, а в старшем 18?

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

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

Не надо мудрить с десятичными числами.

Берете калькулятор в винде и переводите число отсчетов в шестнадцатиричную форму. Пара младших цифр будет мл. байтом, а пара старших соответственно старшим.

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

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

Когда это позволяет программа, можно делать более наглядно: организуется счетчик(1-й уровень), который переполняется например за 5 секунд, по его переполнению - выполняется отсчет других счетчиков(2-й уровень) если они активны, при переполнении которых выполняются некоторые действия и отключается признак активности счетчика.

Для счетчиков 2-го уровня так же необходимо где-то хранить признак их активности, чтобы они не срабатывали постоянно.

Этот подход сильно экономит память при необходимости использования нескольких счетчиков длинной выдержки.

так при использовании счетчика размером в 1 байт можно сделать выдержку до 20 минут.

Учение - изучение правил. Опыт - изучение исключений.

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

теперь это в два баита, 4675/256=18 вродебы так. Получается в младшем баите =256, а в старшем 18?
4675 это в хексе h1243, значит старший байт счётчика h12 = 18, а младший h43 = 67. Проверяем, 18*256+67 = 4675 :)

Советую тик сделать более удобным, например 10 ms. Расчитывать задержки будет легче.

Вот что делает компиль Си для 2-х байт:

              		if(!cnt.L--)
  012         DECF 0x23, F
  013         INCFSZ 0x23, W
  014         GOTO 0x19
              		{
               		if(!cnt.H--)
  015         DECF 0x22, F
  016         INCFSZ 0x22, W
  017         GOTO 0x19
              			cnt.flag=1;	// Счётчик отсчитал. Ставим флаг.
  018         BSF 0x24, 0
              		}

  019         NOP

Адрес старшего байта 0x22

Адрес младшего байта 0x23

Подправить немного под себя, за место 019 метку поставить, адреса поменять и т.д..

Хотя, если бы я писал на АСМе, сделал бы по другому. Я бы использовал команду DEСFSZ

DEСFSZ 0x23, F  ; Декремент младшего байта и пропустить если =0
GOTO METKA
DEСFSZ 0x22, F  ; Декремент старшего байта и пропустить если =0
GOTO METKA

BSF 0x24, 0  ; Ставим флаг

METKA
NOP

Вот, как то так :rolleyes:

Хотя мой пример почему то сощитал всего 4419, одного старшего байта нет. Рзбираться не хочеться :)

PS: А, ну всё правильно, код который делает СИшный компиль, учитывает переходы с 00h в FFh, а мой код переходы с 01h в 00h, вот один деремент и пропал.

Чёто меня так зацепило :D

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

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

Как думаете, можно ли в это время отправить микроконтроллер в спячку(SLEEP), не проспит-ли он вторжение?

ycadrv9rc5.jpg

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

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

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

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

Учение - изучение правил. Опыт - изучение исключений.

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

Что делать? Пусть смотрит на датчик каждые 65мс, не пропадать же прерываниям от TMR0?

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

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

Просто микроконтролеру больше нечего делать, когда он ждет срабатывания датчика, две инструкции : btfss Portb,1 и goto $-1, можно конечно еще диодом мигать но ...

Я тут вспомнил, что датчик имеет некоторую инерцию, т.е при срабатывании он еще какое-то время устанавливает на выходе +12, значить контроллеру есть время чтоб проснуться и среагировать?

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

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

Сегодня я вот чего еще написал в прерывании ( через 65мс)

   decfsz      SecL         ; Декр. 50сек.
        goto        $+2          ; Пропустим, если еще не ноль.
        decf        SecH         ; SecL=0, то декр SecH

        ..................       ; дальнейший код

в основнои проге вот что делаю

; Отсчитаем 50секунд между нажатиями кнопки вызов телефона
           movlw      b'00000001'   ; такие данные мне дал калькулятор
           movwf      SecL          ; Младший разряд 50 сек (769)
           movlw      b'00000011'   ; Старший разряд 50сек
           movwf      SecH
           bcf        STATUS,2
           movf       SecL,1
           btfss      STATUS,2      ; SecL=0?
           goto       $-2
           movf       SecH,1 
           btfss      STATUS,2      ; SecH=0?
           goto       $-2
 ; Зациклить это 4раза, потом на старт.   

Не проверял еще в симуляторе, как думаете правильно?

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

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

Датчик оперирует микросекундными интервалами? нет смысла вводить контроллер в спящий режим (прерывание будет его пробуждать), к тому же реагировать мгновенно на любой импульс от датчика не стоит - будет срабатывать от помех. Надо делать не просто проверку, а проверку если датчик выдает импульс больше 20мсек тогда срабатывать. Насколько знаю, логический выход датчиков движения при срабатывании держится минимум 1-2секунды.

Учение - изучение правил. Опыт - изучение исключений.

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

как думаете правильно?
Не правильный подход.

Вам не зря тут говорили (даже пример приводили) о неком флаге, бите состояния вашего счётчика. Заведите бит, он будет флагом состояния.

В ОП проверяйте этот флаг , и если он установлен, делайте декремент счётчика. Как только счётчик отсчитал (SecH=0 и SecL=0), сбрасывайте флаг.

В основном теле выставляйте задержку (запись значений в SecH и SecL) и устанавливайте флаг. Причём именно в такой последовательности - сначала регистры, затем флаг! Далее просто смотрите за этим флагом (ждёте когда он сбросится) и всё, задержка готова.

В обработчике

btfss       Flag,0       ; Проверим флаг
goto        M            ; Если не установлен, то не считаем
decfsz      SecL         ; Декр. 50сек.
goto        M            ; Пропустим, если еще не ноль.
decfsz      SecH         ; SecL=0, то декр SecH
goto        M            ; Пропустим, если еще не ноль.
bcf         Flag,0       ; Сбросили флаг
M
nop
..................       ; дальнейший код

В основном теле

movlw      .1            ; такие данные мне дал калькулятор
movwf      SecL          ; Младший разряд 50 сек (769)
movlw      .4            ; Старший разряд 50 сек (+1!)
movwf      SecH
bsf        Flag,0        ; Установили флаг

btfsc      Flag,0        ; Ждём когда сбросится     
goto       $-1
nop

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

Добрый день всем!

Помогите кто может.

Хочу написать программу для PIC18F452:

Должно быть 4 кнопки (больше, меньше, ввод и обнуление), при помощи которых выводим на 7-ми сегментный индикатор числа от 0 до 99 и в зависимости от введенного числа зажечь определенное количество светодиодов.

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

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

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

Начни с алгоритма. Блок-схемы рисовал? На листе ... ну или при помощи программы Draw или аналогичной... но на листе карандашом лучше - не надо отвлекаться на то чтобы найти как сделать в программе то-се... отвлекает.

Учение - изучение правил. Опыт - изучение исключений.

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

Блок схему я нарисовал.

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

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

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

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

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

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

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

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

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

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

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

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

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