Сделал для 2313. Тактовая частота 20МГц. Выход PB4. Потом можно переделать на таймер 0 и там будет нужная Вам нога, СКАЗОЧНИК. Есть возможность присобачить на PB4?
20МГц наверняка даст возможность выдвигать биты в цикле (может и 16 хватит). Но пускай пока для каждого бита свой код. Главное проверить работоспособность.
На линию выкидывает 100 байт начиная с адреса 0x60.
Спойлер
Код:
.equ eTOP=0x18 //предел счетчика для 20МГц .equ eBit1=0xF //длительность единичного импулься для лог1 .equ eBit0=0x08 //---------- .def zero=R1
.def buf=R16
.def Bit1 =R17 .def Bit0 =R18 .def SbrosFlag=R19
.def Chislo=R20
//---------- .macro SetBit out TIFR,SbrosFlag //sbrc chislo,@0 out OCR1BL,bit1 sbrs chislo,@0 out OCR1BL,bit0 .endm
.Macro WaitFlag//ждем когда сбросится счетчик in BUF,TIFR ANDi buf,1<<TOV1 breq PC-2 .endm //----------
ldi Zl,low(0x60) //адрес откуда считывать данные ldi ZH,High(0x60)
out TCNT1h, zero //установить счетчик чуть меньшим значение верха ldi buf,eTop-2 out TCNT1l,buf
//************************* //Занести ноль в старшой буфер out OCR1BH,zero //переключение выхода
ld chislo,Z+ //ldi chislo,0x55 SetBit 7
//---------- // понеслась LDI buf,(1<<WGM10)|(1<<WGM11)|(1<<COM1B1)|(0<<COM1B0) out TCCR1A,buf LDI buf,(1<<WGM13)|(1<<WGM12)+1 out TCCR1B,buf //_____
WaitFlag
Cicle: SetBit 6 WaitFlag
SetBit 5 WaitFlag
SetBit 4 WaitFlag
SetBit 3 WaitFlag
SetBit 2 WaitFlag
SetBit 1 WaitFlag
SetBit 0 WaitFlag
SBIW X,1 breq Stop ld chislo, Z+
SetBit 7 WaitFlag
rjmp Cicle
//таймер стоп Stop: out TCCR1B,zero out TCCR1A,zero //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& loop:
rjmp loop
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
еЛКИ. я со своими тормозными мозгами туда буду еще два часа думать, как чего засунуть. Мне все время регистров хватало и с памятью раза два всего дело имел.
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 18:39:15
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:3 Медали: 1
Команды ld chislo, Z+ в двух местах замените на lpm chislo, Z+ . В Z загрузите не 0x60, а DATA*2 (двойное значение метки). В Х фактическое количество байт. Вроде так, если не затупил. Будет сразу читать из флеша и озу не надо.
Помните, я в железе не проверял. Самому интересно что вышло, и не факт что заработает. Хотя в протеусе вроде все правильно.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 18:53:37
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:3 Медали: 1
Но и частота 20МГц ,а не 16. Смысл - команды, что-то меняющие, должны это сделать , чтобы счетчик не успел досчитать до Топа, так как после этого пойдет следующий бит. В данном случае 0x18 или 25 тактов. А вот когда 16 МГц было - только 20 тактов и вроде все работало в симуляторе. Вся привязка к таймеру, быстрее можно делать, но это ничего не даст.
По-моему как-то тупо объяснил.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Да, работает ваш алгоритм. ) Только я его все равно не понимаю.
Однако, добавил библиотеки вверху, а то ругаться начал на неопределенные выражения всякие. Сменил чтение из ОЗУ с адреса 0х60 на чтение из Флеша по метке. Добавил и сам массив в самом низу.
Одно исправление, не 100 элементов массива, а 54 (ну у меня изначально он был на 54 байта ИЛИ 18 светодиодов). И вывод на три светодиода. Т.к. остальные у меня не распаяны.
Работает хорошо. Даже, как мне показалось, лучше чем мой вариант. Но... это к сожалению не мой... (((
Спойлер
Код:
.include "tn2313def.inc"
.equ eTOP=0x18 //предел счетчика для 20МГц .equ eBit1=0xF //длительность единичного импулься для лог1 .equ eBit0=0x08 //---------- .def zero=R1
.def buf=R16
.def Bit1 =R17 .def Bit0 =R18 .def SbrosFlag=R19
.def Chislo=R20
//---------- .macro SetBit out TIFR,SbrosFlag //sbrc chislo,@0 out OCR1BL,bit1 sbrs chislo,@0 out OCR1BL,bit0 .endm
.Macro WaitFlag//ждем когда сбросится счетчик in BUF,TIFR ANDi buf,1<<TOV1 breq PC-2 .endm //----------
out TCNT1h, zero //установить счетчик чуть меньшим значение верха ldi buf,eTop-2 out TCNT1l,buf
//************************* //Занести ноль в старшой буфер out OCR1BH,zero //переключение выхода
lpm chislo, Z+ //ldi chislo,0x55 SetBit 7
//---------- // понеслась LDI buf,(1<<WGM10)|(1<<WGM11)|(1<<COM1B1)|(0<<COM1B0) out TCCR1A,buf LDI buf,(1<<WGM13)|(1<<WGM12)+1 out TCCR1B,buf //_____
WaitFlag
Cicle: SetBit 6 WaitFlag
SetBit 5 WaitFlag
SetBit 4 WaitFlag
SetBit 3 WaitFlag
SetBit 2 WaitFlag
SetBit 1 WaitFlag
SetBit 0 WaitFlag
SBIW X,1 breq Stop lpm chislo, Z+
SetBit 7 WaitFlag
rjmp Cicle
//таймер стоп Stop: out TCCR1B,zero out TCCR1A,zero //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& loop:
Есть еще одна изюминка... У меня вариант не на один порт микроконтроллера, а на любые из 8 бит, и хоть все сразу. Т.к. мне надо было выводить сразу на четыре ленты.
Добавлено after 2 minutes 24 seconds: Еще бы сделать сдвиг этого всего, чтобы цвета перемещались по ленте... )))
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 19:09:08
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Боюсь, что параллельно выдавать не потянет МК. Только зачем Вам так? Соедините их в одну линию. 200 последовательных диодов 6мс требуют времени на обновление, это долго?
Алгоритм могу пояснить.
А сдвиг - надо просто все оформить ввиде подпрограммы и вызывать ее инициализировать Z новым адресом.
Цитата:
Однако, добавил библиотеки вверху,
У меня Атмел студио 6. Он их сам подключает.
_______
UPD: Я таблицу то векторов от Атмеги оставил.!!!
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Я пользуюсь студией 4,19. Если посоветуете перейти на 6ю, то перейду. Однако, говорят, она более навороченная и сложная.
Алгоритм не плохо бы хорошо прокомментировать и украсивить. ))) Тогда будет понятен. Можно и так разобраться, однако, за пояснения все равно спасибо и не откажусь.
У меня тянет МК делать так, без прерываний в тупом главном цикле, т.к. мне больше от него ничего не надо, но и дергать может всем портом сразу или любым количеством битов из порта. Зачем мне это нужно? ))) Тут уже шли у меня мутки и споры по поводу того, можно ли параллелить 4 таких светодиодных ленты на один вывод. Ну и не решился я... Хоть и не большой ток им нужен. Мне же нужно увеличить пиксель. И поэтому пиксель на моем "экране" состоит из 4х светодиодов таких. Всего таких пикселей 18.
Теперь, если сказать, что можно было все это сделать последовательно и просто кучу светодиодов обновлять информацию, то сколько же мне в одной ТИНИ2313 понадобится памяти для этого? Так у меня всего 18 пикселей (светодиодов) и 54 байта информации. А в другом случае у меня 72 светодиода (при этих же пикселях), но последовательно и уже 216 байт информации... Вот и проблема, чем больше в линии светодиодов последовательно, тем больше байт выводить, хоть и быстро. А у меня 4 светодиода всегда светятся одинаково, тогда зачем увеличивать память?
Добавлено after 2 minutes 59 seconds:
Z_h_e писал(а):
А сдвиг - надо просто все оформить ввиде подпрограммы и вызывать ее инициализировать Z новым адресом.
Вот это я в голове очень хорошо представляю. Даже примерно, как сделать сдвиг по адресу, чтобы каждый раз следующий был. Я не могу сообразить, как сделать так, чтобы те элементы, которые пропустил в итоге становились в самый конец! Чтобы круг замкнулся!
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 19:32:24
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:3 Медали: 1
А я не понял, что у Вас 4 ленты одно и тоже светят. Думал что Вы хотите одновременно на 4 ленты разное выдавать.
Алгоритм такой. Вы же видели, что для данных светодиодов 1 и 0 передаются с одинаковым периодом, но разной скважностью. Т.е. чистой воды ШИМ. Таймер выдает аппаратный ШИМ (поэтому просто так ногу не сменить, она же жестко к таймеру привязана). Пока таймер формирует один период ШИМ, программа успевает его перенастроить на следующий период, нужной скважностью. Вот и все.
Цитата:
Я пользуюсь студией 4,19. Если посоветуете перейти на 6ю, то перейду.
Советую пользоваться тем, что нравится.
Цитата:
украсивить
Попробую, но не сегодня наверное.
СКАЗОЧНИК писал(а):
Чтобы круг замкнулся!
Наверное самый простой метод, это держать две подряд таблицы во флеш. Если место есть, то чего мудрить?
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Наверное самый простой метод, это держать две подряд таблицы во флеш. Если место есть, то чего мудрить?
Тоже вариант, почему-то пока не сказали, даже не подумал об этом.
Z_h_e писал(а):
Пока таймер формирует один период ШИМ, программа успевает его перенастроить на следующий период
О! Вот теперь идея ясна. ))) Спасибо.
Z_h_e писал(а):
Советую пользоваться тем, что нравится.
Почему так? Может я уже в прошлом веке торчу?... Просто привык к старому.
З.Ы. Я где-то вычитал, что тайминги у этих светодиодов не такие уж очень жесткие... И они первую часть периода принимают жестко, а хвост (остаток) можно и подзатянуть в разумных приделах, но не превышая время сброса (однако не более 10 мкс). Что я и сделал в своей реализации. Что тоже работает, хотя, может это и коряво. Поэтому заново пересмотрю вашу идею. Да, жаль, что ШИМ аппаратный.
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 19:48:07
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
СКАЗОЧНИК писал(а):
Почему так? Может я уже в прошлом веке торчу?...
Там такой же ассемблер и никакого интеллектуального и актуализированного ввода текста или как он там называется. Может у меня просто выключено и я не знаю , потому что на Си когда пишешь, половину сам за тебя дописывает.
СКАЗОЧНИК писал(а):
Я где-то вычитал, что тайминги у этих светодиодов не такие уж очень жесткие...
По логике вроде так и должно быть. Фронт - начало передачи бита, затем нужная длительнось высокого уровня и вроде бы держи низкий сколкько хочешь, лишь бы до резета не дотянуть. Но ДШ указывает допуск 150нс как на высокий уровень, так и на низкий.
Цитата:
Да, жаль, что ШИМ аппаратный.
Дык вся идея и была на аппаратном ШИМ и не надо никакие тайминги считать.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 19:57:25
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Была мысль и на UART. Только мне показалось, что если передавать одним кадром один бит, то слишком быстро для UART, а дробить например на 5 бит не захотелось думать. UART еще инвертировать надо. Решил с ШИМом попробовать.
А SPI даже не думал. Читать же надо, я кажется с ним на работал.
------- Я думал что светодиоды нужны для полочек. Не думали их использовать в этой ипостаси? Они так просто упростят Вашу задачу, как программно, так и аппаратно.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Последний раз редактировалось Z_h_e Чт окт 20, 2016 20:02:56, всего редактировалось 1 раз.
Уважаемый Z_h_e предложил вариант на таймере: viewtopic.php?p=2893993#p2893993 однако... когда ранее прсматривал варианты исполнения мне такое решение показалось не слишком практичным... не столько из-за применения аппаратно-зависимой привязки к выводам МК, склько из-за невозможности вписаться во время даташита... размышлялось примерно так: всего допустимо 20 циклов при 16МГц с учетом реакции на прерывание надо минимум возможного причем здесь вариант для 1-байтового Т/С1 (тини45)! в другом случае потребно 2 байта для перезагрузки ocr1 ! ежли прерывание, то тело его обработчика
Код:
rol tmp_dat ; 1 сдвиг следующего бита brcs trs_1 ; 1-нет/2-да анализ следующего бита на 1 out ocr1a,tsl0 ; 1 загрузка слота 0 rjmp ands_slts ; 2 переход на анализатор исчерпания бит trs_1: out ocr1a,tsl1 ; 1 загрузка слота 1 ands_slts: dec cntb ; 1 счетчик текущих бит - 1 brne prolg ; 1-нет/2-да проверка исчерпания счетчика текущих бит ldi cntb,8 ; 1 перезагрузка при исчерпании sbiw r25,1 ; 2 счетчик байт массива -1 brbs Z,end_mass_tr ; 1-нет/2-да проверка на завершение массива ld tmp_dat,x+ ; 2 если еще есть байт загружаем в буфер вывода prolg: reti ; 4 примерно 16 тактов при максимальной длине = запас в 4 такта... end_mass_tr: stop t_c1 ; здесь уже время не существенно reti ;
если используем программное ожидание, то ставится фрагмент
Код:
wait: ; засада - TIFR за пределами области прямоанализируемых бит портов, ; значит нужен еще один временный регистр... in tmpf,TIFR ; 1 sbrs tmpf,TOV1 ; 1-нет/2-да rjmp wait ; 2 ldi tmpf,(1<<TOV1) ; 1 out TIFR,tmpf ; 1 сброс флага TIFR.TOV1 ; и дальше повтор вышеприведенного rol tmp_dat ; 1 сдвиг следующего бита brcs trs_1 ; 1-нет/2-да анализ следующего бита на 1 out ocr1a,tsl0 ; 1 загрузка слота 0 rjmp ands_slts ; 2 переход на анализатор исчерпания бит trs_1: out ocr1a,tsl1 ; 1 загрузка слота 1 ands_slts: dec cntb ; 1 счетчик текущих бит - 1 brne prolg ; 1-нет/2-да проверка исчерпания счетчика текущих бит ldi cntb,8 ; 1 перезагрузка при исчерпании sbiw r25,1 ; 2 счетчик байт массива -1 brbs Z,end_mass_tr ; 1-нет/2-да проверка на завершение массива ld tmp_dat,x+ ; 2 если еще есть байт загружаем в буфер вывода prolg: rjmp wait ; 2 примерно 19 тактов при максимальной длине = запас в 1 такта... end_mass_tr: stop t_c1 ; здесь уже время не существенно
тоесть при применении аппаратного таймера в некоторых случаях обработки время исполнения программы критически совпадает с периодом самого таймера, что не есть хорошо для частоты системного генератора менее 16МГц (0.0000000625секунды/такт). Единственное преимущество более верное соответствие времени слотов 1 и 0.
Заголовок сообщения: Re: Светодиоды c пиксельной адресацией WS2812B
Добавлено: Чт окт 20, 2016 20:17:49
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Прямой доступ не пробовал. Но делал фазовый ШИМ (диммер) без участия программы. Т.е. приходит импульс детектора фазы на вход МК, таймеры сами его обрабатывают и выдают нужный сигнал. Программа туда совсем не вмешивается, кроме инициализации и смены режима. Это я еще затупил, сделал на двух таймерах, а оказалось можно сделать на одном. Есть верить одному форумчанину, у него вроде получилось.
Но я что-то пока подзабил на STM32, надо бы конечно вернуться к нему. У меня еще STM8 валяется.
Добавлено after 9 minutes 28 seconds:
BOB51 писал(а):
причем здесь вариант для 1-байтового Т/С1 (тини45)! в другом случае потребно 2 байта для перезагрузки ocr1 !
2313 позволяет работать с таким алгоритмом на 8битном таймере. Но 2 байта не требуется для перезагрузки ocr1, если не трогать буферный старший байт таймера1. А я его не трогаю.
BOB51 писал(а):
с учетом реакции на прерывание надо минимум возможного
Никаких прерываний не получится, нету времени на них. Хотя я не считал, что-то мне это подсказывает.
А я Ваш код и не видел, BOB51. Смотреть не вникая - смысла нет. Разбирать чего-то уже голова не варит. Очень даже может быть Ваша идея значительно лучше моей. Меня приятно удивили существование таких светодиодов, петух меня клюнул и я решил попробовать реализовать данный алгоритм.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения