Всем доброго времени суток! Будет длинный сказ о проекте =)
Посетила меня идея сделать устройство для "работы" с аккумуляторами Li-on. Данная устройство занималось бы зарядкой аккумов и измерением их ёмкости. У Гайвера был видос по данной теме, от туда и пошли корни моего проекта. Зарядкой занималась бы микруха tp4056, планирую сделать на два аккумулятора (две банки). Разряжать на батарею резисторов (20 шт 4.7 Ом) Общее сопротивление около 3,76 ом. Что при рабочем напряжении аккумулятора около 3.7-3.8В дало б около 1А тока разрядки. Думаю для банок 18650 и др. Ток великоват) но что поделать =). Теперь встал вопрос с камнем. Из старой сигнализации я выпаял ATtiny2313 и долго думал куда бы его впихнуть, вот думаю самое время. До этого с голыми камнями не работал, да и честно говоря не стал я еще и "гуру" ардуино (если так высказаться можно), но захотелось попробовать. 2Кб флэша тяжело конечно но надеюсь влезу =)
Подвигаемся к теме отображения. У меня есть два LCD дисплея. Один LCD1602 без переходника вот такой (LCM1602C)
И LCD 2004 с переходником на I2C(TWI). I2C на микрухе PCF8574T. Сам дисплей такой(SunStar 2004A)
Ну думаю два провода лучше чем подключать 1602. В общем в ходе долгих мучительных поисков как запустить на тиньке I2C узнал много нового) В общем в тиньке нету аппаратной поддержки I2C(TWI) но есть не что, с чем как я понял играться можно вечно модуль USI. Много прочитал про него, многие так и говорят что мол нормального I2C добиться тяжко. Долго подумав вспомнил что чего нету аппаратно можно сделать программно. Погуглил нашел пару библеотек в которых чисто функционал минимальный. Может функций 5 на всю либу. И тут уже 1/4 памяти хоба) И испарилась, так дислпей на I2C и не заработал. Ну ладно, есть же 1602. Ног у тиньки не много, но и не мало, найдеться куда впихнуть дислпей. По гуглил и тд. Нашел целую серию видео и статью от одного автора Narod Stream. (Статья). Код я там по видео писал, получился вот такой.
Да знаю задержки все дела, тут можно оптимизировать и оптимизировать но этом потом =)
Сделал в протеусе проект, там все настроил и тд. В общем работает.
Но на реальном устройстве дисплей не заработал. Схема в реальности подобная только подведено питание, и потенциометр на контрастность. И вот я не знаю куда копать. Два дисплея не один не завелся. Документацию на 1602 толковую не нашел, да и врядли-бы починил бы если бы нашел =)
Ув. формучане подскажите может кто сталкивался с такими Lcd1602. Может тайминги не те выбрал, может байты инициилизации или команд отличаються ? Или же проще USI запустить да юзать 2004.. Нуждаюсь в вашей помощи!
Посетила меня идея сделать устройство для "работы" с аккумуляторами Li-on. Данная устройство занималось бы зарядкой аккумов и измерением их ёмкости. У Гайвера был видос по данной теме, от туда и пошли корни моего проекта. Зарядкой занималась бы микруха tp4056, планирую сделать на два аккумулятора (две банки). Разряжать на батарею резисторов (20 шт 4.7 Ом) Общее сопротивление около 3,76 ом. Что при рабочем напряжении аккумулятора около 3.7-3.8В дало б около 1А тока разрядки. Думаю для банок 18650 и др. Ток великоват) но что поделать =). Теперь встал вопрос с камнем. Из старой сигнализации я выпаял ATtiny2313 и долго думал куда бы его впихнуть, вот думаю самое время. До этого с голыми камнями не работал, да и честно говоря не стал я еще и "гуру" ардуино (если так высказаться можно), но захотелось попробовать. 2Кб флэша тяжело конечно но надеюсь влезу =)
Подвигаемся к теме отображения. У меня есть два LCD дисплея. Один LCD1602 без переходника вот такой (LCM1602C)
И LCD 2004 с переходником на I2C(TWI). I2C на микрухе PCF8574T. Сам дисплей такой(SunStar 2004A)
Ну думаю два провода лучше чем подключать 1602. В общем в ходе долгих мучительных поисков как запустить на тиньке I2C узнал много нового) В общем в тиньке нету аппаратной поддержки I2C(TWI) но есть не что, с чем как я понял играться можно вечно модуль USI. Много прочитал про него, многие так и говорят что мол нормального I2C добиться тяжко. Долго подумав вспомнил что чего нету аппаратно можно сделать программно. Погуглил нашел пару библеотек в которых чисто функционал минимальный. Может функций 5 на всю либу. И тут уже 1/4 памяти хоба) И испарилась, так дислпей на I2C и не заработал. Ну ладно, есть же 1602. Ног у тиньки не много, но и не мало, найдеться куда впихнуть дислпей. По гуглил и тд. Нашел целую серию видео и статью от одного автора Narod Stream. (Статья). Код я там по видео писал, получился вот такой.
Основной код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
//-------------------------------------------------------------------
#define e1 PORTB |= 0b00001000 //Установка пина Е в 0, и в 1
#define e0 PORTB &= 0b11110111
#define rs1 PORTB |= 0b00000100 //Установка пина RS в 0, и в 1
#define rs0 PORTB &= 0b11111011
//-------------------------------------------------------------------
void SendHalfByte(unsigned char c){
c<<=4;
e1;
_delay_us(50);
PORTB&=0b00001111;
PORTB |= c;
e0;
_delay_us(50);
}
void sendByte(unsigned char c, unsigned char mode){
if (mode == 0)
{
rs0;
}
else
{
rs1;
}
unsigned char Hc = 0;
Hc=c>>4;
SendHalfByte(Hc);
_delay_us(20);
SendHalfByte(c);
_delay_us(20);
}
void sendStr(const char *s){
int i;
for(i =0; s[i] != '\0';i++){
sendByte(s[i],1);
}
}
void port_init(void){
DDRB = 0xFF;
PORTB = 0x00;
}
void lcd_clear(void){
sendByte(0b00000001,0);
_delay_ms(1);
}
void lcd_init(void){
_delay_ms(15);//Ждем пока дисплейный контролер очухаеться
SendHalfByte(0b00000011);
_delay_ms(4);
SendHalfByte(0b00000011);
_delay_us(100);
SendHalfByte(0b00000011);
_delay_ms(1);
SendHalfByte(0b00000010);
_delay_ms(1);
sendByte(0b00101000,0);
_delay_ms(1);
sendByte(0b00001100,0);
_delay_ms(1);
sendByte(0b00000110,0);
_delay_ms(1);
}
void setPos(unsigned char x, unsigned char y){
unsigned char addr = 0;
addr = (0x40*y+x)|0b10000000;
sendByte(addr,0);
}
int main(void){
port_init();
lcd_init();
setPos(0,0);
sendByte('n',1);
sendStr("Hello");
setPos(4,1);
sendStr("Word");
while (1){
}
}
Сделал в протеусе проект, там все настроил и тд. В общем работает.
Но на реальном устройстве дисплей не заработал. Схема в реальности подобная только подведено питание, и потенциометр на контрастность. И вот я не знаю куда копать. Два дисплея не один не завелся. Документацию на 1602 толковую не нашел, да и врядли-бы починил бы если бы нашел =)
Ув. формучане подскажите может кто сталкивался с такими Lcd1602. Может тайминги не те выбрал, может байты инициилизации или команд отличаються ? Или же проще USI запустить да юзать 2004.. Нуждаюсь в вашей помощи!