Jump to content

crazz
 Share

Recommended Posts

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Goodefine

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

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

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

Link to comment
Share on other sites

Выгодные LED-драйверы MOSO для индустриальных приложений

Компэл представляет выгодные светодиодные драйверы MOSO для промышленных решений с высоким классом защиты от внешних воздействующих факторов, хорошей устойчивостью к импульсным помехам и высокой надежностью. В ряде серий реализована возможность дистанционного контроля, кроме того, отдельные версии драйверов могут программироваться на работу в автономном режиме по заранее заданному сценарию. Рассмотрим подробнее их характеристики. 

Читать статью>>

Goodefine

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

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

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

Это всё ИМХО.

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

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

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

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

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

Link to comment
Share on other sites

ER10450 – литий-тионилхлоридная батарейка FANSO EVE Energy формата ААА
Компания FANSO EVE Energy расширила номенклатуру продукции, разработав новый химический источник тока (ХИТ) – батарейку литий-тионилхлоридной электрохимической системы (Li-SOCl2; номинальное напряжение 3,6 В) типоразмера ААА – ER10450. Батарейка имеет бобинную конструкцию (тип Energy) и предназначена для долговременной работы при малых токах.
Батарейка может применяться в приборах учета ресурсов, в различных датчиках, устройствах IoT и в других приборах и устройствах, в которых требуется компактный ХИТ соответствующей емкости.
Подробнее >>

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

вот что я выдрал из рабочего проекта (на 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

Edited by Alexeyslav

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

Link to comment
Share on other sites

Новое семейство HRP/N3 от MEAN WELL – ИП с 350% перегрузкой для промышленных приложений

В промышленных устройствах и установках с электроприводом на двигателях постоянного тока в момент пуска требуется обеспечить повышенный ток. Для решения этой задачи MEAN WELL предлагает вместо ИП с повышенной избыточной мощностью, более оптимальное решение - источник питания с необходимой перегрузочной способностью семейства HRP/N3. 

Новое семейство, представленное в Компэл, экономичнее и расширяет уже существующее HRP/N в увеличении кратности перегрузки. Подробнее>>

evyXh.jpg

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

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

Edited by Andrey_Ch8

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

Т

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

теперь это в два баита, 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

Link to comment
Share on other sites

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

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

ycadrv9rc5.jpg

Edited by Andrey_Ch8

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Сегодня я вот чего еще написал в прерывании ( через 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раза, потом на старт.   

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

В ОП проверяйте этот флаг , и если он установлен, делайте декремент счётчика. Как только счётчик отсчитал (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

Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • Можно ссылку на этот выключатель массы?
    • Не надо тестер покупать. Есть много способов  измерения индуктивности первички ТВЗ. Например определяем индуктивное сопротивление первички на частоте сети 50Гц. Z=U/I например 220/0,05А = 4400ом.  L= 4400/314 = 14 Гн.  Если ток нечем  измерить,берём включаем  последовательно с первичкой сопротивление любое малоомное например 15ом. Включаем в сеть 220в и  измеряем на резисторе падение напряжения. Оно  будет тем больше - чем  меньше индуктивность  обмотки например получилось 0,5вольт.  0,5v/15ом = 0,033А  Дальше как выше формула. Напряжение 220 вольт разделить на ток. 220/0,033=6666ом / 314=21,2Гн .  А вот в ТОРе  ТВЗ индуктивность  гораздо  больше,потому что вся поверхность сердечника (вся длина магнитной линии) находиться внутри обмотки , обеспечивая максимальную индуктивность. Например у ТВЗ 80 тор, вся первичка имеет ток 1-1,3ма при 220 вольт,считаем  индуктивность В  Ш железе всего 1/3 магнитной лини покрыта обмоткой,  поэтому  индуктивность при том же сечении железа в 5-10 раз меньше,как меньше и мощность в 3-4 раза чем у ТОРа. Это  измеряем  ТВЗ  отдельно от выходного каскада УНЧ. А вот в  УНЧ уже  измеряем  резонансным методом индуктивность,подключив параллельно первичке  конденсатор ,что б образовался резонансный контур с частотою  чем меньше - тем больше индуктивность первички ТВЗ. Реально видим  частоту резонанса,измеряем например в однотакте уже с подмагничиванием рабочим током выходной лампы,видим работу зазора и можем подобрать величину зазора сердечника не  на глазок , а точно подобрать. И не больше и не меньше чем положено. Если на глазок или по формуле ставить зазор - мы обязательно теряем  ИНДУКТИВНОСТЬ. А нам важно получить её максимально  возможной,для  хорошего воспроизведения низких частот. И увеличение зазора и уменьшение от оптимального - ведёт к уменьшению  индуктивности первички.. Аудиодебилы наоборот уменьшают индуктивность,что б появилось много гармоник,звучание становиться насыщенным.Богатый БАС получается!   
    • Нашел ещё один косяк на плате , не пропаян контакт индуктивности ( на фото пометил)  в цепи затвора RD15 , пропаял , собрал в корпус , нагрузил антенной и в путь  , 15 минут работы , ток на фото , температура была 47-49 , потом подключил источник звука температура упала до 37-39 и так и осталась , оставлю пока пусть работает и буду смотреть , т.е. по факту сейчас ток 2,2 температура 40 градусов , вроде как все штатно . Еще вопросик , вот те регуляторы уровня для источников звука и микрофона , если микрофон не использую то его на минимум , тут ясно , а вот левый регулятор как оптимально выставить , я сейчас на источнике звук накрутил а тут на передатчике по серединке поставил , вообще его положение на работу передатчика сильно влияет ? я все переживаю что б не перегревать его   и какой по мощности резистор на 100 кОм на выход поставить ? 0,25 Вт пойдет 
    • Согласен, тут не поспоришь. Ну ок, научите меня пожалуйста... посоветуйте конкретный девайс для зарядки. Если бы ссылочку какую нибудь на него, где можно приобрести тогда был бы вдвойне признателен.
    • КПД ни при чём. Остальное верно.
  • Similar Content

×
×
  • Create New...