www.cncmasterkit.ru • Просмотр темы - CSS - PICC. Не въезжаю как правильно передать строку. Хелп!

www.cncmasterkit.ru

ЧПУ своими руками

     · ПРАВИЛА ·

Текущее время: 25 сен 2017, 20:55
Сообщения без ответов | Активные темы

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
Сообщение #1  Добавлено: 30 окт 2011, 15:04 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 01:00
Сообщения: 58
Откуда: Усть-Лабинск
Здравствуйте! Вот код управления дисплеем:
Код:
#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!


Вернуться к началу
 Профиль  
 
Сообщение #2  Добавлено: 30 окт 2011, 15:40 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 01:00
Сообщения: 58
Откуда: Усть-Лабинск
Ха... переписал функцию как указано ниже, заработала!!! Но все равно не понятно в чем разница, не врубаюсь как указатели правильно применять :(
Код:
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!


Вернуться к началу
 Профиль  
 
Сообщение #3  Добавлено: 30 окт 2011, 17:49 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 19 апр 2010, 00:00
Сообщения: 128
Откуда: Харьков
С PICами я не работаю, но по аналогии с большинством придуманных для AVR функций работы с ЖКИ на контроллере HD44780 скажу.
Функция lcd_write_string() поддерживает указатели на строки, хранящиеся только в ОЗУ.
В первом Вашем варианте конструкция
Код:
lcd_write_string("Testing the L.C.D.");

обращается к строке, которую компилятор разместил в памяти программ. И это компилятору крайне не нравится.
Во втором -
Код:
lcd_write_string(text1);

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

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

Удачи.


Вернуться к началу
 Профиль  
 
Сообщение #4  Добавлено: 30 окт 2011, 18:46 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 01:00
Сообщения: 58
Откуда: Усть-Лабинск
Спасибо Germie ! В описании компилятора об этом что-то говорят. Но на вражьем языке не общался уже лет 10, тяжело перевод дается :) Все равно буду копать в этом направлении. А по подробней про символы русского языка можно? В знакогенераторе русские символы есть, но как добраться туда - пока не понятно. Если можно кусочек исходного кода, желательно на Си :)

_________________
Девице - device!


Вернуться к началу
 Профиль  
 
Сообщение #5  Добавлено: 30 окт 2011, 19:17 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 19 апр 2010, 00:00
Сообщения: 128
Откуда: Харьков
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);
   }
}


Вернуться к началу
 Профиль  
 
Сообщение #6  Добавлено: 30 окт 2011, 19:52 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 01:00
Сообщения: 58
Откуда: Усть-Лабинск
Спасибо! Сейчас попробую :)

_________________
Девице - device!


Вернуться к началу
 Профиль  
 
Сообщение #7  Добавлено: 30 окт 2011, 22:59 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 05 фев 2011, 01:00
Сообщения: 765
Откуда: Красноярск
Имя: Max
Ни_за_что бы не стал хранить "стринги" в EEPROM. Если я правильно понял код, предложенный Germie.
Попробуйте, может и Ваш компилятор поймет следующие варианты:
Код:
lcd_write_string(PSTR("Hello world!"));

Но на AVR я таким стараюсь не пользоваться...


Вернуться к началу
 Профиль  
 
Сообщение #8  Добавлено: 30 окт 2011, 23:17 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 01:00
Сообщения: 58
Откуда: Усть-Лабинск
Скорее всего имелось в виду вот это:
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!


Вернуться к началу
 Профиль  
 
Сообщение #9  Добавлено: 31 окт 2011, 00:40 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 19 апр 2010, 00:00
Сообщения: 128
Откуда: Харьков
kernel писал(а):
Ни_за_что бы не стал хранить "стринги" в EEPROM. Если я правильно понял код, предложенный Germie.


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

Удачи.


Вернуться к началу
 Профиль  
 
Сообщение #10  Добавлено: 31 окт 2011, 10:56 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 05 фев 2011, 01:00
Сообщения: 765
Откуда: Красноярск
Имя: Max
Ого... Ничего себе название ф-ии придумали. Тогда бы хотя б read_program_rom назвали или что-нибудь подобное :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Мобильная версия