Страница 268 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 07:53:53
IDok
edm2007 писал(а):
Я смог, а Вы?
а я нет

светик сразу загорается и люминь. яркость 200
ну я не в протеусе, сразу на МК пробую. мож фьюзы не так выставил? встроеный генератор на 8МГц, делитель на 8 отключен,
отличие от предыдущего кода я нашел, но в общем они похожи.
кстати, а разве не надо писать Start Timer0 ?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 08:05:07
edm2007
Ну я тоже в железе проверил, отладочная как раз трудится на столе, далеко ходить не надо.

Должно работать, давайте разбираться тогда. Фьюзы так, да. Вроде как и заблудиться негде. В моем коде яркость 200, это почти полная яркость. Если светодиод на земле сидит, конечно. Измените на 5, светодиод должен еле светиться.
IDok писал(а):кстати, а разве не надо писать Start Timer0 ?
Таймер начинает молотить, как только конфигурируется прескалер (в коде это Prescale = 1). Команды Stop и Start именно тем и занимаются, что сбрасывают биты прескалера, и возвращают обратно. Таймер мы нигде не останавливали, он изначально в конфигурации запущен. Но если Вам так спокойнее, то запустите его еще раз.

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 08:29:42
IDok
яркость диода управляется. ну вот скрин баскома - шо тут может пойти не так?

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 08:31:53
edm2007
IDok писал(а):яркость диода управляется.
Так именно это код и делает. Если Вы меняете значение Bright и при этом меняется яркость, значит все в порядке. Так и должно быть. Что именно Вас не устраивает?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 08:34:30
IDok
ну меня не устраивает что светодиод сразу загорается на всю дурь, а хотелось бы плавного зажигания
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 08:41:29
edm2007
А где в Вашем коде плавное зажигание? Почему Вы решили, что он должен зажигаться плавно? Я же говорю:
Изменяйте значение яркости, посмотрите как реагирует светодиод, разберитесь с работой кода, там ничего сложного нет. И после этого Вы без проблем допишите именно плавное зажигание / гашение светодиода.
Допишите. Этого блока нет, это Ваша задача. Программный ШИМ - это возможность регулировать яркость. А как она будет меняться, дело уже Ваше. Где в коде меняется Bright? Мы ее как инициализировали в начале, так она и остается константой. Не надо встраивать наобум задержки в прерывания, этот код вообще трогать не нужно.
Просто напишите изменение переменной Bright от 0 до максимума, и светодиод плавно загорится. Вы же меняете яркость вручную: 0 - не горит, 1- самая малая яркость, 2 - чуть ярче..... 250 - почти максимум. Ну логично же, что нужно сделать так, чтобы переменная автоматом прошагала от 0 до максимума.
Я могу дать одно из решений, но нужно ли Вам это? Ведь явно же, что это родит еще больше непонятностей.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 09:01:57
IDok
edm2007 спасибо за разьяснение
получилось нечто вот:
Do
if Bright<250 then incr Bright
Waitms 10
Loop
End
'--------------------------------------------------------------
Pwm_prog: ' ïðåðûâàíèå ïðîãðàììíîé ØÈÌ íà Ò0
Incr Count
If Count = 255 Then ' ìîäóëü ñ÷åòà ØÈÌ
Count = 0
End If
If Count < Bright Then ' óïðàâëåíèå ñâåòîäèîäîì
Set Led
Else
Reset Led
End If
Return
без задержки никак, слишком быстро шуршало. но вообще ход мыслей в нужную сторону или опять огородами шастаю?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 09:07:09
edm2007
Ну вот, ход мыслей совершенно верный. Куда же интереснее самому разобраться. Без задержки конечно никак, это же скорость изменения яркости. Если ее сделать нулевой, светодиод слишком быстро поднимет яркость, глаз просто не успеет отследить. Если нужно просто зажечь светодиод, то можно еще до начала цикла сделать так:
Код: Выделить всё
Bright = 0 ' начальное значение яркости
While Bright < 255 ' пока яркость не достигла максимума
Incr Bright ' увеличиваем ее
Waitms 5
Wend
Do
Loop
End
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 09:12:09
IDok
edm2007 спасибо

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 12:36:58
Adagumer
IDok писал(а): спасибо
Есть же плюсик!
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 25, 2017 15:37:03
LazarevSergey
ARV писал(а):LazarevSergey писал(а):вот в этом куске кода у меня остался "косяк" и как его устранить я
'так и не додумался. Дело в том, что КОРОТКОЕ нажатие происходит ВСЕГДА раньше длинного
'на то оно и короткое! Чётко разделить разные нажатия получается только "закрыв МК глаза" циклом
'в течении которого ему всё равно что там ЕЩЁ помимо должно происходить! Ввиду этого, во время
'цикла, гаснет индикация. А без цикла, в момент переключения разрядов при их настройке, фиксируется
'ложное короткое нажатие и тем самым к настроеному как бы уже значению, прибавляется единица.
'То есть, если надо установить значение 5, то настраивать надо 4.
Вообще говоря, все абсолютно логично, даже в Windows при двойном клике мышкой сначала посылается сообщение "Нажата_левая_кнопка_мыши", а потом "Двойной_клик_левой_кнопкой_мыши".
И разбираться с этим можно только в обработчике "короткого" нажатия: если вы получили сигнал о коротком нажатии прежде чем его обработать, надо убедиться, что это на самом деле короткое нажатие, т.е. надо немножко подождать (примерно столько, сколько это короткое нажатие может длиться) и проверить, нажата ли все еще эта кнопка. только если кнопка уже не нажата, следует обработать короткое нажатие. ну а если еще нажата - обработка не требуется, надо дождаться сигнала о длинном нажатии.
сложно давать рекомендации, когда не очень понятно, как реализована у вас обработка кнопок... лично я в подобных случаях частенько запихивал логику "длинный-короткий" прямо в функцию опроса кнопок: если она возвращает результат с установленным старшим битом, то это долгое нажатие, в младших битах код кнопки.
как-то так...
Поправил!

Спасибо за идею. Правда, сделал не совсем так, как Вы предложили. Но импульс на доработку дали именно ВЫ!

Вот что получилось:
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 15:17:45
IDok
подскажите, плиз, где косяк. задача такая - два светодиода должны плавно по очереди загореться и так и остаться на максимальной мощности. с загоранием проблем нет, а вот потом они начинают периодически ронять накал (в основном второй светик). диоды подключены напрямую, без ключей. на лишние переменный внимания не обращайте, это результаты экспериментов
regfile = "attiny2313.dat"
$crystal = 8000000
Config Portd.2 = Output
config portd.1 = output
Config Timer0 = Timer , Prescale = 1 : On Timer0 Pwm_prog : Enable Timer0 : Enable Interrupts
Dim S As Byte , L1 As Byte , M As Byte , L2 as byte , N as Byte , O as Byte , V as Byte
'--------------------------------------------------------------
M=0 : N=0
Do
if M=0 then incr L1
if L1=255 then
portd.2 = 1
M=1
End If
if M=1 then incr L2
if L2=255 then
Portd.1 = 1
M=2
End If
waitms 10
Loop
End
'--------------------------------------------------------------
Pwm_prog:
Incr S
Incr V
If M=0 Then
If S<L1 Then
Set Portd.2
Else
Reset Portd.2
End If
End If
If M=1 Then
If V<L2 then
Set Portd.1
Else
Reset Portd.1
End If
End If
Return
Добавлено after 1 hour 36 minutes 55 seconds:
точнее даже так - второй светодиод не выходит из цикла, загорается и гаснет по кругу и не пускает программу к третьему диоду
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 17:11:05
edm2007
Что-то Вы намудрили, конечно... Думается мне, Вы представляете в голове задачу гораздо сложнее, чем она есть на самом деле. Несколько советов:
- Привыкайте называть переменные своими именами, иначе через пару месяцев даже Вы не вспомните, что это за M, N, O, V...
- Комментируйте код. И себе жизнь облегчите, и другим копаться проще. Это правило хорошего тона - выкладывать исходник с комментариями.
- Изучайте язык, на котором пишите. Он не более чем инструмент, а значит нужно пользоваться этим инструментом в полной мере. Применяйте новые команды, пробуйте описать одну и ту же задачу разными способами.
Один из вариантов решения Вашей задачи. Вариант удобен тем, что можно не меняя основы кода, добавить при необходимости еще светодиоды. Достаточно лишь изменить количество каналов яркости, и число проходов в цикле их зажигания. Ну и ШИМ дописать, естественно:
Код: Выделить всё
$regfile = "attiny2313.dat" ' тип МК
$crystal = 8000000 ' тактовая частота
Config Portd.2 = Output ' настройка пинов светодиодов
Config Portd.3 = Output
Led1 Alias Portd.2
Led2 Alias Portd.3
' программный ШИМ
Config Timer0 = Timer , Prescale = 1 : On Timer0 Pwm_prog : Enable Timer0 : Enable Interrupts
Dim Count_pwm As Byte ' счетчик ШИМ
Dim Count_bright As Byte ' счетчик перебора каналов яркости
Dim Bright(2) As Byte ' переменные яркости для двух светодиодов
'--------------------------------------------------------------
Bright(1) = 255 ' начальное значение яркости (255 - минимум, 0 - максимум)
Bright(2) = 255
For Count_bright = 1 To 2 ' цикл, в котором последовательно поднимается яркость двух светодиодов
While Bright(count_bright) <> 0 ' пока яркость не достигла максимума
Decr Bright(count_bright) ' поднимаем ее
Waitms 5
Wend
Next
'-----------------------------
Do ' пустой цикл
Loop
End
'--------------------------------------------------------------
Pwm_prog: ' прерывание программной ШИМ на Т0
Incr Count_pwm
If Count_pwm = 255 Then ' модуль счета ШИМ
Count_pwm = 0
Reset Led1
Reset Led2
End If
If Count_pwm > Bright(1) Then Set Led1 ' управление светодиодами
If Count_pwm > Bright(2) Then Set Led2
Return
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 17:17:59
IDok
edm2007 у Вас программа для диодов, включенных катодом в МК? вообще более причесаный код у меня выглядел так:
M=0
Do
if M=0 then incr L1
if L1=255 then M=1
if M=1 then incr L2
if L2=255 then M=2
if M=2 then incr L3
if L3=255 then M=0
waitms 10
Loop
End
'--------------------------------------------------------------
Pwm_prog:
Incr S
if S=255 then S=0
If S<L1 Then
Set Portb.1
Else
Reset Portb.1
End If
If S<L2 then
Set Portb.2
Else
Reset Portb.2
End If
If S<L3 then
Set Portb.3
Else
Reset Portb.3
End If
Return
первый диод загорался как положено, второй загорался но снова гас и снова загорался, до третьего дело вообще не доходило. по поводу языка - я б с радостью, но не нашел толкового описания в сети. только куски, отрывки... а по программному шиму вообще только куски кода
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 17:29:29
edm2007
IDok писал(а):у Вас программа для диодов, включенных катодом в МК?
Да.
IDok писал(а):первый диод загорался как положено, второй загорался но снова гас и снова загорался, до третьего дело вообще не доходило.
Вообще стоит начать с того, что все находится в основном цикле. Зачем зажигая третий светодиод, Вы снова выбираете M0? Вы же переваливаетесь в 0 у яркости первого светодиода. Либо убирайте это из основного цикла, либо присваивайте несуществующее значение M. А вообще пробуйте одинаковые куски кода объединять циклами. Ведь по-сути у Вас меняется только канал яркости.
IDok писал(а):по поводу языка - я б с радостью, но не нашел толкового описания в сети.
У баскома мощнейшая справка, где расписана
каждая команда. С примерами. Чего еще желать-то.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 17:39:01
IDok
пока не дописал "else reset Led" - плавно загораться отказывалось. переписал на три диода с общим катодом - работает

только паузы между диодами большие больно. чем это регулируется?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 17:45:01
edm2007
Выключать светодиоды отдельно нужно только если не менять условие проверки со счетчиком. Посмотрите внимательно на код, и увидите разницу.
Это не паузы большие, это яркость регулируется нелинейно, такова суть светодиода. Нужно писать логарифмическую шкалу яркости.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 17:58:20
IDok
не, изначально Вашей программой диоды загорались сразу на всю яркость, без плавности. после дописания ресета стали загораться плавно и остаются гореть потом. а вообще почему в моей исходной проге все-таки цикл крутился по второму каналу? ну они ж одинаковые все и условия перехода вроде прописаны.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 18:06:33
edm2007
С разных планет мы, видимо. У меня это код зажигает плавно по очереди светодиоды.
а вообще почему в моей исходной проге все-таки цикл крутился по второму каналу?
Если не хотите пошаговую симуляцию делать, пройдите хотя бы пальцем по своему коду. Выполните его в голове, и все поймете. Я могу сказать в чем дело, но...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс мар 26, 2017 18:38:15
IDok
пройдите хотя бы пальцем по своему коду. Выполните его в голове, и все поймете.
прошел и не раз. если убираю "else reset pоrt" на всех портах - диоды загораются дискретно, но зато все.
там вроде так-то все банально - крутится главный цикл, меняется метка М, по которой переключается порт вывода, вроде все четко. так что если не сложно - ткните пальцем (я почему не хочу от метки отказываться - по ней удобно зажигать следующий диод не дожидаясь выхода на всю яркость текущего диода. это поможет сократить паузу между загораниями. то есть метка передвинется не при L1=255, a L1=200 к примеру и начнется запуск второго диода)