Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Atmega8 + lcd3310 + gcc


Автор: bend 10.3.2009, 16:00
возникла проблема с библиотекой NokiaLCD.c и не только у меня одного, не работает нормально функция LcdStr()
Дело в том, что если выводить 2-4 и более строк дисплэй или ничего вообще не выводит или выводит чушь. Дисплэй 100 процентов исправен, заполнял его весь и линиями и пикселами и разными символами. 
    Если даже прописать const char *string[5]={"1","2","3","4","5"} всеравно больше 3 строк нормально не выводится. Дак вот почитал на форумах что с такой же проблемой сталкнулся народ и есть выход разместить строковые константы в eeprom. Но как это сделать на avr-gcc???  

Автор: Mazzi 11.3.2009, 10:15
А что пишут по этому поводу в руководстве компилятора?

Автор: bend 11.3.2009, 17:54
Да ничего особого, есть там 6 основных команд запись байта, слова и буфера, разобрался с сзаписью в eeprom, разместил там строки, но ничего не изменилось  smile  Попрежнему нормально не работает вывод строк на дисплей. Я думаю проблема в каких-то опциях компилятора, нужно как-то объяснить компилятору чтобы он строковые константы оставлял как есть, а то создаеться впечатление что он их- как-то искажает. Кстати одна и таже строка выводиться несколько раз нормально, разные строки выводяться косячно... Пробовал собирать и с оптимизацией и без (опции -O0 -O3) никакого эффекта. От размещения в eeprom сразу отказался, ибо запись в него медленная и чтение и занимает много ресурсов. Но вот как разместить строки в памяти чтобы они не искажались? Я так понимаю адреса под строковые константы должен выделять сам компилятор, он это делает хренова, поэтому может как-то не опускаясь до асма можно выделить адреса под строковые константы и потом с ними нормально работать...

Автор: Mazzi 12.3.2009, 09:58
У меня компилятор не GCC, поэтому не могу точно сказать что тебе делать.
Вот смотри пример от моего компилятора CodeVisionAVR:

Код

eeprom char a[2] = {'s','d'};
..................
.................

a[0] = anything;
a[1] = a[0] + a[0];

...................


Для размещения строк в памяти программ:
Код

flash char KeyCodes[]={'#','3','0','2',
            '*','1','D','A',
            '9','6','8','5',
            '7','4','C','B'};
..................
.................



Автор: bend 13.3.2009, 17:24
После 4 дней напряженных боев, выяснилось что глюк происходит если в строке передаваемой функции LcdStr(), содержаться пробелы цифры и проч небуквенные знаки. Хотя по умолчанию компилятор должен жевать в utf8, и отдельно символы любые выводяться через LcdChr(), пока непонятно Вот функция 
Код

void LcdStr ( LcdFontSize size, char *dataPtr )
{

while (*dataPtr)
    {
        LcdChr( size, *dataPtr++ );

    }


}


походу загвоздка именно здесь, при разбивке всей строки на байты как-то косячно передаються коды небуквенных символов...
Я плохо пока понимать с++  smile  если не сложно хотелось бы увидеть простенький текст для проверки скан кодов клавиш дабы проверить их с теми что использует программа. Просто наживаешь клавишу - на экране скан-код. Хочу сравнить его с тем что используеться в таблице моей проги..

Автор: bend 26.3.2009, 14:30
Бои закончились победой с моей стороны smile  Пришлось изучать с++, раньше он мне не нравился, но теперь я понял что он почти как ассемблер, тока чуть удобнее. Порыскав инете я нашел несколько библиотек для работы с дисплеем 3310, большенство их было клоном той что я использовал, но я таки нашол нормальную либу для дисплея, с толковым описанием и с дополнительными функциями, типа вывода бмп картинки на экран и проч. Прикупив кварц на 10MHz, я прошил фьюзы, все стало работать намного быстрее  smile 
Попутно пришлось изучить eeprom, теперь я написал процедуру привязки новых устройств к шине 1-wire, можно былоб конечно намутить автораспознование устройств на шине, но у меня устройств мало и если один датчик сгорит, то пришить новый к системе можно будет не перешивая МК. Идея проста, подключаем новое устройство (например датчик температуры) к шине, остальные устройства от шины отключаем, сканируем его персональный код и записываем его в eeprom.
Ну и для пущей картины сегодня подключил русские буквы, дабы русифицировать меню. Было немнога геммороя, дело в том что в линукс везде практически кодировка UTF8, (т.е. мультибайтная), я вышел из положения просто добавив в makefile, перекодировку из utf8 в cp866 перед компиляцией. Ну и русские буквы должны быть в строгости с ascii, а там после буквы "п", идет псевдографика 48байт, потом остальные русские буквы. 
Пока подключил 3 датчика температуры, ну и конечно потом занес все серийники с ключей-таблеток от домофона, (на будующее для отмычки домофонов).
Линию пробовал и 2-х проводную с подтягивающим резистором, все работало. Питаю все это дело от нокиовской батарейки smile 

Как лучше сделать клавиатуру? Нашел схему матрицы типа крест накрест выводы портов, но как тогда избежать дребезга? Вообще посоветуйте хорошую схему клавиатуры кнопок из 5-9?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)