Страница 4 из 7
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 16:09:45
pavel1979
а что там разбираться то?используем таймер-кварц 16мгц или 16000000,используем самый большое деление кварца 1024, Тогда таймер будет увеличивать значение каждые (коэффициент/тактовая частота, 1024/16.000.000)=0,064 миллисекунд,используем таймер1,так как он 16-ти битный(считает до 65535),Т0 не подойдет-всего до 255 ,значит таймер будет переполняться каждые 65535*0,064=4,194 сек
отсюда и пляшем,если надо 1 сек,то делаем предустановку,чтоб таймер начинал счет не с 0,а с другого значения
упс,опередили,не буду мешать...
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 16:24:03
vek
ну или так

Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 16:25:51
vek
pavel1979 писал(а): будет переполняться каждые 65535
кстати каждые 65536
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 16:57:06
pavel1979
ну так то да,переполняется каждые 65536 тактов,а вот считает только до 65535!!!примерно так
' Один из способов создания определенного промежутка времени - не давать таймеру свободно заполняться от 0 до максимального значения, а задавать некоторое ненулевое значение регистра после каждого переполнения. Мы можем выбрать его таким образом, чтобы получить нужное время заполнения от этого значения до максимума:
'нам надо 1 сек,один такт 1024/16000000=0,000064 сек,1 сек/0,000064=15625 тактов
$regfile = "m8def.dat"
$crystal = 16000000
Config Portd.0 = Output ' реле
Config Portc.5 = Output ' светодиод
Config Timer1 = Timer , Prescale = 1024
Const Timer1pre = 49911 '65536-15625=49911
Stop Timer1
Timer1 = Timer1pre
On Timer1 Pulse:
Start Timer1
Reset Portd.0
Wtime = 100
Enable Interrupts
Enable Timer1
Do 'просто мигание светодиодом,можно сюда вставлять вольтметр,термометр,жипиэс и прочее
Set Portc.5
Waitms 500
Reset Portc.5
Waitms 500
Loop
Pulse:
Stop Timer1
Timer1 = Timer1pre
Start Timer1
Set Portd.0
Wait 5
Reset Portd.0
Return
End
'После каждого переполнения Timer1 в его регистр помещается значение 49911, поэтому перед каждым прерыванием он считает от 49911 до 65535. Это занимает (65536 - 49911) * 0,064 = 1 секунд. Изменяя константу Timer1pre, вы можете задать время включения/выключения с точностью 64 микросекунд.
поправил,неправильно посчитал,надо проверять в железе
ZN-GAME вы здесь?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:06:57
AlekseyV
pavel1979, Спасибо за код. Есть вопрос
А если на 4-ре часа, то будет:
Const Timer1pre -224934464 верно?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:09:46
vek
нет не верно,я плохо понимаю синтаксис бейсика,но насколько я уловил - здесь просто отсчитывается интервал в 1 секунду. А подсчет этих самых секунд делаем в основной программе гдето между DO и LOOP
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:13:38
pavel1979
ZN-GAME писал(а):pavel1979, Спасибо за код. Есть вопрос
А если на 4-ре часа, то будет:
Const Timer1pre -224934464 верно?
нет, Timer1pre может быть максимум 65535,для вашего случая(совсем вылетело из головы что реле щелкает каждые 4 часа а не каждую сек) надо ввести переменную типа
Dim Wtime As Word
потом Wtime увеличивать каждую сек и проверять,не достигло ли оно значения 14400(4 часа),эту часть вы уже писали
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:15:07
pavel1979
vek писал(а):нет не верно
где не верно?я ж говорю-надо в железе проверить...поправьте если не так-пишу по памяти почти
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:17:03
vek
Фигня какая-то получается:) я пишу одно - вы отвечаете,в это время я уточняю/правлю текст,вы правите свой....Не форум а каша получилась
pavel1979 писал(а):vek писал(а):нет не верно
где не верно?я ж говорю-надо в железе проверить...поправьте если не так-пишу по памяти почти
Извините.Я просто не правильно понял как работает,говорю-же бесик непонимаю
Pulse:
Stop Timer1
Timer1 = Timer1pre
Start Timer1
Set Portd.0
Wait 5
Reset Portd.0
Return
А это обработчик?Тогда какого лешего в нем программная задержка Wait 5 ?
А Dim Wtime As Word - это 2 байта без знака?
Если несложно не могли-бы комментарии построчно подписать,для инакоязычных
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:33:37
vem566
Что то я то же не понял обработку прерывания. Особенно если в основную программу вставлять что то. Задержка ведь на 5 секунд остановит МК. Да и вообще, лучше сразу привыкать к хорошему стилю программирования. В прерываниях настоятельно рекомендуется устанавливать только флаги и, как данном случае, предустановка таймера. Никаких операций в обработчике прерывания делать не стоит. Это не мое мнение - это букварь. Хотя я с букварем согласен.
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:39:09
vek
Прерывание должно быть быстрым...как понос
И как-бы неплохо с "магическими" числами завязывать с самого начала. вот ZN-GAME и непонял откуда какие числа взялись

,
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:42:04
pavel1979
задержка никак не остановит таймер,его может остановить только команда Stop Timer1 и если питание или кварц отключит
по прерыванию происходит останов таймера,предустановка и старт таймера,все,он тикает,одновременно вкл реле,но это надо исправить-просто инкременировать WTIME и РЕТУРН
Никаких операций в обработчике прерывания делать не стоит. Это не мое мнение - это букварь. Хотя я с букварем согласен.-вкл-выкл реле можно сделать и в основной программе,не важно
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:51:20
vek
Я правильно понимаю?
Pulse:_________________;входим в обработчик
Stop Timer1____________;| манипуляции
Timer1 = Timer1pre______;| с регистрами
Start Timer1______________ ;| таймера
Set Portd.0 ________________ ;портД.0 = 1
Wait 5 ______;ждем 5 секунд
Reset Portd.0_________________; портД.0 = 0
Return___________;выходим
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:53:47
vem566
Ну про остановку таймера на 5 секунд никто не говорил. Все фоновые процессы продолжают идти. Но основная программа встанет.
Кстати, pavel1979, никак не могу определить ни опыт программирования, ни специализацию. Иногда чуть ли не цитаты из классических учебников, а иногда такие вопросы... Можно узнать?
А понимание vek обработчика совершенно правильное.
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:55:08
pavel1979
Pulse: ;входим в обработчик-да
Stop Timer1 ;| манипуляции -останавливаем таймер
Timer1 = Timer1pre ;| -предустановка
Start Timer1 ;| старт таймера
Set Portd.0 ;портД.0 = 1
Wait 5 ;ждем 5 секунд
Reset Portd.0 ; портД.0 = 0
Return ;выходим
достал из полки свой девайс,правда там тини2313,индикатор винстар 0802,попробую проверю свою программу
вот прекрасный ресурс
http://decada.org.ru/project/lessons/bascom_avr/ и вот
http://avr.ru/beginer/bascom,есть в инете хелп на русском не помню где точно,форум какой-то
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 17:57:42
vek
Да и проверять нечего,работать будет
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 18:20:24
vek
Синтаксис вы наверное не поймете,но суть уловить должны,каждая строчка подписана
Я бы сделал типа того на асмблере:
прерывание:
t1_ovf: _____адрес обработчика
ldi tmp,high(CONSTANTA)
out TCNTH,tmp
ldi tmp,low(CONSTANTA)
out TCNTL,tmp___________________за 4 такта вписываем вместо CONSTANTA - нужное начальное
______________ значение таймера
sbr status,1<<ovf_____Ставим флаг (не в SREG!,просто мне такое название нравиться,и я так любой _________из регистров обозвал) - 1 такт
reti____________________Выходим - 4 такта
;жжжжжжжжжжжжжжжжжжжжжжж
где-то в основной программе:
бла
бла
бла
sbrs status,ovf________только если флаг установлен
rjmp metka_1__________ пропустим эту строку,в противном случае прыгай на metka_1
subi countL, low(-1)_______| здесь прибавим к
sbci countH, high(-1)____| счетчику 1
cbr status,ovf________сбросим флаг,результат прерывания обработан
metka_1:
бла
бла
бла
итого обработчик = 5тактов
войти/выйти в/из обработчика = 4+4 = 8 тактов
Прерывание украло (5+8)/16000000=0.8мкС времени.
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 18:41:41
pavel1979
это си или апм?работает тини,ровно сек импульсы,правда кварц 8 мгц
Спойлер
$regfile = "attiny2313a.dat" 'настройки
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'$sim
Config Lcdpin = Pin , Rs = Portb.7 , E = Portb.6 , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2
Cls
Config Portd.0 = Output ' реле
Config Timer1 = Timer , Prescale = 1024
Const Timer1pre = 57724 '65536-7812=
Dim K As Integer
Dim F As Bit
Stop Timer1
Timer1 = Timer1pre
On Timer1 Pulse:
Start Timer1
Reset Portd.0
K = 0
F = 0
Cls
Enable Interrupts
Enable Timer1
Do
Loop
End
Pulse:
Stop Timer1
Timer1 = Timer1pre
Start Timer1
Toggle Portd.0
Incr K
F = 1
Locate 1 , 1
Lcd K
Return
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 18:55:35
vek
я на асм-е показал как это примерно выглядело-бы у меня
Я правильно расшифровываю?
Pulse:_________вход в обработчик
Stop Timer1__________манипуляции
Timer1 = Timer1pre____с регистрами
Start Timer1___________таймера
Toggle Portd.0________насколько понял - переключить выход портД0
Incr K_______________инкремент переменной К(счетчик событий-прерываний)
F = 1_________________походу ставим флаг
Locate 1 , 1______непойму что это значит
Lcd K_______________________ВЫЗЫВАЕМ ДОЛГУЮ ПОДПРОГРАММУ Lcd ?
Return_________выходим из прерывания?
И это...как сделать такое "сворачивание" текста?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 19:05:37
vem566
vek писал(а):Locate 1 , 1______непойму что это значит
Lcd K_______________________ВЫЗЫВАЕМ ДОЛГУЮ ПОДПРОГРАММУ Lcd ?
Первая строка - позиционирование курсора на индикаторе (1 колонка, 1 строка).
Вторая - вывод на индикатор значение переменной К.
Вообще то работа с индикатором не быстрый процесс. Относительно, конечно. По сравнению с подпрограммой предложенной
vek.