BASCOM AVR в вопросах и ответах
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
У меня кварц 16 МГц.
- Вложения
-
- noname3.hex
- (2.78 КБ) 283 скачивания
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
- Microtech
- Поставщик валерьянки для Кота
- Сообщения: 2052
- Зарегистрирован: Вт ноя 03, 2009 21:02:38
- Откуда: Москва
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Кусок на ассемблере. Спер у кого-то и немного подправил. Значение регистра osccal подобрал, чтобы частота была около 12.5 МГц. (внутренний RC генератор)
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
dec r17
cpi r17,0
brne Nextbyte
pop r0
pop r16
pop r17
Waitus 5
Enable Interrupts
Return
Спойлер
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
dec r17
cpi r17,0
brne Nextbyte
pop r0
pop r16
pop r17
Waitus 5
Enable Interrupts
Return
Re: BASCOM AVR в вопросах и ответах
Урааа!
Подружил барсик (2.0.7.5) с библиотекой rainbow.
Ваш исходник работает!
Спасибо!
Иду дальше...
Ознакомился с описанием, что-то получается, а что-то нет.
Например, Call Settablecolor(0 , Х) работает с массивом и, меняя Х могу выбрать палитру. И очень странно, что меняется только 1 светик. А у меня неопиксель из 12ти светиков по кругу.
Чтобы включить все светики в ленте, надо воспользоваться Fill_Stripe() или Fill_color().
т.е. Call Fill_stripe(color(Х)) - здесь Х может принять значения: 1(светит белым); 2(светит желтым) и 3(светит красным). Почему только 3 и откуда такие цвета - не пойму. И почему цвет заливки не берется с массива?
Вкратце по умолчанию все светики горят белым. Каждое нажатие меняет цвет (берется из палитры). Привожу исходник
Microtech, asm для меня сложно. Я в нем ничего не понимаю. Барсик как-то привычней
В любом случае, спасибо!
Подружил барсик (2.0.7.5) с библиотекой rainbow.
Ваш исходник работает!
Спасибо!
Иду дальше...
Ознакомился с описанием, что-то получается, а что-то нет.
Например, Call Settablecolor(0 , Х) работает с массивом и, меняя Х могу выбрать палитру. И очень странно, что меняется только 1 светик. А у меня неопиксель из 12ти светиков по кругу.
Чтобы включить все светики в ленте, надо воспользоваться Fill_Stripe() или Fill_color().
т.е. Call Fill_stripe(color(Х)) - здесь Х может принять значения: 1(светит белым); 2(светит желтым) и 3(светит красным). Почему только 3 и откуда такие цвета - не пойму. И почему цвет заливки не берется с массива?
Вкратце по умолчанию все светики горят белым. Каждое нажатие меняет цвет (берется из палитры). Привожу исходник
Спойлер
Код: Выделить всё
$regfile = "m328pdef.dat"
$Crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Debounce = 75 'время задержки в мс
'_____
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
'#Rainbow0
Const Rainbow0_len = 12
Const Rainbow0_port = Portc
Const Rainbow0_pin = Pc3
'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 для меня сложно. Я в нем ничего не понимаю. Барсик как-то привычней
В любом случае, спасибо!
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
KOTик писал(а):И очень странно, что меняется только 1 светик. А у меня неопиксель из 12ти светиков по кругу.
Sub Settablecolor(byval Lednr As Word , Byval Index As Byte)
LedNr.....индекс светодиода.
Index.....индекс цвета.
То есть менять нужно не только Index, но и LedNr.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Re: BASCOM AVR в вопросах и ответах
Call Settablecolor(0 , 1) 'ЗЕЛЕНЫЙ СОГЛАСНО ПАЛИТРЕ ЦВЕТОВ
Здесь 0 - это первый светодиод (LedNumber). Если напишу 11, то загорится 12ый, если напишу 4, то загорится 5ый. Но никак ни все
Писать так:
Это не вариант. Ведь есть Call Fill_stripe(color(3)) и Call Fill_color(color(3)) , а они почему то не работают
Здесь 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)) , а они почему то не работают
-
Radan
- Мучитель микросхем
- Сообщения: 465
- Зарегистрирован: Ср июн 21, 2006 08:24:32
- Откуда: Лисичанск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
KOTик писал(а):Урааа!![]()
Подружил барсик (2.0.7.5) с библиотекой rainbow.
Расскажите пожалуйста, как вы их подружили.
Re: BASCOM AVR в вопросах и ответах
Radan писал(а):KOTик писал(а):Урааа!![]()
Подружил барсик (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 и ничего не получается. Мой вопрос выше остался открытым
Странно, не могу сюда прикрепить файлы библиотеки
- uni
- Встал на лапы
- Сообщения: 137
- Зарегистрирован: Пт дек 07, 2007 11:17:40
- Откуда: г. Екатеринбург
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
У меня есть две одинаковые виртуальные машины с настроенной системой сборки при помощи компилятора bascomp 2.0.7.8. Правда я делаю сборку без IDE, при помощи Makefile.
Одна машина VMware 12, вторая VirtualBox. На обеих winxp и по для работы с avr мк.
Если хотите, могу дать и показать как пользоваться. В систему сборки включена моя утилита objdump, которая позволяет получать листинги с расшифровкой кода bascom в виде ассемблерных команд. По листингам можно понять что делают библиотечные функции, если разбираться в ассемблере. Такие же листинги можно видеть при отладке кода в Proteus.
Одна машина VMware 12, вторая VirtualBox. На обеих winxp и по для работы с avr мк.
Если хотите, могу дать и показать как пользоваться. В систему сборки включена моя утилита objdump, которая позволяет получать листинги с расшифровкой кода bascom в виде ассемблерных команд. По листингам можно понять что делают библиотечные функции, если разбираться в ассемблере. Такие же листинги можно видеть при отладке кода в Proteus.
Россия навсегда!
Re: BASCOM AVR в вопросах и ответах
Здравствуйте. Может кто подскажет в таком вопросе.
Нужно подключить дисплей с 8 бит данными к ардуино уно.
Обычно под это дело выделяют отдельный порт так
Config Portd = Output
и далее переназначение под данные
Data_displey Alias Portd
Но на UNO 6 ног дисплея сидят на Portd.2-Portd.6 и две ножки Portb.0 и Portb.1
Может кто знает как правильно это всё конфигурировать в баскоме чтоб было равноценно Config Portd = Output ?
Под сигналы сброса дисплея, записи и т.д. конфигурируется по ножке и с этим проблем нет. Но как можно шину дата сделать когда на разных портах она висит?
Нужно подключить дисплей с 8 бит данными к ардуино уно.
Обычно под это дело выделяют отдельный порт так
Config Portd = Output
и далее переназначение под данные
Data_displey Alias Portd
Но на UNO 6 ног дисплея сидят на Portd.2-Portd.6 и две ножки Portb.0 и Portb.1
Может кто знает как правильно это всё конфигурировать в баскоме чтоб было равноценно Config Portd = Output ?
Под сигналы сброса дисплея, записи и т.д. конфигурируется по ножке и с этим проблем нет. Но как можно шину дата сделать когда на разных портах она висит?
Re: BASCOM AVR в вопросах и ответах
А что мешает у UNO переназначить порты? Да и не припомню, что бы они были вообще назначены. Подписаны - да, а конфигурация произвольная.
- Adagumer
- Поставщик валерьянки для Кота
- Сообщения: 2283
- Зарегистрирован: Чт ноя 15, 2012 20:47:59
- Откуда: Крымск
Re: BASCOM AVR в вопросах и ответах
Попробуйте напрямую указать "нога дисплея" = "порт контроллера"
по типу:
Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.6 , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2
по типу:
Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.6 , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2
Re: BASCOM AVR в вопросах и ответах
vem566 писал(а):А что мешает у UNO переназначить порты?
Вопрос в том как это сделать на баскоме. Назначить 8 ножек с разных портов под данные.
Проблема состоит в том что на UNO 8 ножек дисплея на которых выставляются данные попадают 2 ножки PORTB и 6 ножек PORTD.
Плату я конечно могу нарисовать и спаять как надо, но ардуиновские примеры работают с платой UNO. Попробую там посмотреть как они это делают.
Adagumer писал(а):Попробуйте напрямую указать "нога дисплея" = "порт контроллера"
Это конфигурация для двустрочника под стандартную библиотеку баскома. А у меня графический на ILI9341.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
А что, в баскоме нельзя обращаться к отдельным битам порта ?carnaval писал(а):Вопрос в том как это сделать на баскоме.
- Microtech
- Поставщик валерьянки для Кота
- Сообщения: 2052
- Зарегистрирован: Вт ноя 03, 2009 21:02:38
- Откуда: Москва
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Так нелзя, чтоли?
A = 55 ' распихиваем байт данных по разным пинам
send_11:
Portc.7 = A.0
Portc.3 = A.1
Portb.2 = A.2
Portb.0 = A.3
Portd.1 = A.4
Portc.1 = A.5
Portc.2 = A.6
Portb.4 = A.7
return
A = 55 ' распихиваем байт данных по разным пинам
send_11:
Portc.7 = A.0
Portc.3 = A.1
Portb.2 = A.2
Portb.0 = A.3
Portd.1 = A.4
Portc.1 = A.5
Portc.2 = A.6
Portb.4 = A.7
return
Re: BASCOM AVR в вопросах и ответах
Обращаться можно. Как сделать я знаю. Это вообще не проблема. Но в программе есть байт которым устанавливается нужное состояние порта целиком. А тут нужно без бубна устанавливать согласно этому байту состояние определённых 6 портов D и два порта В.
В принципе я знаю как разложить байт на биты и выставить их в нужных портах, но это действие скажется на быстродействии вывода на дисплей. Буду думать дальше как назначить это напрямую, без дополнительной подпрограммы разделения байта на биты.
Добавлено after 55 seconds:
В принципе я знаю как разложить байт на биты и выставить их в нужных портах, но это действие скажется на быстродействии вывода на дисплей. Буду думать дальше как назначить это напрямую, без дополнительной подпрограммы разделения байта на биты.
Добавлено after 55 seconds:
Так можно. Но не проще ли один раз сделать конфигурацию для прямого обращения к портам?Microtech писал(а):Так нелзя, чтоли?
- Microtech
- Поставщик валерьянки для Кота
- Сообщения: 2052
- Зарегистрирован: Вт ноя 03, 2009 21:02:38
- Откуда: Москва
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Так можно. Но не проще ли один раз сделать конфигурацию для прямого обращения к портам?
А что я предложил две конфигурации?

- Dnepr_1186
- Потрогал лапой паяльник
- Сообщения: 398
- Зарегистрирован: Чт мар 26, 2009 20:53:27
- Откуда: Беларусь.Минская обл.
Re: BASCOM AVR в вопросах и ответах
добрый вечер. Товраищи, примитивная задача-измерить частоту. Сделал на таймере, считывание показания по прерыванию ИНТ0. Но как то в протеусе частота прыгает, а бывает вообще выскакивает не та которая должна быть... Включил отладку, глянул как меняются переменные, так вот при каждом цикле они изменяются немного. Т.е. плавают в небольших пределах. И частота на экранчике скачет.А изредка то 0 выскочит то вообще левая частота какая то Как это победить? или я делаю что не так? пробовал измерять по регистру захвата, так вообще тогда экран зависает (от нокиа 3310), а когда выключаю прерывания на момент обращения к экрану, то вообще сильно прыгает частота. В общем может поможете "причесать" примитивную программу.
Все файлы прилагаю.
Все файлы прилагаю.
- Вложения
-
- автопдсос.rar
- (44.28 КБ) 190 скачиваний
- Dnepr_1186
- Потрогал лапой паяльник
- Сообщения: 398
- Зарегистрирован: Чт мар 26, 2009 20:53:27
- Откуда: Беларусь.Минская обл.
Re: BASCOM AVR в вопросах и ответах
4 раза скачано. А ответа нет 
Re: BASCOM AVR в вопросах и ответах
Несколько раз пытался в протеусе смоделировать частотомер, ни разу ни при каких алгоритмах эмулятор корректно не работал. Все было тоже самое, что и у Вас. Закончилось отладкой в железе.
-
rojnov
- Встал на лапы
- Сообщения: 127
- Зарегистрирован: Вс мар 27, 2011 07:48:48
- Откуда: г. Екатеринбург
Re: BASCOM AVR в вопросах и ответах
Приветствую всех, кто еще не спит.
Детский вопрос. Нужно задействовать Timer1, но чтобы он считал не с 0 до 65535, а с 5000 до 65535. Если я до
начала цикла Do-Loop укажу таймеру начальное значение Timer1=5000, т.е. примерно так:
Config Nimer1=Timer, Prescale=64
Timer1=5000
...
...
Do
Start Timer1
...
...
...
Stop Timer1
Loop
Будет ли при каждом круге цикла Do-Loop таймер стартовать со значения 5000, или надо каждый раз указывать ему
начальное значение?
Детский вопрос. Нужно задействовать Timer1, но чтобы он считал не с 0 до 65535, а с 5000 до 65535. Если я до
начала цикла Do-Loop укажу таймеру начальное значение Timer1=5000, т.е. примерно так:
Config Nimer1=Timer, Prescale=64
Timer1=5000
...
...
Do
Start Timer1
...
...
...
Stop Timer1
Loop
Будет ли при каждом круге цикла Do-Loop таймер стартовать со значения 5000, или надо каждый раз указывать ему
начальное значение?