Спаривание SiLabs и Arduino

NorDOSt
Offline
Зарегистрирован: 08.05.2013

 

Доброго времени суток. Передо мной стоит задача: вывести информацию через SiLabs C8051F300 на LCD через I2C (Arduino LCM1602). С SiLabs я достаточно хорошо знаком, а вот с Arduino не очень. Т.к. стандартные библиотеки, естественно, не подойдут, я хочу понять, какую именно инфу передают функции из оных. Покопавшись в библиотеках, я так и не смог разобрать, как эта штука инициализируется. Может есть у кого опыт или советом кто добрым поможет? 

 

PS в google слать не надо, уже ходивши. Заранее спасибо.

NorDOSt
Offline
Зарегистрирован: 08.05.2013

Немного дополню. На данный момент сей "гаджет" выглядит так:

Позднее (надеюсь что вывод все-таки будет работать) планирую на шину повесить гидрометр и барометр, в МК уже строен тепловой датчик. В итоге должна будет получится небольшая метеостанция, с инфой о температуре, давлении и влажности. Сами функции протокола i2c уже написаны (в основном через SFR регистры),через CrossBar шина выведена на нужные пины, осталось разобраться с расширителем на LCD. Выбор протокола I2C неслучаен, у моей платы имеется всего 2 выхода с одного порта, и то раньше там были светодиоды =)

ustas
Offline
Зарегистрирован: 12.03.2012

Посмотрите, с какой библиотекой работает данный дисплей (беглое гугление дает LiquidCrystal_I2C), качайте ее и смотрите, как реализованы функции.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Тут на форуме обсуждалось в теме http://arduino.ru/forum/programmirovanie/lcd-i2c-partizanit, да и вообще - похожих тем на форуме около десятка...

NorDOSt
Offline
Зарегистрирован: 08.05.2013

Да рыскал уже, но толи я ослеп,то ли лыжи не едут. К примеру - процесс инициализации:

 

В LiquidCrystal_I2C.cpp видим:
void LiquidCrystal_I2C::init(){
init_priv();
}    - только прототип, идем в .h
 
LiquidCrystal_I2C.h
class LiquidCrystal_I2C : public Print {
private:
  void init_priv();
}    - и больше ничего.
Прошелся по всем инклудам - больше никаких упоминаний. Какие команды он отправляет, в какой последовательности и т.д так и не нашел. Я то понимаю, что если этот LCD подклюить к другому Arduino с этими библиотеками, проблем бы не было. Но ведь наверняка на других МК его можно заставить работать. Ну я надеюсь)
Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

NorDOSt пишет:

Какие команды он отправляет, в какой последовательности и т.д так и не нашел. Я то понимаю, что если этот LCD подклюить к другому Arduino с этими библиотеками, проблем бы не было. Но ведь наверняка на других МК его можно заставить работать. Ну я надеюсь)

Мне пока непонятно - почему и откуда у Вас выплыл "другой ардуино"? И что в конечном итоге у Вас не работает? i2cscanner видит это устройство на шине?

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

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

NorDOSt
Offline
Зарегистрирован: 08.05.2013

Ок, напишу еще раз, мне не лень.  "другой ардуино" ниоткуда не выплывал - его нет. Я имел ввиду контроллер производства Arduino,  т.к. с ними библиотеки LiquidCrystal_I2C будут работать. То, с чем работаю я, описано выше. Даже с рисунком. Про i2cscanner и говорить нечего, он не только устройство не увидит, но и саму шину тоже, как вы наверное понимаете. А понять я пытаюсь, какие команды в hex передаются на устройство. 

NorDOSt
Offline
Зарегистрирован: 08.05.2013

Да, Александр, именно так.

maksim
Offline
Зарегистрирован: 12.02.2012

NorDOSt пишет:

Да рыскал уже, но толи я ослеп,то ли лыжи не едут. К примеру - процесс инициализации:
......
- и больше ничего.

Да ну как? Куда вы там смотрите?

Команды:

// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80

// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00

// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00

// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00

// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00

// flags for backlight control
#define LCD_BACKLIGHT 0x00
#define LCD_NOBACKLIGHT 0x80

#define En B00010000  // Enable bit
#define Rw B00100000  // Read/Write bit
#define Rs B01000000  // Register select bit

Инициализация:

void LiquidCrystal_I2C::init(){
	init_priv();
}

ниже следующая же функция:

void LiquidCrystal_I2C::init_priv()
{
	Wire.begin();
	_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
	begin(_cols, _rows);  
}

еще ниже функция:

void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
	if (lines > 1) {
		_displayfunction |= LCD_2LINE;
	}
	_numlines = lines;

	// for some 1 line displays you can select a 10 pixel high font
	if ((dotsize != 0) && (lines == 1)) {
		_displayfunction |= LCD_5x10DOTS;
	}

	// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
	// according to datasheet, we need at least 40ms after power rises above 2.7V
	// before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
	delayMicroseconds(50000); 
  
	// Now we pull both RS and R/W low to begin commands
	expanderWrite(_backlightval);	// reset expanderand turn backlight off (Bit 8 =1)
	delay(1000);

  	//put the LCD into 4 bit mode
	// this is according to the hitachi HD44780 datasheet
	// figure 24, pg 46
	
	// we start in 8bit mode, try to set 4 bit mode
	write4bits(0x03);
	delayMicroseconds(4500); // wait min 4.1ms
	
	// second try
	write4bits(0x03);
	delayMicroseconds(4500); // wait min 4.1ms
	
	// third go!
	write4bits(0x03); 
	delayMicroseconds(150);
	
	// finally, set to 4-bit interface
	write4bits(0x02); 


	// set # lines, font size, etc.
	command(LCD_FUNCTIONSET | _displayfunction);  
	
	// turn the display on with no cursor or blinking default
	_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
	display();
	
	// clear it off
	clear();
	
	// Initialize to default text direction (for roman languages)
	_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
	
	// set the entry mode
	command(LCD_ENTRYMODESET | _displaymode);
	
	home();
  
}

Вот и вся инициализация.

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

та не Макс, это не перечнь команд. Это константы, которые подставляются при вызове функций, которые в wire. А в силабсах крапаль по другому TWI работает, точнее его там нет, есть чистый I2C, и эта хрень там работать не будет, без тупой отладки всех этих команд и переписи с нуля. может я не прав, но думаю, если бы я такое просил, допустим на lpc, то мне точно бы не помогло.

maksim
Offline
Зарегистрирован: 12.02.2012

Мне показалось что на фото дуина Micro, а там какой-то свой контроллер, но сути немняет - разбираетесь как настраивается I2C и дальше по аналогии эти же команды дисплея отправляете. А TWI и I2С - это совершенно одинаковые протоколы/интерфейсы, просто называются по разному.

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

я конкретно в  вопрос не въезжал, но если там родные команды hd44780, и просто по адресу 0x27 их записывать то да, это меняет дело. я просто предположил что там свой перечень команд, на которые нет документации, а просто пример скетча.

NorDOSt
Offline
Зарегистрирован: 08.05.2013

Извиняюсь, что не заходил некоторое время, праздники. Да, действительно , вот этой то строки я не заметил:

_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;

Теперь я понял как оно работает. Едиственное, я поначалу забыл о подгрузочных резисторах, т.е. i2c расширитель даже не отсылал ack. Сейчас пайку закончил, на днях вернусь к коду. В любом случае, когда закончу, отпишусь в этой ветке, для тех, кому это может пригодиться. Всем огромное спасибо за отклики!

P.S. Два одтягивающих резистора(3.6кОМ)  от +5V к линиям SDA и SCL:

NorDOSt
Offline
Зарегистрирован: 08.05.2013

Все никак не могу до конца отладить работу этого LCD. Во первых - при выводе в цикле банального счечика дисплей мерцает каждый шаг. Но это еще ладно, в последнее время, вместо чего-либо на экране видны полторы строки, т.е первая и 3 верхних пикселя второй. При этом работа идет, т.е. он периодически мерцает, как при выводе. Сталкивался с таким кто-нибудь, что сделать можно? Заранее спасибо.