Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт июн 11, 2019 21:19:14
Родился
Зарегистрирован: Вт сен 29, 2015 16:36:57 Сообщений: 10
Рейтинг сообщения:0
Здравствуйте. Имеется программа светодиодной "мигалки" с разными режимами работы. Режимы переключаются с помощью одной кнопки поочередно. Хочу добавить еще одну кнопку и пару светодиодов, которая управляет ими, с другими эффектами, но не понимаю как заставить все работать одновременно. Т.е. например первой кнопкой я включил режим мигалки с половинной яркостью(мигание + яркость регулируется с помощью ШИМ), а второй кнопкой включил режим постоянного свечения с половинной яркостью(постоянно + яркость регулируется с помощью ШИМ).
'--- Конфигурация входов и выходов контроллера ---------- Ddrb = &B00001011 'Конфигурация порта В. Считать с права на лево (PORTB.7...PORTB.1,PORTB.0), 0 - вход, 1 - выход Set Portb.4 'Включить внутренний подтягивающий резистор Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8 'Активируем и настраиваем ШИМ '--- Инициализация PCINT0 ---------- Pcmsk0 = &B00010000 'Активирует обработку прерывания PORTB.4 Enable Pcint0 : On Pcint0 Buttonon Enable Interrupts 'Разрешаем прерывания '--- Обзываем всякие переменные ---------- D1 Alias OCR1A 'Диоды фары D2 Alias Portb.3 'Индикаторный диод Button1 Alias Pinb.4 'Переменная для кнопки Dim I As Byte 'Универсальная переменная (0-255) Dim Y As Byte 'Универсальная переменная для прерывания Dim K As Bit 'Флаг отключения Dim Ledmode As Byte 'Переменная для режимов '--- Подпрограмма сна --- Main_sleep: Reset D1 Ledmode = 0 '--- Ждем отпускания кнопки --- Bitwait Button1 , Set Waitus 20 '--- Засыпаем --- Powerdown '--- Ждем нажатия на кнопку --- K = 0 '--- Основная программа --- Main: Do Select Case Ledmode Case 0 : Gosub M0 Case 1 : Gosub M1 Case 2 : Gosub M2 Case 3 : Gosub M3 Case Else : Ledmode = 0 End Select '--- Переход в спящий режим ---------- If K = 1 Then Reset D1 Goto Main_sleep End If Loop
Buttonon: If Button1 = 0 Then Set D2 D1 = 0 Y = 100 Incr Ledmode Do If Button1 = 1 Then Reset D2 Exit Do End If Waitms 10 Incr Y If Y = 0 Then K = 1 Reset D2 End If Loop Until Y = 0 Else Reset D2 End If Return End '--- Режимы --- M0: 'Мигалка / Половина яркости D1 = 128 Waitms 300 D1 = 0 Waitms 300 Return
M1: 'Постоянный / Полная яркость D1 = 255 Return
M2: 'Постоянный / Половина яркости D1 = 128 Return
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
При вычислениях некоторые переменные меняют свои значения, хотя с ними в этот момент операции не производятся. Почему? Нехватка оперативной памяти или наложение переменных друг на друга?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Вроде бы решил вопрос (агрессивным способом): Каждую переменную принудительно пришил к конкретной ячейке в оперативной памяти. Т.к. переменных очень много (~500), то для удобного ориентирования для себя сделал таблицу в Excel с названием переменной + адрес ячейки памяти.
В определенный момент возникла заминка: Прикреплял переменные к ячейкам начиная с адреса &H60, но в определенный момент какого-то лешего некоторые переменные начинали менять свои значения. Самое поразительное - в симуляторе все прекрасно отрабатывает в SRAM, на практике же значения меняются. Попробовал изменить начальный адрес записи переменных в SRAM на &H200 (вместо &H60) и все заработало как надо. Странно?!
так вариантов много, начиная от кривой программы ($hwstack $swstack $framesize ,не верная размерность переменной), до битого, китайского камня. Вообще, протеус в помощь, там всё можно отследить по шагам.
_________________ Все делают ошибки, только мудрецы - новые, а дураки - старые.
kip96, с $hwstack $swstack $framesize все впорядке. Камень вроде оригинал (от популярного Российского поставщика). Вот насчет размерности переменной возникли сомнения, еще один случай: есть переменные в массиве, например dim Arr(2) as string * 3 и вроде массив в памяти должен занимать 8 байт, но переменная на 9 байте, идущая после массива, меняла свои значения. После смещения на 1 байт все наладилось.
Ну так может переменной присвоили три символа, вот и вылез. Вообще, у меня тоже возникает интерес контролировать всё жёстко, но это дело личное. Потом резервируешь стек, переменную по больше, с запасом, и всё нормально.
_________________ Все делают ошибки, только мудрецы - новые, а дураки - старые.
В atmega328p прошит Bootloader по стандартному UART интерфейсу,используется только для прошивки Можно ли в программе PORTD0 и PORTD1 использовать как вход?
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт июл 25, 2019 17:10:03
Поставщик валерьянки для Кота
Карма: 4
Рейтинг сообщений: 26
Зарегистрирован: Ср сен 17, 2008 14:32:15 Сообщений: 2106 Откуда: Старые Васюки
Рейтинг сообщения:0
Всем привет!
Такой вопросик возник. Функция CRC8 в BASCOM и подпрограмма Docrc8 на VB6 из хелпа дают одинаковый результат только для строк длиной не более 32 байт. Дальше они "расходятся во мнениях".
Кто-нибудь сталкивался с этой проблемой? Хотелось бы понять, это косяк BASCOM'а или примера из его хелпа.
_________________ Даже остановленные часы два раза в сутки показывают правильное время.
Config Portd.6 = Output 'âûõîä íà ñâåòîäèîä Config Portb = Output 'âûõîäû íà ØÄ Config Pind.2 = Input 'ãåðêîí Dim S As Byte 'íîìåðà îáìîòîê ØÄ Dim A As Byte 'ñ÷åò÷èê ñåêóíä Dim F As Bit 'ôëàã ñðàáàòûâàíèÿ ãåðêîíà
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт ноя 29, 2019 07:17:06
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Добавил сброс порта по вашему совету - не помогло. Мотор на выключается. Мне кажется, не работает Timer1, у меня мало опыта работы с ним. Надо думать дальше.
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт ноя 29, 2019 09:05:36
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Да, таймер остановлен после инициализации. Но он запускается в подпрограмме обработки INT0, после замыкания геркона. И должен останавливаться через 3 сек. Но он не останавливается. А вообще вопрос перешел из практической области в теоретическую. Я обнаружил, что с поставленной задачей отлично справляется одновибратор на 555, а вместо ШД буду использовать мотор с редуктором от привода тарелки из микроволновки. Уже собрал на картонке - все отлично работает. Но все равно хотелось бы довести идею с ШД да конца - пригодится на будущее. Так что жду советов .
Сейчас этот форум просматривают: Google [Bot], Martian, veso74 и гости: 46
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения