Дисплеи от мобильных телефонов- осцилограммы работы

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

В наличии есть только Атмеги8, на них и сделаю. Только осталось найти когото кому не жалко ЛПТ с моим сомнительным программатором


Могу вам дать схему с гальваноразвязкой на 4N25, К176ЛА7 и 2N7000BU (или КП501).

Заметил что очистка экрана происходит довольно долго по времени (около 2 секунд). Я вообщето думал сделать на этом экране осциллограф (нужен именно цветной чтоб каждый канал отличался по цвету)


На частоте 20 МГц (с атмегой 168-20) оно будет побыстрее. :) А так - да, экран очищается медленно.

А теперь что-то сомневаюсь что у него(точнее у моей Атмеги8) хватит быстродействия. Если выводить попиксельно (176 пикселей на один кадр плюс очистка экрана) то с какой частотой примерно будет обновление экрана? видел в инете довольно шустренькие осциллографы, правда на ч\б экране с Атмегой8. На высокую частоту работы осциллографа я не расчитываю


Ну, что ж делать. :) Кадров 10 в секунду, может, и удастся получить. :) На самом деле, смотрите: 176*132 = столько точек надо закрасить. В режиме 16 бит на точку уйдёт 32 такта (SPI нужно 2 такта процессора на бит). Итого, нужно 176*132*32=743424 тактов. Это даст на частоте 20 МГц 26.9 FPS. Реально вы такого не достигнете, так как у вас такты процессора тратятся менее эффективно. :)
Но, кстати, у экрана есть 8-бит режим. Я, правда, его никогда не задействовал.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Могу вам дать схему с гальваноразвязкой на 4N25, К176ЛА7 и 2N7000BU (или КП501)

У меня ЛПТ программатор собран на 74HC244
Это даст на частоте 20 МГц 26.9 FPS

А если допустим не делать полную очистку экрана? Создать переменную массив с размером 176, записывать туда координаты каждой нарисованной точки а потом просто пройтись по этим же координатам только уже с фоновым цветом. Тогда не придется делать полную очистку экрана, ну и скорость увеличится... Осциллограф хоть и фиговенький выйдет но иногда без него просто никак... :dont_know:
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

У меня ЛПТ программатор собран на 74HC244


Если я правильно понял даташит, она не гальванически развязана от порта.

А если допустим не делать полную очистку экрана? Создать переменную массив с размером 176, записывать туда координаты каждой нарисованной точки а потом просто пройтись по этим же координатам только уже с фоновым цветом. Тогда не придется делать полную очистку экрана, ну и скорость увеличится... Осциллограф хоть и фиговенький выйдет но иногда без него просто никак...


Это можно. :) На точку уйдёт не 32 такта, конечно, но всё же достаточно мало. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

Так ведь и частоты дискретизации большой не получите. В самом оптимистичном случае несколько сотен килогерц, это с потерей разрядности АЦП. Что Вы на нём смотреть то будете на таком осциллографе?

----------
Полгода назад купил себе за 300 грн полурабочий C1-73 заводской сборки, поменял электролиты и пропаял - теперь работает как новый. Для радиолюбительства хватает за глаза. И денег потратил то немного.
До этого пользовался C1-94, который когда-то собрал мой отец, теперь им снова пользуется он сам :)
Giggity giggity goo!
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Foks писал(а):В самом оптимистичном случае несколько сотен килогерц

Мне больше 50-100 кГц и неособо нужно. Я и не расчитываю сделать крутой осциллограф
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
BigallS
Опытный кот
Сообщения: 752
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение BigallS »

Зукс писал(а):Мне больше 50-100 кГц и неособо нужно. Я и не расчитываю сделать крутой осциллограф


А далеко ходить не надо в соседней ветке уже есть прекрасный проект viewtopic.php?f=25&t=19878 а вот его и плата viewtopic.php?f=25&t=19878&start=5200 в конце этой страницы
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

мне нужно сравнивать два сигнала. Чтоб один сигнал рисовался одним цветом а второй другим. В том осциллографе я так понял всего один вход. Да и научится не мешалобы самому а не тупо слизывать
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Нашел старую материнку у себя, починил ее и могу дальше программировать)))
Помогите с выводом текста на дисплей...
Тут массив символов:

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

static unsigned char FONT8x15[97][15] =
{
//0x08,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // columns, rows, nbytes
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00}, // !
{0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // "
{0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00}, // #
{0x0C,0x0C,0x3E,0x63,0x61,0x60,0x3E,0x03,0x03,0x43,0x63,0x3E,0x0C,0x0C,0x00}, // $
{0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18,0x33,0x63,0x00,0x00,0x00}, // %
{0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66,0x66,0x3B,0x00,0x00,0x00}, // &
{0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '
{0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00,0x00,0x00}, // (
{0x00,0x00,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x00,0x00,0x00}, // )
{0x00,0x00,0x00,0x00,0x42,0x66,0x3C,0xFF,0x3C,0x66,0x42,0x00,0x00,0x00,0x00}, // *
{0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00}, // +
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00}, // ,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // -
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00}, // .
{0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00}, // / (forward slash)
{0x00,0x00,0x3E,0x63,0x63,0x63,0x67,0x6B,0x73,0x63,0x63,0x3E,0x00,0x00,0x00}, // 0 0x30
{0x00,0x00,0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00,0x00}, // 1
{0x00,0x00,0x3E,0x63,0x03,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00}, // 2
{0x00,0x00,0x3E,0x63,0x03,0x03,0x1E,0x03,0x03,0x03,0x63,0x3E,0x00,0x00,0x00}, // 3
{0x00,0x00,0x06,0x0E,0x1E,0x36,0x66,0x66,0x7F,0x06,0x06,0x0F,0x00,0x00,0x00}, // 4
{0x00,0x00,0x7F,0x60,0x60,0x60,0x7E,0x03,0x03,0x63,0x73,0x3E,0x00,0x00,0x00}, // 5
{0x00,0x00,0x1C,0x30,0x60,0x60,0x7E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // 6
{0x00,0x00,0x7F,0x63,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x00,0x00,0x00}, // 7
{0x00,0x00,0x3E,0x63,0x63,0x63,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // 8
{0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x3F,0x03,0x03,0x06,0x3C,0x00,0x00,0x00}, // 9
{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00}, // :
{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00}, // ;
{0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00}, // <
{0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00}, // =
{0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00}, // >
{0x00,0x00,0x3E,0x63,0x63,0x06,0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x00,0x00}, // ?
{0x00,0x00,0x3E,0x63,0x63,0x6F,0x6B,0x6B,0x6E,0x60,0x60,0x3E,0x00,0x00,0x00}, // @ 0x40
{0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x00,0x00,0x00}, // A
{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x33,0x33,0x33,0x33,0x7E,0x00,0x00,0x00}, // B
{0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1E,0x00,0x00,0x00}, // C
{0x00,0x00,0x7C,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7C,0x00,0x00,0x00}, // D
{0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x31,0x33,0x7F,0x00,0x00,0x00}, // E
{0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // F
{0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x6F,0x63,0x63,0x37,0x1D,0x00,0x00,0x00}, // G
{0x00,0x00,0x63,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00}, // H
{0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00}, // I
{0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00}, // J
{0x00,0x00,0x73,0x33,0x36,0x36,0x3C,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00}, // K
{0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7F,0x00,0x00,0x00}, // L
{0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00}, // M
{0x00,0x00,0x63,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63,0x63,0x63,0x00,0x00,0x00}, // N
{0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00,0x00}, // O
{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // P 0x50
{0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x6B,0x6F,0x3E,0x06,0x07,0x00}, // Q
{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00}, // R
{0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x06,0x03,0x63,0x63,0x3E,0x00,0x00,0x00}, // S
{0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00}, // T
{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // U
{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x08,0x00,0x00,0x00}, // V
{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x36,0x00,0x00,0x00}, // W
{0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00}, // X
{0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00}, // Y
{0x00,0x00,0x7F,0x63,0x43,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00}, // Z
{0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00}, // [
{0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00}, // \ (back slash)
{0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00}, // ]
{0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ^
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00}, // _
{0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ` 0x60
{0x00,0x00,0x00,0x00,0x00,0x3C,0x46,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00}, // a
{0x00,0x00,0x70,0x30,0x30,0x3C,0x36,0x33,0x33,0x33,0x33,0x6E,0x00,0x00,0x00}, // b
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00}, // c
{0x00,0x00,0x0E,0x06,0x06,0x1E,0x36,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00}, // d
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x7E,0x60,0x63,0x3E,0x00,0x00,0x00}, // e
{0x00,0x00,0x1C,0x36,0x32,0x30,0x7C,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // f
{0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00}, // g
{0x00,0x00,0x70,0x30,0x30,0x36,0x3B,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00}, // h
{0x00,0x00,0x0C,0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00}, // i
{0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // j
{0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3C,0x36,0x33,0x73,0x00,0x00,0x00}, // k
{0x00,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00}, // l
{0x00,0x00,0x00,0x00,0x00,0x6E,0x7F,0x6B,0x6B,0x6B,0x6B,0x6B,0x00,0x00,0x00}, // m
{0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00}, // n
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // o
{0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // p 0x70
{0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x0F,0x00}, // q
{0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // r
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x38,0x0E,0x03,0x63,0x3E,0x00,0x00,0x00}, // s
{0x00,0x00,0x08,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x1B,0x0E,0x00,0x00,0x00}, // t
{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00}, // u
{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x36,0x1C,0x1C,0x08,0x00,0x00,0x00}, // v
{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x00,0x00,0x00}, // w
{0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x1C,0x1C,0x36,0x63,0x00,0x00,0x00}, // x
{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x3F,0x03,0x06,0x3C,0x00}, // y
{0x00,0x00,0x00,0x00,0x00,0x7F,0x66,0x0C,0x18,0x30,0x63,0x7F,0x00,0x00,0x00}, // z
{0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00}, // {
{0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00}, // |
{0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00}, // }
{0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ~
{0x00,0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};


дальше функция берет символ с массива и запихивает его в память дисплея:

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

void LCD_Char(unsigned char x, unsigned char y, char c, unsigned int color)
{
  unsigned char h,ch,p;
  char mask;



    LCD_SendCommand(0x2A); //x-координата
    LCD_SendData8(x);
    LCD_SendData8(x+CHAR_W-1);

    LCD_SendCommand(0x2B);//Y-координата
    LCD_SendData8(y);
    LCD_SendData8(y+CHAR_H-1);

      LCD_SendCommand(0x2C);


  for (h=0; h<CHAR_H; h++) // every column of the character
  {
         // ch=FONT8x15[ c-31 ][h];
         ch=FONT8x15[ c-32 ][CHAR_H-h-1];
        mask = 0x80;
        for (p=0; p<CHAR_W; p++)  // write the pixels
        {
          if (ch & mask)
          {
            LCD_SendData16(color);//delay_ms(5);
          }
          else
          {
            LCD_SendData16(LCD_WHITE);//delay_ms(5);
          }
          mask=mask/2;
        }
  }
}


Потом функция вывода уже целой строки:

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

void put_string(unsigned char x, unsigned char y, char *str, unsigned int color)
{
 unsigned char j;
  j=0;
  while (j<strlen(str))
  {
    LCD_Char(x+j*CHAR_W,y,str[j], color);
    j++;
  }
}


Тут я пытаюсь вывести на экран три строки с символами:

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

put_string(0,15,"!@#$%^&*()_-=+",LCD_BLACK);
put_string(0,85,"abcdefghijkl",LCD_BLACK);
put_string(0,35,"1234567890",LCD_BLACK);

А в итоге получается вот такая вот картина:
Изображение
Мало того что символы корявые так еще и длинна строки не соответствует... Помогите разобратся... Кстати пробовал подставлять вместо символов просто код символа в числом так символы отображались но у них были верхушки отрезанные на пару пикселей

Меня беспокоит один участок кода:

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

ch=FONT8x15[ c-32 ][CHAR_H-h-1];

с - это символ. Говоря на Паскале: String а должен быть byte, тоесть код самого символа (извиняюсь, я в Паскале работал, СИ-шку только учу). На Паскале была функция которая возвращает код символа, как тут это происходит и происходит ли вообще я не понимаю


Когда вызываю функция вывода одного символа на экран но вместо символа подставляю цыфру то выходит вот такая картина(верхняя строка синим шрифтом) она получается со смещением по вертикали:
Изображение
З.Ы. То что все символы перевернуты и отзеркалены это меня пока мало волнует...
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

Строка в си - это массив символов. Переводить его не нужно, тип char - это сразу Вам число. Переводится всё при компиляции, а в памяти хранятся только числа.

Например.
char str[] = "ololo";
if(str[2] == 'o') printf("Hello, world!\n");

Здесь вроде бы сравниваются символы, но на самом деле 'o' это код, соответствующий символу o. А строка "ololo" это 6 чисел и аналогична вот этому:

char str[] = {'o', 'l', 'o', 'l', 'o', 0};
(все строки автоматически заканчиваются нулем)

При этом условие str[2] == 111 тоже будет true.

вот код

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

#include <cstdio>
int main()
{
static char str[] = "ololo";
for(int i = 0; i < sizeof(str); i++)
 printf("%i\n", (int)str[i]);
return 0;
}

Выводит следующее:
111
108
111
108
111
0
Giggity giggity goo!
Аватара пользователя
VDLab
Встал на лапы
Сообщения: 108
Зарегистрирован: Ср июн 29, 2011 14:16:22
Откуда: __.DP.UA

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение VDLab »

Вот это:

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

for (h=0; h<CHAR_H; h++) // every column of the character
  {
         // ch=FONT8x15[ c-31 ][h];
         ch=FONT8x15[ c-32 ][CHAR_H-h-1];
        mask = 0x80;
        for (p=0; p<CHAR_W; p++)  // write the pixels
        {
          if (ch & mask)
          {
            LCD_SendData16(color);//delay_ms(5);
          }
          else
          {
            LCD_SendData16(LCD_WHITE);//delay_ms(5);
          }
          mask=mask/2;
        }
  }
}

Заменить на это:

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

for (h=0; h<CHAR_H; h++) // every column of the character
  {
         ch=FONT8x15[(unsigned char) c-32 ][h];
        mask = 0x80;
        for (p=0; p<CHAR_W; p++)  // write the pixels
        {
          if (ch & mask)
          {
            LCD_SendData16(color);//delay_ms(5);
          }
          else
          {
            LCD_SendData16(LCD_WHITE);//delay_ms(5);
          }
          mask=mask/2;
        }
  }
}

А это:

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

void put_string(unsigned char x, unsigned char y, char *str, unsigned int color)
{
 unsigned char j;
  j=0;
  while (j<strlen(str))
  {
    LCD_Char(x+j*CHAR_W,y,str[j], color);
    j++;
  }
}

На это:

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

void put_string(unsigned char x, unsigned char y, char *str, unsigned int color)
{
 char j;
 
  while (j =*str++)
  {
    LCD_Char(x , y, j, color);
    x+=CHAR_W;
  }
}
[color=#FFBF00]На любой вопрос даю любой ответ[/color]
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение U235 »

Зукс, Вы используете под шрифт 1455 байт - это больше, чем есть оперативной памяти в восьмой меге.
Лучше всего шрифт разместить в памяти программ, для этого надо использовать возможности из файла <avr/pgmspace.h>. Компилятор WinAVR не имеет встроенных средств для работы с памятью программ, поэтому и приходится прибегать к уловкам.
Можно скачать архив с сайта - там шрифт размещён в памяти программ.
Кстати, в

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

put_string(0,35,"1234567890",LCD_BLACK);

вполне возможно, что компилятор строку 1234567890 размещает в памяти программ, а сама функция put_string пытается считывать из оперативки.
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

Да нет, скорее всего он её пишет в никуда. Вот поэтому программирование микроконтроллеров на Си - не такая уж простая задача. За всем нужно следить самому.
Giggity giggity goo!
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Foks, почему вникуда? Я ж выложил код выше и картинки что происходит на экране
VDLab, взял Ваш код, единственное что поменялось - перевернулся текст в нужном направлении
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
VDLab
Встал на лапы
Сообщения: 108
Зарегистрирован: Ср июн 29, 2011 14:16:22
Откуда: __.DP.UA

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение VDLab »

...
VDLab, взял Ваш код, единственное что поменялось - перевернулся текст в нужном направлении

Хм странно, неужели действительно:
Да нет, скорее всего он её пишет в никуда. Вот поэтому программирование микроконтроллеров на Си - не такая уж простая задача. За всем нужно следить самому.


Если компилятор не может уследить, хватит ли у МК оперативной памяти для хранения массива - фтопку его. Лучше уж тогда на ассемблере писать...
Действительно, проверьте, является ли массив "FONT8x15" константой или все же пытается разместиться в ОЗУ
[color=#FFBF00]На любой вопрос даю любой ответ[/color]
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение U235 »

Компилятор WinAVR размещает переменные в оперативной памяти, если переменная не имеет специального модификатора. Это связано с особенностями GCC.
Насколько я знаю, компилятор ругается на перерасход оперативки, но программу всё таки собирает.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
VDLab
Встал на лапы
Сообщения: 108
Зарегистрирован: Ср июн 29, 2011 14:16:22
Откуда: __.DP.UA

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение VDLab »

U235 писал(а):Компилятор WinAVR размещает переменные в оперативной памяти, если переменная не имеет специального модификатора. Это связано с особенностями GCC.

Ну, насколько я знаю, так делают все компиляторы, просто одним достаточно сказать что это const а другим нужно еще и объяснить, где он должен располагаться.
Насколько я знаю, компилятор ругается на переасход оперативки, но программу всё таки собирает.

Ну хоть ругается, уже легче. Кстати, не помешало бы увидеть сообщения компилятора, раз он проект собирает даже с ошибками...
[color=#FFBF00]На любой вопрос даю любой ответ[/color]
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

Он и не отследит. Мануал на libc читать надо!
По максимуму используйте static переменные - их хотя-бы можно отследить самому (есть команда, не помню точно какая, показывающая размер каждого сегмента в elf-файле).
А в heap он будет писать поверх других переменных; переменные там динамически выделяются подобно malloc(), который реализован весьма скудно. У вас на МК нету операционной системы и менеджера памяти, это создает определенные сложности.

----------
add: У меня не ругался. Хоть мегабайтные массивы определяй. Возможно, есть специальные опции, это надо читать мануалы на GCC и AVR-GCC. Я в основном пишу на ассемблере, и все тонкости программирования на avr-libc знаю только поверхностно.

add2: Вообще говоря он и не должен ругаться, если используется динамическая память. Эту ситуацию уже в run-time должен менеджер памяти обработать, которого фактически нету.
Giggity giggity goo!
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Компилятор у меня не ругается. Если нехватает оперативной памяти то почемуже если я вывожу символы по acsii коду, а не по символам - текст выводится, только немного неправильно? (смотреть верхнюю строку, нижние вызваны не кодом а символами):
Изображение
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

Все массивы такого рода надо хранить на FLASH, а не в ОЗУ. Если вы не укажете компилятору, он всё будет хранить в ОЗУ.
Вот вам функция печати символа для WinAVR (правда, для другого дисплея, так что могут быть перепутаны x и y):

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

#include <avr/pgmspace.h>

//символ
const char font6x8[576] PROGMEM=
{
0x00,0x00,0x00,0x00,0x00,0x00, // Symbol 20
0x00,0x00,0x00,0x5F,0x00,0x00, // Symbol 21
0x00,0x00,0x03,0x00,0x03,0x00, // Symbol 22
0x22,0x7F,0x22,0x22,0x7F,0x22, // Symbol 23
0x00,0x24,0x2A,0x6B,0x2A,0x12, // Symbol 24
0x00,0x23,0x13,0x08,0x64,0x62, // Symbol 25
0x00,0x3A,0x45,0x45,0x3A,0x28, // Symbol 26
0x00,0x00,0x00,0x02,0x01,0x00, // Symbol 27
0x00,0x00,0x3E,0x41,0x00,0x00, // Symbol 28
0x00,0x00,0x41,0x3E,0x00,0x00, // Symbol 29
0x00,0x2A,0x1C,0x1C,0x2A,0x00, // Symbol 2A
0x00,0x08,0x08,0x3E,0x08,0x08, // Symbol 2B
0x00,0x00,0x80,0x40,0x00,0x00, // Symbol 2C
0x00,0x08,0x08,0x08,0x08,0x00, // Symbol 2D
0x00,0x00,0x00,0x40,0x00,0x00, // Symbol 2E
0x00,0x20,0x10,0x08,0x04,0x02, // Symbol 2F
0x00,0x3E,0x51,0x49,0x45,0x3E, // Symbol 30
0x00,0x00,0x42,0x7F,0x40,0x00, // Symbol 31
0x00,0x62,0x51,0x51,0x51,0x4E, // Symbol 32
0x00,0x21,0x41,0x45,0x45,0x3B, // Symbol 33
0x00,0x18,0x16,0x11,0x7F,0x10, // Symbol 34
0x00,0x27,0x45,0x45,0x45,0x39, // Symbol 35
0x00,0x3E,0x49,0x49,0x49,0x32, // Symbol 36
0x00,0x01,0x61,0x11,0x09,0x07, // Symbol 37
0x00,0x36,0x49,0x49,0x49,0x36, // Symbol 38
0x00,0x26,0x49,0x49,0x49,0x3E, // Symbol 39
0x00,0x00,0x00,0x12,0x00,0x00, // Symbol 3A
0x00,0x00,0x20,0x12,0x00,0x00, // Symbol 3B
0x00,0x08,0x14,0x22,0x41,0x00, // Symbol 3C
0x00,0x14,0x14,0x14,0x14,0x14, // Symbol 3D
0x00,0x41,0x22,0x14,0x08,0x00, // Symbol 3E
0x00,0x06,0x01,0x51,0x09,0x06, // Symbol 3F
0x00,0x3E,0x41,0x4D,0x4D,0x2E, // Symbol 40
0x00,0x78,0x16,0x11,0x16,0x78, // Symbol 41
0x00,0x7F,0x49,0x49,0x49,0x36, // Symbol 42
0x00,0x3E,0x41,0x41,0x41,0x22, // Symbol 43
0x00,0x7F,0x41,0x41,0x41,0x3E, // Symbol 44
0x00,0x7F,0x49,0x49,0x49,0x41, // Symbol 45
0x00,0x7F,0x09,0x09,0x09,0x01, // Symbol 46
0x00,0x3E,0x41,0x41,0x51,0x32, // Symbol 47
0x00,0x7F,0x08,0x08,0x08,0x7F, // Symbol 48
0x00,0x00,0x41,0x7F,0x41,0x00, // Symbol 49
0x00,0x30,0x40,0x41,0x41,0x3F, // Symbol 4A
0x00,0x7F,0x08,0x08,0x14,0x63, // Symbol 4B
0x00,0x7F,0x40,0x40,0x40,0x60, // Symbol 4C
0x00,0x7F,0x04,0x18,0x04,0x7F, // Symbol 4D
0x00,0x7F,0x04,0x08,0x10,0x7F, // Symbol 4E
0x00,0x3E,0x41,0x41,0x41,0x3E, // Symbol 4F
0x00,0x7F,0x09,0x09,0x09,0x06, // Symbol 50
0x00,0x3E,0x41,0x61,0x21,0x5E, // Symbol 51
0x00,0x7F,0x09,0x09,0x19,0x66, // Symbol 52
0x00,0x26,0x49,0x49,0x49,0x32, // Symbol 53
0x00,0x01,0x01,0x7F,0x01,0x01, // Symbol 54
0x00,0x3F,0x40,0x40,0x40,0x3F, // Symbol 55
0x00,0x07,0x18,0x60,0x18,0x07, // Symbol 56
0x00,0x1F,0x60,0x18,0x60,0x1F, // Symbol 57
0x00,0x63,0x14,0x08,0x14,0x63, // Symbol 58
0x00,0x03,0x04,0x78,0x04,0x03, // Symbol 59
0x00,0x61,0x51,0x49,0x45,0x43, // Symbol 5A
0x00,0x00,0x7F,0x41,0x00,0x00, // Symbol 5B
0x00,0x02,0x04,0x08,0x10,0x20, // Symbol 5C
0x00,0x00,0x41,0x7F,0x00,0x00, // Symbol 5D
0x00,0x00,0x00,0x00,0x00,0x00, // Symbol 5E
0x40,0x40,0x40,0x40,0x40,0x40, // Symbol 5F
0x00,0x00,0x00,0x01,0x02,0x00, // Symbol 60
0x00,0x20,0x54,0x54,0x54,0x78, // Symbol 61
0x00,0x7E,0x48,0x48,0x48,0x30, // Symbol 62
0x00,0x38,0x44,0x44,0x44,0x28, // Symbol 63
0x00,0x30,0x48,0x48,0x48,0x7E, // Symbol 64
0x00,0x38,0x54,0x54,0x54,0x18, // Symbol 65
0x00,0x10,0x7C,0x12,0x02,0x04, // Symbol 66
0x00,0x0C,0x52,0x52,0x3C,0x02, // Symbol 67
0x00,0x7E,0x08,0x08,0x08,0x70, // Symbol 68
0x00,0x00,0x00,0x74,0x00,0x00, // Symbol 69
0x00,0x40,0x80,0x80,0x74,0x00, // Symbol 6A
0x00,0x7E,0x10,0x10,0x10,0x6C, // Symbol 6B
0x00,0x00,0x02,0x7E,0x00,0x00, // Symbol 6C
0x00,0x7C,0x04,0x78,0x04,0x78, // Symbol 6D
0x00,0x7C,0x04,0x04,0x04,0x78, // Symbol 6E
0x00,0x38,0x44,0x44,0x44,0x38, // Symbol 6F
0x00,0xFC,0x24,0x24,0x24,0x18, // Symbol 70
0x00,0x18,0x24,0x24,0x24,0xFC, // Symbol 71
0x00,0x7C,0x08,0x04,0x04,0x08, // Symbol 72
0x00,0x48,0x54,0x54,0x54,0x20, // Symbol 73
0x00,0x08,0x3E,0x48,0x40,0x00, // Symbol 74
0x00,0x3C,0x40,0x40,0x40,0x3C, // Symbol 75
0x00,0x1C,0x20,0x40,0x20,0x1C, // Symbol 76
0x00,0x3C,0x40,0x30,0x40,0x3C, // Symbol 77
0x00,0x44,0x28,0x10,0x28,0x44, // Symbol 78
0x00,0x1C,0x20,0xA0,0xA0,0x7C, // Symbol 79
0x00,0x44,0x64,0x54,0x4C,0x44, // Symbol 7A
0x00,0x08,0x36,0x41,0x00,0x00, // Symbol 7B
0x00,0x00,0x00,0x7F,0x00,0x00, // Symbol 7C
0x00,0x00,0x41,0x36,0x08,0x00, // Symbol 7D
0x02,0x01,0x01,0x02,0x02,0x01, // Symbol 7E
0x00,0x7F,0x7F,0x7F,0x7F,0x7F  // Symbol 7F
};

//----------
//вывод символа в позицию
//----------
inline void LCD_PutSymbol(unsigned char x,unsigned char y,char symbol,unsigned short color,unsigned short bkcolor)
{
 if (symbol<32 || symbol>127) return;
 LCD_SetOutputRectangle(x,y,x+5,y+7);
 int offset=6*(symbol-0x20);
 for(y=0;y<8;y++)
 {
  unsigned char mask=1<<y;
  for(x=0;x<6;x++)
  {
   unsigned char byte=pgm_read_byte(&(font6x8[offset+x]));
   if (byte&mask) LCD_SetPixel(color);
             else LCD_SetPixel(bkcolor);
  }
 }
}
//----------
//вывод строчки в позицию
//----------
inline void LCD_PutString(unsigned char x,unsigned char y,const char *string,unsigned short color,unsigned short bkcolor)
{
 unsigned char l=strlen(string);
 for(unsigned char n=0;n<l;n++,x+=6)
 {
  LCD_PutSymbol(x,y,string[n],color,bkcolor);
 }
}

И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VDLab
Встал на лапы
Сообщения: 108
Зарегистрирован: Ср июн 29, 2011 14:16:22
Откуда: __.DP.UA

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение VDLab »

Foks писал(а):...
add2: Вообще говоря он и не должен ругаться, если используется динамическая память. Эту ситуацию уже в run-time должен менеджер памяти обработать, которого фактически нету.

Какая, блин, динамическая память? Это статический массив, хоть и расположен в ОЗУ. Компилятор просто обязан следить за тем, уместится ли он в память(точнее это задача линкера, но с WinAVR не работал, может там отдельного линкера нет).
da-nie писал(а):Все массивы такого рода надо хранить на FLASH, а не в ОЗУ. Если вы не укажете компилятору, он всё будет хранить в ОЗУ.
....

Да это вроде уже обсудили. А вот это:

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

unsigned char byte=pgm_read_byte(&(font6x8[offset+x]));

особенно доставляет...Я конечно знал, что от GCC хорошего ждать не приходится, но не до такой же степени!

Зукс писал(а):Компилятор у меня не ругается. Если нехватает оперативной памяти то почемуже если я вывожу символы по acsii коду, а не по символам - текст выводится, только немного неправильно? (смотреть верхнюю строку, нижние вызваны не кодом а символами):

Видимо у компилятора еще и с указателями проблемы...
Меня больше интересует вывод символа, он так и выводится смещенным по вертикали? Если да, то проверьте значения CHAR_H и CHAR_W, может там неправильное значение закралось?
Впрочем, сначала замените

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

ch=FONT8x15[(unsigned char) c-32 ][h];

на такую конструкцию

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

ch=pgm_read_byte(&FONT8x15[(unsigned char) c-32 ][h]);

ну или как там правильно читать из памяти программ, ну и массив со шрифтом в ПЗУ перенесите.
[color=#FFBF00]На любой вопрос даю любой ответ[/color]
Ответить

Вернуться в «Периферия»