Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите пожалуйста...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
HCHUNTER
К сожалению, я не очень силен в программировании, и видимо работа с указателями мне не до конца понятна...

Ситуация заключается в следующем.
Контроллер AVR Mega8, среда разработки CVAVR.
Имею 2 больших массива, размещенных во FLASH
const char symbol[3072]={...,...,... ... ... } //закодированные символы, 256 штук размером 8х12
const char str_array[44*27] = {...,...,... ... ... } //символьная строка для вывода в порт
...
//определяю 2 указателя для работы с этими массивами (чтобы работать с ними с максимальной скоростью)
const char * _ptr;
const char * _ptr1;

...

//далее в коде пишу
_ptr = &str_array[ххх]; //установить указатель в позицию ххх одного массива
_ptr1 = &symbol[ууу]; //установить указатель в позицию ууу второго массива


SPDR = *_ptr1 + (*_ptr*12); //здесь идет обращение к большому массиву через маленький, чтобы выбрать нужный байт


В итоге в порт выводится не то что нужно. Левак.
Чувствую, что работа с указателями у меня неверная в последней строчке написана ерунда. То есть в SPRD выводится совершенно не тот байт, что мне нужен.
Или может где-то можно по-русски почитать про указатели применительно к CVAVR ?




Совершенно аналогичное решение вопроса в WinAVR записано так:

SPDR = PRG_RDB(_ptr1 + (* _ptr++)*12);

На сколько я понимаю, эта функция позволяет считать байт по адресу в памяти, указанному суммой указателей. А как это же правильно записать в CVAVR ?

05.gif




---------------------------

Сам задал вопрос, сам видимо и отвечаю... yeah.gif

Вот такая должна быть запись в CVAVR:

SPDR = *(_ptr1 + (* _ptr++)*12);

Непосредственно результат по указателю возвращается так: *(указатель) .
соответственно, моя ошибка была в том, что я неверно взял в скобки разные части выражения.

Никто ничего не добавит к моим умозаключениям...? 05.gif
Сергей Борщ
Цитата(HCHUNTER @ Dec 29 2007, 20:41) *
Никто ничего не добавит к моим умозаключениям...? 05.gif

Фактически вы имеете двумерный массив, 256 символов по 12 байт. Почему бы его и не объявить как двумерный массив?
Код
const char symbol[][12]=
{
    {12 байт},
    {12 байт},
    {12 байт},
};
const char str_array[][44] =
{
    "string1, 44 symbols long",
    "string2, 44 symbols long",
    "string3, 44 symbols long",
    "string4, 44 symbols long",
};
Вторую размерность можно указать, а можно не указывать - компилятор сам посчитает.
Дальше вы можете работать с этим массивом, и первую размерность компилятор подставит сам. Если у вас изменится размер символа - вам надо будет только изменить описание массива (при условии, что в коде вы используете sizeof()).
Код
ptr2 = &symbol[str_array[xxx][yyy]];
for(i = 0; i < sizeof(symbol[0]); ++i )
     SPDR = *ptr2++;
Вы можете также объявить новый тип
Код
typedef const unsigned char symbol_t[12];
тогда массив знакогенератора можно объявить через этот тип:
symbol_t symbol[]=
{
    {12 байт},
    {12 байт},
    {12 байт},
};
и в цикле использовать размерность этого типа:
for(i = 0; i < sizeof(symbol_t); ++i )
HCHUNTER
Спасибо за дельные советы!
...буду думать дальше
HCHUNTER
Сорри за дурацкий вопрос...
А как из обработчика прерывания вернуться в нужную точку, а не в точку, где случилось прерывание...? laughing.gif
bzx
Цитата(HCHUNTER @ Dec 31 2007, 15:25) *
Сорри за дурацкий вопрос...
А как из обработчика прерывания вернуться в нужную точку, а не в точку, где случилось прерывание...? laughing.gif

При выходе из обработчика прерывания в стек занести адрес нужной точки.
HCHUNTER
А если на C++ пишу?
HCHUNTER
Конкретно интересует написание в CVAVR.
Как указать, куда возвращаться из функции-обработчика прерывания?
zltigo
Цитата(HCHUNTER @ Dec 31 2007, 17:47) *
Как указать, куда возвращаться из функции-обработчика прерывания?

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