Arduino NANO + диплей HD44780 +внешнее питание =проблема.

stf
Offline
Зарегистрирован: 20.12.2014

Написал большую программу, отладил на компьютере , подключил на внешнее питание (разные варианты, включая порт компьютера но поUSB кабелю имеющему только распаянными контакты питания) - на выходе на дисплее мусор. Удалось обнаружить корень проблемы,проверьте кто может у себя: может быть у меня нано слишком китайская?
Сама программа:
#include
#define RS 6
#define RW 7
#define E 12
#define DB4 8
#define DB5 9
#define DB6 10
#define DB7 11

LiquidCrystal lcd(RS, RW, E, DB4, DB5, DB6, DB7);
void setup() {
lcd.begin(16,2);
lcd.print("Hello");
}
void loop()
{
}

Этот кусок работает нормально. Но стоит в Setup добавить строчки включения внешних прерываний (INT0, INT1, PCINT) в виде
EICRA = EICRA | B00001100; // INT1 по 0->1, INT0 по 0
EIMSK = EIMSK | B00000011; //разрешить прерывания INT0, INT1
PCICR=PCICR | B00000110; // PCINT23:16; 14:8 включить
PCMSK2 = PCMSK2 | B00110000; //Разрешил вызов прерывания 21 и 20
PCMSK1= PCMSK1 | B00100000; //Разрешил вызов прерывания 13

и начинается мусор. Куда копать - вообще не понимаю. Всякие конденсаторы на линию питания ставил - не помогают. Прямо в растерянности...

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

А вы пробовали работать с прерываниями через функцию attachInterrupt(interrupt, function, mode) ? Возможно вы своими действиями нарушаете работу функции delay, дисплей перестает инициализироваться и на экране мусор.

 

stf
Offline
Зарегистрирован: 20.12.2014

Вроде бы разобрался. 

Было сделано:

0) Написал свой код для дисплея вместо штатной библиотеки ардуино

1) Проверил на ATTINY 44 новый код (залив туда через нано по 5 проводам). Работает с любым блоком питания.

2)проверил на нано - новый код - работает при питании штатным USB кабелем от порта, урезанным от порта, урезанным от внешнего powerbanka. Не работает от внешнего блока питания. Всякие конденсаторы на на питание вешал разных типов и емкостей - пофиг.

3)Взял блок питания размером с кирпич от видеорегистратора. От него все заработало четко.

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

Всем спасибо, кто прочитал )

stf
Offline
Зарегистрирован: 20.12.2014

NeiroN пишет:

А вы пробовали работать с прерываниями через функцию attachInterrupt(interrupt, function, mode)

Пробовал несколько месяцев назад. К сожалению эта функция дает доступ только к 2м прерываниям (INT0, INT1) на данном чипе из 19 возможных (регистр PCINT). А два - мне маловато, ибо программе надо реагировать на внезапные события на ножках, а опрашивать их по таймеру мне не хочется :-)