Технический форум по робототехнике.
Zoom » 01 окт 2009, 10:35
да, за 2 минуты уже сразу набегает отставание. примерно в 1 сек.
contr » 01 окт 2009, 11:05
дык кто мешает вместо
пишите в любом из примеров CVAVR строку delay_ms(1000);
написать delay_ms(980)
Как вариант можно использовать и встроенный генератор с коррекцией частоты в нужную сторону.
Однако и это еще не все. Часики обычно строят на базе кварца 32,768 его делить удобно, а коррекция может осуществляется изменением емкости в цепи обвязки.
Еще один вариант - RC генератор WDT и SLEEP. Это удобно если нужны минутные импульсы.
blindman » 01 окт 2009, 11:17
удобство деления на 215 при применении МК - несущественно. Основное преимущество часового кварца - то, что у него лучше относительная термостабильность. Подбирать конденсаторы необязательно, можно скорректировать программно. А вот термостабильность диэлектрика этих конденсаторов в обвязке кварца важна.
contr » 01 окт 2009, 13:18
я исходил из того, что начинающему программеру на первых порах проще емкость подкрутить - это с любым кварцем работает, чем код подправить.
"Часовые" кварцы на 32768 хорошо стыкуются с постделителями/таймерами. При этом потребление МК минимальное, поскольку большую часть времени он спит, просыпаясь по прерыванию лишь раз в секунду. Да и вообще с НЧ кварцами МК кушает меньше. Для автономных девайсов это существенно. Кроме того, такие кварцы легко найти в часиках и пр. аппаратуре
Zoom » 01 окт 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
$baud = 19200 ' use baud rate
$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
'*** Config the timer ***
Config Timer1 = Timer , Prescale = 256
' Timer1 is now UP, and an interrupt is only generated
' when the Timer1 register reaches 0
' To get an interrupt every 1000 timer ticks we load the
' TimerStart constant with 65536-1000
Const Timerstart = 65536 - 1000
' Load the TimerStart value into the Timer1 register
Timer1 = TimerStart
' Set the Timer1 interrupt pointer
' The Timer_1_int subroutine is executed when Timer1=0
On Timer1 Timer_1_int
' Enable the use of Timer1
Enable Timer1
' Enable the general use of interrupts
Enable Interrupts
'*** Variables ***
Dim A as Long
Dim A2 as Long
Dim B as Long
Dim B2 as Long
' Dim ShowA as Bit
'***** MAIN LOOP *****
Do
Locate 1 , 1
Lcd B
Loop
'***** END - MAIN LOOP *****
End 'end of Main program
'***** Subroutines and data area *****
'Subroutine which is called when Timer1=0
Timer_1_int:
' AVR Timers do not need a new START command to automatically keep running
' Timer1 is reloaded as to be ready for counting the next time slice
Timer1 = Timerstart
B = B + 1
Return
Нашел тут в инете некоторые исходники и выдернул вот это.
Так вот этот процесс идет по таймеру.Он достигает максимального значения дергает за int и начинается снова.Но все равно на разных мегагерцах разная скорость.Возможно тут надо что-то изменять в prescale.
Но а как из этого получить 1 секунду??
Модератор vooon:Буду бить банхамером если не будешь пользоваться тегом CODE!
Последний раз редактировалось
Zoom 01 окт 2009, 13:43, всего редактировалось 1 раз.
contr » 01 окт 2009, 13:43
всяческих кодов очень много.
Просто задайте в своей первой версии Waitms 998
EdGull » 01 окт 2009, 14:06
я так понимаю, Zoom не вносит корректировок на время выполнения остального кода
Zoom » 01 окт 2009, 14:13
я понимаю, что его нужно приплюсовывать.А как его высчитывать?
EdGull » 01 окт 2009, 14:22
его нужно как раз из задержки вычитать
boez » 01 окт 2009, 18:40
Вот это и есть фундаментальная проблема кода на задержках - как вычислить время (возможно переменное) выполнения чужой библиотечной функции например вывода на lcd, чтобы затем его учесть?
galex1981 » 01 окт 2009, 21:48
Только из опыта!
contr » 01 окт 2009, 23:03
не знаю как другие выкручиваются, а в MPLab инструмент специальный встроен. Но, частоту кварца указываешь симулятору сам, а реально она может немножко отличаться. Сверхточные часики не отстроишь, а выровнять время исполнения по разным веткам запросто
blindman » 02 окт 2009, 05:28
Единственный надёжный способ измерения временных интервалов - использовать аппаратный таймер.
Zoom » 02 окт 2009, 05:57
Может быть bascom avr не подходит для этого?
Я тут приводил пример программы с таймером, но не совсем понятно это то или нет.
EdGull » 02 окт 2009, 08:01
таймер, он и в африке таймер.
причем тут язык?