Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR: Организация смешенного чтения байтов, слов из таблицы во flash-памяти программ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
MaxiMuz
Таблица представляет из себя чтото типа:
Код
uint8_t tabl[] PROGMEM={0x00,0x12ff,0x02,0x0100,0x40,0x0020,0x3f,0x1000};

чередование целых байтов и слов.
Задается указатель на начало таблицы и затем с помощью команды pgm_read_byte (Ptabl) или pgm_read_word (Ptabl) по порядку читается байты и слова. Но проблема в том, как в записи таблицы корректно указать размер ее содержимого.
Возможно ли вообще такое обращение ?

Палыч
Все элементы массива должны быть одного типа (не может быть часть элементов массива - байты, а остальные - слова). Такое смешение типов может быть в структурах... Может быть, структура - это то, что Вам нужно?
MaxiMuz
цель такой таблицы это простота ее заполнения , а при написании структуры , там писанины получиться много
Палыч
Цитата(MaxiMuz @ Mar 22 2012, 10:15) *
писанины получиться много

Тогда, как вариант - два массива:
1. Массив данных. Типа того, что вы представили, но с типом элементов массива максимально возможного размера (если, как у Вас - байты и слова, то массив слов).
2. Массив типов данных. Каждый элемент этого массива некое число, характеризующее тип соответствующего элемента первого массива. Например: 0 - байт, 1 - слово...

Т.е., из первого массива считываем элемент (для Вашего примера - всегда слово); считываем из второго массива признак типа элемента первого массива; при необходимости производим преобразование типа; что-то с преобразованными данными делаем (Вы не привели информацию об использовании этих данных).
XVR
Цитата(MaxiMuz @ Mar 22 2012, 10:15) *
цель такой таблицы это простота ее заполнения , а при написании структуры , там писанины получиться много

Цель любой таблицы - это что бы ее корректно понял компилятор С. В вашем случае он ее поймет, но результат будет не тот, который вы ожидаете. Ваша таблица будет обрезанна до такой:
Код
uint8_t tabl[] PROGMEM={0x00,0xff,0x02,0x00,0x40,0x20,0x3f,0x00};
и вся будет байтовая.
Так что пишите структуру:
Код
#pragma pack(1)
typedef struct {
uint8_t byte;
unit16_t word;
} MyStruct;

MyStruct tabl[] PROGMEM={{0x00,0x12ff},{0x02,0x0100},{0x40,0x0020},{0x3f,0x1000}};

MaxiMuz
Цитата(Палыч @ Mar 22 2012, 11:37) *
.................
Т.е., из первого массива считываем элемент (для Вашего примера - всегда слово); считываем из второго массива признак типа элемента первого массива; при необходимости производим преобразование типа; что-то с преобразованными данными делаем (Вы не привели информацию об использовании этих данных).

я не понял что это должно из себя представлять.
Смысл в том что в прерывании каждый раз будет считываться в размере байта - тон цвета , слово - задержка. И так каждый вызов. Две таблицы писать неразумно.
Уже подумал написать преобразователь таблиц : пишем попорядку байт, слово , на выходе в тестовом виде все байты. Вставляем в программу и дальше дело техники ..

Цитата(XVR @ Mar 22 2012, 12:10) *
Так что пишите структуру:
Код
#pragma pack(1)
typedef struct {
uint8_t byte;
unit16_t word;
} MyStruct;

MyStruct tabl[] PROGMEM={{0x00,0x12ff},{0x02,0x0100},{0x40,0x0020},{0x3f,0x1000}};

а возможно написание без промежуточных скобок: "{0x00,0x12ff,0x02,0x0100,0x40,0x0020,0x3f,0x1000};" ?
Палыч
Цитата(MaxiMuz @ Mar 22 2012, 13:47) *
будет считываться в размере байта - тон цвета , слово - задержка...

Так у Вас всегда чередование байт - слово ?!
Тогда всё проще
Код
uint16_t tabl[] PROGMEM={0x00,0x12ff, 0x02,0x0100, 0x40,0x0020, 0x3f,0x1000};
uint16_t * Ptabl;
......
  Ptabl= tabl;
......
  color= (uint8_t)pgm_read_word (Ptabl);  ++Ptabl;
  time= pgm_read_word (Ptabl);  ++Ptabl;
XVR
Цитата(MaxiMuz @ Mar 22 2012, 13:47) *
а возможно написание без промежуточных скобок: "{0x00,0x12ff,0x02,0x0100,0x40,0x0020,0x3f,0x1000};" ?
Да, но некоторые компиляторы будут на это выдавать warning'и

MaxiMuz
Цитата(Палыч @ Mar 22 2012, 13:15) *
Так у Вас всегда чередование байт - слово ?!

Ну или слово - байт , разницы особой нет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.