Официальный сайт компании Arduino по адресу arduino.cc
LCD 16x2 и прерывание - странности поведения
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Добрый день, всем
Играюсь с TLC5940 и все там, собственно, хорошо. Решил вот добавить в проект экранчик 16х2.
В итоге, наткнулся на странность их совместной работы. Даташитов/мануалов в достаточной степени пока не накурился (в процессе это), но есть подозрения, что ошибка очень проста, но на замыленный глаз мой не видна с первого раза.
Из всего проекта сделал тестовый скетч, показывающий ошибку.
Итак, вот код работы с экранчиком:
#include <LiquidCrystal.h> const unsigned char lcdEnablePin = 3; // PD3 pin включения/выключения lcd const unsigned char lcdDB4Pin = A4; // PC4 const unsigned char lcdDB5Pin = A5; // PC5 const unsigned char lcdDB6Pin = 12; // PB4 const unsigned char lcdDB7Pin = 4; // PD4 const unsigned char lcdRSPin = A2; // PC2 const unsigned char lcdEPin = A3; // PC3 LiquidCrystal lcd(lcdRSPin, lcdEPin, lcdDB4Pin, lcdDB5Pin, lcdDB6Pin, lcdDB7Pin); void setup() { pinMode(lcdEnablePin, OUTPUT); lcd.begin(16, 2); digitalWrite(lcdEnablePin, HIGH); lcd.setCursor(0, 0); lcd.print("*** 11111 ***"); delay(2000); lcd.setCursor(0, 1); lcd.print("*** 22222 ***"); delay(2000); digitalWrite(lcdEnablePin, LOW); } void loop() { }
С ним все в порядке и он в таком виде дает ожидаемый результат, а именно: при старте экран зажигается, в первой строке выводятся единички, потом во второй двоечки и потом через 2 сек все заснет
Теперь этот скетч дополняю блоком настройки прерывания, необходимого для работы TLC5940:
#include <LiquidCrystal.h> const unsigned char lcdEnablePin = 3; // PD3 pin включения/выключения lcd const unsigned char lcdDB4Pin = A4; // PC4 const unsigned char lcdDB5Pin = A5; // PC5 const unsigned char lcdDB6Pin = 12; // PB4 const unsigned char lcdDB7Pin = 4; // PD4 const unsigned char lcdRSPin = A2; // PC2 const unsigned char lcdEPin = A3; // PC3 LiquidCrystal lcd(lcdRSPin, lcdEPin, lcdDB4Pin, lcdDB5Pin, lcdDB6Pin, lcdDB7Pin); void setup() { pinMode(lcdEnablePin, OUTPUT); lcd.begin(16, 2); digitalWrite(lcdEnablePin, HIGH); lcd.setCursor(0, 0); lcd.print("*** 11111 ***"); delay(2000); // ->>>> start probleb block // Enable SPI, Master, set clock rate fck/2 SPCR = (1 << SPE) | (1 << MSTR); SPSR = (1 << SPI2X); // CTC with OCR0A as TOP TCCR0A = (1 << WGM01); // clk_io/1024 (From prescaler) TCCR0B = ((1 << CS02) | (1 << CS00)); // Generate an interrupt every 4096 clock cycles OCR0A = 3; // Enable Timer/Counter0 Compare Match A interrupt TIMSK0 |= (1 << OCIE0A); sei(); // ->>>> end probleb block lcd.setCursor(0, 1); lcd.print("*** 22222 ***"); delay(2000); digitalWrite(lcdEnablePin, LOW); } void loop() { } ISR(TIMER0_COMPA_vect) { }
Блок настройки прерывания скопипастен из доки "Demystifying-the-TLC5940.pdf" и сам по себе работает (проверялось, но без LCD).
сорри..
сорри..
Axell, где Вы увидели хоть кусочек кода в обработчике прерывания?
sds, причина банальная, у Вас пин D12 висит на дисплее. Когда Вы включаете SPI, этот пин является MISO для протокола SPI, т.е. настраивается прежде всего на вход.
Короче, перенесите с D12 на какой-то другой да и делов, че я сопли жую )
Спасибо большое. Вечером сегодня проверю
Какую-нибудь такую подлянку и ожидал от этих настроек ...
Да, после ухода с 12-го пина экранчик стал показывал текст правильно, но его выключение не происходит (digitalWrite(lcdEnablePin, LOW); не работает)
Вернее, все хитрее получается ...
Если до блока инициализации прерывания установить пин в HIGH, то экран все время "горит", а если заранее поставить его в LOW, то больше и не зажигается.
Короче, полный игнор дрыгания ноги с 1 в 0 и обратно
Перебрал несколько разных пустых ног (аналоговых/цифровых). Поведение везде одинаковое.
Есть ли мысли у уважаемого сообщества по данной странности?
А что это за нога в индикаторе 16х2?
Использую анод от подсветки: 15 — A, питание для подсветки ⇨ +5 В
хм. вы питаете подсветку напрямую от ардуины?