а я нет светик сразу загорается и люминь. яркость 200 ну я не в протеусе, сразу на МК пробую. мож фьюзы не так выставил? встроеный генератор на 8МГц, делитель на 8 отключен, отличие от предыдущего кода я нашел, но в общем они похожи. кстати, а разве не надо писать Start Timer0 ?
Ну я тоже в железе проверил, отладочная как раз трудится на столе, далеко ходить не надо. Должно работать, давайте разбираться тогда. Фьюзы так, да. Вроде как и заблудиться негде. В моем коде яркость 200, это почти полная яркость. Если светодиод на земле сидит, конечно. Измените на 5, светодиод должен еле светиться.
IDok писал(а):
кстати, а разве не надо писать Start Timer0 ?
Таймер начинает молотить, как только конфигурируется прескалер (в коде это Prescale = 1). Команды Stop и Start именно тем и занимаются, что сбрасывают биты прескалера, и возвращают обратно. Таймер мы нигде не останавливали, он изначально в конфигурации запущен. Но если Вам так спокойнее, то запустите его еще раз.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Так именно это код и делает. Если Вы меняете значение Bright и при этом меняется яркость, значит все в порядке. Так и должно быть. Что именно Вас не устраивает?
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А где в Вашем коде плавное зажигание? Почему Вы решили, что он должен зажигаться плавно? Я же говорю:
Цитата:
Изменяйте значение яркости, посмотрите как реагирует светодиод, разберитесь с работой кода, там ничего сложного нет. И после этого Вы без проблем допишите именно плавное зажигание / гашение светодиода.
Допишите. Этого блока нет, это Ваша задача. Программный ШИМ - это возможность регулировать яркость. А как она будет меняться, дело уже Ваше. Где в коде меняется Bright? Мы ее как инициализировали в начале, так она и остается константой. Не надо встраивать наобум задержки в прерывания, этот код вообще трогать не нужно.
Просто напишите изменение переменной Bright от 0 до максимума, и светодиод плавно загорится. Вы же меняете яркость вручную: 0 - не горит, 1- самая малая яркость, 2 - чуть ярче..... 250 - почти максимум. Ну логично же, что нужно сделать так, чтобы переменная автоматом прошагала от 0 до максимума.
Я могу дать одно из решений, но нужно ли Вам это? Ведь явно же, что это родит еще больше непонятностей.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ну вот, ход мыслей совершенно верный. Куда же интереснее самому разобраться. Без задержки конечно никак, это же скорость изменения яркости. Если ее сделать нулевой, светодиод слишком быстро поднимет яркость, глаз просто не успеет отследить. Если нужно просто зажечь светодиод, то можно еще до начала цикла сделать так:
Код:
Bright = 0 ' начальное значение яркости
While Bright < 255 ' пока яркость не достигла максимума
Incr Bright ' увеличиваем ее Waitms 5
Wend
Do
Loop
End
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
вот в этом куске кода у меня остался "косяк" и как его устранить я 'так и не додумался. Дело в том, что КОРОТКОЕ нажатие происходит ВСЕГДА раньше длинного 'на то оно и короткое! Чётко разделить разные нажатия получается только "закрыв МК глаза" циклом 'в течении которого ему всё равно что там ЕЩЁ помимо должно происходить! Ввиду этого, во время 'цикла, гаснет индикация. А без цикла, в момент переключения разрядов при их настройке, фиксируется 'ложное короткое нажатие и тем самым к настроеному как бы уже значению, прибавляется единица. 'То есть, если надо установить значение 5, то настраивать надо 4.
Вообще говоря, все абсолютно логично, даже в Windows при двойном клике мышкой сначала посылается сообщение "Нажата_левая_кнопка_мыши", а потом "Двойной_клик_левой_кнопкой_мыши". И разбираться с этим можно только в обработчике "короткого" нажатия: если вы получили сигнал о коротком нажатии прежде чем его обработать, надо убедиться, что это на самом деле короткое нажатие, т.е. надо немножко подождать (примерно столько, сколько это короткое нажатие может длиться) и проверить, нажата ли все еще эта кнопка. только если кнопка уже не нажата, следует обработать короткое нажатие. ну а если еще нажата - обработка не требуется, надо дождаться сигнала о длинном нажатии.
сложно давать рекомендации, когда не очень понятно, как реализована у вас обработка кнопок... лично я в подобных случаях частенько запихивал логику "длинный-короткий" прямо в функцию опроса кнопок: если она возвращает результат с установленным старшим битом, то это долгое нажатие, в младших битах код кнопки.
как-то так...
Поправил! Спасибо за идею. Правда, сделал не совсем так, как Вы предложили. Но импульс на доработку дали именно ВЫ! Вот что получилось:
подскажите, плиз, где косяк. задача такая - два светодиода должны плавно по очереди загореться и так и остаться на максимальной мощности. с загоранием проблем нет, а вот потом они начинают периодически ронять накал (в основном второй светик). диоды подключены напрямую, без ключей. на лишние переменный внимания не обращайте, это результаты экспериментов
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: точнее даже так - второй светодиод не выходит из цикла, загорается и гаснет по кругу и не пускает программу к третьему диоду
Что-то Вы намудрили, конечно... Думается мне, Вы представляете в голове задачу гораздо сложнее, чем она есть на самом деле. Несколько советов:
- Привыкайте называть переменные своими именами, иначе через пару месяцев даже Вы не вспомните, что это за M, N, O, V... - Комментируйте код. И себе жизнь облегчите, и другим копаться проще. Это правило хорошего тона - выкладывать исходник с комментариями. - Изучайте язык, на котором пишите. Он не более чем инструмент, а значит нужно пользоваться этим инструментом в полной мере. Применяйте новые команды, пробуйте описать одну и ту же задачу разными способами.
Один из вариантов решения Вашей задачи. Вариант удобен тем, что можно не меняя основы кода, добавить при необходимости еще светодиоды. Достаточно лишь изменить количество каналов яркости, и число проходов в цикле их зажигания. Ну и ШИМ дописать, естественно:
Dim Count_pwm As Byte ' счетчик ШИМ Dim Count_bright As Byte ' счетчик перебора каналов яркости Dim Bright(2) As Byte ' переменные яркости для двух светодиодов
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
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Последний раз редактировалось edm2007 Вс мар 26, 2017 17:23:10, всего редактировалось 1 раз.
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
первый диод загорался как положено, второй загорался но снова гас и снова загорался, до третьего дело вообще не доходило. по поводу языка - я б с радостью, но не нашел толкового описания в сети. только куски, отрывки... а по программному шиму вообще только куски кода
у Вас программа для диодов, включенных катодом в МК?
Да.
IDok писал(а):
первый диод загорался как положено, второй загорался но снова гас и снова загорался, до третьего дело вообще не доходило.
Вообще стоит начать с того, что все находится в основном цикле. Зачем зажигая третий светодиод, Вы снова выбираете M0? Вы же переваливаетесь в 0 у яркости первого светодиода. Либо убирайте это из основного цикла, либо присваивайте несуществующее значение M. А вообще пробуйте одинаковые куски кода объединять циклами. Ведь по-сути у Вас меняется только канал яркости.
IDok писал(а):
по поводу языка - я б с радостью, но не нашел толкового описания в сети.
У баскома мощнейшая справка, где расписана каждая команда. С примерами. Чего еще желать-то.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
пока не дописал "else reset Led" - плавно загораться отказывалось. переписал на три диода с общим катодом - работает только паузы между диодами большие больно. чем это регулируется?
Выключать светодиоды отдельно нужно только если не менять условие проверки со счетчиком. Посмотрите внимательно на код, и увидите разницу.
Это не паузы большие, это яркость регулируется нелинейно, такова суть светодиода. Нужно писать логарифмическую шкалу яркости.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
не, изначально Вашей программой диоды загорались сразу на всю яркость, без плавности. после дописания ресета стали загораться плавно и остаются гореть потом. а вообще почему в моей исходной проге все-таки цикл крутился по второму каналу? ну они ж одинаковые все и условия перехода вроде прописаны.
С разных планет мы, видимо. У меня это код зажигает плавно по очереди светодиоды.
Цитата:
а вообще почему в моей исходной проге все-таки цикл крутился по второму каналу?
Если не хотите пошаговую симуляцию делать, пройдите хотя бы пальцем по своему коду. Выполните его в голове, и все поймете. Я могу сказать в чем дело, но...
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
пройдите хотя бы пальцем по своему коду. Выполните его в голове, и все поймете.
прошел и не раз. если убираю "else reset pоrt" на всех портах - диоды загораются дискретно, но зато все. там вроде так-то все банально - крутится главный цикл, меняется метка М, по которой переключается порт вывода, вроде все четко. так что если не сложно - ткните пальцем (я почему не хочу от метки отказываться - по ней удобно зажигать следующий диод не дожидаясь выхода на всю яркость текущего диода. это поможет сократить паузу между загораниями. то есть метка передвинется не при L1=255, a L1=200 к примеру и начнется запуск второго диода)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения