roboforum.ru

Технический форум по робототехнике.

Как организовать задержку на секунду в Bascom?Wait(ms) врёт

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

Zoom » 01 окт 2009, 10:35

да, за 2 минуты уже сразу набегает отставание. примерно в 1 сек.

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

contr » 01 окт 2009, 11:05

дык кто мешает вместо
пишите в любом из примеров CVAVR строку delay_ms(1000);

написать delay_ms(980)
Как вариант можно использовать и встроенный генератор с коррекцией частоты в нужную сторону.
Однако и это еще не все. Часики обычно строят на базе кварца 32,768 его делить удобно, а коррекция может осуществляется изменением емкости в цепи обвязки.
Еще один вариант - RC генератор WDT и SLEEP. Это удобно если нужны минутные импульсы.

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

blindman » 01 окт 2009, 11:17

удобство деления на 215 при применении МК - несущественно. Основное преимущество часового кварца - то, что у него лучше относительная термостабильность. Подбирать конденсаторы необязательно, можно скорректировать программно. А вот термостабильность диэлектрика этих конденсаторов в обвязке кварца важна.

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

contr » 01 окт 2009, 13:18

я исходил из того, что начинающему программеру на первых порах проще емкость подкрутить - это с любым кварцем работает, чем код подправить.
"Часовые" кварцы на 32768 хорошо стыкуются с постделителями/таймерами. При этом потребление МК минимальное, поскольку большую часть времени он спит, просыпаясь по прерыванию лишь раз в секунду. Да и вообще с НЧ кварцами МК кушает меньше. Для автономных девайсов это существенно. Кроме того, такие кварцы легко найти в часиках и пр. аппаратуре

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

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 раз.

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

contr » 01 окт 2009, 13:43

всяческих кодов очень много.
Просто задайте в своей первой версии Waitms 998

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

EdGull » 01 окт 2009, 14:06

я так понимаю, Zoom не вносит корректировок на время выполнения остального кода

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

Zoom » 01 окт 2009, 14:13

я понимаю, что его нужно приплюсовывать.А как его высчитывать?

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

EdGull » 01 окт 2009, 14:22

его нужно как раз из задержки вычитать

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

boez » 01 окт 2009, 18:40

Вот это и есть фундаментальная проблема кода на задержках - как вычислить время (возможно переменное) выполнения чужой библиотечной функции например вывода на lcd, чтобы затем его учесть? :)

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

galex1981 » 01 окт 2009, 21:48

Только из опыта!

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

contr » 01 окт 2009, 23:03

не знаю как другие выкручиваются, а в MPLab инструмент специальный встроен. Но, частоту кварца указываешь симулятору сам, а реально она может немножко отличаться. Сверхточные часики не отстроишь, а выровнять время исполнения по разным веткам запросто :)

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

blindman » 02 окт 2009, 05:28

Единственный надёжный способ измерения временных интервалов - использовать аппаратный таймер.

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

Zoom » 02 окт 2009, 05:57

Может быть bascom avr не подходит для этого?
Я тут приводил пример программы с таймером, но не совсем понятно это то или нет.

Re: Как организовать задержку на секунду в Bascom?Wait(ms) врёт

EdGull » 02 окт 2009, 08:01

таймер, он и в африке таймер.
причем тут язык?


Rambler\'s Top100 Mail.ru counter