Технический форум по робототехнике.
Zoom » 02 окт 2009, 08:23
Язык не причем,согласен.Но а как секунду получить из процесса изменяющихся чисел 0-65536, причем на 4 мгц и на 8 мгц они бегут по разному?
boez » 02 окт 2009, 10:58
Зачем 65536? Вот для примера как можно настроить даже 8-битный таймер как часы:
кварц 8 МГц
прескалер 64 (после него 125 кГц)
период 125 (частота переполнений таймера 1 кГц)
на таймер прерывание, в прерывании увеличиваем переменную на 1, если досчитала до 1000 - скидываем в 0 и увеличиваем вторую переменную. В первой получаем миллисекунды, во второй секунды. Ну дальше можно и часы-минуты-дни добавлять.
Для кварца 4 МГц прескалер ставим 32, он правда есть токо на втором таймере.
Если таймер 16-битный - то еще проще, 8 МГц, прескалер 256, период таймера 31250 (для 4 МГц - 15625) и переполнение таймера будет возникать раз в секунду, можно просто в основном цикле программы опрашивать флаг overflow и если он стоит - увеличивать переменную "секунды" на 1. Хотя на прерываниях удобнее для основной программы, если в ней хочется делать длинные задержки.
SERGEY_M » 02 окт 2009, 11:04
ща будет вопрос, как задать нужный период переполнения
![Rolling Eyes :roll:](http://roboforum.ru/images/smilies/rolleyes.gif)
boez » 02 окт 2009, 11:25
А вот это уже - читать даташит!
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
Zoom » 02 окт 2009, 13:36
- Код: Выделить всё • Развернуть
$regfile = "m16def.dat" ' specify the used micro
$crystal = 8000000
$lib "lcd4.lib"
Enable Interrupts
Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.2 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
Config Lcd = 16 * 2
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Dim B As Integer
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Int_1 'verzweige bei Timer1 uberlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 31285 'Timer1 soll schon von 34285 wegzahlen
Do
Locate 1 , 1
Lcd B
Loop
End
Int_1: 'ISR von Timer1
Timer1 = 31285 'Timer1 soll wieder von 34285 wegzahlen
B = B + 1
Return
вот процесс по таймеру.
взят с немецкого сайта.
указан интервал в 1 секунду.
В реале - отставание.Что здесь не так?
Последний раз редактировалось
Zoom 02 окт 2009, 14:07, всего редактировалось 8 раз(а).
galex1981 » 02 окт 2009, 13:56
Код заключай пожалуйста в тэг code
Zoom » 02 окт 2009, 14:03
во. вставил тег
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
EdGull » 02 окт 2009, 14:30
отставание на сколько?
Zoom » 02 окт 2009, 14:52
Точно сказать сложно, но за 60 секунд точно на 1 или даже побольше уйдет.
EdGull » 02 окт 2009, 14:54
тактуешся от чего?
Zoom » 02 окт 2009, 15:18
Я так понимаю, что программа задействует 16 битный таймер (делитель 256)
Видать от него и тактуется.
Или вы о кварце? Тогда int 8 mhz
Последний раз редактировалось
Zoom 02 окт 2009, 15:21, всего редактировалось 1 раз.
EdGull » 02 окт 2009, 15:21
я имел ввиду от чего тактуется мега?
Zoom » 02 окт 2009, 15:22
int 8 mhz
EdGull » 02 окт 2009, 15:23
калибровал?
Myp » 02 окт 2009, 15:24
ну и нормально
за 60 секунд там процессор стока тиков сделает что запросто наберётся погрешности на секунду
внутренний кварц отличается особенной неточностью