Jump to content

Recommended Posts

Друзья помогите разобраться.

Приобрел управляемые диоды WS2812 многим уже известные.

Поиски доступных для новичка исходников результатов не дали. Сталкивался с скечами для Ардуино, библиотеками NeoPixel.

Во первых не забрался, во-вторых принципиально хочу сообразить всё это на на своей плате на Attiny или Atmege.

Сам по себе принци понять логику. Из даташита понятно что диды управляются 24битами, таймаутами и т.п., но никак не соображу как послать биты в контроллер.

Только начал разбираться с ШИМом. Думал тут чтото подобное.

Помогите новичку с самого простого.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Умный и безопасный дом от STMicroelectronics – строим вмеSTе!» (23.06.2021)

Приглашаем 23/06/2021 всех желающих принять участие в вебинаре, посвященном проектированию и разработке систем умного дома на базе компонентов STMicroelectronics. Экосистема продукции STMicroelectronics включает в себя как электронные компоненты, так и средства разработки, готовые стеки протоколов и законченные примеры кода. Предлагаемые ресурсы позволят разработчику легко построить каркас системы и быстро создать прототип своего приложения. На вебинаре также расскажем о беспроводных интерфейсах – ведь благодаря поддержке стандартов BLE и ZigBee разработчики смогут при необходимости интегрировать устройства сторонних производителей и создавать открытые системы.
Подробнее

Вроде работало, а если нашли ошибку, то может быть... главное, что бы понимание происходящего было)))

Share this post


Link to post
Share on other sites

Тактовые кнопки Panasonic - высококачественная коммутация в миниатюрном исполнении

Panasonic, один из мировых лидеров по производству высококачественных электромеханических компонентов, и Компэл представляют масштабное расширение складской программы. В настоящее время на складе Компэл доступны ведущие серии SMD-тактовых переключателей Panasonic в миниатюрных корпусах. Линейка тактовых кнопок Panasonic отличается многообразием компактных переключателей различных типоразмеров, форм штока и выводов. Переключатели отвечают важнейшим требованиям в ответственных применениях.

Подробнее

Использование интеллектуальных силовых ключей PROFET в системах электропитания современных автомобилей

Современные автомобили, использующие полуавтоматизированные и автоматизированные системы вождения, отказываются от централизованных систем распределения питания в пользу децентрализованных. При этом современные системы контроля электропитания и обеспечения его безопасности требуют замены электромеханических коммутаторов и предохранителей на быстродействующие ключи на базе MOSFET со встроенными микроконтроллерами и возможностями диагностики – такие как предлагаемые компанией Infineon интеллектуальные силовые ключи PROFET.
Подробнее

Передача 8 бит по спи как раз укладывается в период одного бита ws, передавая одно из двух значений по спи - ws распознает еденицу либо ноль, получается для зажигания одного диода надо отправить последовательность из 24байт в спи ws их воспримет как 24 бита по 8 бит на цвет.

Главное после заволнения всей ленты выждать паузу не менее 10-50 мксек, чтобы загруженые цвета зажглись.

Share this post


Link to post
Share on other sites

Что конкретно не понятно в этой строке ? Что такое while, SPSR или SPIF ? Или символы "!", "&", .... ?
 

Share this post


Link to post
Share on other sites

SPSR - регистр.
SPIF - бит в этом регистре.
"!" - логическое отрицание.
"&" - побитовое "И".
"<<" - сдвиг влево.

Что конкретно не понятно ?


 

Share this post


Link to post
Share on other sites

не думал что все так плохо.... Стоит наверное начать с изучения СИ, потом почитать даташиты на МК, что бы понять как они устроены, разобрать основные шины данных UART\SPI\I2C\1-wire

  • SPI Status Register – SPSR
  • Bit 7 – SPIF: SPI Interrupt Flag
  • When a serial transfer is complete, the SPIF Flag is set. An interrupt is generated if SPIE in
  • SPCR is set and global interrupts are enabled. If SS is an input and is driven low when the SPI is
  • in Master mode, this will also set the SPIF Flag. SPIF is cleared by hardware when executing the
  • corresponding interrupt Handling Vector. Alternatively, the SPIF bit is cleared by first reading the
  • SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR).
Edited by Mishany

Share this post


Link to post
Share on other sites

@Mishany Да некоторые моменты из СИ еще не понятны, но это решаемо с помощью интернета. Мое программирование когда-то давно закончилось на бэйсике, но логика то в голове осталась. Вот исходя логики пытаюсь эмитировать на бумаге ход выполнения программы.

Минуя все воиды с описаниями функций перехожу на войд маин, где крутиться цикл самой программы:

int main(void)
{
    SPI_MasterInit();
    while(1)
    {
//     off_strip();
//     _delay_ms(100);
    Set_Effect_2();

 

То-есть программа лезет в функцию эффектов в которой во временный массив загоняются значения эффекта:

for (s=0; s<t; s++)        //strip-длина ленты
    {
        for (i=0; (i<=s); i++)
        {

            for (j=0;j<3;j++)
            {
                if (i<longh)    //longh-длина эффекта
                {
                    temp[s+i][j]=led_on[j];//задвигаем массив эффекта во временный массив   
                }
                else
                {
                    temp[s+i][j]=led_off[j];//задвигаем led_off во временный массив
                }
            }

        SPI_Write();//отправляем что собрали на ленту
        delay(8+(strip-t));

 

И тут у меня есть вопрос. Во временный массив

temp[0][0] попадает led_on[0]

temp[0][2] попадает led_on[1]

temp[0][2] попадает led_on[2]

 

И больше про Led_on в программе ни слова. Только в самом начале описывается переменная unsigned char led_on[3]={255,255,255};

И при отправке временного массива в SPI_Write происходит сравнение:

if ((temp[n][j]&a)==0)            // что есть сравнение led_on[0..2] и a  == 0

 

Вот тут я не понимаю для чего led_on[0..2]. Может тут какие-то значения пропущены???

 

 

Share this post


Link to post
Share on other sites

в led_on[] храниться белый цвет

//вывод временного массива на ленту
void SPI_Write(void)				
{
	unsigned char a;
	unsigned char j,i,n;
for (n=0; n<strip; n++)			//strip=20 диодов длина ленты
{
	

	for (j=0; j<3; j++)			//первым выставляется G (Hi->Low), потом R и B
	{
		a = 0x80;				//сравниваем каждый бит
		for (i=0;i<8;i++)			//передача 8 бит цвета из подготовленного массива temp
		{
			if ((temp[n][j]&a)==0)
			{
				SPDR = 224;//0xE0 0.37us 0	//ноль
			}
			else
			{
				SPDR = 252;//0xFC 0.75us 1 //единица
			}
			while(!(SPSR & (1<<SPIF)));
			a=a>>1;
		}
	}
}
}

что тут может быть не понятно? Учите СИ, битовые поля, битовые маски, многомерные массивы

Share this post


Link to post
Share on other sites

Выше @Mishany привел примерчик реализации обмена по SPI с WS2812 - не смотря на то, что идея на поверхности и мне самому приходила в голову, я почему-то уперся в работу по прерываниям и, само собой, требования протокола не смог выполнить. А его пример вдохновил меня на другой подход, и вот что вышло:

Скачать видео
Скачать видео
Скачать видео

Это первый положительный результат. Основа - atmega32 (просто она есть в наличии, реально можно упихать и в atmega8), немного модифицированная библиотека FFT от Chan-а и 32 штуки WS2812 на выходе. В начале и конце работает фоновая подсветка (при тишине, не обращайте внимание на гул - это вентилятор системника на горизонте).

К сожалению, правила ютуба не позволяют выложить со звуком видео с ритмичной музыкой типа Boney M или Rock'n'Roll, на которой зрелищность заметно выше. Ну и качество видео не отражает реального эффекта в полной мере...

Но мне все равно нравится :) 

Edited by ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

  • Similar Content

    • By Teo74
      Есть проект состоящий из Atmega 8, Uart, и lcd Nokia 5110.Проблема лишь в том что дисплей 5110 очень маленький, так как показания нужно читать с расстояния 3-6 метров. В интернете нашёл 7 дюймовый TFT дисплей  но не понимаю как его использовать в моём проекте. В протеус его нет, библиотек для него тоже не нашёл. Если я правильно понял, у этого дисплея есть свой контролер STM32, но как совместить с Atmega 8? Как симулировать в протеус?
    • Guest kaisarali1997ss@gmail.com
      By Guest kaisarali1997ss@gmail.com
      Доброго времени суток.
      Не смог реализовать повторный Serial.available() внутри условия Serial.available.
      Может кто-то уже сталкивался с этим.
      Задача состоит в том, что нужно зажечь светодиодные ленты WS2812b. 
      Алгоритм действий:
      1)  Ожидаем появления данных на входе serial с помощью if (Serial.available()){}
      2) Принимаем значения int val=Serial.paresInt();
      3)Условие сравнивания if(val>123){chess=val;} esle if(val<124){color=val;} т.е номер светодиода это chess, цвет это color
      4) На смартфон отправляем 'n', для разрешения отправки следующих данных
      5)Ждем уже цвет светодиода на входе serial далее по предыдущему алгоритму 
      6)Зажигаем указанный светодиод на указанный цвет. 
      #include <FastLED.h> #define LED_PIN 6 #define NUM_LEDS 123 CRGB leds[NUM_LEDS]; const unsigned int DIM1 = 123; const unsigned int DIM2 = 1; const unsigned int DIM3 = 3; int ary[DIM1][DIM2][DIM3]; void setup() { Serial.begin(9600); FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS); } void loop() { if(Serial.available()){ int val=Serial.parseInt(); int chess=val; Serial.println(chess); delay(1); Serial.println('n'); clear_serail(); if(Serial.available()){int color=Serial.parseInt(); Serial.println(color); if(color>0){ if(color==124){ ary[chess][1][1]=0; ary[chess][1][2]=255; ary[chess][1][3]=0; Serial.println(ary[chess][1][1]); Serial.println(ary[chess][1][2]); Serial.println(ary[chess][1][3]); leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]); FastLED.show(); Serial.println('l'); clear_serail(); } if(color==125){ ary[chess][1][1]=255; ary[chess][1][2]=0; ary[chess][1][3]=0; leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]); FastLED.show(); Serial.println('l'); clear_serail(); }}} } } void clear_serail(){ Serial.end(); Serial.begin(9600); }  
    • By Любовь Бертулите
      Компания производитель вендинговых автоматов для розлива питьевой воды в поисках инженера-системотехника/инженера электронщика.
      График 5/2 с 9 до 18, здесь удаленный формат не рассматриваем.
      Место работы – г. Екатеринбург.
      Мы ищем специалиста, который будет делать прототипы нового для контроллера, курировать производство, проверять, дорабатывать, перепаивать, а также:
      Переписывать текущие программы на С++; Создавать программу для Android для конфигурации параметров контроллера через bluetooth. (т.е. предлагать новые, современные идеи и подходы для развития имеющихся контроллеров, которыми вы владеете); Предлагать новые программные продукты, среды разработки. Будет в тренде мира микроэлектроники, китайского контрактного производства. Может предложить совершенно новую реализацию наших текущих задач, чтобы это было лучше и эффективнее. В идеале, нам нужен специалист, который имеет:
      Опыт программирования микроконтроллеров Atmega, STM32, ESP32; Опыт работы в Altium Designer; Опыт работы в c++ (IAR, QT); Опыт работы с modbus, rs485/232, SPI. Готовы рассматривать специалистов с разным опытом, поэтому пишите, задавайте вопросы.
      Резюме можно отправить на почту lb@ktekt.ru (да, мы кадровое агентство), позвонить можно по следующему тел. 89068001212 - Любовь. 
       
    • By Trute
      Цена 700 р.
      Доставка по России Почтой России от 250 р. до 400 р. зависит от региона.
       
       Продаётся Плата в Сборе с Прошитым Микроконтроллером.
      ОПИСАНИЕ:
      Это устройство запитывается от любого источника питания 5 вольт, например, USB порт ПК или ноутбука, зарядка для телефона и т. п..., и не нуждается в подключении к источнику 12 вольт, в отличии от других прототипов.
      Предназначено для восстановления "убитых" микроконтроллеров AVR ATmega и ATtiny путем записи в них корректных значений бит фьюзов.
      Atmega Fusebit Doctor исправит Ваши брикнутые микроконтроллеры за доли секунды.
      Поддерживаемые контроллеры:
       
       



       
    • Guest Роман
      By Guest Роман
      Добрый день, форумчане. Такая задача. Хочу создать несколько устройств на светодиодах. Задача каждого в том, чтобы от движения (датчик вибрации, наклона) светодиод начинал моргать, переливаться и т.д. Подпитывается всё от батарейки, конечно же как можно меньших размеров (таблетка).
      Собственно я уже реализовал такое пробное устройство на ATtiny13, вибродатчике 18015 и батарейке CR1220. Всё работает, но хотелось бы это дело и удешевить и уменьшить в размерах, если это конечно же возможно. Особо в параметрах МК я не разбираюсь, но могу сказать что мне от неё точно нужно:
      1) Маленький размер
      2) Как минимум 1 канал ШИМ (а лучше 3, для переливания трёх светодиодов RGB)
      3) Память на 1Кб (программу для одного такого устройства приложу ниже, может её можно и сократить, но не факт что такую же, но на три диода получится ужать)
      4) Низкое потребление или возможность подключения режимов с низким потреблением.
      5) Работа от 3В. (от таблетки)
      6) Возможность программирования через Arduino UNO (но другие варианты тоже рассматриваю, просто Arduino уже есть)

      Повторюсь пока что нашел и использовал только ATtiny13, который меня вполне устроил, но он достаточно дорогой и в корпусе SOIC его найти достаточно проблематично. К тому же как мне показалось, он слишком хорош для такого проекта. Повторюсь, я чайник, и может есть какие-то более дешевые аналоги.

      Очень надеюсь на Вашу помощь. Заранее большое Вам спасибо!
      Прикладываю обещанный мною код:
      int vib = 4; int led = 0; long loopTime = 5000; void setup() { pinMode(led, OUTPUT); pinMode(vib, INPUT); } void loop() { if (digitalRead(vib)){ unsigned long currentMillis = millis(); while(millis()-currentMillis<=loopTime) { for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } digitalWrite(led, LOW); delay(600); } } }  
×
×
  • Create New...