Да, у каждого программиста свои страшилки есть. Я после похожего случая стал в дропбоксе проекты хранить. Удобно на нескольких компухтерах работать, а для безопасности это виртуальный зашифрованный диск, который монтируется автоматом под паролем. А при его монтировании запускается дропбокс. Я хоть и параноик, но пока вполне устраивает. Ну и периодически на резервный винт сливаю.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт апр 14, 2017 09:59:44
Электрический кот
Карма: 4
Рейтинг сообщений: 48
Зарегистрирован: Вт янв 08, 2013 04:08:16 Сообщений: 1036 Откуда: FAR EAST FOREVER
Рейтинг сообщения:0
Сам проги не пишу. Очень хочу разобраться. Но для этого надо время и что б никто не дергал. В жизни как у Маяковского-кроха сын к отцу пришел... И - дорогой ты в магазин ходил? Ну вот как тут разбираться?
_________________ 1.Всегда бывает первый раз. 2.Родился сам, помоги другому
Прошу помощи. Я сделал индикатор из светодиодных матриц 8х8 + max7219 - . 4 последовательно соединенных матрицы в 3 ряда. Основа MAX7219 16-разрядный сдвиговый регистр. передается 8-бит адреса + 8 бит данных. У меня последовательно соединено 4 матрицы. Вот кусок тестового кода
Код:
'Запись из ПАМЯТИ Disp_ram() в дисплей max7221 Max7219_load:
Spi_data(2) = Disp_ram(disp_ra_1) ' Этот байт передается в ряд 1 матриц Spi_data(3) = Disp_ram(disp_ra_2) ' Этот байт передается в ряд 2 матриц Spi_data(4) = Disp_ram(disp_ra_3) ' Этот байт передается в ряд 3 матриц
чтоб можно было посмотреть как задвигаются данные. + задержки. Допустим я хочу зажечь верхнюю строку матрицы 4 и 1 . Записываю в Disp_ram(4) = FF и Disp_ram(1) = FF Запускаю программу. В регистры передается последовательность 01FF,0100,0100,01FF Сначала зажигается верхняя строка первой матрицы, затем зажигается верхняя строка второй, а у первой гаснет. и т.д. до четвертой - светятся верхние строки матриц 1 и 4. Всё правильно. (При записи следущей строки, содержимое предидущей испортится - всё правильно) А вот если закоментировать строку "P_iload = 1 ' Для ПРОБЫ", как должно быть, то в четвертой матрице ничего не включится. Будет отображаться только информация для первой матрицы - та что последняя в пакете. То есть будет работать только 1 матрица в ряду. Почему так ?
_________________ Одни хотели бы понимать то, во что верят, другие - поверить в то, что пнимают.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Если не ошибаюсь, у Вас там аппаратный SPI. Мне не подходит. У меня 3 линии данных при общих Clk и LOAD.
Цитата:
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0
В других примерах, Как я понял, Там задвигается информация не на всю цепочку матриц сразу, а только для одной, а в остальные пишется 0 в нулевые регистры.
Код:
'========================= Sub Write_matrix_reg_data(byval Copy_matrix As Byte , Byval Copy_reg As Byte , Byval Copy_data As Byte) '---------- Local Tmp_count_matrix As Byte Local Tmp_ckip_max7219 As Byte
Tmp_ckip_max7219 = 0
'Даём понять чипам MAX7219_7221, что начинаем передавать данные Load_max7219_7221 = 0
For Tmp_count_matrix = Const_amount_matrix To 1 Step -1 If Copy_matrix = Tmp_count_matrix Then Write_data_max7219_7221 Copy_reg Write_data_max7219_7221 Copy_data Else Write_data_max7219_7221 Tmp_ckip_max7219 Write_data_max7219_7221 Tmp_ckip_max7219 End If Next Tmp_count_matrix
'Даём понять чипам MAX7219_7221, что закончили передавать данные, тем самым разрешая применить введённые данные Load_max7219_7221 = 1 '---------- End Sub '=========================
Т.е. допустим, я хочу передать информацию для первой строки всех 4 матриц нужно задвинуть не 4*2 байта = 8 байт, а 4*2 по 4 раза = 32 байта . Из них полезных только 8 байт. Вопрос, можно ли задвинуть информацию сразу для всей строки всех 4 матриц - 4*2 байта ? Я смотрел описания на рускоязычных сайтах.
?? писал(а):
24 - DOUT. Последовательный вывод данных. На этом выводе появляются принятые на входе DIN данные c задержкой в 16 с половиной тактов.
Вроде как можно. Но на практике не получается. Завтра попробую подробнее спросить на указанном Вами ресурсе, раз там есть профильная тема .
_________________ Одни хотели бы понимать то, во что верят, другие - поверить в то, что пнимают.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Всем привет, подскажите, плиз, Задача: поднимать флаг каждые, например 2 сек, 3 сек, 4 сек, 5 сек не используя таймер. В распоряжении есть переменная, назовем ее А, которая каждую секунду инкриминируется от 0 до 59 и так по кругу – как секунды в часах. В примитивном варианте это что-то типа: If A=0 or A=3 or A=6 or A=9 or A=12 or A=15 и так далее Then Что-то делаем полезное каждые 3 сек End If Но хотелось бы интервал сделать в виде переменной, чтобы можно было менять эту переменную с кнопок, а в таком виде это невозможно. Никак не соображу, как сделать.
Испытал оба варианта. Испытал метод деления по модулю, работает в моем случае. для простоты взял деление на 2, типа: B=секунда mod 2 в итоге имеем B = 1 через каждую секунду, удобно работать с такой переменной. Испытал и путь с инкрементированием промежуточной переменной за счет длины главного цикла Do-Loop, он у меня очень длинный, если вся периферия подключена – занимает от 1 секунды и до 2 сек (32К кода). По другому не сумел. Тоже работает. Больше понравилось работать с остатком от деления. Спасибо форумчанам за подсказки.
Добрый день, подскажите пожалуйста что делаю не правильно lcd 1602 в протеусе мерцает и можно это как то исправить в Bascom только начал работать просьба сильно не пинать. Спойлер$regfile = "m8def.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32
Dim Temp As Single Dim Effect As Byte Const W = 10 Temp = 0
Do If Temp = 10000 Then Effect = 2 If Pind.5 = 0 Then Effect = 1 If Pind.7 = 0 Then Effect = 2 If Pinb.1 = 0 Then Effect = 3
If Effect = 1 Then Portb.0 = 0 Portd.6 = 1 Cls Locate 2 , 4 Lcd " trenirovka "
Portd.0 = 1 Waitms W Portd.1 = 1 Waitms W Portd.2 = 1 Waitms W Portd.3 = 1 Waitms W Portd.4 = 1 Waitms W Portd.0 = 0 Waitms W Portd.1 = 0 Waitms W Portd.2 = 0 Waitms W Portd.3 = 0 Waitms W Portd.4 = 0 Waitms W
Temp = Temp + 1 End If
If Effect = 2 Then Cls Locate 2 , 4 Lcd " end "
Portd = 0 Portb.0 = 1 Temp = 0 End If
If Effect = 3 Then Portd = 0 Portb.0 = 0 Temp = 0 Portd.6 = 0 End If Loop End
Вы каждый раз полностью очищаете дисплей. Вместо этого затирайте предыдущее сообщение новым. Если оно короче, то используйте пробелы.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Мрр коты Благодаря этому сайту и данной ветке форума, я открыл для себя мир МК и стал создавать простые вещи. Напридумал я себе замутить американский дхо-габарит-поворотник с использованием 2-контактной лампы 21Вт (!)без переделки патрона. И тут столкнулся с маленькой проблемой. Скажите, Барсик с двумя Eram работает? Описание (для тиньки13):
1) ШИМ на PINB.0 2) LED на PINB.3 3) кнопка настройки яркости и режима работы с замыканием на массу PINB.2 4) вход (+) плюс на порту PINB.1
Во время работы ШИМ кнопка настраивает яркость и значение сохраняется в памяти. Если до подачи питания нажать и удерживать кнопку, произойдет смена режима по входу (+) на PINB.1, светодиод мигнет 1раз и настройка режима сохранится. Т.е., если выбран режим-1 и подали (+)плюсик на PINB.1 - ШИМ 100%, если выбран режим-2 и подали (+)плюсик, то ШИМ 0%. В обоих случаях, - нет плюсика на PINB.1? - тогда светим с установленной яркостью. Я использую 2 типа Eram: одну для настройки яркости, вторую - для смены режима работы. Настройка ШИМ сохраняется, а вот смена режима нет. Хотя переключается и работает правильно. Уже который день пишу/переписываю код, ни в какую не получается Подскажите, что не так. Буду признателен за помощь
Вложение:
Комментарий к файлу: Протеус и исходник с коментами в архиве. ДХО-габарит-поворотник.rar [16.19 KiB]
Скачиваний: 244
$regfile = "attiny13.dat" 'specify the used micro $crystal = 9600000 'used crystal frequency $hwstack = 32 'default use 32 for the hardware stack $swstack = 8 'default use 8 for the SW stack $framesize = 16 'default use 40 for the frame space Config Debounce = 100 'время задержки в мс
'================ О Б Ъ Я В Л Е Н И Е П Е Р Е М Е Н Н Ы Х ===
Dim V As Eram Byte 'Переменная, записанная в EEPROM Dim Click As Byte 'Переменная нажатий Dim Store As Byte 'Переменная для уровня ШИМ Dim Button As Bit Button = 1
Dim Count As Byte 'счетчик кол-ва нажатий
Dim S As Eram Byte 'Переменная, записанная в EEPROM Dim Mmode As Byte 'Переменная установки режима работы, привязанная к переменной S Eram
'== Н А С Т Р О Й К А П О Р Т О В ======= Config Portb.0 = Output 'PWM OUT Config Portb.3 = Output 'STATUS LED Config Pinb.1 = Input 'TURN Config Pinb.2 = Input 'ADJUST BUTTON
Turn Alias Pinb.1 'Обзываем TURN для PINB.1 Btn Alias Pinb.2 'Обзываем SETUP для PINB.2 Led Alias Portb.3 'Обзываем SETUP для PINB.3
'===== Н А С Т Р О Й К А Ш И М ========== Config Timer0 = Pwm , Prescale = 256 , Compare A Pwm = Clear Up Start Timer0
'/// ---> НАСТРОЙКА РЕЖИМА РАБОТЫ 'До подачи питания нажимаем кнопку и держим до тех пор, 'Значение Mmode не изменится 'LED мигнет 1раз сигнализируя о том, что настройка сохранилась If Btn = 0 Then Waitms 500 Mmode = Mmode + 1 'инкрементируем Waitms 500 S = Mmode 'сохраняем в S Eram Waitms 500 Led = 1 'мигаем 1 раз Waitms 100 Led = 0 Waitms 100
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2. Mmode = 0
Else 'в противном случае If Btn = 1 Then 'если кнопку не нажимали Waitms 500 Mmode = S 'считываем раннее записанное значение Mmode (режима) End If 'конец условия Wait 3 End If 'конец условия End If 'конец условия
'=============== ПРОГРАММА ================= Main:
'/// ---> УСТАНОВКА УРОВНЯ ШИМ If Click >= 4 Then Click = 1 'Если нажали кнопку 4ый раз, тогда сбрасываем на минимум If Click = 1 Then Pwm0a = 40 'pwm = 15% If Click = 2 Then Pwm0a = 77 'pwm = 30% If Click = 3 Then Pwm0a = 115 'pwm = 45% If Button = 1 Then If Btn = 0 Then Button = 0 Store = Click + 1 'Увеличиваем яркость на 1 шаг Waitms 50 V = Store 'Записываем значение ШИМ в V Eram End If 'конец условия End If 'конец условия If Btn = 1 Then Button = 1
Loop
'================= О Б Р А Б О Т Ч И К П Р Е Р Ы В А Н И Й ==
'/// ---> ВЫКЛЮЧАЕМ ДХО Drl_off: 'метка If Mmode = 1 And Turn = 1 Then 'Если выбран Режим=1 и включен поворотник, тогда Pwm0a = 255 'Включаем ШИМ на полную яркость Else 'В противном случае, Режим=0 + включен поворотник, тогда Pwm0a = 0 'Выключаем ШИМ вовсе End If 'конец условия Bitwait Turn , Reset 'ждем когда поворотник перестанет мигать Return 'выходим
'/// ---> ВКЛЮЧАЕМ ДХО Drl_on: 'метка Pwm0a = Click Click = Store Store = V 'Считываем яркость из ЕЕПРОМ Return 'выходим
'----------
'обрабатываем мигание поворотника 'Turn: 'метка While Turn = 1 'до тех пор пока поворотник включен (мигает) Incr Count 'увеличиваем счетчик задержки на выключение Waitms 50 'задержка If Count => 20 Then 'если поворотник выключен 100 мсек. Gosub Drl_on 'переход к метке Bitwait Turn , Reset 'ждем когда он выключится Gosub Drl_off 'переход к метке Goto Ext 'переход к метке End If 'конец условия Wend
'если мигание поворотника было менее секунды Count = 0 'сбрасываем Count Ext: Return 'выходим
У тиньки13 64 байта ERAM памяти.Это не 64 типа памяти, а 64 байта. В программе использовано всего 2. Причем в первом байте яркость меняется, а вот комбинацией кнопок изменить значение второго байта у меня не получилось. Это можно смотреть в отладке протеуса. Запускается эмуляция, ставится на паузу и из главного меню вызывается debug->AVR->EPROM Memory. Появляется окошко с содержимом памяти. Так что в отладке пошагово пройтись и посмотреть почему не доходит до команды запись в память.
Запускается эмуляция, ставится на паузу и из главного меню вызывается debug->AVR->EPROM Memory. Появляется окошко с содержимом памяти. Так что в отладке пошагово пройтись и посмотреть почему не доходит до команды запись в память.
Посмотрел, но это мне ничего не дало. Извините, может туплю, но что мне с этим делать? Код сохранения аналогичен тому же, что и в настойке яркости.
Поставьте на схему кнопку с фиксацией, которая будет имитировать зажатую клавишу при включении. Теперь при включении в EEPROM меняется режим?
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Поставьте на схему кнопку с фиксацией, которая будет имитировать зажатую клавишу при включении. Теперь при включении в EEPROM меняется режим?
Приветствую, учитель Это кнопка как бы с фиксацией. Чтобы с имитировать нажатие до подачи питания, я останавливаю симуляцию, зажимаю кнопку и затем запускаю симуляцию. Отпускаю кнопку уже во время симуляции. Состояние еепром не меняется, а вот переменная MMODE в окне AVR Variable - U2 меняется.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения