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

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

Сообщение pavel1979 »

F = 1_________________походу ставим флаг-да,но в данном случае не ставим
Locate 1 , 1______непойму что это значит-устанавливаем курсор на 1,1(y,x на винстар 0802)
Lcd K_______________________ВЫЗЫВАЕМ ДОЛГУЮ ПОДПРОГРАММУ Lcd ? -и выводим значение переменной
то что она долгая-согласен,можно перенести в основной цикл,я поначалу и ставил его в основной,вот флаг и остался
сейчас приделаю чтоб каждые 4 часа вкл реле на 5 сек

вот0,только пересчитайте делители под свою частоту или поставьте кварц на 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

Config Portd.0 = Output ' реле
Config Portd.1 = Output ' светодиод
Config Timer1 = Timer , Prescale = 1024
Const Timer1pre = 57724 'такт.частота 1024/8000000=0,000128 сек,1 сек/0,000128=7812 ,65536-7812=57724 такта
Const Releon = 14395 'вкл реле через 14395 сек или 3 часа 59 мин 55 сек
Const Releoff = 14400 'выключение реле
Dim K As Integer 'время в сек
Dim F As Bit 'флаг прерывания
Stop Timer1
Timer1 = Timer1pre
On Timer1 Pulse:
Start Timer1
Reset Portd.0
Reset Portd.1
K = 0
F = 0
Cls
Cursor Off
Enable Interrupts
Enable Timer1

Do
If F = 1 Then
Toggle Portd.1
F = 0
Locate 1 , 1
Lcd K
If K = Releon Then Set Portd.0
If K = Releoff Then
K = 0
Reset Portd.0
End If
End If
Loop
End
Pulse:
Stop Timer1
Timer1 = Timer1pre
Start Timer1

Incr K
F = 1

Return
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4747
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

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

Сообщение vek »

:idea: действительно пусть основная программа мультики показывает.Чего-то я зря загрузил процессор проверкой флага на целых 3 такта :)).Нефиг от мультиков отвлекаться. Нужно делать еще быстрее. :)) Надо режим СТС включить. И в прерывании вместо программного сброса счетчика,нужно COUNT++ делать,прерывание на 2 такта короче получится + в основной программе сэкономим 3 такта при отрицательном результате проверки флага.В основной программе останется только сравнивать COUNT==konstanta4hour :)) Не программа,а ракета получается :)
Последний раз редактировалось vek Вт окт 08, 2013 19:43:43, всего редактировалось 1 раз.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

я сам с ними спорил что в прерывании все можно загнать увы-уперлись что занимает много времени и все (не в обиду :) )
версия с лсд-показывает сколько времени прошло с момента последнего откл реле
Спойлер$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

Config Portd.0 = Output ' реле
Config Portd.1 = Output ' светодиод
Config Timer1 = Timer , Prescale = 1024
Const Timer1pre = 57724 'такт.частота 1024/8000000=0,000128 сек,1 сек/0,000128=7812 ,65536-7812=57724 такта
Const Releon = 7 '14395 'вкл реле через 14395 сек или 3 часа 59 мин 55 сек
Const Releoff = 10 '14400 'выключение реле
Declare Sub Tim
Dim K As Integer 'время в сек
Dim F As Bit 'флаг прерывания
Dim Secund As Byte
Dim Minut As Byte
Dim Hour As Byte
Stop Timer1
Timer1 = Timer1pre
On Timer1 Pulse:
Start Timer1
Reset Portd.0
Reset Portd.1
K = 0
F = 0
Secund = 55
Minut = 47
Hour = 23
Cls
Cursor Off
Enable Interrupts
Enable Timer1

Do
If F = 1 Then
Toggle Portd.1
F = 0
Incr Secund
If Secund > 59 Then Call Tim
Locate 1 , 1
If Hour < 10 Then Lcd " "
Lcd Hour ; ":"
If Minut < 10 Then Lcd "0"
Lcd Minut ; ":"
If Secund < 10 Then Lcd "0"
Lcd Secund
If K = Releon Then
Set Portd.0
Locate 2 , 1
Lcd "pe»e іє»"
End If
If K = Releoff Then
K = 0
Locate 2 , 1
Lcd "pe»eіГє»"
Reset Portd.0
End If
End If
Loop
End
Pulse:
Stop Timer1
Timer1 = Timer1pre
Start Timer1

Incr K
F = 1

Return

Sub Tim
Secund = 0
'Reset Secund
Incr Minut
If Minut > 59 Then
Incr Hour
Minut = 0
End If
End Sub
чегобы еще наворотить-самому интересно стало
Последний раз редактировалось pavel1979 Вт окт 08, 2013 20:56:29, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4747
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

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

Сообщение vek »

Как-бы килобайтом не напугал :)))

Const Timer1pre = 57724 'такт.частота 1024/8000000=0,000128 сек,1 сек/0,000128=7812 ,65536-7812=57724 :oops:
А нельзя это все макросом наворотить :) через месяц с трудом вспомнишь откуда какие числа взял :)
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

последняя?вот
внимание=НАШЕЛ ОШИБКУ В ПОСЛЕДНЕ ПРОГРАММЕ,ИСПРАВИЛ
Вложения
Безымян.gif
(91.25 КБ) 648 скачиваний
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

ну и еще одна для тини2313,отличие-прерывание раз в минуту,включение нагрузки через 3 часа 55 мин и после паузы 5 мин отключение,ВНИМАНИЕ-ВКЛЮЧИТЬ ДЕЛИТЕЛЬ НА 8 =CKDIV
Спойлер$regfile = "attiny2313a.dat" 'настройки .включить вфузах делитель на 8,кварц 8 мгц
$crystal = 1000000
$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

Config Portd.0 = Output ' реле
Config Portd.1 = Output ' светодиод
Config Timer1 = Timer , Prescale = 1024
Const Timer1pre = 6943 'такт.частота 1024/1000000=0,001024 сек,1 мин=60 сек/0,001024сек=58593 такта,65536-58593=6943
Const Releon = 235 'вкл реле через 235 мин
Const Releoff = 240 'выключение реле через 240 мин
Declare Sub Tim
Dim K As Integer 'время в сек
Dim F As Bit 'флаг прерывания
Dim Minut As Byte
Dim Hour As Byte
Stop Timer1
Timer1 = Timer1pre
On Timer1 Pulse:
Start Timer1
Reset Portd.0
Reset Portd.1
K = 0
F = 0
Minut = 0
Hour = 0
Cls
Cursor Off
Enable Interrupts
Enable Timer1

Do
Locate 1 , 1
If Hour < 10 Then Lcd " "
Lcd Hour ; ":"
If Minut < 10 Then Lcd "0"
Lcd Minut ; " "
If F = 1 Then
Toggle Portd.1
F = 0
Incr Minut
If Minut > 59 Then
Incr Hour
Minut = 0
End If




If K = Releon Then
Set Portd.0
Locate 2 , 1
Lcd "pe»e іє»"
End If
If K = Releoff Then
K = 0
Minut = 0
Hour = 0
Locate 2 , 1
Lcd "pe»eіГє»"
Reset Portd.0
End If
End If
Loop
End
Pulse:
Stop Timer1
Timer1 = Timer1pre
Start Timer1

Incr K
F = 1

Return
занимает 58 %,если убрать из программы жки-19%
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Так мы быстро проиграем :o Неможет эта фигня занимать полкилобайта без дисплея,с дисплеем ваашпе килобайт с лишним из 2-х.

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

Сообщение pavel1979 »

память тини2313 2048 б,значит без дисплея 2048*18/100=369 байт,можно конечно оптимизировать,я с этим не парюсь-не хватает памяти-беру мк с большимобьемом
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

pavel1979 писал(а): $crystal = 1000000 'настройки .включить вфузах делитель на 8,кварц 8 мгц
...
такт.частота 1024/1000000=0,001024 сек,1 мин=60 сек/0,001024сек=58593 такта,65536-58593=6943
Простите, так насколько? :)) Не совсем понимаю я.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

ZN-GAME писал(а):
pavel1979 писал(а): $crystal = 1000000 'настройки .включить вфузах делитель на 8,кварц 8 мгц
...
такт.частота 1024/1000000=0,001024 сек,1 мин=60 сек/0,001024сек=58593 такта,65536-58593=6943
Простите, так насколько? :)) Не совсем понимаю я.
какая строчка не понятна,1-я или 2=я?
конкретно Ваш случай-мега8 и кварц 16 мгц-
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 16
$swstack = 16
$framesize = 16
Config Timer1 = Timer , Prescale = 1024-предварительное деление частоты кварца,1 такт=1024/16000000=0,064 мсек
таймер т0 не подходит-не хватает коэф деления до 1 сек(таймер т0 8-ми битный,то есть может считать максимум до 0,064мсек*256=16.384 мсек,а нам надо 1 сек=> 1/0,000064=15625)
выбираем таймер т1 который делит максимум до 65536,то есть один цикл займет 0,64*65536=4.194 сек
если так и оставить то прерывание будет вызываться каждые 4,194 сек,а нам нужно 1 сек,то есть 1/0.000064=15625 тиков
таймер после прерывания снова начинает считать с 0 до 65535,при этом произоидет 65536 тиков,а надо 15625,значит таймер заставляем считать не с 0,а с 65536-15625=4991

вообще я делаю как привык,не вдаваясь в подробности,при этом важны строчки $crystal = 16000000 и Prescale = 1024-частота кварца и коэф предварительного деления
затем второе делю на первое-1024/16000000=0,000064
нам нужна 1 сек,делим ее на предыдущий результат 1/0,000064=15625
и,поскольку выбран т1 отнимаем от максимально возможного коэф переполнения таймера (для т0=256,для т1=65536) предыдущ результат
65536-15625=49911-именно это значение и присваиваем начальному значению т1,с которого он будет считать
Const Timer1pre = 49911
Последний раз редактировалось pavel1979 Ср окт 09, 2013 07:41:16, всего редактировалось 1 раз.
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

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

Сообщение pavel1979 »

Я к тому, что у вас указано $crystal = 1000000, но вы говорите, что нужно "включить вфузах делитель на 8,кварц 8 мгц". Если я правильно понимаю, то почему частоты разные?
в данном случае кварц 8 мгц и включен CKDIV-частота кварца делится на 8 и уже потом поступает на ядро мк,в которой работает программа,
далее-
Ведь получится МК будет работать не на 1Мгц, а на 8Мгц и тогда - такт. частота 1024/8000000=0,000128 сек-нет,частота именно 1 мгц,один такт = 1 мкс,но для прерывания включен делитель на 1024-Prescale = 1024,поэтому один такт 1024 мкс или 1,024 мсек(для прерывания,для основной программы он неизменен=1 мкс)
1 мин=60 сек/0,000128сек=468750 такта-нет,вот так 1 мин=60 сек/0,001024=58593
я не знаю как доходчиво обьяснить,учитель из меня никакой :)
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

ZN-GAME писал(а): И кстати, один таймер можно использовать для нескольких функций или только для одной? Например, каждые 4 часа перезагрузка одного реле, каждые 2 - другого. Чисто для теоретического понимания интересно.
вы не совсем поняли наверно смысл прерывания,так...
в данном случае по прерыванию формируются секундные импульсы К и ставится флаг F-признак обновления К и все
само управление в основной программе,там можно ставить хоть сколько условий
If K = Releon1 Then Set Portd.0
If K = Releoff1 Then Reset Portd.0
If K = Releon2 Then Set Portd.1
If K = Releoff2 Then Reset Portd.1
....
If K = Releon8 Then Set Portd.7
If K = Releoff8 Then Reset Portd.7

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

Сообщение vek »

Можно для многих задач одновременно использовать.
Например можно одновременно выдавать ШИМ,попутно прерывание по совпадению с регистром совпадения(ну допустим моргать диодом),а по пути еще и таблицу времени входящих по ICP импульсов создавать.
Т.е. Какая-то задача повешенная на таймер,его не отключает для других задач,просто накладывает некоторые ограничения
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

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

Сообщение vek »

В данной ситуации ничем,и без этого разобрались,сугубо в учебных целях.
самый удобный делитель(как программный,так и аппаратный) - это степень двойки,поделить можно на 2,на 4,8.16.32.....1024...65536.........
Попробуйте делить частоту 32768 на такие числа.Что получиться?
Применяется такой кварц для удобства подсчета времени.
pavel1979 писал(а): кстати,если у Вас мега8,то можно тактировать Timer1 от кварца 32768 гц
Имеется ввиду фишка мега8 - можно тактировать весь камень от одного генератора(у вас 16МГц),
а таймер Т1 имеет свойство - можно и со всеми,а можно и отдельный генератор повесить .
Последний раз редактировалось vek Ср окт 09, 2013 11:32:33, всего редактировалось 1 раз.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

vek писал(а):В данной ситуации ничем,сугубо в учебных целях.
самый удобный делитель(как программный,так и аппаратный) - это степень двойки,поделить можно на 2,на 4,8.16.32.....1024...65536.........
Попробуйте делить частоту 32768 на такие числа.Что получиться?
pavel1979 писал(а): кстати,если у Вас мега8,то можно тактировать Timer1 от кварца 32768 гц
Имеется ввиду фишка мега8 - можно тактировать весь камень от одного генератора(у вас 16МГц),а таймер Т1 - можно и со всеми,а можно и отдельным генератором. Применяется такой кварц для
удобства подсчета времени
и еще добавлю-в BASCOM есть отличная подпрограмма часов
Config Clock = Soft
_sec = 0 : _min = 0 : _hour = 0
Config Timer1 = Counter , Edge = Falling , Prescale = 1 ' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!
все,часы идут,можно сделать как будильники на вкл-выкл реле
If _hour = 4 Then
If _min = 0 Then set portd.0
end if

и не нужно считать коэф деления и назначать подпрограмму прерывания
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

vek писал(а): а таймер Т1 имеет свойство - можно и со всеми,а можно и отдельный генератор повесить .
Теперь стало ясно :)

pavel1979 писал(а):и не нужно считать коэф деления и назначать подпрограмму прерывания
Хм.. так даже проще.

If _hour = 4 Then If _min = 0 Then set portd.0 end if
If _hour = 8 Then If _min = 0 Then set portd.0 end if
If _hour = 12 Then If _min = 0 Then set portd.0 end if
и т.д. верно ведь?
Ответить

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