|
|
  |
Строковые и символьные типы в AVR С |
|
|
|
Mar 13 2006, 18:57
|

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

|
Сядь и спокойно подумай - как производяться эти действия. Просмотри листинги. Что мы имеем: В случае char* данные беруться из ОЗУ - по комаде ld r,X(Y,Z)+ В случае char* _flash данные беруться из флэши - по комаде lpm r,Z(+) В случае EEPROM - вызовом функции чтения периферии. И ты предполагаешь, что компилятор сам найдет нужную форму вызова? Одно из двух - писать три функции или работать с буфером в ОЗУ загружая его из других источников. Второе ИМХО предпочтительнее. Есть еще фокусы с перезагрузкой в С++, но в данном случае они внесут лишнюю путаницу. Советую также обратить внимание на два типа функций работы с памятью memcpy()/memcpy_P() strcpy()/strcpy_P()
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 13 2006, 19:46
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата И ты предполагаешь, что компилятор сам найдет нужную форму вызова? Одно из двух - писать три функции или работать с буфером в ОЗУ загружая его из других источников. Именно это и мерещилось мне последние три дня... А вы говорите, учи стандартный С... Ладно, буду ковыряться...
|
|
|
|
|
Mar 14 2006, 21:43
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата 1.Делаем буфер в RAM unsigned char r[16]; Цитата .Указатель на этот буфер unsigned char *ptr_to_ram Цитата указываем в качестве 2 аргумента для LcdChr LcdChr(FONT_1X, *ptr_to_ram++, NORMAL) Цитата Для отображения вычисляемого символа из программы пользуемся функциями sprintf - поверьте, пробовал. Цитата Для отображения константной строки из флэша делаем копию в все тот же буфер функцией strcpy_P И без strcpy все работало для __flash Разве не так я сделал, как вы описали? И что нового вы сказали? Недостаточное чтение мануалов я всегда компенсировал использованием при изучении готовых примеров, в которых я что-то менял или выдирал куски кода. В CodeVision аж 3 примера работы с каким-то ЖКИ. И все как в мануалах - те же указатели, те же типы данных. И почему-то все работает для этого индикатора... Я правда сам проверить не могу. Знаете, я выше уже кажется доказал вам на примере, что причина первой моей проблемы была в той детали , которая ни в одном мануале не описана, а если и описана, то нужна случайность, чтобы обратить на эту деталь внимание. Я про место объявления переменных. Что-то подсказывает мне, что и здесь причина не в системном непонимании (иначе если не вы, то ни-нибудь другой уже ткнул бы меня носом в ошибку), а в такой же мелочи.
Сообщение отредактировал zheka - Mar 14 2006, 21:45
|
|
|
|
|
Mar 15 2006, 09:31
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473

|
[quote name='zheka' date='Mar 15 2006, 00:43' post='95057'] [quote]1.Делаем буфер в RAM [/quote]
unsigned char r[16];
[quote].Указатель на этот буфер[/quote] unsigned char *ptr_to_ram
нада хотя бы так: ptr_to_ram = r;
>>Умные тут все. Судя по постам даже не вчитывались в суть проблемы. вот это выше: >>Блин,да открой ты хелп к кодвижину,там безумно подробно описано как размещать строки и указатели это ниже твоей раздраженной реплики: >>vet же сказал,у тебя *ptr_to_ram не инициализирован.
Ну и что там по поводу "не ипали"?
>>В некоторых других сферах я считаю себя профессионалом.
Методы освоения новой сферы деятельности не отягощены опытом профессионализма - вся ветка напоминает разговор слепого с глухим.
|
|
|
|
|
Mar 15 2006, 16:47
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Ладно, господа профессионалы, высочайшего класса. Вот вам пример, взятый из CodeVision Examples,т.е. 100% рабочий, т.е. все ошибки человека не отягощенного профессионализмом исключены, все указатели все переменные инициализированы. Даже если где и закралась ошибка, опечатка и пр - компилятор бы ругался. Вот пример Цитата flash unsigned char f[]="12345"; #pragma warn- eeprom unsigned char e[16]; #pragma warn+ unsigned char r[16];
//------------------------------------- // не знаю, конечно, но по моему нижеследующая функция // заточена под RAM //-------------------------------------
void LcdStr ( LcdFontSize size, byte *dataPtr, LcdPixelInverse inverse ) {
while (*dataPtr) { LcdChr( size, *dataPtr, inverse ); } }
//-------------------------------------
void main () {
char flash *ptr_to_flash; char eeprom *ptr_to_eeprom; char *ptr_to_ram; int i,j; // copy the string f from FLASH to // the string e in EEPROM ptr_to_flash=f; ptr_to_eeprom=e; while (*ptr_to_flash) *ptr_to_eeprom++=*ptr_to_flash++;
// copy the string e from EEPROM to // the string r in RAM ptr_to_eeprom=e; ptr_to_ram=r; while (*ptr_to_eeprom) *ptr_to_ram++=*ptr_to_eeprom++;
LcdInit(); Delay();
LcdStr(FONT_1X, ptr_to_ram , NORMAL); LcdUpdate(); } LcdStr ничего не выводит. Вы говорите, что я не умею размещать строки и указатели - вот, это уже сделали другие люди за меня. Уже получена переменная ptr_to_ram ей присвоено значение. Типы данных совпадают (я на всякий случай менял byte на char - без эффекта). Ваше мнение? Defunct, отвечаю на ваш вопрос - отдельно LcdChr работает. Предложенный вами вариант ни к чему не привел. Если в объявлении LcdStr писать __flash, то эта фнукция выводит строки через кавычки и строки инициализированные например так : flash unsigned char f[]="12345"; Но не все же хранить во флеше, что-то генерируется в ходе работы программы, что-то читается из EEPROM.
Сообщение отредактировал zheka - Mar 15 2006, 16:48
|
|
|
|
|
Mar 15 2006, 17:43
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
>>Но не все же хранить во флеше, что-то генерируется в ходе работы программы, что-то читается из EEPROM. Я в таких случаях пользуюсь sprintf-очень удобная библиотечная функция.Обьявляешь под нее массив в RAM и через неё формируешь строку для вывода-константные данные из флеша,переменные откуда угодно+она форматирует данные как хочешь-данные лежат в двоичном формате,а читать цифрвые зна- чения удобнее в десятичном.Посмотри хелп кодвижна по библиотечным функциям ввода-вывода. sprintf(buf_indic," %02.0u%c%02.0u%c%02.0u ",CHAS,':',MIN,':',SEK);
Сообщение отредактировал WHALE - Mar 15 2006, 17:45
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|