CSS - PICC. Не въезжаю как правильно передать строку. Хелп!

помощь начинающим осваивать программирование МК (PIC, AVR) на Си.

Модератор: koolhatcker

Ответить
Аватара пользователя
maxlab
Станкостроитель
Станкостроитель
Сообщения: 58
Зарегистрирован: 23 ноя 2010, 01:00
Откуда: Усть-Лабинск

CSS - PICC. Не въезжаю как правильно передать строку. Хелп!

Сообщение maxlab »

Здравствуйте! Вот код управления дисплеем:

Код: Выделить всё

#include <16F876A.h>
#include <string.h>

#fuses NOWDT,HS,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOPROTECT,DEBUG,NOWRT                
#use delay(clock=20000000)
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5)

#define lcd_rs   PIN_B0
#define lcd_en   PIN_B1
#define lcd_d4   PIN_B2
#define lcd_d5   PIN_B3
#define lcd_d6   PIN_B4
#define lcd_d7   PIN_B5

  

void lcd_strobe()    {output_bit(lcd_en,1);delay_us(5);output_bit(lcd_en,0);}
void lcd_cmd_on()    {output_bit(lcd_rs,0);}
void lcd_cmd_off()    {output_bit(lcd_rs,1);}

void lcd_send_nibble(char x) {
   output_bit(lcd_d4, !!(x & 1)); 
   output_bit(lcd_d5, !!(x & 2));  
   output_bit(lcd_d6, !!(x & 4));    
   output_bit(lcd_d7, !!(x & 8));    
}

void lcd_write(unsigned char x) {
   lcd_send_nibble(x>>4);
   lcd_strobe();
   lcd_send_nibble(x);
   lcd_strobe();
   delay_us(40);
}

void lcd_init() {
   lcd_cmd_on();
   delay_ms(15);
   lcd_send_nibble(0x3);
   lcd_strobe();
   delay_ms(5);
   lcd_strobe();
   delay_us(100);
   lcd_strobe();
   delay_ms(5);
   lcd_send_nibble(0x2);
   lcd_strobe();
   delay_ms(5);
   lcd_write(0x28);   
   lcd_write(0x08);   
   lcd_write(0x0F);   
   lcd_write(0x06);   
}

void lcd_clear() {
   lcd_cmd_on();
   lcd_write(0x1);
   delay_ms(2);
}

void lcd_write_string(char *s){
   lcd_cmd_off();
   while(*s!=0) {
      lcd_write(*s++);
   }
}

void lcd_write_char(char x){
   lcd_cmd_off();
   lcd_write(x);
}

void lcd_goto(unsigned char pos)
{
   lcd_cmd_on();
   lcd_write(0x80+pos);
}

void main(){

lcd_init();
lcd_clear();
lcd_write_char("a");
lcd_write_char("b");
lcd_write_char("c");
lcd_write_char("d");
lcd_goto(40);
lcd_write_char("e");
lcd_write_char("f");
lcd_write_char("g");
lcd_write_char("i");
lcd_clear();

lcd_write_string("Testing the L.C.D.");
lcd_goto(40);
lcd_write_string("This is on Row 2 !");

while(1) {}
}
если закомментить три последние строки, компиляция идет без ошибок и на дисплей выводятся символы. В таком виде компилятор ругается след. образом
Executing: "C:\Program files\Picc\CCSC.exe" +FM "lcd_test.c" #__DEBUG=1 +ICD +DF +LN +T +A +M -Z +Y=9 +EA #__16F876A=TRUE
*** Error 90 "lcd_test.c" Line 94(38,39): Attempt to create a pointer to a constant
*** Error 90 "lcd_test.c" Line 96(38,39): Attempt to create a pointer to a constant
2 Errors, 0 Warnings.
Че я делаю не так? Внимательно изучив пример ex_str.c, особенно вызов функции get_num_numbers(char *str) и передачу в нее строки, применил такой же подход к своей поделке. На Си пишу первый раз :) Кто может объясните где я на грабли наступил.
Девице - device!
Аватара пользователя
maxlab
Станкостроитель
Станкостроитель
Сообщения: 58
Зарегистрирован: 23 ноя 2010, 01:00
Откуда: Усть-Лабинск

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение maxlab »

Ха... переписал функцию как указано ниже, заработала!!! Но все равно не понятно в чем разница, не врубаюсь как указатели правильно применять :(

Код: Выделить всё

void main(){
char text1[]="Testing the LCD.";
char text2[]="This is on Row 2 !";
lcd_init();
lcd_clear();
lcd_write_char("a");
lcd_write_char("b");
lcd_write_char("c");
lcd_write_char("d");
lcd_goto(40);
lcd_write_char("e");
lcd_write_char("f");
lcd_write_char("g");
lcd_write_char("i");
delay_ms(10000);
lcd_clear();

lcd_write_string(text1);
lcd_goto(40);
lcd_write_string(text2);

while(1) {}
}
фотокарточка : http://saveimg.ru/show-image.php?id=5e1 ... b856417778
Теперь добраться бы до русского шрифта.
Девице - device!
Аватара пользователя
Germie
Станкостроитель
Станкостроитель
Сообщения: 128
Зарегистрирован: 19 апр 2010, 00:00
Откуда: Харьков
Контактная информация:

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение Germie »

С PICами я не работаю, но по аналогии с большинством придуманных для AVR функций работы с ЖКИ на контроллере HD44780 скажу.
Функция lcd_write_string() поддерживает указатели на строки, хранящиеся только в ОЗУ.
В первом Вашем варианте конструкция

Код: Выделить всё

lcd_write_string("Testing the L.C.D.");
обращается к строке, которую компилятор разместил в памяти программ. И это компилятору крайне не нравится.
Во втором -

Код: Выделить всё

lcd_write_string(text1);
строка из памяти программ предварительно записывается в ОЗУ и уже оттуда выводится на ЖКИ.
Выход - написать или найти готовую процедуру обращения к строке, хранящейся в ПЗУ.

А до русского языка добираться не надо :). Если у вас индикатор с прошитыми русскими символами, надо просто включать их коды в строку, которую Вы собираетесь выводить на экран. Другое дело, что символы эти размещаются совсем не по стандарту ASCII :).

Удачи.
Аватара пользователя
maxlab
Станкостроитель
Станкостроитель
Сообщения: 58
Зарегистрирован: 23 ноя 2010, 01:00
Откуда: Усть-Лабинск

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение maxlab »

Спасибо Germie ! В описании компилятора об этом что-то говорят. Но на вражьем языке не общался уже лет 10, тяжело перевод дается :) Все равно буду копать в этом направлении. А по подробней про символы русского языка можно? В знакогенераторе русские символы есть, но как добраться туда - пока не понятно. Если можно кусочек исходного кода, желательно на Си :)
Девице - device!
Аватара пользователя
Germie
Станкостроитель
Станкостроитель
Сообщения: 128
Зарегистрирован: 19 апр 2010, 00:00
Откуда: Харьков
Контактная информация:

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение Germie »

maxlab писал(а):А по подробней про символы русского языка можно? В знакогенераторе русские символы есть, но как добраться туда - пока не понятно. Если можно кусочек исходного кода, желательно на Си :)
Для того, чтобы туда добраться, нужно просто включать кодовые эквиваленты русских символов в свои строки :).
Например, строка "Установка" превратится в такую:

Код: Выделить всё

unsigned char Welcome[] =  {"©cїaЅoієa"};
В этой строке буквы, у которых есть английские "братья" - 'с', 'а', 'о', остаются неизменными, а те, у которых нет - 'У', 'т', 'н', 'в', 'к' заменяются на символы, на месте которых они стоят в таблице индикатора - '©', 'ї', 'Ѕ', 'і', 'є' соответственно.
Для того, чтобы не сломать мозг, подставляя в строки эти абракадабры, существует консольная утилитка RusLCD, которой надо скормить исходник, а на выходе она вернет этот же исходник, но с транслированными строками. Найти можно здесь - http://www.ra-publish.com.ua/programs/Pic5.zip .

Удачи.

ЗЫ Нашел функцию для работы с памятью программ для Вашего компилятора - read_program_eeprom, которой в качестве аргумента передается адрес, чтение которого необходимо произвести.

Тогда процедура для вывода строки из Flash должна выглядеть примерно так:

Код: Выделить всё

void lcd_write_string_flash(const unsigned char *s)
{
	unsigned char Data = read_program_eeprom(s);
	while (Data)
	{
		lcd_cmd_off();
		lcd_write(Data);
		Data = read_program_eeprom(++s);
	}
}
Аватара пользователя
maxlab
Станкостроитель
Станкостроитель
Сообщения: 58
Зарегистрирован: 23 ноя 2010, 01:00
Откуда: Усть-Лабинск

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение maxlab »

Спасибо! Сейчас попробую :)
Девице - device!
Аватара пользователя
kernel
Станкостроитель
Станкостроитель
Сообщения: 765
Зарегистрирован: 05 фев 2011, 01:00
Имя: Max
Откуда: Красноярск

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение kernel »

Ни_за_что бы не стал хранить "стринги" в EEPROM. Если я правильно понял код, предложенный Germie.
Попробуйте, может и Ваш компилятор поймет следующие варианты:

Код: Выделить всё

lcd_write_string(PSTR("Hello world!"));
Но на AVR я таким стараюсь не пользоваться...
Аватара пользователя
maxlab
Станкостроитель
Станкостроитель
Сообщения: 58
Зарегистрирован: 23 ноя 2010, 01:00
Откуда: Усть-Лабинск

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение maxlab »

Скорее всего имелось в виду вот это:
Constant Data:
The CONST qualifier will place the variables into program memory. If the keyword CONST is used before the identifier, the identifier is treated as a constant. Constants should be initialized and may not be changed at run-time. This is an easy way to create lookup tables.

The ROM Qualifier puts data in program memory with 3 bytes per instruction space. The address used for ROM data is not a physical address but rather a true byte address. The & operator can be used on ROM variables however the address is logical not physical.

The syntax is:
const type id[cexpr] = {value}

For example:
Placing data into ROM
const int table[16]={0,1,2...15}
Placing a string into ROM
const char cstring[6]={"hello"}

Creating pointers to constants
const char *cptr;
cptr = string;
И вот это:
The data placed in program memory using the methods listed above can be read from width the following functions:
read_program_memory((address, dataptr, count)
- Reads count bytes from program memory at address to RAM at dataptr. Every fourth byte of data is read as 0x00
Но тут засада с каждым четвертым байтом. Так что указатели копать надо.
Девице - device!
Аватара пользователя
Germie
Станкостроитель
Станкостроитель
Сообщения: 128
Зарегистрирован: 19 апр 2010, 00:00
Откуда: Харьков
Контактная информация:

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение Germie »

kernel писал(а):Ни_за_что бы не стал хранить "стринги" в EEPROM. Если я правильно понял код, предложенный Germie.
Информацию я почерпнул из книжки Шпака "Программирование на языке С...". В ней приведено описание компилятора CCS-PICC (я так, понял топикстартер использует именно его). И, как это пользователям AVR (и мне, в том числе) ни странно, функция read_program_eeprom предназначена для "считывания данных из памяти программ". А вот функция read_eeprom "считывает данные из памяти EEPROM". Может, я чего и понял неправильно :).
А хранить строки в ЕЕПРОМ, действительно, нецелесообразно.

Удачи.
Аватара пользователя
kernel
Станкостроитель
Станкостроитель
Сообщения: 765
Зарегистрирован: 05 фев 2011, 01:00
Имя: Max
Откуда: Красноярск

Re: CSS - PICC. Не въезжаю как правильно передать строку. Хе

Сообщение kernel »

Ого... Ничего себе название ф-ии придумали. Тогда бы хотя б read_program_rom назвали или что-нибудь подобное :)
Ответить