Я разрабатываю схему задержки на основе микроконтроллера для реализации задержек в 2 часа, 1 час, 45 минут и 30 минут. Схема автоматически включит реле по истечении этого периода времени.
Я застрял с узким выбором микроконтроллеров, доступных на местном рынке:
Я проверил таблицы данных этих микроконтроллеров, но нет информации о максимальной задержке, которую они могут производить.
Какова максимальная задержка, которую можно получить с этими микроконтроллерами?
Задержка может быть сколько угодно. Если таймер не дает вам нужной задержки, просто увеличивайте регистр или несколько регистров каждый раз, когда он переполняется. Вот простая программа, использующая 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
Это не указано, потому что любой нормальный микроконтроллер может с помощью программного обеспечения создать практически неограниченную задержку, т. е. гораздо более длительное время, чем есть какие-либо причины ожидать, что схема все еще будет работать или кто-то будет заботиться о результате.
По сути, вы найдете некоторые средства создания короткой задержки, такие как выполнение процессором нескольких инструкций или использование аппаратного таймера, а затем вы используете счетчик, чтобы сделать это столько раз, сколько необходимо, чтобы компенсировать период задержки. ты желаешь.
Каждый байт доступного регистра или оперативной памяти для значения счетчика увеличит доступную задержку в 256 раз. Имея всего 64 байта ОЗУ (у большинства микропроцессоров в несколько раз больше), вы сможете создавать задержки там, где возраст земли меркнет по сравнению с этим.
Другие уже объяснили, что на самом деле нет предела тому, что вы можете сделать, и Fake Name немного жонглировал большими числами, чтобы показать, что 5 байтов будет достаточно на любом контроллере.
Такая трата! :-) Тщательно выбрав микроконтроллер, вы можете использовать свой таймер с задержкой до 9 часов всего с 1 байтом ОЗУ.
Первое, что нужно сделать, это синхронизировать микроконтроллер как можно медленнее. MSP430 может работать с кристаллом 32,768 кГц, что является самым медленным из возможных, если вам нужна точность . (Более медленные часы не будут использовать кристалл.)
Далее используйте прескалеры. MSP430 может предварительно масштабировать частоту кристалла 8 для создания вспомогательных часов . тогда будет 4096 Гц. Вы можете использовать для тактирования 16-битного таймера, но и здесь у вас есть 8 вариант предделителя. Это означает, что 16-битный таймер работает на частоте 512 Гц. = 128 с. Таким образом, используя низкочастотный кварц и два прескалера, таймер будет переполняться каждые 128 секунд. Использование 8-битного счетчика для подсчета количества переполнений таймера позволяет насчитать 256 128 с = 32768 с, или более 9 часов, всего с одним байтом.
Максимально достижимая задержка основана на сочетании системных часов и доступной оперативной памяти.
По сути, вы можете создавать большие переменные (например, 32-битные целые числа, 64-битные целые числа) на 8-битном микроконтроллере, распределяя целые числа по нескольким 8-битным сегментам оперативной памяти. Для выполнения сложения или умножения таких чисел требуется несколько операций (поскольку вам нужно перебирать отдельные байты), но скорость здесь не совсем критична, так что это нормально.
Итак, при тактовой частоте 20 МГц, какая переменная вам нужна?
Я делаю много предположений здесь. Во-первых, я предполагаю паритет часов и инструкций. Многим микроконтроллерам требуется несколько тактовых циклов для выполнения одной инструкции, что снижает эффективную тактовую частоту. Во-вторых, я предполагаю, что ваш базовый счетчик увеличивается с той же скоростью, что и системные часы. Обычно это верно только для аппаратных счетчиков. В-третьих, числа, которые я использую для вещей (продолжительность года и т. д.), являются округленными версиями реальных чисел. Наконец, все это упражнение довольно глупо.
Хорошо,
, поэтому вам нужно ~ 24,25 бита для задержки на одну секунду.
2 часа =
секунды, так что вам нужно
, поэтому вам нужно 37,06 (или в основном 38 бит) бит оперативной памяти для представления 2-часовой задержки.
Итак... Предполагая, что ваш микроконтроллер имеет не менее 5 байт ОЗУ, все перечисленные устройства будут работать.
Ради интереса давайте посмотрим, как долго long long
продержится 64-битная версия:
Секунды
годы
Таким образом, имея всего 8 байт памяти, похоже, вам хватит как минимум на следующие 30 тысяч лет.
Lastly, this whole exercise is rather silly.
У нас есть четыре банка памяти по восемь регистров с r0 по r7 в каждом. Используя любое количество регистров, мы можем сгенерировать задержку даже в 10 часов.
Кенни
Кортук
КапитанКрейг
Кортук