Страница 2 из 7
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 19:29:27
pavel1979
ZN-GAME писал(а):
Начало
t=0
Портд.0 = 1
If t=14400 то Портд.0 = 0
Подождать 3 секунды
End if
Портд.0 = 1
Конец
так вы уже все и написали, перевести и поправить
Dim t As Integer
t=0
portd.0=0
do
If t=14400 then
portd.0=1
wait 3
portd.0=0
t=0
end if
incr t
wait 1
loop
end
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 19:31:38
vek
Это мы быстро научим.
Давайте начнем с подсчета временных промежутков.
Источником тактового сигнала выберем внутренний генератор. На какой частоте будет работать ваш? Ну допустим 1Мгц.
Удобно использовать таймер в таких целях
Еще там есть таймер Т1,он может досчитать от 0 и максимум до 65535"тиков"
До скольки может досчитать таймер Т1 в секундах?
Правильно: до 1/(1000000/65536) = 0.065536 Сек. мало мне кажется.
Еще в таймере есть такая штука - предделитель. Она может "замедлять" таймер в 1,8,64,256 или 1024
раз.
Допустим берем делитель 1024. Значит таймер может досчитать максимум до
0.065536сек*1024= 67,108864Сек. Вроде ближе к теме. Удобно считать?Не хрень какая-то получилась
А если таймер не будет досчитывать до своего МАХ ? а досчитает скажем до 58593.
Что будет?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 19:35:40
vek
pavel1979 писал(а):
Dim t As Integer
t=0
portd.0=0
do
If t=14400 then
portd.0=1
wait 3
portd.0=0
t=0
end if
incr t
wait 1
loop
end
чего-то недоеду с какой скоростью будет Т инкременироваться?Как компилятор пожелает?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 19:49:37
pavel1979
чего-то недоеду с какой скоростью будет Т инкременироваться?Как компилятор пожелает?
снизу 3 строка-wait 1-задержка 1 сек,задано в упор,компилятор пусть как хочет так и пусть делает,но переменную каждую сек увеличивать будет,главное указать ему тип мк и частоту,которую поставили в фузах
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 19:57:56
vek
А...тут как-то грустно получается....Я считаю делители там всякие,а вы чит-код delay_us()

Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 20:08:21
pavel1979
ну можно и через прерывания,если поставить кварц скажем 8 мгц,задать коэф деления кварца,тогда и выдержки будут стабильнее и т д хорошая обучалка
http://decada.org.ru/project/lessons/bascom_avr/10/
кстати,vek,а что за язык на предыдущей странице?си?или ассемблер?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 20:08:40
vek
pavel1979 писал(а):снизу 3 строка-wait 1-задержка 1 сек,задано в упор
Просто бейсика раньше в глаза не видел,немного растерялся поначалу.Это ведь бейсик?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Пн окт 07, 2013 20:23:22
pavel1979
так и тема Таймер на ATMega8 в Bascom-AVR,практически бейсик,только несколько другой синтаксис
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 03:39:37
vek
ф-ф-ф

А я на себя одеяло тяну

Асм-ы всякие подразумеваю

или С# какие-нибудь

Очень смутно представлял себе что такое баском

А wait - это стандартный макрос? секунды подразумевает? А если мСек или мкСек надо? есть такие?
Какую-то муть пишут,вот цитата от туда "Все прерывания в AVR имеют одинаковый приоритет."
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 07:01:01
pavel1979
vek писал(а):ф-ф-ф

А я на себя одеяло тяну

Асм-ы всякие подразумеваю

или С# какие-нибудь

Очень смутно представлял себе что такое баском

А wait - это стандартный макрос? секунды подразумевает? А если мСек или мкСек надо? есть такие?
Какую-то муть пишут,вот цитата от туда "Все прерывания в AVR имеют одинаковый приоритет."[/quote]
1 сек=wait 1
1миллисек=waitms 1
1 микросек=waitus 1
А по Вашему-если в программе несколько прерываний то какое прерывание главнее(приоритетнее)?здесь как в бане-все одинаковые

Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 09:16:19
AlekseyV
Взлетит?
Код: Выделить всё
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 16
$swstack = 16
$framesize = 16
$noramclear
Dim S As Byte
Config Portb.0 = Output
Config Portb.3 = Output
Rel1 Alias Portb.0
Led1 Alias Portb.3
S = 0
Onof(1) = 14400
Do
If S = 14401 Then
S = 0
Else
Incr S
End If
If S = Onof(1) Then
Rel1 = 1
Wait 3
Rel1 = 0
End If
Led1 = 1
Waitms 500
Led1 = 0
Waitms 434
Loop
End
Return
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 09:34:30
pavel1979
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 16
$swstack = 16
$framesize = 16
$noramclear
Dim S As Byte переменная byte может быть не менее 255,лучше поставить integer-до 65535
Config Portb.0 = Output
Config Portb.3 = Output
Rel1 Alias Portb.0
Led1 Alias Portb.3
S = 0
Onof(1) = 14400 необьявленная переменная
Do
If S = 14401 Then
S = 0
Else
Incr S
End If все пишем в 1 строчку-If S = 14401 Then S = 0 Else Incr S
If S = Onof(1) Then
Rel1 = 1
Wait 3
Rel1 = 0
End If
Led1 = 1
Waitms 500
Led1 = 0
Waitms 434 светодиод будет моргать постоянно
Loop
End
Return
если точность не важна-работать должен
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 10:19:31
vem566
pavel1979 писал(а):Dim S As Byte переменная byte может быть не менее 255,лучше поставить integer-до 65535
Байт - от 0 до 255, во вторых, integer это знаковый тип, поэтому значение его от -32768 до +32767.
Беззнаковый двухбайтовый тип это word.
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 10:24:13
pavel1979
А,точно,и частоту сделать 8 мгц,это частота нового мега8
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 11:23:47
vek
pavel1979 писал(а): А по Вашему-если в программе несколько прерываний то какое прерывание главнее(приоритетнее)?здесь как в бане-все одинаковые

А если одновременно придут прерывание по переполнению Т1 и от компаратора,какое сработает первым.Если приоритет одинаков?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 12:05:30
pavel1979
цитата из справочника bascom:
"Приоритеты прерываний
В микроконтроллерах AVR отсутствует механизм перераспределения векторов прерывания. При наличии условий возникновения нескольких прерываний первым обрабатывается находящееся выше в списке векторов (с меньшим адресом). Когда происходит прерывание, то остальные оказываются автоматически запрещенными, вследствие очистки (сброса) бита I. То есть, по умолчанию, вложенные прерывания невозможны. Обеспечение вложенности прерываний осуществляется программным методом. Для этого достаточно в начале программы обработки прерывания вновь установить бит I."
не сталкивался с таким,кстати,в bascom можно вставлять ассемблерные вставки,можно вообще все написать на асм и откимпилировать,
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 12:29:13
vek
Ну вот и ладненько,а тут
http://decada.org.ru/project/lessons/bascom_avr/10/ как-то в
заблуждение вводят.
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 14:24:00
AlekseyV
Прошил этим:
Код: Выделить всё
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 16
$swstack = 16
$framesize = 16
$noramclear
Dim S As Word
Config Portd.0 = Output
Config Portc.5 = Output
Rel1 Alias Portd.0
Led1 Alias Portc.5
S = 0
Do
If S = 61 Then S = 0 Else Incr S
If S = 60 Then
Rel1 = 1
Waitms 100
Rel1 = 0
End If
Led1 = 1
Waitms 500
Led1 = 0
Waitms 500
Loop
End
Return
Светодиод моргает, но не в такт секунде, т.е. слишком медленно. Пробовал ставить wait 1 - также.
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 14:37:40
vek
Насколько медленно? В 8 раз? в 4 раза?
Re: Таймер на ATMega8 в Bascom-AVR
Добавлено: Вт окт 08, 2013 14:45:18
pavel1979
какие фузы ставили?я както делал кухонный таймер,без кварца,за час отставало минуты на 2-3,этого хватило