#1 Програмування Arduino » Расширение входов при помощи регистров по SPI » 2018-02-01 13:20:43

seri0shka
відповідей: 0

Для расширения входов-выходов применяю сдвиговые регистры с программным SPI, всё отлично работало. Сейчас осваиваю аппаратный SPI, возникли проблемы.
Вот фрагмент скетча в котором считывается 8 bit с входного регистра 74НС165 в переменную out1 (опрос каждые 100 мсек). Как считать 16 bit соответственно с двух последовательно включенных регистров? Заменить _8bit на _16bit не подходит!

#include <LineDriver.h>
#include <SPI.h>
#include <SPI_Bus.h>
int out1;
SPI_Bus reg1(_8bit,  9);
unsigned long time_1=0;
void setup()
{
reg1.setSelectionPolicy(SPI_Bus::SELECT_BEFORE);
}
void loop()
{
if (millis()>=  time_1)
  {   
    time_1 =millis()+ 100;
    noInterrupts();
    out1 = reg1.read8bits();
    interrupts();
  }
}

#2 Проекты » Управление по одному проводу. » 2017-02-24 21:14:17

seri0shka
відповідей: 0

Сделал блок для управления нагрузками по одному проводу (на самом деле по двум, конечно, но при этом только один сигнальный и, соответственно, используется один пин ардуинки). Изначально блок проектировался для управления релюшками в количестве до 16 штук, но на картинке для простоты и наглядности два семисегментных индикатора. Разработано на основе статей "Управляем индикатором TIC по одному проводу", "Управление семисегментными индикаторами по одному проводу" и видео с ютуба "Управление сдвиговым регистром по одному проводу". Принцип работы подробно расписан в указанных статьях, остальное должно быть понятно из схемы и циклограмм на рисунке. В отличие от вариантов из статей, блок позволяет полноценно передавать 16 бит информации, в моём случае каждый бит означает включенное или выключенное состояние реле. Изменён вариант подключения защёлки регистра, применение SN74HC125 позволяет обойтись без диода между выходом буфера и конденсатором С2 (при высоком уровне на входе Е буфера выход буфера находится в высокоимпедансном состоянии и конденсатор постепенно заряжается через резистор R2, при низком уровне на входах Е и D буфера на выходе О тоже низкий уровень, что приводит к почти мгновенному разряду конденсатора С2). Возможно применение любых других повторителей (буферов) или по два последовательно соединённых инвертора (хоть 155ла3), но тогда между выходом микросхемы и конденсатора С2 нужно ставить диод- на схеме под цифрой 4 в кружочке, анодом к конденсатору. Номиналы резисторов и конденсаторов в моём варианте: R1=1ком, C1=0,1мкф, R2=4,7ком, C2=0,33мкф. На циклограмме t1- время записи единицы в регистр, при указанных номиналах я поставил 30 мкс, t0- время записи нуля в регистр, у меня 130 мкс, tр- пауза между битами, в скетче такая же, как и t0. Временые параметры можно изменить при других номиналах конденсаторов и резисторов, я подбирал экспериментально оптимальные для таких номиналов, как на схеме. При большом расстоянии от ардуины до приёмного блока возможно влияние помех, но так как информация в регистр перезаписывается каждый цикл отработки скетча, то одиночные помехи не оказывают значительного влияния на состояние реле на выходах или показания индикаторов.  Тех, кто попробует схему в действии, прошу написать про результаты работы, в частности про используемые в вашем варианте номиналы и временные параметры. Их можно менять в широких пределах. Также принимаются предложения по изменению скетча, если переписать его на СИ, можно значительно ускорить, но я ещё далёк от такого уровня. Отвечу на конструктивные вопросы, глупых прошу не задавать.

595-03.jpg


bool in01=1;//любые нужные переменные для вывода
bool in02=0;
bool in03=1;
bool in04=1;
bool in05=0;
bool in06=0;
bool in07=1;
bool in08=1;
bool in09=1;
bool in10=1;
bool in11=0;
bool in12=0;
bool in13=0;
bool in14=0;
bool in15=1;
bool in16=1;
int OUT = 5;//пин для вывода

void setup() {
  pinMode(OUT, OUTPUT);
}

void loop() {
  int x = 130;//t0- время записи нуля в регистр, и такое же время для tр- паузы между битами
  int y = 30;//t1- время записи единицы в регистр 

  digitalWrite(OUT, 0);
  if ( in01 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in02 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in03 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in04 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in05 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in06 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in07 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in08 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in09 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in10 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in11 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in12 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in13 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in14 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in15 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in16 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  delay(40);//пауза до перезаписи
}

#3 Re: Програмування Arduino » VGA library for Arduino » 2017-02-04 23:47:35

Открываем файл VGAX.h в библиотеке VGAX. Ищем строку
#define VGAX_HEIGHT 60
Заменяем 60 на желаемое, скажем 126. Дальше в строке
#define VGAX_BWIDTH 30
заменяем 30 на 15.
Далее открываем файл VGAX.cpp. В строке
#define SKIPLINES 90
можно заменить 90 на меньшее значение (не менее 35), я ставил 50, это подымет изображение на экране
выше на несколько строк. Можно и не менять. Далее в строке
if (rlinecnt<60) { 
Нужно изменить значение на то же, что в файле VGAX.h, в даном случае 126. Далее в строке
".rept 30   \n\t" //output 4 pixels for each
меняем 30 на 15 (как заменили в файле VGAX.h). И в строке
if (++aline==5) {
меняем 5 на 2, уменьшая высоту пикселей и символов в 2 раза (с 6 до 3 строк).
После всего вышеописанного перезапускаем IDE, открываем скетч BitFont из примеров, и дописываем чтобы он выводил на экран 21 строку с координатами x,y от 0,0 до 0,120. Компилируем, вгружаем, подключаем к монитору. Видим на экране 21 строку текста сверху донизу экрана.
Но длина строк всего лишь 15*4=60 пикселей, это около 13 букв (до середины экрана). Для того, чтоб добиться желаемого, нужно было не менять число 30 в описании выше, но тогда не хватит оперативной памяти, которая и так занята на 95%. Как известно, у автора библиотеки каждый пиксель экрана (60х120) состоит из двух бит, то есть в одном байте оперативной памяти закодировано 4 пикселя 4 возможных цветов каждый. Если сделать, чтобы каждый байт содержал 8 однобитных пикселей (2 цвета- чёрный или белый), то памяти хватит для картинки разрешением 126 по вертикали и 120 по горизонтали (15 записей по 8 бит, смотреть выше).
Вот здесь в файле VGAX.cpp. код вывода байта на экран:
      ".rept 15                  \n\t" //output 4 pixels for each iteration*30 в оригинале
      "    ld r16, Z+            \n\t" //
      "    out %[port], r16   \n\t" //write pixel 1
      "    mul r16, r20         \n\t" //<<2
      "    out %[port], r0    \n\t" //write pixel 2
      "    mul r0, r20          \n\t" //<<4
      "    out %[port], r0    \n\t" //write pixel 3
      "    mul r0, r20          \n\t" //<<6
      "    out %[port], r0    \n\t" //write pixel 4
      ".endr                      \n\t" //
Пробовал здесь поиграть, ничего толкового не вышло, хотя немного узнал об Ассемблере, что тоже неплохо.
Может кто поскажет что?

#4 Re: Програмування Arduino » VGA library for Arduino » 2017-02-03 14:46:22

В строке
if (++aline==5) {
файла "VGAX.cpp" меняю 5 на 2, получаю пиксель высотой 3 строки вместо 6, то есть то, что и хотел. Но вот вывести более 60 пикселей по вертикали не получается (получилось, но нижняя половина экрана дублировала верхнюю с некоторым смещением и абракадаброй на стыке зон). У кого есть мысли в этом направлении? Заранее благодарен за любую помощь.

#6 Re: Програмування Arduino » VGA library for Arduino » 2017-02-03 12:28:06

Ещё вопрос знатокам, может глупый.
Можно ли изменить доступное разрешение в этой библиотеке с 120*60 на 120*120. Аппаратно в моём понимании ограничение по горизонтали привязано к тактовой частоте, а по вертикали хоть 480.
Вот так бы выглядела картинка на экране (слева 120*60, справа 120*120, фотошоп)
PICT0536bj_3894347_25021927.jpg
Сам попробовал изменить один параметр в "VGAX.cpp"- не получилось.

#7 Re: Програмування Arduino » VGA library for Arduino » 2017-02-02 01:50:11

УРА! Заработало! В папке скетча "BitFont" были файлы "bitblit.cpp", "blit.cpp", "blit4.cpp", "blit8.cpp", вот их убрал  и всё компилируется.
А закинул я их туда ещё в первый день, до переименования print в printPROGMEM. Пример "MarioSprites" только с ними компилировался, вот я и здесь всунул на свою голову.
Всем большое спасибо, рад что тема заинтересовала.

#8 Re: Програмування Arduino » VGA library for Arduino » 2017-02-01 16:00:59

NoName пише:

что означает не прокатило?

Меняю print на printPROGMEM. При проверке ошибка:

Arduino: 1.6.5 (Windows 7), Плата"Arduino Nano, ATmega328"
VGAX\print.cpp.o: In function `VGAX::printPROGMEM(unsigned char*, unsigned char, unsigned char, unsigned char, unsigned char, char const*, char, char, unsigned char)':
C:\Users\Администратор\Desktop\arduino-1.6.5-r5\libraries\VGAX/print.cpp:80: multiple definition of `VGAX::printPROGMEM(unsigned char*, unsigned char, unsigned char, unsigned char, unsigned char, char const*, char, char, unsigned char)'
print.cpp.o:C:\Users\836D~1\AppData\Local\Temp\build2182968972192280164.tmp/print.cpp:80: first defined here
VGAX\print.cpp.o: In function `VGAX::printPROGMEM(unsigned char*, unsigned char, unsigned char, unsigned char, unsigned char, char const*, char, char, unsigned char)':
C:\Users\Администратор\Desktop\arduino-1.6.5-r5\libraries\VGAX/print.cpp:80: multiple definition of `VGAX::printSRAM(unsigned char*, unsigned char, unsigned char, unsigned char, unsigned char, char const*, char, char, unsigned char)'
print.cpp.o:C:\Users\836D~1\AppData\Local\Temp\build2182968972192280164.tmp/print.cpp:80: first defined here
collect2.exe: error: ld returned 1 exit status
Ошибка компиляции.

#9 Re: Програмування Arduino » VGA library for Arduino » 2017-02-01 01:35:12

NoName пише:

120*60  это слишком маленькое разрешение.  (

VGA для Arduino - это как с помощью стремянки на 9-этажку, так что и 120*60 неплохо. Хотя мне кажется, что 120*120 вполне можно было бы в однобитном режиме сделать. Но автор библиотеки почему-то выбрал двухбитный режим со странным подключением. Я три цвета на разъёме VGA соединил, чтоб чёрно-белое изображение получить, можно даже на 2 монитора разные картинки вывести (пробовал), или на один монитор 4 градации яркости вместо 4 цветов (пока не пробовал).

#10 Re: Програмування Arduino » VGA library for Arduino » 2017-02-01 01:23:48

void loop пише:

print был переименован в printPROGMEM.

Спасибо, это я ещё в первый день попробовал- не прокатило У вас компилируется?

#11 Re: Програмування Arduino » VGA library for Arduino » 2017-01-31 12:19:17

Хоть что-то подскажите, неужели никому тема не интересна? Я уже почти решил вопрос обходными путями, но хотелось бы без костылей встроенными средствами библиотеки, через vga.print.

#12 Програмування Arduino » VGA library for Arduino » 2017-01-25 22:57:02

seri0shka
відповідей: 18

Есть замечательная библиотека для ардуино, позволяющая выводить изображение на VGAмонитор в разрешении 120*60 пикселей. Вот здесь тема от автора библиотеки:
http://forum.arduino.cc/index.php?topic=320238.0
А вот здесь сама библиотека:
https://github.com/smaffer/vgax
Примеры из библиотеки я попробовал (без бубна не обошлось), работают отлично. Но вывести надписи на экран никак не получается, компилятор ругается:
Arduino: 1.6.5 (Windows 7), Плата"Arduino Nano, ATmega328"
sketch_jan24b.ino: In function 'void setup()':
sketch_jan24b:110: error: 'class VGAX' has no member named 'print'
'class VGAX' has no member named 'print'
Как только убираю строку с 'print' из скетча, сразу компилируется нормально, ну так и смысл пропадает.
Кто-нибудь опытный, попробуйте скетч "BitFont" из папки "examples" в библиотеке, с монитором пробовать не обязательно, для начала он должен нормально компилироваться, а я опробую уже с монитором и отчитаюсь.
Очень прошу, три вечера мучаюсь.

#13 Re: Програмування Arduino » Библиотека для четырёхразрядного семисегментного LED ииндикатора. » 2016-06-23 16:57:09

То есть скважность или время активного состояния индивидуальна для каждой цифры?

#14 Re: Програмування Arduino » Библиотека для четырёхразрядного семисегментного LED ииндикатора. » 2016-06-23 16:37:40

Напрямую, без резистора- это понятно (не знаю, понравится ли это контроллеру). Только не пойму, что при этом нужно менять в программе?

#15 Re: Програмування Arduino » Библиотека для четырёхразрядного семисегментного LED ииндикатора. » 2016-06-23 16:01:54

Green пише:

Однажды написал на все случаи. Любые порты, до 8 анодов/катодов, с таймером/без, с резисторами/без, PIC/AVR, яркость, мигание т.п. Но много нюансов из за которых страдает наглядность.

А что значит "с таймером/без, с резисторами/без", в смысле для чего таймер и как без резисторов?

#17 Re: Програмування Arduino » Библиотека для четырёхразрядного семисегментного LED ииндикатора. » 2016-06-22 22:57:31

Это я не умею пока. Скетч могу попробовать без использования библиотеки написать, но это будет строк на 500

#18 Re: Програмування Arduino » Библиотека для четырёхразрядного семисегментного LED ииндикатора. » 2016-06-22 22:39:17

NoName пише:

Led4Digits disp(1,5,4,3,2, 6,7,8,9,10,11,12,13);
Led4Digits disp2(10, 15,14,23,21, 26,27,28,29,30,31,32,33);
а так? ет ведь ++ , работает вывод?

------Led4Digits disp2------ Стазу ошибка: 'disp' was not declared in this scope
Думаю, если создать вторую библиотеку с именем Led4Digits_2, в которой переименованы все переменные (и не только), то прокатило бы. Но тут появился бы другой вопрос- где взять пины 23,26,27,28,29,30,31,32,33? К тому же, пины 5,4,3,2 должны быть общими для обоих библиотек- тупик (((

#19 Програмування Arduino » Библиотека для четырёхразрядного семисегментного LED ииндикатора. » 2016-06-22 18:18:45

seri0shka
відповідей: 14

Нашёл отличную (и единственную) библиотеку для подключение семисегментного светодиодного индикатора, статья с описанием здесь:
http://mypractic.ru/urok-20-podklyuchen … rom.html#3
Главное достоинство по сравнению с подобными- работает в параллельном процессе (формулировка автора), кроме того с любыми вариантами полярностей управляющих импульсов (4 варианта). Проверил в действии, хорошо прочувствовал преимущество параллельного процесса- индикатор не мигает, яркость сегментов равномерная. Если кто встречал подобные библиотеки- дайте ссылки.
Но хотелось бы к ардуинке подключить 2 индикатора по 4 разряда- то есть 8 выходов на сегменты первого, 8 выходов на сегменты второго, 4 выхода на общие аноды (или катоды)- каждый к энному разряду обоих индикаторов. Да, с помощью регистров я и 3 штуки по 4 разряда подключал, но хочется использовать возможности ардуино по максимуму и обойтись без помощи регистров, количество пинов позволяет (Arduino Pro Mini- 22 шт). Аппаратно никаких проблем нет. Но библиотека рассчитана на один четырёхразрядный. Кто мог бы допилить библиотеку? У меня недостаточно квалификации для этого, а библиотека пригодилась бы многим. Самый простой вариант применения- измерение тока и напряжения одновременно, или двух напряжений, как раз остаётся два входа ардуинки.
Вообще странно, что для такой вроде востребованной функции, как подключение семисегментного светодиодного индикатора, есть только одна толковая библиотека (нашёл правда ещё одну, но там индикатор гаснет, пока контроллер занят другими операциями, а при замерах и подсчёте среднеквадратичного напряжения это очень заметно).

#20 Re: Програмування Arduino » Выводы 0 (RX) и 1 (TX) - особенности » 2016-04-07 14:53:41

Менять ардуино на контроллер со всеми вытекающими проблемами при программировании- нет уж, спасибо. Менять про мини на мегу- тем более не вариант. Уж лучше использую все ножки по максимуму.

#21 Re: Програмування Arduino » Выводы 0 (RX) и 1 (TX) - особенности » 2016-04-07 14:27:40

Проблема, как писалось, может быть при загрузке следующего скетча- эти выводы используются для получения (RX) и передачи (TX) данных по последовательному интерфейсу, вроде как  может не загружаться. Можно, конечно, экспериментально проверить, но боязно.

#22 Програмування Arduino » Выводы 0 (RX) и 1 (TX) - особенности » 2016-04-07 13:32:18

seri0shka
відповідей: 13

Помню, читал где-то, что не рекомендуется какой-то из  этих выводов назначать выходом, сейчас не могу найти. Нужно назначить. Чем чревато?

#24 Re: Програмування Arduino » Программирование ATmega32 с помощью Arduino » 2016-03-01 22:16:49

А смысл летать в самолёте пассажиром, ведь можно выучиться на лётчика  smile
Это не так просто, как тем, кто УЖЕ умеет. Для меня ардуина ещё пока тёмный лес, а контроллеры тем более. Может, всё гораздо проще, но информации не хватает, много пробелов (типа "это ж и так понятно").
А по делу- как выдрать BIN файл с IDE? И что такое "дудка"?

#25 Re: Програмування Arduino » Программирование ATmega32 с помощью Arduino » 2016-03-01 20:52:59

Через SPI, не через ком.
Попробую исправить секцию (не сегодня).
Спасибо!

Підвал форуму