Arduino:Примеры/UsingProgmem

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

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


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

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

Код

/*

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

Задает монохромные значения из PROGMEM, чтобы не использовать RAM.

Если хотите поиграться с несколькими «кадрами» (для анимации),
смотрите пример «Базовые анимации».

Настройки оборудования смотрите в примере «Базовое использование».
Создан 2009-02-03 Алексом Леоне (Alex Leone; acleone ~AT~ gmail.com).

*/

#include "Tlc5940.h"

// для использования расширенных функций (они начинаются с приставки  
   «tlc_...») требуется также подключить этот заголовок:
#include "tlc_progmem_utils.h"

/*

Это массив в памяти PROGMEM. Она вмещает 16 килобайт памяти,
тогда как в SRAM для обычных переменных отведено 1025 байта.

Формата массива следующий:

GS_DUO(OUT15, OUT14), ... GS_DUO(OUT1, OUT0)

Если у вас больше одного TLC, то формат следующий:

GS_DUO(TLC2.OUT15, TLC2.OUT14), ... GS_DUO(TLC2.OUT1, TLC2.OUT0),
GS_DUO(TLC1.OUT15, TLC1.OUT14), ... GS_DUO(TLC1.OUT1, TLC1.OUT0)

Паттерн ниже работает только с одним TLC. Для каждого нового TLC
этот паттерн, состоящий из 4-ех строчек, придется скопировать 
и вставить по-новому. Не забывайте про фигурные скобки.

*/

uint8_t gsArray1[NUM_TLCS * 24] PROGMEM = {
  GS_DUO((4095 * 16)/16, (4095 * 15)/16), GS_DUO((4095 * 14)/16, (4095 * 13)/16),
  GS_DUO((4095 * 12)/16, (4095 * 11)/16), GS_DUO((4095 * 10)/16, (4095 * 9)/16),
  GS_DUO((4095 * 8)/16, (4095 * 7)/16), GS_DUO((4095 * 6)/16, (4095 * 5)/16),
  GS_DUO((4095 * 4)/16, (4095 * 3)/16), GS_DUO((4095 * 2)/16, (4095 * 1)/16),
};

void setup()
{
  Tlc.init();
}

void loop()
{
  // показываем паттерн (по мере перехода от одного выходного контакта 
  // к другому яркость будет затухать):
  tlc_setGSfromProgmem(gsArray1);
  Tlc.update();

  // делаем затухание каждого канала до «0»:
  for (TLC_CHANNEL_TYPE channel = 0; channel < NUM_TLCS * 16; channel++) {
    int16_t initialValue = Tlc.get(channel);
    while (initialValue > 0) {
      initialValue -= 5;
      if (initialValue < 0) {
        initialValue = 0;
      }
      Tlc.set(channel, initialValue);

      // перед тем, как продолжать, ждем, пока данные будут 
      // отправлены на TLC:
      while (Tlc.update());
    }
  }
}

См.также

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