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

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


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

Группа: Свой
Сообщений: 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()


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


Гуру
******

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



Цитата
И ты предполагаешь, что компилятор сам найдет нужную форму вызова?
Одно из двух - писать три функции или работать с буфером в ОЗУ загружая его из других источников.


Именно это и мерещилось мне последние три дня...
А вы говорите, учи стандартный С...
Ладно, буду ковыряться...
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 13 2006, 20:01
Сообщение #33


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

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



Увы и ах, я тоже подпишусь под постом dxp.
Есть язык С, его массивы и указатели, а есть AVR с его тремя видами
памяти. При понимании механизма указателей, применение его к конкретной архитектуре не представляет труда


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


кекс
******

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



Цитата(zheka @ Mar 13 2006, 18:57) *


LcdChr работает?
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 14 2006, 18:23
Сообщение #35


Гуру
******

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



Ну вот:

flash unsigned char f[]="123456";
#pragma warn-
eeprom unsigned char e[16];
#pragma warn+
unsigned char r[16];


void main ()
{
unsigned char flash *ptr_to_flash;
unsigned char eeprom *ptr_to_eeprom;
unsigned char *ptr_to_ram;
int i,j;
ptr_to_flash=f;


LcdInit();
Delay();

LcdGotoXY(1,1);

while (*ptr_to_flash)
{
*ptr_to_ram++ = *ptr_to_flash++;
}

while (*ptr_to_ram) LcdChr(FONT_1X, *ptr_to_ram++, NORMAL);


LcdUpdate();
}

Ну где ошибка?
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 14 2006, 18:44
Сообщение #36


Знающий
****

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



Куда показывает ptr_to_ram ?


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 14 2006, 19:38
Сообщение #37


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

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



Тут непонимание системного уровня.
1.Делаем буфер в RAM
2.Указатель на этот буфер указываем в качестве 2 аргумента для LcdChr
3.Для отображения вычисляемого символа из программы пользуемся функциями sprintf или memcpy/strcpy для простого копирования.
Аргументом будет все тот же указатель на буфер.
Или простым копированием 1 символа в буфер.
4.Для отображения константной строки из флэша делаем копию в все тот же буфер функцией strcpy_P

Изучить на зубок библиотечки работы со строками и строками во флэше
о чем я уже писал.


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


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 15 2006, 06:05
Сообщение #39


Знающий
****

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



vet же сказал,у тебя *ptr_to_ram не инициализирован.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 15 2006, 07:08
Сообщение #40


кекс
******

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



2 zheka.

Вы так и не ответили на мой вопрос. Отдельно LcdChr() работает? Если да, тогда возможен такой вариант функции для вывода строк без использования "дорогостоящих" строк в ram:


Код
void LcdStr ( LcdFontSize size, unsigned char __flash *ptr, LcdPixelInverse inverse );
{
    unsigned char c;
    while(*ptr)
    {
        c = *ptr++;
        LcdChr( size, c, inverse);
     }
}


Сообщение отредактировал defunct - Mar 15 2006, 07:09
Go to the top of the page
 
+Quote Post
freux
сообщение Mar 15 2006, 09:31
Сообщение #41


Участник
*

Группа: Новичок
Сообщений: 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 не инициализирован.

Ну и что там по поводу "не ипали"?

>>В некоторых других сферах я считаю себя профессионалом.

Методы освоения новой сферы деятельности не отягощены опытом профессионализма - вся ветка напоминает разговор слепого с глухим.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 15 2006, 16:47
Сообщение #42


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 15 2006, 17:06
Сообщение #43


кекс
******

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



Цитата(zheka @ Mar 15 2006, 18:47) *
Но не все же хранить во флеше, что-то генерируется в ходе работы программы, что-то читается из EEPROM.

IMHO выгоднее написать 2 отдельные функции:
1. для вывода строк хранящихся во флеш памяти.
2. для вывода строк хранящихся в eeprom (к тому же строки в eeprom выгоднее хранить в паскалевском представлении - первый символ - длина строки, дальше данные без нуль-терминатора)
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 15 2006, 17:43
Сообщение #44


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 15 2006, 17:50
Сообщение #45


Гуру
******

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



Цитата
IMHO выгоднее написать 2 отдельные функции:
1. для вывода строк хранящихся во флеш памяти.
2. для вывода строк хранящихся в eeprom (к тому же строки в eeprom выгоднее хранить в паскалевском представлении - первый символ - длина строки, дальше данные без нуль-терминатора)



Ну? 1 функция у меня уже есть. - для флеш.
2-я простите, а выводить строки из eeprom напрямую можно? По-моему нет, раз создатели примеров в CodeVision выводят данные из eeprom помещая их в RAM. Предыдущий мой пост читали? Или опять нет? Я же там жалуюсь что стандартный пример не работает, прошу найтм ошибку.
Go to the top of the page
 
+Quote Post

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

 


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


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