реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Строковые и символьные типы в AVR С
zheka
сообщение Mar 5 2006, 13:31
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Работаю с индикатором LCD через ImageCraft

Вот две функции:

Цитата
void LcdChr ( LcdFontSize size, byte ch )
{
byte i, c;
byte b1, b2;
int tmpIdx;

if ( LcdCacheIdx < LoWaterMark )
{
// Update low marker.
LoWaterMark = LcdCacheIdx;
}

if ( (ch < 0x20) || (ch > 0x7b) )
{
// Convert to a printable character.
ch = 92;
}

if ( size == FONT_1X )
{
for ( i = 0; i < 5; i++ )
{
LcdCache[LcdCacheIdx++] = FontLookup[ch - 32][i] << 1;
}
}
else if ( size == FONT_2X )
{
tmpIdx = LcdCacheIdx - 84;

if ( tmpIdx < LoWaterMark )
{
LoWaterMark = tmpIdx;
}

if ( tmpIdx < 0 ) return;

for ( i = 0; i < 5; i++ )
{
c = FontLookup[ch - 32][i] << 1;
b1 = (c & 0x01) * 3;
b1 |= (c & 0x02) * 6;
b1 |= (c & 0x04) * 12;
b1 |= (c & 0x08) * 24;

c >>= 4;
b2 = (c & 0x01) * 3;
b2 |= (c & 0x02) * 6;
b2 |= (c & 0x04) * 12;
b2 |= (c & 0x08) * 24;

LcdCache[tmpIdx++] = b1;
LcdCache[tmpIdx++] = b1;
LcdCache[tmpIdx + 82] = b2;
LcdCache[tmpIdx + 83] = b2;
}

// Update x cursor position.
LcdCacheIdx += 11;
}

if ( LcdCacheIdx > HiWaterMark )
{
// Update high marker.
HiWaterMark = LcdCacheIdx;
}

// Horizontal gap between characters.
LcdCache[LcdCacheIdx++] = 0x00;
}

/*--------------------------------------------------------------------------------------------------

Name : LcdStr

Description : Displays a character at current cursor location and increment cursor location
according to font size.

Argument(s) : size -> Font size. See enum.
dataPtr -> Pointer to null terminated ASCII string to display.

Return value : None.

--------------------------------------------------------------------------------------------------*/
void LcdStr ( LcdFontSize size, byte *dataPtr )
{
while ( *dataPtr )
{
LcdChr( size, *dataPtr++ );
}
}



ЧТо-то не получается у меня... LcdStr(1,"hello"); LcdChr(1,'f'); не выводит ничего,

LcdChr(1,"f"); - выдает ошибку found "pointer to char" expected "unsigned char"

Что делать?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 14:00
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
LcdStr(1,"hello"); LcdChr(1,'f'); не выводит ничего

С технической стороны все правильно, а вот с логической....
1.Вы уверены, что индикатор жив, проинициализирован, выставлена контрастность?
2.Вы уверены, что
Код
LcdFontSize size
может быть равно 1.
3.
Код
if ( size == FONT_1X )
наводит на мысль, что существуют какие-то макросы для описания фонтов.

И последнее - напишите простую функцию инициализации и вывода
на LCD 1-2 символов.Без извращений и оптимизаций простую как грабли. Это гарантирует вам возможность четко разделять ошибки в софте от проблем в железе.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 5 2006, 14:13
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Коллега! Честное слово, обижаете. Конечно уверен в работоспособности, я выводил линии на экран:
Цитата
void main ()
{
int i,j;
LcdInit();
for (i=0;i<11;i++) LcdLine(i*8,0,i*8,48, PIXEL_ON);
for (j=0;j<11;j++) LcdLine(0,j*4,80,j*4, PIXEL_ON);
LcdGotoXY(20,20);
LcdStr(1,"ff");
LcdUpdate();
}


А полный текст модуля здесь http://www.microsyl.com/nokialcd/nokialcd.html

Из него понятно, как генерируются буквы. Если несложно, ознакомьтесь, и посоветуйте что-нибудь.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 14:46
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Библиотечка достточно объемная и без знания индикатора разбираться с ней довольно муторно.
Могу посоветовать поубирать все что касаеться size и FontLookUp,
а если не поможет прогнать прогу в симуляторе.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 5 2006, 15:58
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Хм.. разобрался я с буквами. Проблема свелась только к одной фукции:
Цитата
void LcdStr ( LcdFontSize size, byte *dataPtr )
{
while ( *dataPtr )
{
LcdChr( size, *dataPtr++ );
}
}



Сама по себе LcdChr(1,'F'); работает. Без проблем!
А вот LcdStr(1, 'abcdef'); пишет character constant is too long
Замена кавычек - LcdStr(1, "abcdef"); ошибка function parameter #2 incompartible with its declaration

Как мне запустить функцию LcdStr() c параметром "abcdef", как эту строку передать функции?
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 5 2006, 16:21
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Просто строка "abcdef" в данном случае лежит во FLASH, а функция, в которую Вы её передаёте, работает со строками в памяти. Поменяйте тип принимаемого параметра на byte __flash * (или как там в ICC).


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 5 2006, 17:09
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
Поменяйте тип принимаемого параметра на byte __flash * (или как там в ICC).



ОГРОМНОЕ СПАСИБО!!!! Получилось!!!
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 6 2006, 15:40
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Ну что-то я совсем запутался с типами....

Надо мне вывести список строк который будет в EEPROM на экран.

Но вначале я тренируюсь с прописанными константами:
Цитата
const float Freq [10] =
{
103.1 ,
108.2 ,
133.3 ,
253.4 ,
324.5 ,
544.6 ,
623.7 ,
721.8 ,
778.9 ,
868.9
};



Как-только ни пробовал не получается... Как мне в цикле вывести список этих частот на экран?

напомню: функция вывода следующая:
Цитата
void LcdStr ( LcdFontSize size, byte __flash *dataPtr )
{

while ( *dataPtr)
{
LcdChr( size, *dataPtr++);
}
}
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 6 2006, 16:14
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Ну так по передаваемому в функцию адресу лежит число, а она ждёт строку. Понятно, что напечатается ерунда.
Переведите float в строку функцией sprintf, потом печатайте.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 6 2006, 17:25
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Я привел текст функции LcdStr.

Вызываю я ее так : LcdStr(FONT_1X, "abcdef");

а вот как мне ее вызвать не указывая конкретную строку в кавычках а через переменную?

Цитата
mystring="abcde";
LcdStr(FONT_1X, mystring);


Как объявить этот mystring? Какого типа он должен быть?
А потом уже будем говорить о sprintf, ведь она тоже требует параметры.

Кстати говоря, при попытке запихнуть float в sprintf вылетает ощибка float type is not allowed here


Вот сделал, упростил до int:
Цитата
const int Freq [10] =
{
103 ,
108 ,
133 ,
253 ,
324 ,
544 ,
623 ,
721 ,
778 ,
868
};

/////////////////////////////////////////
void main ()
{
int i,j;

byte mystring;

LcdInit();

for (i=1;i<5;i++)
{
LcdGotoXY(1,i);
sprintf(Freq[i],mystring);
LcdStr(FONT_1X, mystring);
}
}


Пишет для LcsStr: function parameter #2 incompartible with its declaration.

Сообщение отредактировал zheka - Mar 6 2006, 17:27
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 6 2006, 18:38
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



И как вообще организовать массив из строк?
Go to the top of the page
 
+Quote Post
Old1
сообщение Mar 6 2006, 19:24
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(zheka @ Mar 6 2006, 21:25) *
Я привел текст функции LcdStr.

Вызываю я ее так : LcdStr(FONT_1X, "abcdef");

а вот как мне ее вызвать не указывая конкретную строку в кавычках а через переменную?

Цитата

mystring="abcde";
LcdStr(FONT_1X, mystring);


Как объявить этот mystring? Какого типа он должен быть?

Судя по реализации функции LcdStr(...), строка должна быть объявлена так:
Код
__flash byte mystring[]="abcde";

а в функцию передается указатель на эту строку: mystring.
Цитата
И как вообще организовать массив из строк?

Один из вариантов решения- это создать массив указателей на строки и инициализировать его. Вот пример такого массива указателей на строки во flash, сам массив хранится во flash:
Код
__flash char __flash *MasStr[3]={(char __flash *)"String1",
(char __flash *)"String2",
(char __flash *)"String3"};

Если работатете с ИАРом то в дополнительных опциях компилятора нужно прописать ключик: --string_literals_in_flash.
Со строками в SRAM можно поступить аналогичным образом.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 6 2006, 19:53
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



__flash byte mystring[]="abcde"; для этой строки CodeVision выдает: storage modifier not allowed in this context

a для LcdStr - function parameter #2 incompartible with its declaration


Вот вам код:
Цитата
for (i=0;i<10;i++)
{
LcdGotoXY(1,i);

LcdStr(FONT_1X, StrArray[i]);
}


Создайте StrArray.


Цитата
__flash char __flash *StrArray[3]={(char __flash *)"String1",
(char __flash *)"String2",
(char __flash *)"String3"};


Этот код, даже без обращения к StrArray приводит к тому что на индикатор не выводится даже то что рисуется другими функциями.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 6 2006, 20:44
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Когда появляется сразу сильно много тупых вопросов, то не мешало бы сперва подучить мат часть ( http://www.opennet.ru/docs/RUS/ansi-c/ ), а потом возвращаться на форум
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 6 2006, 20:53
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



defunct, знаете, в С для AVR я ноль.
В некоторых других сферах я считаю себя профессионалом. И поверьте, никогда не позволял себе оскорблять новичков, задающих "тупые" вопросы. И вам не позволю. Или дайте дельный совет или молчите.

А что касается матчасти - что о ней говорить, если советы людей прекрано ее знающих не помогают. Мне же в этом разобраться еще сложнее.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016