Таймер на ATMega8 в Bascom-AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

а что там разбираться то?используем таймер-кварц 16мгц или 16000000,используем самый большое деление кварца 1024, Тогда таймер будет увеличивать значение каждые (коэффициент/тактовая частота, 1024/16.000.000)=0,064 миллисекунд,используем таймер1,так как он 16-ти битный(считает до 65535),Т0 не подойдет-всего до 255 ,значит таймер будет переполняться каждые 65535*0,064=4,194 сек
отсюда и пляшем,если надо 1 сек,то делаем предустановку,чтоб таймер начинал счет не с 0,а с другого значения

упс,опередили,не буду мешать...
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

ну или так :)
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

pavel1979 писал(а): будет переполняться каждые 65535
кстати каждые 65536
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение 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 вы здесь?
Последний раз редактировалось pavel1979 Вт окт 08, 2013 17:08:19, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

pavel1979, Спасибо за код. Есть вопрос
А если на 4-ре часа, то будет:
Const Timer1pre -224934464 верно?
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

нет не верно,я плохо понимаю синтаксис бейсика,но насколько я уловил - здесь просто отсчитывается интервал в 1 секунду. А подсчет этих самых секунд делаем в основной программе гдето между DO и LOOP
Последний раз редактировалось vek Вт окт 08, 2013 17:15:25, всего редактировалось 1 раз.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

ZN-GAME писал(а):pavel1979, Спасибо за код. Есть вопрос
А если на 4-ре часа, то будет:
Const Timer1pre -224934464 верно?
нет, Timer1pre может быть максимум 65535,для вашего случая(совсем вылетело из головы что реле щелкает каждые 4 часа а не каждую сек) надо ввести переменную типа
Dim Wtime As Word
потом Wtime увеличивать каждую сек и проверять,не достигло ли оно значения 14400(4 часа),эту часть вы уже писали
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

vek писал(а):нет не верно
где не верно?я ж говорю-надо в железе проверить...поправьте если не так-пишу по памяти почти
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение 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 байта без знака?
Если несложно не могли-бы комментарии построчно подписать,для инакоязычных
Последний раз редактировалось vek Вт окт 08, 2013 17:35:07, всего редактировалось 1 раз.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Друг Кота
Аватара пользователя
Сообщения: 4747
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Что то я то же не понял обработку прерывания. Особенно если в основную программу вставлять что то. Задержка ведь на 5 секунд остановит МК. Да и вообще, лучше сразу привыкать к хорошему стилю программирования. В прерываниях настоятельно рекомендуется устанавливать только флаги и, как данном случае, предустановка таймера. Никаких операций в обработчике прерывания делать не стоит. Это не мое мнение - это букварь. Хотя я с букварем согласен.
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Прерывание должно быть быстрым...как понос ;)
И как-бы неплохо с "магическими" числами завязывать с самого начала. вот ZN-GAME и непонял откуда какие числа взялись :)) ,
Последний раз редактировалось vek Вт окт 08, 2013 17:44:29, всего редактировалось 2 раза.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

задержка никак не остановит таймер,его может остановить только команда Stop Timer1 и если питание или кварц отключит
по прерыванию происходит останов таймера,предустановка и старт таймера,все,он тикает,одновременно вкл реле,но это надо исправить-просто инкременировать WTIME и РЕТУРН
Никаких операций в обработчике прерывания делать не стоит. Это не мое мнение - это букварь. Хотя я с букварем согласен.-вкл-выкл реле можно сделать и в основной программе,не важно
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Я правильно понимаю?


Pulse:_________________;входим в обработчик
Stop Timer1____________;| манипуляции
Timer1 = Timer1pre______;| с регистрами
Start Timer1______________ ;| таймера
Set Portd.0 ________________ ;портД.0 = 1
Wait 5 ______;ждем 5 секунд
Reset Portd.0_________________; портД.0 = 0
Return___________;выходим
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Друг Кота
Аватара пользователя
Сообщения: 4747
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Ну про остановку таймера на 5 секунд никто не говорил. Все фоновые процессы продолжают идти. Но основная программа встанет.
Кстати, pavel1979, никак не могу определить ни опыт программирования, ни специализацию. Иногда чуть ли не цитаты из классических учебников, а иногда такие вопросы... Можно узнать?
А понимание vek обработчика совершенно правильное.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение 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,есть в инете хелп на русском не помню где точно,форум какой-то
Последний раз редактировалось pavel1979 Вт окт 08, 2013 17:59:57, всего редактировалось 1 раз.
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Да и проверять нечего,работать будет
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение 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мкС времени.
Последний раз редактировалось vek Вт окт 08, 2013 19:07:29, всего редактировалось 2 раза.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение 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
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

я на асм-е показал как это примерно выглядело-бы у меня

Я правильно расшифровываю?

Pulse:_________вход в обработчик
Stop Timer1__________манипуляции
Timer1 = Timer1pre____с регистрами
Start Timer1___________таймера
Toggle Portd.0________насколько понял - переключить выход портД0
Incr K_______________инкремент переменной К(счетчик событий-прерываний)
F = 1_________________походу ставим флаг
Locate 1 , 1______непойму что это значит
Lcd K_______________________ВЫЗЫВАЕМ ДОЛГУЮ ПОДПРОГРАММУ Lcd ? :shock: :))
Return_________выходим из прерывания?

И это...как сделать такое "сворачивание" текста?
Последний раз редактировалось vek Вт окт 08, 2013 19:06:14, всего редактировалось 2 раза.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Друг Кота
Аватара пользователя
Сообщения: 4747
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

vek писал(а):Locate 1 , 1______непойму что это значит
Lcd K_______________________ВЫЗЫВАЕМ ДОЛГУЮ ПОДПРОГРАММУ Lcd ?
Первая строка - позиционирование курсора на индикаторе (1 колонка, 1 строка).
Вторая - вывод на индикатор значение переменной К.
Вообще то работа с индикатором не быстрый процесс. Относительно, конечно. По сравнению с подпрограммой предложенной vek.
Ответить

Вернуться в «AVR»