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

 
 
 
Reply to this topicStart new topic
> символьные строки в MCC18
Слесарь
сообщение Jun 26 2010, 10:35
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Здравствуйте!
Чет мне как-то непривычно с компилятором MCC18, код:
Код
unsigned char buf[17];
buf[0] = 0X54;
buf[1] = 0x45;
buf[2] = 0X53;
buf[3] = 0X54;
buf[4] = 0;
lcd_puts( buf );

- работает и выводится на экран LCD текст, а вот код:
Код
lcd_puts( "Test" );

- неработает. Выводится мусор на экран.

Возможно причина в размерности строковых констант.

Подскажите, что нужно подкрутить?

Сообщение отредактировал rezident - Jun 26 2010, 21:01
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 26 2010, 10:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Cлесарь @ Jun 26 2010, 14:35) *
Возможно причина в размерности строковых констант.
Нет, причина в типе памяти размещения констант: в первом случае - ОЗУ (процедура работает с данными размещенными в ОЗУ) , во втором - ПЗУ (процедура не умеет работать с этими данными).
Go to the top of the page
 
+Quote Post
Слесарь
сообщение Jun 26 2010, 11:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Понятно.
Так это издержки компилятора? Это нельзя обойти чтоб использовать привычные lcd_puts( "Test" ); ?
PIC16 + HI-TECH компилятор, таких проблем небыло

Если обойти нельзя, подскажите более удобочитаемый вариант кода для символьных строк в программе?

CODE
void lcd_puts(unsigned char * s)
{
LCD_RS = 1; // write characters
while( *s )
{
lcd_write( *s );
s++;
}
}
Go to the top of the page
 
+Quote Post
msalov
сообщение Jun 29 2010, 08:38
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Код
"Test"
иммет тип rom char *
Замените
Код
void lcd_puts(unsigned char * s)
на
Код
void lcd_puts(unsigned char rom * s)
и ваша функция будет работать только со строками из флешь-памяти.
И
Код
lcd_puts( "Test" );
будет работать как и ожидается.Как пример можете посмотреть библиотечные функции memcmp/memcmppgm2ram/memcmppgm2pgm. Эти функции выполняют одно и тоже только сравнивают они ОЗУ-ОЗУ/ПЗУ-ОЗУ/ПЗУ-ПЗУ соответственно.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 10 2010, 05:03
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Cлесарь @ Jun 26 2010, 15:47) *
Понятно.
Так это издержки компилятора?

Это не издержки компилятора. Это издержки Гарвардской архитектуры процессора.
Go to the top of the page
 
+Quote Post

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

 


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


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