Заведите счетчик, по которому будет меняться благ. Флагом может служить переменная типа БИТ. По состоянию блага приравнивайте для М1 - А или В Как то так..
Код:
dim counter as word , flag as bit
do incr counter if counter = 500 then : toggle flag: counter = 0 : end if
A = Getadc(5) B = Getadc(0) if flag = 1 then : M1 = A * 5 : else : M1 = B * 5 : end if M2 = M1 M3 = M1
Не знаю, у меня такой вариант в часах уже 5 лет работает. Код ниже. Понимаю, что код может показаться не оптимальным, но он рабочий, без таймеров и прерываний.
Dim Count As Byte , T As Byte , C As Byte Dim Disp As String * 4 Dim W(4) As String * 1 Dim Pak(4) As String * 2 Dim T1 As Byte , Byte0 As Byte , Byte1 As Byte Dim T2 As Byte Dim Viv As Bit
Сделал небольшой эксперимент. Помигал светодиодом. Понадобилось узнать разницу в частоте мигания при разных подходах к делу. Использовал BascomAVR и AVR Studio7. Все остальное на скринах.
Странно что toggle в баскоме отрабатывает медленнее чем set reset. Примечательно что выходной HEX баскома = 192 байта, а студии - 142 байта.
Странно что toggle в баскоме отрабатывает медленнее чем set reset.
Если посмотреть на дизасм, то становится понятно, почему так происходит:
А для инверсии бита в Си, можно сделать так:
Код:
PORTB ^= (1 << 5);
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Дизасм с кода баскома и студии должен быть одинаковым при простом Set, Reset bit. Кажется, но сейчас посмотрю. Но видно что код баскома делает мигание это с частотой 2,4 МГц, а студия 2,66МГц.
здрассьте, уважаемые. решил вот открыть для себя чудный мир микроконтроллеров и сходу заимел прикладную задачу, с которой и прошу помощи. итак, задача - линейка из 9 (лучше 11) светодиодов, поочередно вспыхивающих и плавно гаснущих. т.е. форма сигнала по сути - убывающая пила. из гугля я понял, что надо лудить ШИМ, но аппаратный ШИМ весь на таймерах, а где их взять такую палестину? не лучше ли будет использовать программный ШИМ, благо кроме этой задачи МК больше ничего делать не будет (ну почти. там еще пара фенечек). так как я твердо решил стоять на бейсике, то на нем и стою, но вот примеров программного ШИМа на нем не нашел. не подкинете хоть на 1-2 канала, а дальше я может и сам справлюсь?
Добавлено after 7 hours 22 minutes 12 seconds: долго смотрел в код, пока он не начал смотреть в меня. но вопросы остались:
Цитата:
Config Portd.2 = Output : Led Alias Portd.2 Config Timer0 = Timer , Prescale = 1 : On Timer0 Pulse : Enable Timer0 : Enable Interrupts Dim Z As Byte , Y As Integer
Do Y = 10 Loop End
Pulse: Incr Z If Z >= Y Then : Reset Led : Z = 0 Else : Set Led : End If Return
што должен делать в данном случае цикл Do\Loop и где в теле программы вызов подпрограммы Pulse?
В Do\Loop вы должны менять значение яркости переменной Y. Pulse срабатывает по таймеру 0 - On Timer0 Pulse
тысяча извинений, я сварщик пока не настоящий, но я там вижу бесконечный пустой цикл без надежды на выход и до подпрограммы дело не доходит да и симулятор Баскома тоже по циклу крутится и не хочет выходить
барин, я там половины слов не понимаю! но все равно спасибо, буду на мелкой проге отрабатывать. ну и риторический вопрос - два эффекта одновременно (на разных выходах, ессно) я ж не запущу, да? пошаговость, как она есть?
два эффекта одновременно (на разных выходах, ессно) я ж не запущу, да?
Почему? В приведенном примере 8 работает. Если, конечно, МК будет чем то еще занят, то эта самая "занятость" может тормозить, но в целом все работает. Если частота МК 8 МГц, таймер срабатывает по переполнению(можно сократить время срабатывания), то есть в 256 раз медленнее. Получается 31250 Гц. Дискретность ШИМа то же 256. Частота мигания диодов 122 Герца, что глазом не заметно. Ну и можно дальше развлекаться. Частоту поднять до 16-20 МГц, таймер заставить срабатывать по совпадению, дискретность ШИМа уменьшить до 64 градаций яркости. Этим можно еще удвоить каналы.
Привет! Намедни была нужда поиграться с вводом/выводом, так в шпорах нета обнаружил нестыковку - одне пишут:
Цитата:
К примеру нам надо сконфигурировать порт B таким образом
CONFIG PORTB = OUTPUT CONFIG PORTB.3 = INPUT CONFIG PORTB.4 = INPUT CONFIG PORTB.5 = INPUT То есть – 3,4 и 5 выводы порта настроены на вход, а остальные на выход. С помощью DDR то же самое можно сделать одной строчкой… вот так…
Можно также устанавливать направление соответствующих линий порта с помощью установки регистра DDRB. Для примера инструкция:
DDRB = &B00001111
повлечет запись числа 15 в регистр направления порта B, и 4 старших бита (PORTB.7 до PORTB.4) будут выходами, а 4 младшие (PORTB.3 до PORTB.0) входами.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения