Библиотека для LCD Nokia 1100

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Значит так: по последнему - есть команда (посылаем команду) есть дата (посылаем данные) командой задавайте по "Y" банк по "Х" координату. Это в даташите. Если без координат, вывет в (0, 0); затем (1, 0);

По сдвигу это надо разобраться с побитовыми логическими операторами "и" (&), "или" (|). последний не путать с логическим или (||).

Установка бита









#define SCK_LCD_SET     PORTB |= 1<<5

Запишем эквивалент в более понятной форме:









#define SCK_LCD_SET     PORTB =  PORTB | (1<<5)

Это тоже самое.

в результате бит регистра примит логическую еденицу если "или" данный бит "или" бит маски равен логической еденице. Остальные биты маски просто скрыты, поэтому другие регистры не затрагиваются (или просто остаются без изменений)

Для нескольких портов можно писать так:









#define SCK_LCD_SET     PORTB|= (1<<2) | (1<<6) | (1<<7)

тут постфиксный  (с права от оператора присвоения"=") "или" просто объеденяет битовые маски.

Для сброса бита регистра добавим ещё один оператор побитового инвертирования "~" и поменяем все биты маски. 

С ним (~) оператор (&) установит только те биты которые с маской равны "1", остальные останутся  нетронутые









#define SCK_LCD_RESET   PORTB =PORTB & (~(1<<5) )//более понятная форма
#define SCK_LCD_RESET   PORTB &= ~(1<<5) //более простая в написании

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Линия должна появиться в координатах 0,0.

Переход к другим координатам осуществляется 3мя командами:

SendByte(0,(0xB0|(y&0x0F)));      // установка адреса по Y: 0100 yyyy
SendByte(0,(0x00|(x&0x0F)));      // установка адреса по X: 0000 xxxx - биты (x3 x2 x1 x0)
SendByte(0,(0x10|((x>>4)&0x07))); // установка адреса по X: 0010 0xxx - биты (x6 x5 x4)

Где х,у соответствующие координаты х[0..96], y[0,8]

hugoboss317
Offline
Зарегистрирован: 21.03.2013

igorok107 пишет:

Линия должна появиться в координатах 0,0.

Так я о чём!? Если не задавать  координат, там и появится.

igorok107 пишет:

Переход к другим координатам осуществляется 3мя командами:

а если не "почистить" экран, и не задавать координаты, вторая появится в координатах (1, 0)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спасибо. дальше думаю разберусь

я путал & и &&, а также | и ||. Ломал голову как может логическая операция менять бит, и не подумал что это логический оператор изменения битов

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Ну тогда еще вопрос:

#define SCK_LCD_SET	        PORTB |= 1<<5

этот код понимать так?:

SCK_LCD_SET     это функция установки PB4 в еденицу (или PB5? хотя нумерация идет с 0 тогда должно быть PB4)
 
если нужен PB0 то писать так
 
#define SCK_LCD_SET	        PORTB |= 1<<0

или так?

#define SCK_LCD_SET	        PORTB |= 1

 

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Чтобы установить PB0 ничего сдвигать вообще не надо просто

#define SCK_LCD_SET         PORTB |= 1
#define SCK_LCD_SET         PORTB |= 1<<5

Устанавливает 1 в PORTB.5, т.к сдвигает на 5 разрядов от 0го.

           PB 7654 3210

Было        0000 0001 << 5 //сдвинули пять раз

Получили 0010 0000 // profit!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спасибо. буду мучать дальше дисплей

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

hugoboss317
Offline
Зарегистрирован: 21.03.2013

igorok107 пишет:

Чтобы установить PB0 ничего сдвигать вообще не надо просто







#define SCK_LCD_SET         PORTB |= 1



не рекомендую так делать, правельно не правельно, опять же теряется визуально с каким пином порта работаем.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

hugoboss317 пишет:

igorok107 пишет:

Чтобы установить PB0 ничего сдвигать вообще не надо просто






#define SCK_LCD_SET         PORTB |= 1



не рекомендую так делать, правельно не правельно, опять же теряется визуально с каким пином порта работаем.

то есть эта запись тоже правильная? точнее рабочая

#define SCK_LCD_SET	        PORTB |= 1<<0

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

то есть эта запись тоже правильная? точнее рабочая

#define SCK_LCD_SET	        PORTB |= 1<<0

Да, только наглядней и универсальней.

jeka_tm пишет:

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

Можно просто передать число, которое будет соответсвовать нужной маске порта:

igorok107 пишет:

#define SCK_LCD_SET     PORTB |= 0x20
#define SDA_LCD_SET 	PORTB |= 0x08
#define CS_LCD_SET      PORTB |= 0x04
#define SCK_LCD_RESET	PORTB &= ~0x20
#define SDA_LCD_RESET	PORTB &= ~0x08
#define CS_LCD_RESET	PORTB &= ~0x04  

Но как заметил hugoboss317:

hugoboss317 пишет:

А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:

#define SCK_LCD_SET	    PORTB |= 1<<5
#define SDA_LCD_SET 	PORTB |= 1<<3
#define CS_LCD_SET	    PORTB |= 1<<2
#define SCK_LCD_RESET	PORTB &= ~(1<<5)
#define SDA_LCD_RESET	PORTB &= ~(1<<3)
#define CS_LCD_RESET	PORTB &= ~(2<<2)

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

понятно. спасибо что все разъяснили

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

почему сдвигаем для CS 2 бита?

#define CS_LCD_RESET	PORTB &= ~(2<<2)

может должно быть

#define CS_LCD_RESET	PORTB &= ~(1<<2)

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

почему сдвигаем для CS 2 бита?

#define CS_LCD_RESET	PORTB &= ~(2<<2)

может должно быть

#define CS_LCD_RESET	PORTB &= ~(1<<2)

аха, оппечатка.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну тогда еще впорос. самый простой способ очистить дисплей это записать в него нули?

Void Clear(){
  for (int i=0;i<864;i++){
    SendByte(1,0x00);
  }
}

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

ну тогда еще впорос. самый простой способ очистить дисплей это записать в него нули?

Void Clear(){
  for (int i=0;i<864;i++){
    SendByte(1,0x00);
  }
}

угу, т.к. контроллер дисплея не имеет комманды стирания.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

igorok107 пишет:

jeka_tm пишет:

ну тогда еще впорос. самый простой способ очистить дисплей это записать в него нули?

Void Clear(){
  for (int i=0;i<864;i++){
    SendByte(1,0x00);
  }
}

угу, т.к. контроллер дисплея не имеет комманды стирания.

хорошо. вечером попробую запустить

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот получилось))

Размер скетча в двоичном коде: 430 байт (из 1 024 байт максимум)

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Всё-таки замутил, красавчик.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Ага. спасибо igorok107 и hugoboss317 за помощь. 

Все работает кроме инвертирования

  //SendByte(0,0xC8);   // mirror Y axis (about X axis)
  //SendByte(0,0xA1);   // Инвертировать экран по горизонтали

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

выкладываю весь код. может кому понадобится

#define SC_On            PORTB |= 1<<0        // CS    PB0
#define Data_On          PORTB |= 1<<1        // Data  PB1
#define Clock_On         PORTB |= 1<<2        // Clock PB2
#define SC_Off           PORTB &= ~(1<<0)
#define Data_Off         PORTB &= ~(1<<1)
#define Clock_Off        PORTB &= ~(1<<2)


byte mass[42]={
  0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e,  //A
  0x00, 0x7f, 0x09, 0x19, 0x29, 0x46,  //R
  0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c,  //D
  0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f,  //U
  0x00, 0x00, 0x41, 0x7f, 0x41, 0x00,  //I
  0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f,  //N
  0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e}; //O


void SendByte(unsigned char mode, unsigned char c){
  SC_Off;
  (mode)? Data_On : Data_Off;
  Clock_On;
  Clock_Off;

  byte i;
  for(i=0;i<8;i++)
  {
    Clock_Off;
    if (c & 0x80) Data_On;
    else	  Data_Off;
    Clock_On;
    c <<= 1;
  }

  Clock_Off;
  SC_On;
  Data_Off;
}

void Clear_LCD(){
  for (int i=0;i<864;i++){
    SendByte(1,0x00);
  }
}

void Goto_XY(byte x, byte y){
SendByte(0,(0xB0|(y&0x0F)));      // установка адреса по Y: 0100 yyyy
SendByte(0,(0x00|(x&0x0F)));      // установка адреса по X: 0000 xxxx - биты (x3 x2 x1 x0)
SendByte(0,(0x10|((x>>4)&0x07))); // установка адреса по X: 0010 0xxx - биты (x6 x5 x4)
}

void setup() { 
  DDRB |= 0b000111;          //включаем порты на выход с 0 по 2

  // Инициализация дисплея
  Clock_Off;
  Data_Off;
  SC_Off;
  SC_On;

  SendByte(0,0x2F);     // Power control set(charge pump on/off)
  SendByte(0,0xA4);

  //SendByte(0,0xC8);   // mirror Y axis (about X axis)
  //SendByte(0,0xA1);   // Инвертировать экран по горизонтали

  SendByte(0,0xAF);     // экран вкл/выкл
  Clear_LCD();

  Goto_XY(25,4);
  for (byte i=0;i<42;i++){
    SendByte(1,mass[i]);
  }

}

void loop() {
}





 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

Все работает кроме инвертирования

  //SendByte(0,0xC8);   // mirror Y axis (about X axis)
  //SendByte(0,0xA1);   // Инвертировать экран по горизонтали

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

Странно что не работает, у меня что в железе, что в протеусе инвертирование работает.

Кстати массив с данными можно разместить в программую память, так оперативки меньше будет кушать:

byte mass[42] PROGMEM = {
  0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e,  //A
  0x00, 0x7f, 0x09, 0x19, 0x29, 0x46,  //R
  0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c,  //D
  0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f,  //U
  0x00, 0x00, 0x41, 0x7f, 0x41, 0x00,  //I
  0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f,  //N
  0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e}; //O
  for (byte i=0;i<42;i++){
    SendByte(1,pgm_read_byte(&(mass[i])));
  }

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спасибо что подсказали. а то голову уже сломал как меньше оперативки тратить

блин ругается

sketch_nov14b:9: error: expected initializer before 'PROGMEM'
sketch_nov14b.ino: In function 'void setup()':
sketch_nov14b:72: error: 'mass' was not declared in this scope
sketch_nov14b:72: error: 'pgm_read_byte' was not declared in this scope

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

все разобрался. надо было подключить

#include <avr/pgmspace.h>

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

красота. наконец запустил шрифт 10*16 на тиньке. теперь оперативки хватает. правда только цифры. пока нужны в основном только они. вечером еще в железе проверю. хугобосс использовал твои шрифты. лень было рисовать))

чуть не забыл

Размер скетча в двоичном коде: 798 байт (из 1 024 байт максимум)

еще 226 байт. это радует. можно основную программу сделать

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Я бы добавил путой столбец а того и два при выводе символа/цифры, что бы не смотрелись так слитно, разрешение позволяет: 96/8 = 10+2.

А что вообще за проэкт такой делайте?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я специально их слитно делал

вообще это для тренировки чтобы понимать как работает и использования в будущем, но и цель конкретная есть - сделать свою прошивку для этого устройства: 

Вольтамперваттметр на тиньке13

http://vrtp.ru/index.php?showtopic=20096

благодаря ему я в свое время поверил что можно в принципе запустить жк дисплей от телефона

теперь хочу свою прошивку сделать в той же схеме (там ближе к концу я выкладывал измененные упрощенные схемы)

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверил в железе. работает

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ну рад что шрифт пригодился :))

Проэкт интересный и полезный, держи в курсе дела

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

решил увеличить шрифт. все таки пришлось самому делать. теперь 10*24.

и только 2 строки. напряжение и ток. мощность не особо нужна

а также переходить на CVAVR, а то почти закончилась память. 

было в ардуино

Размер скетча в двоичном коде: 938 байт (из 1 024 байт максимум)

Оставалось всего 86 байт

в CVAVR с оптимизацией скорости стало

с оптимизацией по размеру

теперь остается 212 байт.

так что пока памяти вроде хватает. посмотрим что дальше будет

надо будет добавить еще 2 символа V и A

после этого наши библиотеки скомпилированные на 4К и выше  кажутся монстрами неоптимальными

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

может что подскажите еще по оптимизации. вот код CVAVR

#include <tiny13.h>
#include <delay.h>

#define SC_On            PORTB |= 1<<0        // CS    PB0
#define Data_On          PORTB |= 1<<1        // Data  PB1
#define Clock_On         PORTB |= 1<<2        // Clock PB2
#define SC_Off           PORTB &= ~(1<<0)
#define Data_Off         PORTB &= ~(1<<1)
#define Clock_Off        PORTB &= ~(1<<2)

flash char mass[10][30] = {
    { 0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8,    //0
      0xC3, 0xE7, 0xC3, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xE7, 0xC3,
      0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xF8,    //1
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xE7, 0xC3,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F},
    { 0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8,    //2
      0xC0, 0xE0, 0xD8, 0x3C, 0x3C, 0x3C, 0x3C, 0x1B, 0x07, 0x03,
      0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0x40, 0x00, 0x00},
    { 0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8,    //3
      0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0xDB, 0xE7, 0xC3,
      0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},
    { 0xF8, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xF8,    //4
      0x03, 0x07, 0x1B, 0x3C, 0x3C, 0x3C, 0x3C, 0xDB, 0xE7, 0xC3,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F},
    { 0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00,    //5
      0x03, 0x07, 0x1B, 0x3C, 0x3C, 0x3C, 0x3C, 0xD8, 0xE0, 0xC0,
      0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},
    { 0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00,    //6
      0xC3, 0xE7, 0xDB, 0x3C, 0x3C, 0x3C, 0x3C, 0xD8, 0xE0, 0xC0,
      0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},
    { 0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8,    //7
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xE7, 0xC3,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F},
    { 0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8,    //8
      0xC3, 0xE7, 0xDB, 0x3C, 0x3C, 0x3C, 0x3C, 0xD9, 0xE7, 0xC3,
      0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},
    { 0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8,    //9
      0x03, 0x07, 0x1B, 0x3C, 0x3C, 0x3C, 0x3C, 0xDB, 0xE7, 0xC3,
      0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}
};
 


void SendByte(unsigned char mode, unsigned char c){
  char i;
  SC_Off;
  if (mode == 1){
   Data_On;
  }
  else{
   Data_Off;
  }
  Clock_On;
  Clock_Off;

  
  for(i=0;i<8;i++)
  {
    Clock_Off;
    if (c & 0x80) Data_On;
    else      Data_Off;
    Clock_On;
    c <<= 1;
  }

  Clock_Off;
  SC_On;
  Data_Off;
}

void Goto_XY(char x, char y){
  SendByte(0,(0xB0|(y&0x0F)));      // установка адреса по Y: 0100 yyyy
  SendByte(0,(0x00|(x&0x0F)));      // установка адреса по X: 0000 xxxx - биты (x3 x2 x1 x0)
  SendByte(0,(0x10|((x>>4)&0x07))); // установка адреса по X: 0010 0xxx - биты (x6 x5 x4)
}

void simb10x16(char n, char x, char y){
  char i;
  Goto_XY(x,y);
  for (i=0;i<10;i++){
    SendByte(1,mass[n][i]);
  }
  Goto_XY(x,y+1);
  for (i=10;i<20;i++){
    SendByte(1,mass[n][i]);
  }
  Goto_XY(x,y+2);
  for (i=20;i<30;i++){
    SendByte(1,mass[n][i]);
}
}

void Clear_LCD(){
  int i;
  for (i=0;i<864;i++){
    SendByte(1,0x00);
  }
}



void main(void) { 
  DDRB |= 0b000111;          //включаем порты на выход с 0 по 2

  // Инициализация дисплея
  Clock_Off;
  Data_Off;
  SC_Off;
  delay_ms(20);
  SC_On;

  SendByte(0,0x2F);     // Power control set(charge pump on/off)
  SendByte(0,0xA4);

  SendByte(0,0xC8);   // mirror Y axis (about X axis)
  SendByte(0,0xA1);   // Инвертировать экран по горизонтали

  SendByte(0,0xAF);     // экран вкл/выкл
  Clear_LCD();
  
  
  simb10x16(0, 20, 0);
  simb10x16(1, 32, 0);
  simb10x16(2, 44, 0);
  simb10x16(3, 56, 0);

  
  simb10x16(5, 20, 5);
  simb10x16(6, 32, 5);
  simb10x16(7, 44, 5);
  simb10x16(8, 56, 5);





while(1){

}
}

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Растяни по ширене вдвое, это конечно не оптимизация, но место есть, цифры ещё крупнее будут

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

hugoboss317 пишет:

Растяни по ширене вдвое, это конечно не оптимизация, но место есть, цифры ещё крупнее будут

нельзя. памяти не хватит. сейчас 300байт занято под цифры. будет 600. еще 2 буквы надо будет и точку. а еще ацп, и вычисления. не хватит места. тогда уже на асме надо будет писать, а не хочу и не умею. ну или сложный алгоритм, так как в цифрах много одинаковых элементов. но не уверен что усложение алгоритма вывода цифр сильно уменьшит в объеме

каждый байт на счету))) это не на меге программить)))

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Не, ты не понял, не 20х24 шрифт, свой оставь только в коде пиши не

  for (i=0;i<10;i++){
    SendByte(1,mass[n][i]);

  for (i=0;i<10;i++){
    SendByte(1,mass[n][i]);
    SendByte(1,mass[n][i]);

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а понял. вечером может попробую. если нормльно будет выглядеть то оставлю

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверил в железе

по моему получилось слишком широко

ты меня натолкнул на мысль как сделать крупный шрифт, при этом сэкономив память. в билжайшее время сделаю

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, жирновато. Я шрифт немного не такой рисовал, поэтому у меня не так жирно кажется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот сделал

при этом еще сэкономил память 32 байта

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

дальше усложнять алгоритм вывода текста не вижу смысл, сам алгоритм съедает память.

например до этого шрифты занимали 10*30 = 300 байт

а целиком программа 812 байт

теперь шрифты занимают 10*21= 210 байт

а целиком программа 780

итого: разница в объеме массива шрифтов 90 байт, а разница в объеме всей программы всего 32

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот и снова уперся в объем флеша у тиньки 13. уже не знаю что уменьшить, кроме как цифры сделать квадратными. даже точку не вывел не то что буквы. пришлось закоментить

но хотя бы измеряет

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
хорошая мысля приходит опосля))
нашел способ уменьшить программу. нарисовал простые точки
hugoboss317
Offline
Зарегистрирован: 21.03.2013

На сколько я помню, ты цифры в координатох печатаешь, ну так отодвинь немного десятые и сотые, а точку между ними поставь

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

hugoboss317 пишет:

На сколько я помню, ты цифры в координатох печатаешь, ну так отодвинь немного десятые и сотые, а точку между ними поставь

 

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

вот думаю использовать переход в координаты только 1 раз. должно уменьшить код прилично, а вот совсем отказаться думаю не получится, нужно будет следить в каком месте находится "курсор" и со временем возможен глюк, хотя и не факт

Iwan73
Offline
Зарегистрирован: 02.11.2013

Наверное не в тему,извините. Собрал устройство на макетке использующее бибу с этой темы,дисплей от нокиа 1110,все хорошо,но рисует медленно, решил заменить дисплей на 1202(кто то где то писал что пошустрее работает) и тут началось, инверсия по горизонтали,исправил ,нормально,пошло. Отключаю от USB и подаю внешнее питание 12 вольт в дуину,инверсия, нажал рессет, нормальная картинка. выключаю питание,включаю опять инверсия. после рессета - нормально.Если запитываю от USB то проблема не появляется. В чем трабла,кто что посоветует?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверьте побольше раз чтобы точно выяснить причину. мне лично это тоже интересно

Iwan73
Offline
Зарегистрирован: 02.11.2013

Блок питания от компа атх, 12 вольт в дуину,болячка сегодня не рассосалась сама,при подаче питания картинка инверсная,рессет нажал - все отлично. проверено раз 20. С  USB всегда нормальный запуск. В целях чистоты эксперимента достал с полки блок питания ATTEN APS,с него запуск происходит нормально.

 Делаю выводы что как то связано именно с питанием,хотя подключаю модуль с дисплеем от 1110 и любой источник питания таких проблем не возникает. Завтра еще один дисплей 1202 возьму и попробую с ним.  

hugoboss317
Offline
Зарегистрирован: 21.03.2013

От usb питание более-мение стабильное, вы 12 вольт крените? если да, то ёмкость надо обязательно на низкой стороне ставить.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и по входу тоже лучше поставить

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

jeka_tm пишет:

вот и дотравилось. спаяю макетки буду проверять

плата местами черная потому что тонер при стирании ацетоном частично впитывается в текстолит и больше не стирается. это еще кисточкой. ватой еще хуже

какой номинал лучше брать для конденсатора?

gnd-gnd там просто перемычка, так ведь?

и обновите ссылки на библиотеку и скетчи, пишет файлы не найдены

спасибо

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да там перемычка. какие именно файлы вам нужны? я теперь их храню в отдельной папке и не удаляю

конденсатор для драйвера последний раз ставил 100мкф, далее стабилизатор на 5В и  снова кондесатор керамика на 1мкф

для обычной платы с измерениями и без теперь ставлю керамику 10мкф 1206

вот например

там радиомодуль, дисплей и 2 аналоговых входа для измерения напряжения. пока 10мкф хватает. если есть мотор например, или полевик управляемый шимом тут нужно конечно больше и разделять цепи резистором 100ом например по плюсу  с конденасаторами с каждой стороны чтобы всплески в силовой части не влияли на цифровую часть. для аналоговых еще лучше надо делать

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

из файлов интересуют всякие вкусности для дисплея 1100. библиотека и пару пробных скетчей.

можно схему вот этого момента в картинках "сли есть мотор например, или полевик управляемый шимом тут нужно конечно больше и разделять цепи резистором 100ом например по плюсу  с конденасаторами с каждой стороны"

не совсем понял что имелось ввиду

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хорошо. библиотеку чуть позже брошу. вот схемы чтобы понятнее было

в 1 схеме забыл поправить там 5 вольт. номиналы и количество светодиодов чисто для понимания что нагрузка большая. и что помехи от шим например или от икрения щеток двигателя не должны попадать в питание микроконтроллера

не лишним будет добавить паралельно электролиту тоже керамику. электролит не любит высокие частоты. и если ток большой будет греться, а керамика легко переносит и эффективно гасит. электролит в данном случае для гашения провалов питания например в момент пуска двигателя, когда ток особенно приличный и напряжение может просесть что может привести разным  последствиям. зависит еще и от источника

+ вот папка с архивом 2 библиотек. там есть примеры к каждой

http://yadi.sk/d/CXjuENmaEEwun