serg_svd это один из кучи вариантов программы, пробовал всяко. выход из бесконечности и должен быть только по прерыванию кнопки. главная беда была что возвращение после прерывания кнопки приходилось в долгий цикл, и пока он до конца не доходил - кина не случалось собсна, я уже решил проблему тупо, некрасиво и в лоб. самому противно
Да нет там у вас решения. В прерывании изменяетсятолько значение переменной В. А оператор goto находится вне двух бесконечных циклов. Поэтому и не работает
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Dim S As Byte , A as Byte , C(3) as byte , B as Byte , R as Byte
for A=0 to 63 C(1)=lookup(A , TAB_PWM) waitms 20 next
Do
If R=0 then PORTB.3 = 0 for A=0 to 63 'тут ШИМ, режим 1 (по умолчанию) if R=0 then C(2)=lookup(A , TAB_PWM) waitms 20 else goto 1 end if next
for A=63 to 0 step -1 'óìåíüøàåì êðàñíûé if R= 0 then C(1)=lookup(A , TAB_PWM) waitms 20 else goto 1 end if next waitms 100 for A=0 to 63 'óâåëè÷èâàåì ñèíèé if R=0 then C(3)=lookup(A , TAB_PWM) waitms 20 else goto 1 end if next
for A=63 to 0 step -1 'óìåíüøàåì çåëåíûé if R=0 then C(2)=lookup(A , TAB_PWM) waitms 20 else goto 1 end if next waitms 100 for A=0 to 63 'óâåëè÷èâàåì êðàñíûé if R=0 then C(1)=lookup(A , TAB_PWM) waitms 20 else goto 1 end if next
for A=63 to 0 step -1 'óìåíüøàåì ñèíèé if R=0 then C(3)=lookup(A , TAB_PWM) waitms 20 else goto 1 end if next waitms 200 end if
1: If R=1 Then C(1) = 0 : C(2) = 0 : C(3) = 0 : PORTB.3 = 1 'тут фонарик (режим2) End if
loop
end
Pwm_prog: Incr S
if S=255 then S=0
If S<C(1) Then Set Portb.0 Else Reset Portb.0
If S<C(2) then Set Portb.1 Else Reset Portb.1
If S<C(3) then Set Portb.4 Else Reset Portb.4
Return
Button: Incr R waitms 75 'потому что кнопка плохая, вот и 75 if R>1 then R = 0 GIFR = 64 Return
IDok, я баском немного подзабывать начал, перешел на СИ (поэтому прошу прощения, если где-то в синтаксисе ошибусь). Но поскольку Вам не отвечают, решил включится. Полностью прописывать прогу не буду, опишу смысл, как вижу реализацию
Код:
'объявление функций DECLARE SUB фонарик DECLARE SUB ШИМ
'здесь основная программа do select case B case 0: call ШИМ case 1: call фонарик end select loop end
'здесь обработчик прерывания от кнопки button: Incr B [s]waitms 10[/s] ' в обработчике прерываний нежелательно и вредно делать какие либо задержки if B>2 then B = 0 return
waitms 10 ' в обработчике прерываний нежелательно и вредно делать какие либо задержки
в итоге Ваша программа всегда будет крутится только по одному бесконечному циклу. Далее, нужно будет смотреть уже более конкретно. Возможно, нужно будет ввести флаги и выполнять код по ним. А то в моем примере исполнение кода будет бегать либо в функции ШИМ, либо в фонаре бесконечно.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
serg_svd спасибо за ответ. ну лето, выходные, все на даче шашлык компилят... задержка в прерывании - это антидребезг. главная моя проблема была - как выйти из ШИМа по прерыванию СРАЗУ, а не после окончания что-то упускаю, но никак не пойму что
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Я понял, но антидребезг нужно выносить из прерывания в основной цикл и там обрабатывать.
У Вас там циклов в последнем коде немеряно. При чем много повторяющихся. Надо смотреть как их объединить. Кроме того, цикл не обязательно делать на операторах for-to-next. Можно и на do-loop, while-do. Просто ввести в них счетчик и инкрементировать его. Кроме этого добавить в условие ту же переменную В и программа будет вылетать из такого цикла, если переменная изменит свое значение. В общем вариантов много. Я в целом задачу не представляю, но вы для себя разбейте программу на блоки, максимально их упростите и оптимизируйте, а дальше объединяйте. Я не спец в программировании, но именно так и делаю. Пишу отдельную функцию, отлаживаю ее. А далее оптимизирую совместную работу со следующей функцией
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
serg_svd многоцикловый цикл - это ШИМ управления RGB-светодиодом. типа лампы настроения. куча циклов - потому что значения ШИМ читаются из таблицы внизу программы. есть вариант и на полностью программном шиме, там да - без кучи фор-некст
собсна вопрос уважаемым котам - как навести красоту на программу? ну явно же есть способ выходить из подпрограммы по прерыванию, не дожидаясь окончания подпрограммы. но я его не вижу
и контроллер не будет прогонять весь код, а вылетать из цикла по условию. Или, если писать ту же обработку ШИМ в виде функции, то и выходить из нее по
Код:
return
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
serg_svd так он и сейчас вылетает по условию. а будет оно оформлено в виде If-THEN или WHILE - разницы не особо. все равно в каждом маленьком цикле идет своя проверка на переменную прерывания. ШИМ в виде подпрограммы не изменит ничего. что сейчас он автоматом возвращается в начало программы что по return... (пробовал я и с подпрограммами, результат тот же). мне же хочется найти вариант "как у больших" - когда в главном цикле только опрос кнопки и условия перехода, а сами режимы где-то там, за горизонтом. и когда по прерыванию программа сразу переходит в главный цикл, а не возвращается к месту прерывания и не ждет окончания режима
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс июн 25, 2017 00:22:27
Слесарь-программист
Карма: 21
Рейтинг сообщений: 88
Зарегистрирован: Вт сен 11, 2012 23:08:28 Сообщений: 341 Откуда: город Кстово Нижегородская обл.
Рейтинг сообщения:0 Медали: 2
Кто пробовал выводить VGA на Xmega256A3 не только текстом, но и графикой? Если да, то как связывали два контроллера между собой? У меня серия А3, там нет EBI (аппаратное расширение памяти), развёртку (синхро сигналы) сделал на 640х480, но с использованием внутренней памяти вывести получилось 280х240 или 35х20 символов. Частота МК 45мГц (кварц 5мГц х 9). Как-то надо передать на МК 3 бита (на 1 точку или букву), в три бита уложить информацию, к примеру: Первый байт: X - номер бита (для графики или текста) Информация о OR AND стереть Информация вывода текст/графика Второй бит: Y - номер линии 0-240 Третий бит: Символ или чего нибудь ещё.
Если кому интересно, выложу проект, всё-же порой VGA интерфейс в разных проектах очень актуален и дешевле большого графического LCD экрана. Чисто теоретически, то, что сейчас работает от внутренней памяти (использовано 8,4кб), имеет достаточный ресурс и вполне может послужить каким нибудь прибором, к примеру измерительным или ЭКГ или чего нибудь ещё. Но при нагрузке есть проблемы с помехами в сигнале, хотя это лечится суровой оптимизацией. Сейчас проблема управления этой картой, причём так, чтоб управляющий контроллер не тормозил на отправке данных, ожидая её обработки. Может есть какая возможность аппаратно влазить во внутреннюю память контроллера?
Прошу прощения за наверняка занудный вопрос, но перекопать почти 300 страниц темы я не в состоянии. Понадобилось поработать в АВР Бейсике. Переустанавливал с десяток разных сборок Баскома. И демо, и крякнутые, и полные. Все работали, но ни один не выдает HEX - файла. Галочки на bin и hex - стоят!!!. Что у меня за проклятие такое??? При компилировании на долю секунды выдает голубое окно с надписью вроде как PASS 1 и всё. Прим: Работаю на ноуте. КОМ и ЛПТ портов на нем нет. С уважением.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ой блиииин. Чтоб он ошибки на экран выдал, оказывается влияет галочка там же где для bin и hex. А я думал она только для выходных файлов. Прошу простить PICBasic-оюзера. Спаааасибочки.
Последний раз редактировалось Ariadna-on-Line Вс июл 02, 2017 12:30:51, всего редактировалось 1 раз.
Добавлено after 12 minutes 51 second: если 8МГц то: таймер1, делитель 256, режим СТС, OCR1A=31250, прерывание по совпадению: 0x00->TCCR1A, 0x0C->TCCR1B, 0x7A->OCR1AH, 0x12->OCR1AL, 0x10->TIMSK
Добавлено after 4 minutes 38 seconds: sei забыл прерывание по совпадению OCR1A будет вызываться 1 раз в секунду.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
чето я про ассемблер подумал, про регистры... а тут так и пишешь: TCCR1A=$00 вроде так 16ричные цифры здесь пишутся
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: veso74 и гости: 38
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения