Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/UsingProgmem

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Использование PROGMEM[1]

Это скетч для библиотеки TLC5940 и платы Arduino, который демонстрирует, как при помощи чипа TLC5940 вместо памяти RAM использовать память PROGMEM. Это позволяет сэкономить ресурсы памяти RAM.

Код

  1. /*
  2.  
  3. Использование PROGMEM
  4.  
  5. Задает монохромные значения из PROGMEM, чтобы не использовать RAM.
  6.  
  7. Если хотите поиграться с несколькими «кадрами» (для анимации),
  8. смотрите пример «Базовые анимации».
  9.  
  10. Настройки оборудования смотрите в примере «Базовое использование».
  11. Создан 2009-02-03 Алексом Леоне (Alex Leone; acleone ~AT~ gmail.com).
  12.  
  13. */
  14.  
  15. #include "Tlc5940.h"
  16.  
  17. // для использования расширенных функций (они начинаются с приставки  
  18.    «tlc_...») требуется также подключить этот заголовок:
  19. #include "tlc_progmem_utils.h"
  20.  
  21. /*
  22.  
  23. Это массив в памяти PROGMEM. Она вмещает 16 килобайт памяти,
  24. тогда как в SRAM для обычных переменных отведено 1025 байта.
  25.  
  26. Формата массива следующий:
  27.  
  28. GS_DUO(OUT15, OUT14), ... GS_DUO(OUT1, OUT0)
  29.  
  30. Если у вас больше одного TLC, то формат следующий:
  31.  
  32. GS_DUO(TLC2.OUT15, TLC2.OUT14), ... GS_DUO(TLC2.OUT1, TLC2.OUT0),
  33. GS_DUO(TLC1.OUT15, TLC1.OUT14), ... GS_DUO(TLC1.OUT1, TLC1.OUT0)
  34.  
  35. Паттерн ниже работает только с одним TLC. Для каждого нового TLC
  36. этот паттерн, состоящий из 4-ех строчек, придется скопировать 
  37. и вставить по-новому. Не забывайте про фигурные скобки.
  38.  
  39. */
  40.  
  41. uint8_t gsArray1[NUM_TLCS * 24] PROGMEM = {
  42.   GS_DUO((4095 * 16)/16, (4095 * 15)/16), GS_DUO((4095 * 14)/16, (4095 * 13)/16),
  43.   GS_DUO((4095 * 12)/16, (4095 * 11)/16), GS_DUO((4095 * 10)/16, (4095 * 9)/16),
  44.   GS_DUO((4095 * 8)/16, (4095 * 7)/16), GS_DUO((4095 * 6)/16, (4095 * 5)/16),
  45.   GS_DUO((4095 * 4)/16, (4095 * 3)/16), GS_DUO((4095 * 2)/16, (4095 * 1)/16),
  46. };
  47.  
  48. void setup()
  49. {
  50.   Tlc.init();
  51. }
  52.  
  53. void loop()
  54. {
  55.   // показываем паттерн (по мере перехода от одного выходного контакта 
  56.   // к другому яркость будет затухать):
  57.   tlc_setGSfromProgmem(gsArray1);
  58.   Tlc.update();
  59.  
  60.   // делаем затухание каждого канала до «0»:
  61.   for (TLC_CHANNEL_TYPE channel = 0; channel < NUM_TLCS * 16; channel++) {
  62.     int16_t initialValue = Tlc.get(channel);
  63.     while (initialValue > 0) {
  64.       initialValue -= 5;
  65.       if (initialValue < 0) {
  66.         initialValue = 0;
  67.       }
  68.       Tlc.set(channel, initialValue);
  69.  
  70.       // перед тем, как продолжать, ждем, пока данные будут 
  71.       // отправлены на TLC:
  72.       while (Tlc.update());
  73.     }
  74.   }
  75. }

См.также

Внешние ссылки

  1. github.com - UsingProgmem.pde