Скажу сразу , что никогда ничего не паял. И всегда считал что всё что связанно с хардом, очень сложно.
Очень заинтересовался микроконтроллерами. Отрыл старые свои конспекты , полазил по сетке и стал неплохо врубаться в тему.
Сначала ничего не получалось (не припаявылось) , потом выяснил что дело в плохом флюсе и паяльнике. Купил хорошие и дело пошло.
Собрал программатор на LPT , собрал стабилизатор на 5в всё подключил , как в "первом проекте" диод замигал - счастье. Вот такая присказка.
А вот и сказка.
Прочитал про дисплей 3310, про SPI - понятно. Распаял дисплей с преобразователем уровней в 3.3 Качнул библиотечку, подключил, собрал залил. РАБОТАЕТ!!!
Теперь на экране пишется сколько раз мигнул диод.
Вот собственно вопрос.
// Распиновка порта
#define LCD_DC_PIN PB1
#define LCD_CE_PIN PB2
#define SPI_MOSI_PIN PB3 // SDIN дисплея обязательно подключаем к MOSI аппаратного SPI
#define LCD_RST_PIN PB4
#define SPI_CLK_PIN PB5 // SCLK дисплея обязательно подключаем к SCK аппаратного SPI
Первое LCD_CE_PIN у меня не распаян и заведён в землю на экране. по скольку SPI устройство у меня одно и второго не предвидеться.
Второе, PB1 и PB2 мне нужны для ШИМ. Заживёт ли всё это в параллели ( кажется должно ) ?
Вот я задался идеей например выпилить работу с LCD_CE_PIN из библиотеки и перекинуть LCD_DC_PIN с PB1 на PB0. Вот тут я и встал.
Выпилил везде обращение к LCD_CE_PIN , кроме init - работает .
Функция init
CODE:
void LcdInit ( void )
{
// Pull-up на вывод подключенный к reset дисплея
LCD_PORT |= _BV ( LCD_RST_PIN );
// Устанавливаем нужные биты порта на выход
LCD_DDR |= _BV( LCD_RST_PIN ) | _BV( LCD_DC_PIN ) | _BV( LCD_CE_PIN ) | _BV( SPI_MOSI_PIN ) | _BV( SPI_CLK_PIN );
// Некалиброванная задержка
Delay();
// Дергаем reset
LCD_PORT &= ~( _BV( LCD_RST_PIN ) );
Delay();
LCD_PORT |= _BV ( LCD_RST_PIN );
// Активируем SPI:
// без прерываний, старший бит первый, режим мастера, CPOL->0, CPHA->0, Clk/4
SPCR = 0x50;
// Отключаем LCD контроллер - высокий уровень на SCE
LCD_PORT |= _BV( LCD_CE_PIN );
// Отправляем команды дисплею
LcdSend( 0x21, LCD_CMD ); // Включаем расширенный набор команд (LCD Extended Commands)
LcdSend( 0xC8, LCD_CMD ); // Установка контрастности (LCD Vop)
LcdSend( 0x06, LCD_CMD ); // Установка температурного коэффициента (Temp coefficent)
LcdSend( 0x13, LCD_CMD ); // Настройка питания (LCD bias mode 1:48)
LcdSend( 0x20, LCD_CMD ); // Включаем стандартный набор команд и горизонтальную адресацию (LCD Standard Commands,Horizontal addressing mode)
LcdSend( 0x0C, LCD_CMD ); // Нормальный режим (LCD in normal mode)
// Первичная очистка дисплея
LcdClear();
LcdUpdate();
}
Так вот как только я вместо
CODE: // Устанавливаем нужные биты порта на выход
LCD_DDR |= _BV( LCD_RST_PIN ) | _BV( LCD_DC_PIN ) | _BV( LCD_CE_PIN ) | _BV( SPI_MOSI_PIN ) | _BV( SPI_CLK_PIN );
делаю
CODE:
// Устанавливаем нужные биты порта на выход
LCD_DDR |= _BV( LCD_RST_PIN ) | _BV( LCD_DC_PIN ) | _BV( SPI_MOSI_PIN ) | _BV( SPI_CLK_PIN );
Такое чувство что всё напрочь повисает и не только экран не показывает ничего но и диод не мигает. В чём тут может быть дело? |