Форум myROBOT.ru » Роботы и робототехника » Обо всем » Проблема с настройкой таймера

Страниц (3): [1] 2 3 »
 

1. Artem - 04 Сентября, 2012 - 21:13:06 - перейти к сообщению
Здравствуйте.
Программирую на Бейсик в Баском АВР, нужно настроить таймер что бы он формировал прямоугольные импульсы на выходе через равные промежутки времени. Вот код:
$regfile = "m8def.dat"
$crystal = 1000000
Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle
Compare1a = 222
Config Portb.1 = Output
Start Timer1
Do
Loop
End
Код взял с сайта, поэтому в правильности не уверен, но откомпилировав его ошибок не было, я загрузил его в мк и по идее он должен выдавать прямоугольные импульсы на выходе B1, но он этого не делает, я узнал это подключив светодиод, после того как ничего не произошло я подключил пьезодинамик, результат нулевой.
Затем я подумал, что сгорел порт мк поэтому я заменил его на другой, но результат всё тот же. Грустный
Затем я попробовал заменить код, попробовал заменить значение Compare1a, но всё равно ничего, попробовал объявить его значение после Do но тоже ничего, даже попробовал заменить Portd на PINd но ничего, попробовал запустить таймер в бесконечном цикле, но ничего, всё время результата нет, я не понимаю почему рёв в три ручья
Помогите кто нибудь
Заранее спасибо Улыбка
2. anar - 04 Сентября, 2012 - 21:42:52 - перейти к сообщению
Artem пишет:
Программирую на Бейсик в Баском АВР, нужно настроить таймер что бы он формировал прямоугольные импульсы на выходе через равные промежутки времени. Вот код:
$regfile = "m8def.dat"
$crystal = 1000000
Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle
Ваш таймер сконфигурирован, как счетчик, то есть он считает импульсы.Если надо формировать импульсы через равные промежутки времени таймер надо сконфигурировать, так, чтобы он на выходе формировал шим сигнал.
3. Artem - 05 Сентября, 2012 - 17:53:45 - перейти к сообщению
Значит нужно просто поменять Counter на Timer и убрать строчку Edge, если я правильно понимаю, то тогда получиться, что Таймер 1 будет работать в режиме таймер,(строчка Edge нам не нужна так как она определяет по какому фронту на входе будет происходить подсчёт) далее выбираем предделитель и затем переключаем выход при переполнении таймера.
Код по моему вот такой:
$regfile = "m8def.dat"
$crystal = 1000000
Config Timer1 = Timer, Prescale = 8 , Compare A = Toggle
Compare1a = 222
(Добавление)
Я попробовал свой код всё вышло, но возникла проблема, импульсы генерируются с одинаковой последовательность при лбом значении Comparea как можно это исправить?
4. anar - 05 Сентября, 2012 - 19:41:26 - перейти к сообщению
Artem пишет:
regfile = "m8def.dat"
$crystal = 1000000
Config Timer1 = Timer, Prescale = 8 , Compare A = Toggle
Compare1a = 222

рёв в три ручья как вы только учитесь в школе?Почитайте внимательно: http://avrproject.ru/publ/pwm_bascom/1-1-0-37
5. Artem - 05 Сентября, 2012 - 21:04:31 - перейти к сообщению
Я читал эту статью, десять раз, но ведь по словам автора вот этот код:
$regfile = "m8def.dat"
$crystal = 1000000
Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle
Compare1a = 222
Config Portb.1 = Output
Start Timer1
должен работать, я просто пытался повторить его так что бы он работал.
Теперь по поводу вот этого кода:
Config Timer1 = Pwm, Pwm = 9, Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8
Config PORTB.3 = Output
Config PORTB.4 = Output
я так понимаю вот эта часть Compare A Pwm = Clear Down, Compare B Pwm = Clear Up она изменяет шим сигнал а нужно что бы он был постоянный, значит эту строчку нужно убрать, наверно Замешательство
или нужно будет убрать строчку:
Incr Pwm1a
Incr Pwm1b
Я не знаю какую
Тогда в куда записывать значения OCR1A?
anar пишет:
как вы только учитесь в школе?

извините, а вы как учились?
6. anar - 06 Сентября, 2012 - 11:41:40 - перейти к сообщению
Artem пишет:
Compare A Pwm = Clear Down, Compare B Pwm = Clear U

Про это я писал вот здесь: http://myrobot.ru/forum/topic.ph...opic=307&p=2
Artem пишет:
Incr Pwm1a

Здесь вы управляете скважностью импульсов,присвойте Pwm1a какое-нибудь постоянное значение и у вас будут генерироваться импульсы постоянной длины.
Пример:
CODE:


$regfile = "attiny2313.dat"
$crystal = 8000000

Config Timer1 = Pwm, Pwm = 9, Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8
Config PORTB.3 = Output
Config PORTB.4 = Output

Do
Pwm1a = 125 ' постоянно генерируем импульсы частотой 976,56 Гц, а длина имульсов равна половине периода

Loop

End

7. Artem - 06 Сентября, 2012 - 22:05:04 - перейти к сообщению
anar пишет:
Здесь вы управляете скважностью импульсов,присвойте Pwm1a какое-нибудь постоянное значение и у вас будут генерироваться импульсы постоянной длины.

А как можно изменить длину импульсов ?
8. anar - 07 Сентября, 2012 - 09:37:33 - перейти к сообщению
Artem пишет:
А как можно изменить длину импульсов ?

Увеличив значение Pwm1a .
9. Artem - 07 Сентября, 2012 - 22:30:15 - перейти к сообщению
Постойте вы сказали:
anar пишет:
Здесь вы управляете скважностью импульсов

я так понял что скважность, это растояние между импульсами
а потом вы говорите что управлять длиною импульсов можно изменением Pwm1a
Получается что эта переменная контролирует и длину и скважность? Замешательство
Мне кажется так не должно быть Замешательство
10. anar - 08 Сентября, 2012 - 09:46:08 - перейти к сообщению
Artem пишет:
Постойте вы сказали:

anar пишет:
Здесь вы управляете скважностью импульсов

я так понял что скважность, это растояние между импульсами
а потом вы говорите что управлять длиною импульсов можно изменением Pwm1a
Получается что эта переменная контролирует и длину и скважность?
Мне кажется так не должно быть

Я запутал вас да?Ну ладно увеличить длину импульса вы можете увеличив значение Pwm1a.

Скважность равна отношению периода к длине импульса, так что если изменяется длина импульса, то изменяется и скважность.Так что просто увеличте значение Pwm1a и у вас увеличится длина импульса.
11. Artem - 09 Сентября, 2012 - 12:09:26 - перейти к сообщению
А теперь понятно, но всё же как-то странно получается, нельзя было сделать отдельно регистр отвечающий за длину и отдельно за скважность. Замешательство
Спасибо за объяснение Улыбка
12. Artem - 10 Сентября, 2012 - 21:10:53 - перейти к сообщению
anar, подскажите пожалуйсто, я хочу сделать что-то вроде простого вольтметра, но без дисплея(я пока не хочу его подключать), что-то вроде полоски из светодиодов. Логика работы такая: например полоска из 5 светодиодов, напротив каждого располагается какое-то значение в вольтах, то есть если значение 1 вольт загорается один нижний светодиод, два вольта-2 светодиода(при цене деления 1 вольт на один светодиод), вот как-то так, в интернете нашёл много схем конфигурирования ацп, но везде требуется дисплей, поэтому решил сам написать программу для мк ATmega8:
$regfile = "m8def.dat"
$crystal = 1000000
'здесь нужно сконфигурировать какие-то два порта вход и выход, есть описание выводов мк, только на английском поэтому я не знаю, не могли бы вы мне подсказать, точнее есть два порта ADC5 и ADC4(PORTC.5 и PORTC.4) это что выход или вход? Замешательство
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim W as Word 'здесь объявляем переменную я не совсем понимаю, это для дисплея или нет, но в нее потом записывается значение ацп
Start Adc
Do
W = Getadc(0) 'присваиваем переменной значение ацп затем его надо считать я полагаю, я думаю нужно объявить ещё пять переменных и записать в них значения ацп которые будут иметь место при 1, 2, 3, 4, 5 вольтах и затем сравнивать значение ацп с этими переменными, но такой способ мне кажется слишком сложным. Я не знаю как можно рассчитать значения переменных . И я думаю что должен быть способ проще только я не знаю какой.
Так вот не могли бы вы подсказать с на какой порт подавать аналоговый сигнал а с какого снимать, и как можно выполнить мою задумку без всех этих операций сравнения?
Буду очень благодарен Улыбка
13. anar - 11 Сентября, 2012 - 12:28:43 - перейти к сообщению
Artem пишет:
anar, подскажите пожалуйсто, я хочу сделать что-то вроде простого вольтметра, но без дисплея(я пока не хочу его подключать), что-то вроде полоски из светодиодов. Логика работы такая: например полоска из 5 светодиодов, напротив каждого располагается какое-то значение в вольтах, то есть если значение 1 вольт загорается один нижний светодиод, два вольта-2 светодиода(при цене деления 1 вольт на один светодиод), вот как-то так, в интернете нашёл много схем конфигурирования ацп, но везде требуется дисплей, поэтому решил сам написать программу для мк ATmega8:

Вот схема и код вольтметра.При определенном напряжении включается определенный диод.
CODE:

$regfile = "m8def.dat"
$crystal = 8000000
Dim I As Integer
Config Portb = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Do

Start Adc
I = Getadc(0)
If I > 610 And I < 616 Then
Portb = 0
Waitms 1
Portb.0 = 1
End If
If I > 400 And I < 420 Then
Portb = 0
Waitms 1
Portb.4 = 1
End If
If I > 200 And I < 210 Then
Portb = 0
Waitms 1
Portb.7 = 1
End If
Loop
End
14. elmot - 11 Сентября, 2012 - 12:46:33 - перейти к сообщению
Artem пишет:
anar, подскажите пожалуйсто, я хочу сделать что-то вроде простого вольтметра, но без дисплея(я пока не хочу его подключать), что-то вроде полоски из светодиодов. Логика работы такая: например полоска из 5 светодиодов, напротив каждого располагается какое-то значение в вольтах, то есть если значение 1 вольт загорается один нижний светодиод, два вольта-2 светодиода(при цене деления 1 вольт на один светодиод), вот как-то так, в интернете нашёл много схем конфигурирования ацп, но везде требуется дисплей, поэтому решил сам написать программу для мк ATmega8:
$regfile = "m8def.dat"
$crystal = 1000000
'здесь нужно сконфигурировать какие-то два порта вход и выход, есть описание выводов мк, только на английском поэтому я не знаю, не могли бы вы мне подсказать, точнее есть два порта ADC5 и ADC4(PORTC.5 и PORTC.4) это что выход или вход? Замешательство
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim W as Word 'здесь объявляем переменную я не совсем понимаю, это для дисплея или нет, но в нее потом записывается значение ацп
Start Adc
Do
W = Getadc(0) 'присваиваем переменной значение ацп затем его надо считать я полагаю, я думаю нужно объявить ещё пять переменных и записать в них значения ацп которые будут иметь место при 1, 2, 3, 4, 5 вольтах и затем сравнивать значение ацп с этими переменными, но такой способ мне кажется слишком сложным. Я не знаю как можно рассчитать значения переменных . И я думаю что должен быть способ проще только я не знаю какой.
Так вот не могли бы вы подсказать с на какой порт подавать аналоговый сигнал а с какого снимать, и как можно выполнить мою задумку без всех этих операций сравнения?
Буду очень благодарен Улыбка


ADC - это вход, конечно. Только его включить надо как именно вход ADC. Зависимость числа полученного из ADC от входного напряжения - линейная, т.е. надо высчитать коэффициент и поделить. Вообще я советую Вам не линейку из 5 диодов, а 7-сегментный индикатор. Проводов столько же(а может и меньше, у семисегментника все семь сегментов имеют один общий вывод), зато градаций напряжения от 0 до 9 в цифровом виде + можно вывести что-нибудь типа буквы E в случае перегруза.

PS не забудте поделить входное напряжение делителем на 2х резисторах.
15. Artem - 12 Сентября, 2012 - 14:32:29 - перейти к сообщению
anar, спасибо вам огромное за код и за схему!
elmot, по поводу вашей идеи использовать семи сегментный индикатор, это правда отличная идея при том если использовать шестнадцатиричную систему счисления то можно отображать значения от 0-15 вольт Подмигивающий