Максимально достижимая задержка с микроконтроллером

Я разрабатываю схему задержки на основе микроконтроллера для реализации задержек в 2 часа, 1 час, 45 минут и 30 минут. Схема автоматически включит реле по истечении этого периода времени.

Я застрял с узким выбором микроконтроллеров, доступных на местном рынке:

  • 89C51
  • 89C52
  • 89С51
  • 89С52
  • 89C2051
  • ПОС 16С71
  • ПОС 16Ф84

Я проверил таблицы данных этих микроконтроллеров, но нет информации о максимальной задержке, которую они могут производить.

Какова максимальная задержка, которую можно получить с этими микроконтроллерами?

Даже 6-контактная серия PIC10 может это сделать. Возможно, вы даже захотите подсчитать количество последовательных тайм-аутов сторожевого таймера, как это предлагается в ответе ниже, если они длиннее, чем максимальное значение таймера 0.
@TheNoble-Coder, важный аспект, какая точность вам нужна?
Я согласен с @kortuk. Если точность является проблемой, то будет сложно получить точный таймер только от микроконтроллера, даже с довольно хорошим кристаллом. Могу ли я порекомендовать хороший модуль RTC? datasheets.maxim-ic.com/en/ds/DS3231.pdf
@CMP, почти все хотят точности, но часто думают о своей точности. Многие люди знают, что очень легко получить +- несколько минут самостоятельно, и предполагают, что микроконтроллер может легко, но надежно получить +-1 минуту за 1 год с микроконтроллером, не зная, что нужно компенсировать, может быть почти невозможно.

Ответы (5)

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

        #include    "P16F88.INC"

#define LED 0

    errorlevel -302     ;suppress "not in bank 0" message

#define RB0 0
#define INIT_COUNT 0    ;gives (255 - 199) * 17.36 = 972 us between interrupts


    cblock  0x20
    tick_counter
    temp    
    endc

    ;reset vector
    org     0
    nop
    goto    main

    ;interrupt vector
    org     4
    banksel INTCON
    bcf     INTCON,TMR0IF   ;clear Timer0 interrupt flag
    movlw   0x00            ;re-initialise count
    movwf   TMR0
    decf    tick_counter,f
    retfie

main:
    banksel OPTION_REG
    movlw   b'00000111'     ;prescaler 1/128
    movwf   OPTION_REG      ;giving 7.3728 Mz/128 = 57600 Hz (period = 17.36 us)
    banksel TMR0
    movlw   0x00            ;initialise timer count value
    movwf   TMR0
    bsf     INTCON,GIE      ;enable global interrupt
    bsf     INTCON,TMR0IE   ;enable Timer0 interrupt
    banksel TRISB
    bcf     TRISB,LED   ;RB0 is LED output
    banksel 0

mainloop:
    goto    mainloop

    bsf     PORTB,LED
    call    dly
    bcf     PORTB,LED
    call    dly 
    goto    mainloop

dly:
    movlw   20
    movwf   tick_counter
dly1:
    movf    tick_counter,f
    skpz
    goto    dly1
    return

    end
Я просто хочу спросить. Верна ли эта концепция, что такая большая задержка не может быть произведена 89c51 или 89c52.
Вы можете использовать ту же технику с любым MCU.
Упс, я думаю, что формат кода нуждается в правке.
У придирчивости есть предел. Учитывая, что ОЗУ и количество регистров конечны, максимальный счет, который вы можете с ними сделать, тоже конечен, хотя и огромен. Ваш ответ хорош, и я уже поставил ему +1.
@Telaclavo - я указал требуемый объем или объем оперативной памяти. На самом деле это немного.
@FakeName Его точка зрения заключается в том, что при любом конечном количестве оперативной памяти существует конечное (хотя и большое) максимальное число, до которого вы можете рассчитывать.

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

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

Каждый байт доступного регистра или оперативной памяти для значения счетчика увеличит доступную задержку в 256 раз. Имея всего 64 байта ОЗУ (у большинства микропроцессоров в несколько раз больше), вы сможете создавать задержки там, где возраст земли меркнет по сравнению с этим.

Спасибо за ответ. На самом деле этот микроконтроллер всего 1 байт (8 бит). Могу ли я производить так много задержки с ним?
@TheNoble-Coder - вы имеете в виду ширину одной операции. Выполняя математические операции в несколько операций, вы можете увеличивать числа почти на пределе вашей памяти, точно так же, как вы можете вручную выполнять многозначные арифметические действия по одному разряду за раз. Таким образом, по существу неограниченный анализ выполняется. FWIW компилятор C будет стремиться обрабатывать математику до 32 бит без каких-либо специальных трюков, выполняя комбинацию операций, необходимых для выполнения этого на 8-битном чипе за кулисами для вас. Вложенные 32-битные циклы for были бы простым в реализации решением, вплоть до коэффициента 4 миллиарда для каждого цикла.
хм. Японял твою точку зрения. Большое спасибо.
Некоторые PIC-контроллеры имеют всего 24 байта оперативной памяти. С другой стороны, 24 байта было бы достаточно, чтобы сосчитать почти до 10^58. Достаточно времени.
Если вы считаете секунды, 16 бит дадут вам около 4,5 часов. С четырьмя возможными настройками вам нужны 2 бита для того, в каком режиме вы находитесь, и, возможно, еще два бита для того, считаете ли вы в данный момент или нет, и текущего состояния вашего реле. Это оставляет вам 21,5 байта ОЗУ для остальной части вашей программы, даже на 24-байтной машине. Трудно, но просто ждать чего-то можно даже в очень ограниченной системе.
@wrosecrans — не забывайте, что вы можете повторно использовать пространство памяти, особенно если вы пишете на ассемблере. Пока вам не нужно делать что-то еще во время ожидания, вы можете использовать одну и ту же оперативную память для нескольких задач.
@wrosecrans Большинство этих действительно крошечных микроконтроллеров используют гарвардские архитектуры и, по крайней мере, имеют отдельные области памяти. 24 байта оперативной памяти отличаются от имеющейся у нее программной памяти.

Другие уже объяснили, что на самом деле нет предела тому, что вы можете сделать, и Fake Name немного жонглировал большими числами, чтобы показать, что 5 байтов будет достаточно на любом контроллере.

Такая трата! :-) Тщательно выбрав микроконтроллер, вы можете использовать свой таймер с задержкой до 9 часов всего с 1 байтом ОЗУ.

Первое, что нужно сделать, это синхронизировать микроконтроллер как можно медленнее. MSP430 может работать с кристаллом 32,768 кГц, что является самым медленным из возможных, если вам нужна точность . (Более медленные часы не будут использовать кристалл.)

Далее используйте прескалеры. MSP430 может предварительно масштабировать частоту кристалла ÷ 8 для создания вспомогательных часов А С л К . А С л К тогда будет 4096 Гц. Вы можете использовать А С л К для тактирования 16-битного таймера, но и здесь у вас есть ÷ 8 вариант предделителя. Это означает, что 16-битный таймер работает на частоте 512 Гц. 2 16 512 ЧАС г = 128 с. Таким образом, используя низкочастотный кварц и два прескалера, таймер будет переполняться каждые 128 секунд. Использование 8-битного счетчика для подсчета количества переполнений таймера позволяет насчитать 256 × 128 с = 32768 с, или более 9 часов, всего с одним байтом.

Nitpick: Предделитель — это тип памяти, так как он имеет внутреннее состояние. Так же и таймеры. :)
@Nick - Но это не оперативная память!
Верно, я просто указываю, что тот факт, что вы не используете системную память, не позволяет вам избежать проблемы, связанной с тем, что верхняя граница счетчика основана на количестве битов состояния.

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

По сути, вы можете создавать большие переменные (например, 32-битные целые числа, 64-битные целые числа) на 8-битном микроконтроллере, распределяя целые числа по нескольким 8-битным сегментам оперативной памяти. Для выполнения сложения или умножения таких чисел требуется несколько операций (поскольку вам нужно перебирать отдельные байты), но скорость здесь не совсем критична, так что это нормально.


Итак, при тактовой частоте 20 МГц, какая переменная вам нужна?

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

20 М час г "=" 20 × 10 6 "=" 20 , 000 , 000
Хорошо, л о г ( 20 , 000 , 000 ) л о г ( 2 ) "=" 24.2534966642115 , поэтому вам нужно ~ 24,25 бита для задержки на одну секунду.
2 часа = 2 * 60 * 60 "=" 7200   секунды, так что вам нужно л о г ( 20 , 000 , 000 * 7 , 200 ) л о г ( 2 ) "=" 37.0672778554286 , поэтому вам нужно 37,06 (или в основном 38 бит) бит оперативной памяти для представления 2-часовой задержки.

Итак... Предполагая, что ваш микроконтроллер имеет не менее 5 байт ОЗУ, все перечисленные устройства будут работать.


Ради интереса давайте посмотрим, как долго long longпродержится 64-битная версия:

2 64 "=" 18 , 446 , 744 , 073 , 709 , 551 , 616
18 , 446 , 744 , 073 , 709 , 551 , 616 / 20 , 000 , 000 "="   922337203685.478     Секунды
922337203685 60 * 60 * 24 * 365 "="   29247.120     годы

Таким образом, имея всего 8 байт памяти, похоже, вам хватит как минимум на следующие 30 тысяч лет.

Что делать, если этого недостаточно?
Представление вашего результата в 15 значащих цифрах нелепо. Даже это не точное значение, так в чем же смысл? Многие люди, похоже, не осознают, как мало 1 в 10 15 является. Даже в одной и той же строке вы пропускаете 11 цифр, делая при этом ошибку округления до 37,06. Итак, вы начинаете с 15 цифр и заканчиваете 4, где последняя неверна...
Продолжительность тропического года составляет около 365,24219 дней. В вашем расчете количества лет, начинающегося с 15 цифр количества секунд, есть ошибка в 4-й цифре. Просто чтобы проиллюстрировать, насколько все это бессмысленно.
@stevenvh - Это то, что выводит мой калькулятор? Я, конечно, не утверждаю, что точный, черт возьми, дрейф в 0,1% в системном генераторе сделает такие длинные задержки очень неточными, не говоря уже о дрейфе в RC-генераторе (если таковой используется).
На самом деле, усечение точности в современном цифровом калькуляторе сложнее, чем просто использование численно точного , но реально неточного значения. я использовал (приблизительный символ TeX).
На самом деле, это просто (несколько) глупое упражнение, показывающее, как мало оперативной памяти требуется для достижения смехотворно больших задержек.
«На самом деле, это просто (несколько) глупое упражнение». Конечно, я согласен с этим. Но даже с   Я ожидаю, что все, кроме, возможно, последней цифры, верны.
@stevenvh - я добавил примечание о том, что вы указываете продолжительность года. Это прямо перед комментариемLastly, this whole exercise is rather silly.
Откровенно говоря, неточность в продолжительности года составляет всего около 0,06%. Я ожидаю, что дрейф осциллятора будет на несколько порядков больше, и это не совсем то, что я могу исправить, увеличив точность используемых констант.
@abdullah - 128 бит дают максимальную задержку   5.4 × 10 23 годы. Этого должно быть достаточно, чтобы сварить эти яйца.
@stevenvh - В этот момент, я думаю, вы можете позволить тепловой смерти вселенной сварить их для вас.
@stevenvh ах, это именно то, что мне нужно, спасибо!

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

Было бы полезно, если бы вы могли объяснить свое предложение подробнее. Сейчас неясно, относится ли это к какому-либо из процессоров из вопроса.