Обсуждаем контроллеры компании Atmel.
Ответить

Re: BASCOM AVR в вопросах и ответах

Пт апр 14, 2017 09:58:26

Да, у каждого программиста свои страшилки есть. :evil: Я после похожего случая стал в дропбоксе проекты хранить. Удобно на нескольких компухтерах работать, а для безопасности это виртуальный зашифрованный диск, который монтируется автоматом под паролем. А при его монтировании запускается дропбокс. Я хоть и параноик, но пока вполне устраивает. Ну и периодически на резервный винт сливаю. :))

Re: BASCOM AVR в вопросах и ответах

Пт апр 14, 2017 09:59:44

Сам проги не пишу. Очень хочу разобраться. Но для этого надо время и что б никто не дергал. В жизни как у Маяковского-кроха сын к отцу пришел... И - дорогой ты в магазин ходил? Ну вот как тут разбираться?

Re: BASCOM AVR в вопросах и ответах

Сб апр 15, 2017 15:57:18

Прошу помощи.
Я сделал индикатор из светодиодных матриц 8х8 + max7219 - . 4 последовательно соединенных матрицы в 3 ряда.
Основа MAX7219 16-разрядный сдвиговый регистр. передается 8-бит адреса + 8 бит данных. У меня последовательно соединено 4 матрицы.
Вот кусок тестового кода
Код:
'Запись из ПАМЯТИ Disp_ram() в дисплей max7221
Max7219_load:

    P_iclk = 0                                               ' Тактовый вывод
    P_iload = 0                                             ' Вывод LOAD

    Disp_ra_1 = 1                                           ' Установка начальных адресов
    Disp_ra_2 = Disp_ra_1 + 32                              '     в массиве ОЗУ экрана
    Disp_ra_3 = Disp_ra_2 + 32                              '     для каждого ряда матриц

    Disp_sh_row = 8                                         ' счетчик строк в матрице

    While Disp_sh_row > 0                                   ' Перебор строк

       Spi_data(1) = Disp_sh_row                            ' Адрес регистра (1 - 8)
       Disp_sh_col = 1                                      ' Счетчик матриц (1-4)

       While Disp_sh_col < 5

          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 матриц

          Waitms 5

          Gosub Disp_shift                                  '  Передача по SPI сразу в 3 ряда

          P_iload = 1       ' Для ПРОБЫ
          Waitms 50
          P_iload = 0

         ' Следущий байт в массиве
         Incr Disp_ra_1
         Incr Disp_ra_2
         Incr Disp_ra_3
         Incr Disp_sh_col                                   ' Следущая матрица

       Wend

       P_iload = 1                                          ' Запись в MAX
       Waitms 500
       Waitms 500

       Decr Disp_sh_row                                     ' Следущая строка в матрице

    Wend

Return


Я специально вставил вот этот кусок
Код:
          P_iload = 1       ' Для ПРОБЫ
          Waitms 50
          P_iload = 0

чтоб можно было посмотреть как задвигаются данные. + задержки.
Допустим я хочу зажечь верхнюю строку матрицы 4 и 1 . Записываю в Disp_ram(4) = FF и Disp_ram(1) = FF
Запускаю программу. В регистры передается последовательность 01FF,0100,0100,01FF
Сначала зажигается верхняя строка первой матрицы, затем зажигается верхняя строка второй, а у первой гаснет. и т.д. до четвертой - светятся верхние строки матриц 1 и 4.
Всё правильно. (При записи следущей строки, содержимое предидущей испортится - всё правильно)
А вот если закоментировать строку "P_iload = 1 ' Для ПРОБЫ", как должно быть, то в четвертой матрице ничего не включится. Будет отображаться только информация для первой матрицы - та что последняя в пакете. То есть будет работать только 1 матрица в ряду.
Почему так ?

Re: BASCOM AVR в вопросах и ответах

Вс апр 16, 2017 19:13:35

SV12 писал(а):Прошу помощи.
Я сделал индикатор из светодиодных матриц 8х8 + max7219

Есть готовое решение.
Изображение
Изображение
Нужно региться.

Re: BASCOM AVR в вопросах и ответах

Вс апр 16, 2017 22:31:03

max50 писал(а):Есть готовое решение.

Если не ошибаюсь, у Вас там аппаратный 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 с половиной тактов.

Вроде как можно. Но на практике не получается.
Завтра попробую подробнее спросить на указанном Вами ресурсе, раз там есть профильная тема .

Re: BASCOM AVR в вопросах и ответах

Пн апр 17, 2017 16:21:04

SV12 писал(а): Вроде как можно. Но на практике не получается.

Вопрос снят. Я нашел ошибку.

Re: BASCOM AVR в вопросах и ответах

Ср апр 19, 2017 16:04:47

Всем привет, подскажите, плиз,
Задача: поднимать флаг каждые, например 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
Но хотелось бы интервал сделать в виде переменной, чтобы можно было менять эту переменную с кнопок, а в таком виде это невозможно.
Никак не соображу, как сделать.

Re: BASCOM AVR в вопросах и ответах

Ср апр 19, 2017 17:00:47

В простейшем случае добавить переменную b, которая тоже будет инкрементироваться каждую секунду.
Код:
if b >= period then
   b=0
   some_action()
end if

Re: BASCOM AVR в вопросах и ответах

Ср апр 19, 2017 18:21:46

Ещё как вариант - анализировать остаток от деления.

Re: BASCOM AVR в вопросах и ответах

Чт апр 20, 2017 00:03:39

Испытал оба варианта.
Испытал метод деления по модулю, работает в моем случае.
для простоты взял деление на 2, типа:
B=секунда mod 2
в итоге имеем B = 1 через каждую секунду, удобно работать с такой переменной.
Испытал и путь с инкрементированием промежуточной переменной за счет длины главного цикла Do-Loop, он у меня очень длинный, если вся периферия подключена – занимает от 1 секунды и до 2 сек (32К кода). По другому не сумел. Тоже работает.
Больше понравилось работать с остатком от деления.
Спасибо форумчанам за подсказки.

Re: BASCOM AVR в вопросах и ответах

Чт апр 20, 2017 11:18:14

twinsen_kiev писал(а):Испытал метод деления по модулю, работает в моем случае.
B=секунда mod 2
Попробуйте лучше B=секунда and 1
Результат тот же, а выполнятся будет гораздо быстрее и потребует меньше места на flash.

Re: BASCOM AVR в вопросах и ответах

Пт апр 21, 2017 09:40:12

Еще вариант B = секунда.0

Re: BASCOM AVR в вопросах и ответах

Пн май 01, 2017 08:19:09

Добрый день, подскажите пожалуйста что делаю не правильно lcd 1602 в протеусе мерцает и можно это как то исправить в Bascom только начал работать просьба сильно не пинать.

Re: BASCOM AVR в вопросах и ответах

Пн май 01, 2017 08:26:56

Здравствуйте.

Вы каждый раз полностью очищаете дисплей. Вместо этого затирайте предыдущее сообщение новым. Если оно короче, то используйте пробелы.

Re: BASCOM AVR в вопросах и ответах

Пн май 01, 2017 08:37:01

edm2007 спасибо всё заработало как надо

Re: BASCOM AVR в вопросах и ответах

Вт май 02, 2017 10:43:44

Мрр коты :)
Благодаря этому сайту и данной ветке форума, я открыл для себя мир МК и стал создавать простые вещи.
Напридумал я себе замутить американский дхо-габарит-поворотник с использованием 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: одну для настройки яркости, вторую - для смены режима работы.
Настройка ШИМ сохраняется, а вот смена режима нет. Хотя переключается и работает правильно.
Уже который день пишу/переписываю код, ни в какую не получается :kill: Подскажите, что не так.
Буду признателен за помощь :beer:
ДХО-габарит-поворотник.rar
Протеус и исходник с коментами в архиве.
(16.19 KiB) Скачиваний: 244

Код:
'----------
'                     (c) April 27, 2017 KOTик
'           АМЕРИКАНСКИЙ СТИЛЬ ДХО(ГАБАРИТ) - ПОВОРОТНИКИ
' Частота ШИМ = (частота кварца/предделитель) / (размер счетного регистра *2)
'                   (4800000/256) / (256*2) = 36 Гц
'                   (9600000/256) / (256*2) = 73 Гц
'                   (4800000/64) / (256*2) = 146 Гц
'                   (9600000/64) / (256*2) = 293 Гц
'----------

$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

'Pinb.1 = 1
'Pinb = &B00000110                                          'Подтягивающие резисторы PINB.1 and PINB.4

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:

Do

'/// ---> ДРЕБЕЗГ ВХОДОВ
Debounce Turn , 1 , Drl_off , Sub                           'Если поворотник включен (пульсирующий сигнал)
Debounce Turn , 0 , Drl_on , Sub                            'Если поворотник выключен


'/// ---> УСТАНОВКА УРОВНЯ ШИМ
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                                                      'выходим



'----------
End                                                         'end program

Re: BASCOM AVR в вопросах и ответах

Вт май 02, 2017 14:15:31

У тиньки13 64 байта ERAM памяти.Это не 64 типа памяти, а 64 байта. В программе использовано всего 2. Причем в первом байте яркость меняется, а вот комбинацией кнопок изменить значение второго байта у меня не получилось. Это можно смотреть в отладке протеуса. Запускается эмуляция, ставится на паузу и из главного меню вызывается debug->AVR->EPROM Memory. Появляется окошко с содержимом памяти. Так что в отладке пошагово пройтись и посмотреть почему не доходит до команды запись в память.

Re: BASCOM AVR в вопросах и ответах

Вт май 02, 2017 15:29:43

Запускается эмуляция, ставится на паузу и из главного меню вызывается debug->AVR->EPROM Memory. Появляется окошко с содержимом памяти. Так что в отладке пошагово пройтись и посмотреть почему не доходит до команды запись в память.

Изображение
Посмотрел, но это мне ничего не дало.
Извините, может туплю, но что мне с этим делать?
Код сохранения аналогичен тому же, что и в настойке яркости.

Re: BASCOM AVR в вопросах и ответах

Вт май 02, 2017 15:35:54

Поставьте на схему кнопку с фиксацией, которая будет имитировать зажатую клавишу при включении. Теперь при включении в EEPROM меняется режим?

Re: BASCOM AVR в вопросах и ответах

Вт май 02, 2017 15:50:45

Поставьте на схему кнопку с фиксацией, которая будет имитировать зажатую клавишу при включении. Теперь при включении в EEPROM меняется режим?

Приветствую, учитель :)
Это кнопка как бы с фиксацией.
Чтобы с имитировать нажатие до подачи питания, я останавливаю симуляцию, зажимаю кнопку и затем запускаю симуляцию. Отпускаю кнопку уже во время симуляции.
Состояние еепром не меняется, а вот переменная MMODE в окне AVR Variable - U2 меняется.
Ответить