Бибилиотека LCD Nokia 1616 (SPFD54124B)

deemon84
Offline
Зарегистрирован: 05.01.2015

Не могу добиться инициализации. Мусор есть, нормальной инициализации нет. Есть у кого библиотека?

deemon84
Offline
Зарегистрирован: 05.01.2015

Дописал библиотеку. Новая проблема. Подключаю к Arduino Nano V3, дисплей пересвечен, тянучки за цветными пикселями, странные полосы в пересвете. Библиотека написана на основе статей в интернете и библиотеки HX8340B. Всё вроде стандартно. Думал уровни высокие 5В, все шины кроме CS на ограничительный резистор ни как не реагируют. Как только по линии CS фронт сигнала падает ниже 4,5В - изо пропадает, но ближе к этому напряжению пересвет почти порпадает, появляется нормальный чёрный. 

В чём я ошибся? Напряжение питания дисплея 3,3В. Перебрал 3 дисплея всё то же.

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

там и питание и сигналы все 3.3В. может попалил уже контроллер дисплея

http://yadi.sk/d/CXjuENmaEEwun

в папке дисплеи смотри. софтварный и хардваный spi для 1616

axill
Offline
Зарегистрирован: 05.09.2011

Легко мог спалить, эти дисплеи не живут долго если на них подавать больше 3.3в

Хардверный? Наверно все таки комбинированный потому как у атмеги нет 9ти битного Spi в железе

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

ну да комбинированный. первый бит софтварно. но остальное хардварно, поэтому гораздо быстрее

deemon84
Offline
Зарегистрирован: 05.01.2015

Вряд ли попалил. Инициализация есть, графику символы выводит, на команды реагирует. Пробовал новый дисплей запускать сразу через согласователь уровней, который сделал на 74LVC08- инициализации нет. Если линию CS пустить без согласования, то инициализация естьЮ но с такой вот какой. Ну соответвенно изо становится нормальным при снижении уровня сигнала CS.

Может дисплей на другом контроллере, либо с напряжениями при инициализации поиграть нужно?

JXD-SYXB006

WD-F1216XZ-6FLWd 4850266

S3159060003A0015S005

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

кстати я reset не использовал. ну вообще. вроде к 3.3В подключен. все управление по 3 пинам

deemon84
Offline
Зарегистрирован: 05.01.2015

Так же не использую reset

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

я проверил свой код на 2 дисплеях. не работает сам голову ломай

axill
Offline
Зарегистрирован: 05.09.2011

Возьмите мой код с радиокота в статьях. Чтобы исключить проблему согласования уровней запитайтн МК от 3.3в

deemon84
Offline
Зарегистрирован: 05.01.2015

axill пишет:

Возьмите мой код с радиокота в статьях. Чтобы исключить проблему согласования уровней запитайтн МК от 3.3в

глядя на ваш код и дописывал библиотеку под графику Adafruit

питать от 3,3в пробовал в первую очередь, нет инициализации, данные бегут, проверял осцилографом

deemon84
Offline
Зарегистрирован: 05.01.2015

jeka_tm пишет:

я проверил свой код на 2 дисплеях. не работает сам голову ломай

ваш код смотрел с ним работает так же как и с моим

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

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

deemon84
Offline
Зарегистрирован: 05.01.2015

да то что согласовывать нужно я и так знаю, уже не один дисплей пробовал, начиная со второго через ограничительные резисторы 4,7Ком

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

 

axill
Offline
Зарегистрирован: 05.09.2011

deemon84 пишет:

ограничительные резисторы 4,7Ком

нужны не ограничительные резисторы, а резистивные делители

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

когда вы ставите ограничительный резистор вместо делителя, то по сути у вас возникает делитель между вашим резистором и внутренним входным сопротивлением контроллера. Откуда вы знаете какое там сопротивление? А если оно много больше 4.7ком и в результате на вход контроллера попадет напряжение выше нормы?

в тестах о которых я пишу в статье я применял резистивные делители, они там есть на схеме. А в устройстве которое я сделал МК питается от 3.3В. Так что могу утверждать что должно работать и так и так

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

1616 прекрасно у меня выжил просто с 4.7к. или 5.1к не помню)

axill
Offline
Зарегистрирован: 05.09.2011

jeka_tm пишет:

1616 прекрасно у меня выжил просто с 4.7к. или 5.1к не помню)

ну хорошо) все равно шаманство)

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

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

axill
Offline
Зарегистрирован: 05.09.2011

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

ПЛИС это уже большой шаг в эту сторону, но не совсем то

deemon84
Offline
Зарегистрирован: 05.01.2015

включил от 3,3В - нет инициализации

купил ещё один дисплей, включил сразу через 74LVC08 - нет инициализации

постепенно начал поднимать напряжение питание и дёргал резет на контроллере, включение с согласованием - нет инициализации

постепенно начал поднимать напряжение питание и дёргал резет на контроллере, включение без согласования - инициализация примерно на 4,3В, ближе к нормальной, но в пересвет в углах сохраняется и полосы

какой вывод?)))

что ж творится то)

порядок инициализации  

0x01

0x11

0x13

0x3A 0xC5

0x29

deemon84
Offline
Зарегистрирован: 05.01.2015

как рерализовать чтение по SPI 9 bit 3 pin? хочется посмотреть может контроллер другой

axill
Offline
Зарегистрирован: 05.09.2011

В моей статье в конце есть ссылка на универсальную плату для дисплея нокия. В ней есть библиотека с чтением ID контроллера. Попробуйте прочитать. Еще рекомендую свою проблему описать здесь http://radiokot.ru/forum/viewtopic.php?f=61&t=78889&sid=bd6f4e0a31b3de5cc3a78866aa3be72b

deemon84
Offline
Зарегистрирован: 05.01.2015

NokiaSuperbreakout использует 4 pin spi как я понял :(

мало того, для этого контроллера параллельный интерфейс описан

__Alexander
Offline
Зарегистрирован: 24.10.2012

странная инициализация. у меня такая.

 


const int init_lcd1616ph[] = {
                0xBA, 0x107, 0x115,     // Data Order
                0x25, 0x13F,            // Contrast
                0x11,                           // Sleep Out
                0x13,                           // Display Normal mode

                0x37,0x100,                     // VSCROLL ADDR
                0x3A,0x105,                     // COLMOD pixel format 4=12,5=16,6=18
                0x29,                           // DISPON
                0x20,                           // INVOFF
                0x13                            // NORON
};

 

deemon84
Offline
Зарегистрирован: 05.01.2015

параметры по умолчанию прописывать не обязательно

переустановил ардуино софт, снова переписал библиотеку, ещё раз 20 перешил и вдруг появилась нормальная инициализация - загадка

и ещё одна загадка следом, один раз из 10 смещение гаммы, в инициализации прописывать пробовал, не влияет

vladimir_orl
Offline
Зарегистрирован: 10.01.2014

Здравствуйте. Подскажите, что за библиотеку вы используете?

Я кусок на чистом си нашёл, попробовал через STK500 управлять - тоже мусор. Пишут что можно по цвету шлейфа посмотреть какой контроллер стоит. У меня - зелёный шлейф.

vladimir_orl
Offline
Зарегистрирован: 10.01.2014

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

Dimaska_1984
Offline
Зарегистрирован: 02.11.2015

Всем доброго времени суток. Пытаюсь запустить LCD nokia 1616 при помощи Arduino но всё тщетно инициализация не проходит, шума ни какого нет дисп молчит. На Bascom всё работает а под ардуиной нет.  В качестве примера беру софтовый вариант по ссылке из этого сообщения. 

jeka_tm пишет:

там и питание и сигналы все 3.3В. может попалил уже контроллер дисплея

http://yadi.sk/d/CXjuENmaEEwun

в папке дисплеи смотри. софтварный и хардваный spi для 1616

Дисп цепляю на PORTB (ATMEGA16)

#define Port         PORTB
#define D_Port       DDRB
#define CS           2 //PB2
#define Data         1 //PB1
#define Clock        3 //PB3

предполагаю что возможно ардуино криво компилит так как  в ней нет готового варианта для ATMEGA16.

Но в тоже время примитив с миганием светодиода работает. Прошу направить нужное русло.

 

 

 

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

"На Bascom всё работает а под ардуиной нет" это один и тот же дисплей? точно пины не перепутал?

Dimaska_1984
Offline
Зарегистрирован: 02.11.2015

Всё один к одному.

Сейчас переткнул на хардовый SPI

Рабочий конфиг Bascom

$regfile = "m16adef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 115200
$lib "glcd-Nokia1616ap.lbx"

Config Graphlcd = Color , Cs1 = Portb.4 , Si = Portb.5 , Sclk = Portb.7 , Rst = Portb.2

Конфиг Arduino

#define CS         4
#define DAT        5
#define CLK        7

#define SPI_OFF   SPCR = 0;
#define SPI_ON    SPCR = _BV(MSTR) | _BV(SPE);
#define SPI_WAIT  while (!(SPSR & _BV(SPIF)));

// определение основных цветов 16bit
#define BLACK   0x0000
#define WHITE   0xffff
#define RED     0xF800
#define GREEN   0x07E0
#define BLUE    0x001F
#define YELLOW  0xFFE0 //Желтый
#define CYAN    0x07FF //Голубой
#define MAGENTA 0xDEE0 //Фиолетовый

#define DISP_W 128
#define DISP_H 160
#define CHAR_W 8
#define CHAR_H 15

#define CS_On           PORTB = 1<<4        // CS    PB4
#define CS_Off          PORTB = 0<<4
#define DAT_On          PORTB = 1<<5        // Data  PB5
#define DAT_Off         PORTB = 0<<5
#define CLK_On          PORTB = 1<<7        // Clock PB7
#define CLK_Off         PORTB = 0<<7

Причём  Ардуино в хард версии выдёт ошибку lvalue required as left operand of assignment

Вот в этот кусок

lcd_write_cmd(0x36); // Ориентация дисплея
if (mode == 0){
    lcd_write_dat(0xC0); //   0 градусов
    DISP_W = 128;
    DISP_H = 160;
  }
  if (mode == 1){
    lcd_write_dat(0xA0); //   90 градусов
    DISP_W = 160;
    DISP_H = 128;
  }
  if (mode == 2){
    lcd_write_dat(0x00); //   180 градусов
    DISP_W = 128;
    DISP_H = 160;
  }
  if (mode == 3){
    lcd_write_dat(0x60); //   270 градусов
    DISP_W = 160;
    DISP_H = 128;
  }

Попробовал поставить == в DISP_H = 128 и т д

компиляция проходит, в хард версии происходит сброс диспа, чего не происходит в софт версии.

Хотя оно и понятно на хард висит программатор

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
#include <avr/pgmspace.h>
static const byte FONT8x15[97][15] PROGMEM ={
  {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}
};




#define CS         10
#define DAT        11
#define CLK        13

#define SPI_OFF   SPCR = 0;
#define SPI_ON    SPCR = _BV(MSTR) | _BV(SPE);
#define SPI_WAIT  while (!(SPSR & _BV(SPIF)));

// определение основных цветов 16bit
#define BLACK   0x0000
#define WHITE   0xffff
#define RED     0xF800
#define GREEN   0x07E0
#define BLUE    0x001F
#define YELLOW  0xFFE0 //Желтый
#define CYAN    0x07FF //Голубой
#define MAGENTA 0xDEE0 //Фиолетовый

byte DISP_W=128;
byte DISP_H=160;
#define CHAR_W 8
#define CHAR_H 15

#define CS_On           PORTB = 1<<2        // CS    PB2
#define CS_Off          PORTB = 0<<2
#define DAT_On          PORTB = 1<<3        // Data  PB3
#define DAT_Off         PORTB = 0<<3
#define CLK_On          PORTB = 1<<5        // Clock PB5
#define CLK_Off         PORTB = 0<<5


unsigned int bgcolor=GREEN;


//=============================Вывод на дисплей 8 бит комманд===================================

void lcd_write_cmd(byte c){
  SPI_WAIT;
  SPI_OFF;
  
  DAT_Off;
  CLK_On;
  CLK_Off;
 
  SPI_ON;
  SPDR = c;
}

//=============================Вывод на дисплей 8 бит данных====================================

void lcd_write_dat(byte c){
  SPI_WAIT;
  SPI_OFF;
  
  DAT_On;
  CLK_On;
  CLK_Off;
  
  SPI_ON;
  SPDR = c;
}

//============================Вывод на дисплей 16 бит данных====================================

void lcd_write16(unsigned int dat){
  lcd_write_dat(dat>>8);
  lcd_write_dat(dat);
} 

//================================Инициализация дисплея=========================================

void lcd_init_rgb(byte mode){ 
  SPSR |= 8;	// 2x clock

  SPI_ON;
  SPDR = 0x00;
  
  CS_Off;
  delay(10);
  CS_On;
  lcd_write_cmd(0x01); 
  delay(50);       //reset  
  CS_Off;

  lcd_write_cmd(0xBA); // Порядок отсылки данных
  lcd_write_dat(0x07);
  lcd_write_dat(0x15);
  lcd_write_cmd(0x25); // Контраст
  lcd_write_dat(0x3F);
  lcd_write_cmd(0x11); // Выход из режима sleep, (0x10) sleep
  lcd_write_cmd(0x14);
  
  lcd_write_cmd(0x37); // Дополнительные настройки
  lcd_write_dat(0x00);
  lcd_write_cmd(0x3A);
  lcd_write_dat(0x05);
  lcd_write_cmd(0x29); // Включить дисплей, (0x28) выключить
  lcd_write_cmd(0x20); // Нормальный режим, (0x21) инвертированный
  
  lcd_write_cmd(0x36); // Ориентация дисплея
  if (mode == 0){
    lcd_write_dat(0xC0); //   0 градусов
    DISP_W = 128;
    DISP_H = 160;
  }
  if (mode == 1){
    lcd_write_dat(0xA0); //   90 градусов
    DISP_W = 160;
    DISP_H = 128;
  }
  if (mode == 2){
    lcd_write_dat(0x00); //   180 градусов
    DISP_W = 128;
    DISP_H = 160;
  }
  if (mode == 3){
    lcd_write_dat(0x60); //   270 градусов
    DISP_W = 160;
    DISP_H = 128;
  }
  
  lcd_write_cmd(0x13);
  
  CS_Off;
}

//===================================Заливка дисплея============================================

void LCD_Fill_all(unsigned int color){   
  LCD_Window(0, 0, DISP_W, DISP_H);
  byte i=DISP_H;
  byte j;
  while(i--){
    j=DISP_W;
    while(j--){
      lcd_write16((color));
    }
  }
 
}

//================================Переход в координаты XY=======================================

void LCD_XY(byte x, byte y){
  lcd_write_cmd(0x2A); //x-координата
  lcd_write16(x+2);
  lcd_write_cmd(0x2B);//Y-координата
  lcd_write16(y+1);
}

//============================Создание области для рисования====================================

void LCD_Window(byte x, byte y, byte w, byte h){
  lcd_write_cmd(0x2A); //x-координата
  lcd_write16(x+2);
  lcd_write16(x+w+1);
  lcd_write_cmd(0x2B);//Y-координата
  lcd_write16(y+1);
  lcd_write16(y+h+1);
  lcd_write_cmd(0x2C);
}

//====================================Рисуем пиксель============================================

void LCD_Pixel(byte x, byte y, int color){
  LCD_XY(x,y);
  lcd_write_cmd(0x2C);// WR_MEM
  lcd_write16(color);
}   

//===========================Вывод символа в XY заданного цвета=================================

void LCD_Char(byte x, byte y, unsigned char c, unsigned int color){
  byte ch;  
  byte mask = 0x80;  
  
  LCD_Window(x, y, CHAR_W, CHAR_H);

  for (byte h=0; h<CHAR_H; h++){ // every column of the character
    ch=pgm_read_byte(&(FONT8x15[c-32][h]));
    mask = 0x80;
    for (byte p=0; p<CHAR_W; p++){  // write the pixels
      (ch & mask)? lcd_write16(color) : lcd_write16(bgcolor);
       mask >>= 1;
    }
  }
}

//===========================Вывод текста в XY заданного цвета==================================

void put_string(byte x, byte 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 LCD_Line(byte x0, byte y0, byte x1, byte y1, unsigned int color){ 
  int dy = y1 - y0; 
  int dx = x1 - x0; 
  int stepx, stepy; 
  if (dy < 0){ 
    dy = -dy;  
    stepy = -1; 
  } 
  else stepy = 1; 
  if (dx < 0){ 
    dx = -dx;  
    stepx = -1; 
  } 
  else stepx = 1; 

  dy <<= 1;                              // dy is now 2*dy 
  dx <<= 1;                              // dx is now 2*dx 

  LCD_Pixel(x0, y0, color); 

  if (dx > dy) { 
    int fraction = dy - (dx >> 1);     // same as 2*dy - dx 
    while (x0 != x1){ 
      if (fraction >= 0) { 
        y0 += stepy; 
        fraction -= dx;            // same as fraction -= 2*dx 
      } 
      x0 += stepx; 
      fraction += dy;                // same as fraction -= 2*dy 
      LCD_Pixel(x0, y0, color); 
    } 
  } 
  else{ 
    int fraction = dx - (dy >> 1); 
    while (y0 != y1){ 
      if (fraction >= 0){ 
        x0 += stepx; 
        fraction -= dy; 
      } 
      y0 += stepy; 
      fraction += dx; 
      LCD_Pixel(x0, y0, color); 
    } 
  } 
} 





//==========================================Круг===============================================

void LCD_Circle(byte x0, byte y0, byte r, unsigned int color) {
  int16_t f = 1 - r;
  int16_t ddF_x = 1;
  int16_t ddF_y = -2 * r;
  int16_t x = 0;
  int16_t y = r;

  LCD_Pixel(x0  , y0+r, color);
  LCD_Pixel(x0  , y0-r, color);
  LCD_Pixel(x0+r, y0  , color);
  LCD_Pixel(x0-r, y0  , color);

  while (x<y) {
    if (f >= 0) {
      y--;
      ddF_y += 2;
      f += ddF_y;
    }
    x++;
    ddF_x += 2;
    f += ddF_x;

    LCD_Pixel(x0 + x, y0 + y, color);
    LCD_Pixel(x0 - x, y0 + y, color);
    LCD_Pixel(x0 + x, y0 - y, color);
    LCD_Pixel(x0 - x, y0 - y, color);
    LCD_Pixel(x0 + y, y0 + x, color);
    LCD_Pixel(x0 - y, y0 + x, color);
    LCD_Pixel(x0 + y, y0 - x, color);
    LCD_Pixel(x0 - y, y0 - x, color);
  }
}  


void LCD_VLine(byte x, byte y, byte h, unsigned int color) {
  LCD_Line(x, y, x, y+h-1, color);
}

void LCD_HLine(byte x, byte y, byte w, unsigned int color) {
  LCD_Line(x, y, x+w-1, y, color);
}

void LCD_Rect(byte x, byte y, byte w, byte h, unsigned int color) {
  LCD_HLine(x, y, w, color);
  LCD_HLine(x, y+h-1, w, color);
  LCD_VLine(x, y, h, color);
  LCD_VLine(x+w-1, y, h, color);
}

void LCD_drawBitmap(byte x, byte y, const byte *bitmap, byte w, byte h, unsigned int color){

  byte i, j, byteWidth = (w + 7) / 8;

  for(j=0; j<h; j++) {
    for(i=0; i<w; i++ ) {
      if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) {
        LCD_Pixel(x+i, y+j, color);
      }
    }
  }
}




//LCD_XY(x, y);
//LCD_Pixel(x, y, color);
//LCD_Char(x, y, char, color);
//put_string(x, y, char *str, color);
//LCD_Circle(x0, y0, r, color);
//LCD_Line(x0, y0, x1, y1, color);
//LCD_Rect(x, y, w, h, color);

unsigned long time;
unsigned long time2;
unsigned int led1 = 0xF800;
unsigned int led2 = 0x001F;

void setup(){
  Serial.begin(9600);
  pinMode(CS, OUTPUT);
  pinMode(DAT, OUTPUT);
  pinMode(CLK, OUTPUT);

  SPSR |= 1;	// 2x clock

  lcd_init_rgb(0);
  LCD_Fill_all(bgcolor);
  //put_string(20, 20, "privet", RED);

}
void loop(){
  //LCD_Circle(30, 30, 30, RED);
  
  
  
  LCD_Fill_all(GREEN);
  LCD_Fill_all(BLUE);
  LCD_Fill_all(RED);
  
}

попробуй еще раз

Dimaska_1984
Offline
Зарегистрирован: 02.11.2015

Ошибка ушла, но дисп так и не завёлся. Вечерком попробую на atmega328.

Вот видео прошивки из Bascom и Arduino  https://youtu.be/y5DQX5haNDA

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

на 16 меге может там пины другие, или pinmode не те пины на выход настраивает, я не проверял, не использую мегу16. если так то по даташиту посмотри где spi. и проверь наверно для начала 328 меге

Dimaska_1984
Offline
Зарегистрирован: 02.11.2015

Ситуация с мегой328 (arduino pro mini) аналогична. В Баскоме всё работает, а в ардуине нет :(

Сброс дисплея на хардовой версии происходит (светится белым).

дисплей подключил к arduino pro mini

CS -> 10 (PB2)
DATA -> 11 (PB3)
CLS-> 13 (PB5)

Дисп 100% подключен верно так как в bascom аналогичный конфиг работает

Cs1 = Portb.2 , Si = Portb.3 , Sclk = Portb.5

вот что на выходе у баском по SPI

Это на выходе у Ардуины по SPI

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

странно. ни софтварный ни хардварный у тебя не работают. а ресет дисплея на +3.3В посадил?

Dimaska_1984
Offline
Зарегистрирован: 02.11.2015

да на 3,3.  А если не сложно скомпилить и хекс сюда кинуть под aрдуино про мини 328 16mhz

в компиляторе выбираю атмега328 5в 16mhz может это проблема, согласующих резсторов нет, и ардуину запитал от 3,3в  но в другой то среде всё работает. Мистика какая то.

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

Прошивка не пошла :)

Но получил мусор на LCD оставив в коде только инициализацию.

А дальше  при любых действиях получаю белый экранчик.

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

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

Khludenkov
Offline
Зарегистрирован: 11.11.2015

Здравствуйте. Тоже озадачился подключением дисплея от Nokia1616.

Имею: дисплей от Nokia, рабочий. Кит AVR STK500, AVR Mega16, много других МК от атмела. Также Аrduino 2009 + pro mini + 2560 + discovery. Макетка

Пробовал начать с Bascov-Avr. Но у него оф версия до 4-х кБ. ПОставил кряк, оказалось что вирус.

Поэтому сразу вопрос - подскажите где взять нормальный Bascom-Avr? Файл $lbx - это текстовая библиотека или что это? Как оттуда достать код для Си?

 

Есть также библиотека NokiaSuperbreakout но там надо чтобы на дисплее MISO был, а на моём нет. Поправил но не заработало.

 

Кому интересно, киидайте хексы или код буду компилить пробовать зашить. Или ошибки посмотрю если найду.

Khludenkov
Offline
Зарегистрирован: 11.11.2015

Посмотрел насчёт:

Function.ino:107:12: error: lvalue required as left operand of assignment

 

 

Правильно. Ведь в начале файла:

#define DISP_W 128
#define DISP_H 160
 
Т.е. получается приравнивание числа числу. Наверное DISP_W должны переменными быть типа char?

 

 

Khludenkov
Offline
Зарегистрирован: 11.11.2015

В файле function.ino надо:

 

char DISP_W = 128;
char DISP_H = 160;
 
Khludenkov
Offline
Зарегистрирован: 11.11.2015

Да и этот кусок:

 

#define CS_On           PORTB = 1<<2        // CS    PB2
#define CS_Off          PORTB = 0<<2
#define DAT_On          PORTB = 1<<3        // Data  PB3
#define DAT_Off         PORTB = 0<<3
#define CLK_On          PORTB = 1<<5        // Clock PB5
#define CLK_Off         PORTB = 0<<5
 
 
Наверное надо через логическое сложение делать: & |

 

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

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

Khludenkov
Offline
Зарегистрирован: 11.11.2015

"так как работает и та и другая конструкция"

Киньте пожалуйста код, чтобы проверить. Есть и ардуины и STK50 для меги16.

Куда какие разъёмы цеплять?

 

Осциллограф есть. Хороший.

 

Khludenkov
Offline
Зарегистрирован: 11.11.2015

STK500 т.е.

Khludenkov
Offline
Зарегистрирован: 11.11.2015

Смотрю код который ARDUINO_SOFT. Несоответствие:

 

 

#define CS           2
#define Data         3
#define Clock        5
 
 
  pinMode(CS, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(Clock, OUTPUT);
 
и
 
Port = (1<<Data)|(0<<Clock);
 
 
Дело в том что порт PORTB и digitalPort в ардуино это разные вещи.
 

 

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

на нормально там все. тестил же. просто на выход настраивал не черзе ddrb а через pinMode. мудрено выгядит, но как говорится я художник, я так вижу)))

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

хорошо 11 пин. прошу отвечать также вариант  - частота

1 вариант:

#define PIN   11

#define PIN_On          PORTB = 1<<3
#define PIN_Off         PORTB = 0<<3

void setup(){
  pinMode(PIN, OUTPUT);
}

void loop(){
  PIN_On;
  PIN_Off;
}

2 вариант

#define PIN   11

#define PIN_On          PORTB |= 1<<3; 
#define PIN_Off         PORTB &= ~(1<<3);

void setup(){
  pinMode(PIN, OUTPUT);
}

void loop(){
  PIN_On;
  PIN_Off;
}

3 вариант заодно

#define PIN   11

#define PIN_On          PORTB |= 1<<3; 
#define PIN_Off         PORTB &= ~(1<<3);

void setup(){
  pinMode(PIN, OUTPUT);
}

void loop(){
  digitalWrite(PIN, HIGH);
  digitalWrite(PIN, LOW);
}

4 вариант (урезанная digitalWrite)

#define PIN   11

#define PIN_On          PORTB |= 1<<3; 
#define PIN_Off         PORTB &= ~(1<<3);

void setup(){
  pinMode(PIN, OUTPUT);
}

void loop(){
  dWrite(PIN, HIGH);
  dWrite(PIN, LOW);
}

void dWrite(byte pin, byte val){
  byte bit = digitalPinToBitMask(pin);
  volatile byte *out;
  out = portOutputRegister(digitalPinToPort(pin));
  (val)? *out |= bit : *out &=~bit;
}

5 вариант. максимальная частота spi. смотреть 11 и 13 пины

#define DAT        11
#define CLK        13

#define SPI_OFF   SPCR = 0;
#define SPI_ON    SPCR = _BV(MSTR) | _BV(SPE);
#define SPI_WAIT  while (!(SPSR & _BV(SPIF)));

void setup(){
  pinMode(DAT, OUTPUT);
  pinMode(CLK, OUTPUT);
  SPSR |= 1;
}

void loop(){
  SPI_ON;
  SPDR = 0b10101010;
  SPI_WAIT;
  SPI_OFF;
}

пока хватит

Khludenkov
Offline
Зарегистрирован: 11.11.2015

Как я понимаю, речь идёт об SOFT версии?

Попрбобую на ардуино2560, там есть переключение на 3.3 В.

Какие разъёмы куда цеплять? Если можно в терминах ардуино или для PORTB.

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

нет. обычная уно например. и без дисплея. просто осциллографом посмотреть

так в самом начале написал 11 пин ардуины. в последнем коде еще 13