Кусок на ассемблере. Спер у кого-то и немного подправил. Значение регистра osccal подобрал, чтобы частота была около 12.5 МГц. (внутренний RC генератор) СпойлерSend: Disable Interrupts
push r17 push r16 push r0 ' leds - количество кристаллов. в каждом ws2812 3 кристалла. Loadadr Leds , X 'адрес переменной bytemax загружаем в регистровую пару x (R26,R27) ld r17,x 'в R17 загружаем x (адрес bytemax) Loadadr Rgb1(1) , X 'адрес начала массива rgb1 загружаем в регистровую пару x (R26,R27) 'массив rgb1 должен быть не короче константы leds. в этом массиве цвета для каждого диода Nextbyte: ld r0,x+ 'В r0 загружается байт по адресу из регистра x, а x инкрементируется ldi r16,8 Nextbit: ' Sbi $1b , 0 'адрес порта вывода lsl r0 brcs Bit1 Bit0: cbi $1b , 0 Bit1: Nop dec r16 cbi $1b , 0 brne Nextbit
Иду дальше... Ознакомился с описанием, что-то получается, а что-то нет. Например, Call Settablecolor(0 , Х) работает с массивом и, меняя Х могу выбрать палитру. И очень странно, что меняется только 1 светик. А у меня неопиксель из 12ти светиков по кругу. Чтобы включить все светики в ленте, надо воспользоваться Fill_Stripe() или Fill_color(). т.е. Call Fill_stripe(color(Х)) - здесь Х может принять значения: 1(светит белым); 2(светит желтым) и 3(светит красным). Почему только 3 и откуда такие цвета - не пойму. И почему цвет заливки не берется с массива?
Вкратце по умолчанию все светики горят белым. Каждое нажатие меняет цвет (берется из палитры). Привожу исходник Спойлер
Config Pind.6 = Input Button Alias Pind.6 'Присвоение КНОПКА для PIND.6
'----[IMPLEMENT RAINBOW]----------
$lib "Rainbow1.21.lib" $external WS2812b Declare Sub Select_rainbow(byval Channel As Byte) Declare Sub Setcolor(byval Lednr As Word , Color() As Byte) Declare Sub Send() Declare Sub Shift_Left(byval Left_index As Word , Byval Width As Word) : $external USE_Shift_Left Declare Sub Shift_right(byval Left_index As Word , Byval Width As Word) : $external Use_shift_right Declare Sub Settablecolor(byval Lednr As Word , Byval Index As Byte) : $external Use_settablecolor Declare Sub Fill_colors(color() As Byte) : $external Use_fill Declare Sub Fill_stripe(color() As Byte) : $external Use_fill_stripe
'Gloabal Color-variables Dim Color(3) as Byte R Alias Color(_base) : G Alias Color(_base + 1) : B Alias Color(_base + 2)
Dim Click As Byte
'_____ '----[MAIN]----------
Call Select_rainbow(0) 'select Rainbow R = 255 : G = 255 : B = 255 'define a color Call Send()
Do Debounce Button , 0 , Changecolor , Sub 'ПЕРЕХОД К МЕТКЕ ДЛЯ ВЫБОРА ЦВЕТА
Loop
'/// ---> МЕНЯЕМ ЦВЕТА ПО НАЖАТИЮ НА КНОПКУ Changecolor: Waitms 50
If Button = 0 Then Incr Click End If
If Click => 4 Then Click = 1 End If
If Click = 1 Then Call Settablecolor(0 , 0) 'КРАСНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ 'Call Fill_stripe(color(1)) 'СВЕТИТ БЕЛЫМ - КАКОЙ-ТО ПРОИЗВОЛЬНЫЙ ЦВЕТ. ОТКУДА ОН? Call Send() End If
If Click = 2 Then Call Settablecolor(0 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ 'Call Fill_stripe(color(2)) 'СВЕТИТ ЖЕЛТЫМ - КАКОЙ-ТО ПРОИЗВОЛЬНЫЙ ЦВЕТ. ОТКУДА ОН? Call Send() End If
If Click = 3 Then Call Settablecolor(0 , 2) 'СИНИЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ 'Call Fill_stripe(color(3)) 'СВЕТИТ КРАСНЫМ - КАКОЙ-ТО ПРОИЗВОЛЬНЫЙ ЦВЕТ. ОТКУДА ОН? Call Send() End If
Bitwait Button , Set Waitms 50 Return
End
Rainbow_colors: ' R , G , B index Data 255 , 0 , 0 'Red 0 Data 0 , 255 , 0 'Green 1 Data 0 , 0 , 255 'Blue 2 Data 255 , 160 , 0 'Orange 3 Data 255 , 255 , 00 'Yellow 4 Data 190 , 0 , 255 'HotPink 5 Data 255 , 255 , 255 'HotPink 6
Microtech, asm для меня сложно. Я в нем ничего не понимаю. Барсик как-то привычней В любом случае, спасибо!
Call Settablecolor(0 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ Здесь 0 - это первый светодиод (LedNumber). Если напишу 11, то загорится 12ый, если напишу 4, то загорится 5ый. Но никак ни все
Писать так:
Код:
Call Settablecolor(0 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ Call Settablecolor(1 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ Call Settablecolor(2 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ ... Call Settablecolor(11 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ
Это не вариант. Ведь есть Call Fill_stripe(color(3)) и Call Fill_color(color(3)) , а они почему то не работают
Урааа! Подружил барсик (2.0.7.5) с библиотекой rainbow.
Расскажите пожалуйста, как вы их подружили.
Ооо... И не спрашивайте. Пробовал одну версию, за другой. Гуглил тут,там. У max50 с версией 2.0.7.7 вроде работает. Я эту версию не нашел. Закачал 2.0.7.5 и то сразу не заработало. Пришлось удалить барсик, почистить реестр Винды и только потом вроде заработало.
В идеале, конечно, 2.0.7.9. Но как подсказал max50, он пока только ввиде обновления. Установочного дистрибутива нет. А обновление доступно только программе с регистрационным ключом. Синтаксисы для барсика 2.0.7.9 и ранних версий разные. Для версии 2.0.7.9 он настраивается всего одной строкой и проще управляется. В ранних же версиях, приходится объявлять Sub и вызывать их (исходник выше). Вот команды для 2.0.7.9 http://avrhelp.mcselec.com/index.html?config_rainbow.htm Так что, буду ждать обновления, а пока разбираю в 2.0.7.5 и ничего не получается. Мой вопрос выше остался открытым
У меня есть две одинаковые виртуальные машины с настроенной системой сборки при помощи компилятора bascomp 2.0.7.8. Правда я делаю сборку без IDE, при помощи Makefile. Одна машина VMware 12, вторая VirtualBox. На обеих winxp и по для работы с avr мк. Если хотите, могу дать и показать как пользоваться. В систему сборки включена моя утилита objdump, которая позволяет получать листинги с расшифровкой кода bascom в виде ассемблерных команд. По листингам можно понять что делают библиотечные функции, если разбираться в ассемблере. Такие же листинги можно видеть при отладке кода в Proteus.
Здравствуйте. Может кто подскажет в таком вопросе. Нужно подключить дисплей с 8 бит данными к ардуино уно. Обычно под это дело выделяют отдельный порт так Config Portd = Output и далее переназначение под данные Data_displey Alias Portd Но на UNO 6 ног дисплея сидят на Portd.2-Portd.6 и две ножки Portb.0 и Portb.1
Может кто знает как правильно это всё конфигурировать в баскоме чтоб было равноценно Config Portd = Output ? Под сигналы сброса дисплея, записи и т.д. конфигурируется по ножке и с этим проблем нет. Но как можно шину дата сделать когда на разных портах она висит?
Вопрос в том как это сделать на баскоме. Назначить 8 ножек с разных портов под данные. Проблема состоит в том что на UNO 8 ножек дисплея на которых выставляются данные попадают 2 ножки PORTB и 6 ножек PORTD. Плату я конечно могу нарисовать и спаять как надо, но ардуиновские примеры работают с платой UNO. Попробую там посмотреть как они это делают.
Обращаться можно. Как сделать я знаю. Это вообще не проблема. Но в программе есть байт которым устанавливается нужное состояние порта целиком. А тут нужно без бубна устанавливать согласно этому байту состояние определённых 6 портов D и два порта В. В принципе я знаю как разложить байт на биты и выставить их в нужных портах, но это действие скажется на быстродействии вывода на дисплей. Буду думать дальше как назначить это напрямую, без дополнительной подпрограммы разделения байта на биты.
Добавлено after 55 seconds:
Microtech писал(а):
Так нелзя, чтоли?
Так можно. Но не проще ли один раз сделать конфигурацию для прямого обращения к портам?
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт дек 06, 2016 19:10:31
Потрогал лапой паяльник
Карма: 1
Рейтинг сообщений: 2
Зарегистрирован: Чт мар 26, 2009 20:53:27 Сообщений: 398 Откуда: Беларусь.Минская обл.
Рейтинг сообщения:0
добрый вечер. Товраищи, примитивная задача-измерить частоту. Сделал на таймере, считывание показания по прерыванию ИНТ0. Но как то в протеусе частота прыгает, а бывает вообще выскакивает не та которая должна быть... Включил отладку, глянул как меняются переменные, так вот при каждом цикле они изменяются немного. Т.е. плавают в небольших пределах. И частота на экранчике скачет.А изредка то 0 выскочит то вообще левая частота какая то Как это победить? или я делаю что не так? пробовал измерять по регистру захвата, так вообще тогда экран зависает (от нокиа 3310), а когда выключаю прерывания на момент обращения к экрану, то вообще сильно прыгает частота. В общем может поможете "причесать" примитивную программу. Все файлы прилагаю.
Несколько раз пытался в протеусе смоделировать частотомер, ни разу ни при каких алгоритмах эмулятор корректно не работал. Все было тоже самое, что и у Вас. Закончилось отладкой в железе.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения