PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Разработка устройств

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2013, 00:03   #11
macau
Старший Пользователь
 
Регистрация: 22.10.2012
Регион: 78, 98
Сообщений: 758
macau is just really nicemacau is just really nicemacau is just really nicemacau is just really nice
По умолчанию

а обязательно побитово слать? помню у меня тоже были проблемы с бинарной отправкой. в хексе все нормально слалось.
macau вне форума   Ответить с цитированием
Старый 26.05.2013, 04:15   #12
s.m.
Гуру
 
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
s.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to behold
По умолчанию

Цитата:
Сообщение от macau Посмотреть сообщение
а обязательно побитово слать? помню у меня тоже были проблемы с бинарной отправкой. в хексе все нормально слалось.
уже перевел в hex, те же, только в профиль.
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 05.08.2013, 02:57   #13
s.m.
Гуру
 
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
s.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to behold
По умолчанию

Завел частично индикатор

Вот скетч, выводящий слово CODE

Код:
#define I2C_ADDR 0x38
#define I2C_SEND_BUFFER_SIZE 17 

#include <Wire.h>

void setup() {
delay(5000);
//Serial.begin(115200);//
  Wire.begin();

  initLCD();
/*
  Wire.beginTransmission(I2C_ADDR);
  uint8_t dataArray3[I2C_SEND_BUFFER_SIZE] = { 0xE0, 0xCB, 0xF0, 0, 0, 0, 0, 0, 169, 99, 1, 20, 96, 161, 0, 0, 0 }; 
//  uint8_t dataArray3[I2C_SEND_BUFFER_SIZE] = { 0xE0, 0xCB, 0xF0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0 }; 
  Wire.write(dataArray3, I2C_SEND_BUFFER_SIZE);
  Wire.endTransmission();
*/
  unsigned char data[14];
  data[0] = 0x00; 
  data[1] = 0x00;
  data[2] = 0x00;
  data[3] = 0x00; 
  data[4] = 0x00;
  data[5] = 0xA9;
  data[6] = 0x63; 
  data[7] = 0x01;
  data[8] = 0x14;
  data[9] = 0x60; 
  data[10] = 0xA1;
  data[11] = 0x00;
  data[12] = 0x00; 
  data[13] = 0x00;

  sendDataToLCD(data);  
/*
  Wire.beginTransmission(I2C_ADDR);
  uint8_t dataArray4[I2C_SEND_BUFFER_SIZE] = { 0xE0, 0xCB, 0xF0, 2, 0, 0, 0, 21, 108, 224, 98, 12, 20, 96, 0, 0, 0 };
  //uint8_t dataArray4[I2C_SEND_BUFFER_SIZE] = { 0xE0, 0xCB, 0xF0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  Wire.write(dataArray4, I2C_SEND_BUFFER_SIZE);
  Wire.endTransmission();
*/  

  unsigned char data2[14];
  data2[0] = 0x02; 
  data2[1] = 0x00;
  data2[2] = 0x00;
  data2[3] = 0x00; 
  data2[4] = 0x15;
  data2[5] = 0x6C;
  data2[6] = 0xE0; 
  data2[7] = 0x62;
  data2[8] = 0x0C;
  data2[9] = 0x14; 
  data2[10] = 0x60;
  data2[11] = 0x00;
  data2[12] = 0x00; 
  data2[13] = 0x00;

  sendDataToLCD(data2);  
}

void loop() { 
}

void sendDataToLCD(unsigned char *data) {
  unsigned char buffer[I2C_SEND_BUFFER_SIZE];
  byte i = 0;

  buffer[0] = 0xE0;
  buffer[1] = 0xCB;
  buffer[2] = 0xF0;
  
  for (i = 3; i < I2C_SEND_BUFFER_SIZE; i ++) {
     buffer[i] = data[i - 3]; 
  }  
  
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(buffer, I2C_SEND_BUFFER_SIZE);
  Wire.endTransmission();
}

void initLCD() {
    /* init
   E0CBF000000000000000 
   E0CBF020000000000000 
   E0CBF000000000000000 
   E0CBF020000000000000  
   */
  
  /*
  Wire.beginTransmission(I2C_ADDR);
  uint8_t dataArray[I2C_SEND_BUFFER_SIZE] = { 0xE0, 0xCB, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; 
  Wire.write(dataArray, I2C_SEND_BUFFER_SIZE);
  Serial.print(Wire.endTransmission()); 

  Wire.beginTransmission(I2C_ADDR);
  uint8_t dataArray2[I2C_SEND_BUFFER_SIZE] = { 0xE0, 0xCB, 0xF0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; 
  Wire.write(dataArray2, I2C_SEND_BUFFER_SIZE);
  Serial.print(Wire.endTransmission()); 
*/
   
  unsigned char data[14];
  byte i = 0;

  for (i = 0; i <= 14; i++) {
    data[i] = 0x00; 
  }  

  sendDataToLCD(data); 
  
  data[0] = 0x20;

  sendDataToLCD(data); 
}
Дело за малым, написать кусок кода, который будет выводить произвольную строку. Проблема сейчас в том, что используется мультиплексирование для вывода данных.
Нашел только куски кода для 1:2

Может у кого-то есть готовый кусок кода для случая 1:3 ?
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 11.08.2013, 20:05   #14
s.m.
Гуру
 
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
s.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to beholds.m. is a splendid one to behold
По умолчанию

Раскурил индикатор.

Если кому понадобится, вот скетч для управления любым сегментом через COM-порт

Код:
#define I2C_ADDR 0x38
#define I2C_SEND_BUFFER_SIZE 17 

#include <Wire.h>

void setup() {
	Serial.begin(115200);//
	Wire.begin();

	initLCD();
}

void loop() {
	String content = "";
	char character; 
	while(Serial.available()) {
		character = Serial.read();
		content.concat(character);
	}
	if (content != "") {
		Serial.println(content);
 
		if (content == "!") {
			Serial.println("Reset");
			initLCD();
		}
		else {
			int numArgs = 0;

			int beginIdx = 0;
			int idx = content.indexOf(",");

			String arg;

			Wire.beginTransmission(I2C_ADDR);
			while (idx != -1) {
				numArgs++;
				arg = content.substring(beginIdx, idx);
				Serial.println((byte)arg.toInt());
				Wire.write((byte)arg.toInt());
				if (numArgs == 17) {
					Serial.println('#');
					Wire.endTransmission();
					Wire.beginTransmission(I2C_ADDR);
				}  
				beginIdx = idx + 1;
				idx = content.indexOf(",", beginIdx);
			}
			arg = content.substring(beginIdx);
			Serial.println((byte)arg.toInt());
			Wire.write((byte)arg.toInt());
			Wire.endTransmission();
		}
	}
}

void sendDataToLCD(unsigned char *data) {
  unsigned char buffer[I2C_SEND_BUFFER_SIZE];
  byte i = 0;

  Wire.beginTransmission(I2C_ADDR);
  buffer[0] = 0xE0;
  buffer[1] = 0xCB;
  buffer[2] = 0xF0;
  
  for (i = 3; i < I2C_SEND_BUFFER_SIZE; i ++) {
     buffer[i] = data[i - 3]; 
  }  
  
  Wire.write(buffer, I2C_SEND_BUFFER_SIZE);
  Wire.endTransmission();
}

void initLCD() {
    /* init
   E0CBF000000000000000 
   E0CBF020000000000000 
   E0CBF000000000000000 
   E0CBF020000000000000  
   */
   
  unsigned char data[14];
  byte i = 0;

  for (i = 0; i <= 14; i++) {
    data[i] = 0x00; 
  }  

  sendDataToLCD(data); 
  
  data[0] = 0x20;

  sendDataToLCD(data); 
}
Вот такая строка выводит слово CODE

Код:
224,203,240,0,0,0,0,0,169,99,1,20,96,161,0,0,0,224,203,240,2,0,0,0,21,108,224,98,12,20,96,0,0,0
Для удобного манипулирования такими строками написал маленькое веб-приложение на PHP, которое формирует и отправляет в указанный порт такие строки.
Проверено под Виндой под запущенным USBWebserver.
Установка проста - распаковать в корневую папку вебсервера, в файле index.php указать номер порта и скорость (сейчас COM3 и 9600).

Приложение будет доступно по адресу http://localhost/com/

Можно задавать значения в десятичном, шестнатеричном, бинарном форматах. Все значения будут немедленно отправлены в индикатор.
Можно стереть все символы кнопкой Reset.
Вложения
Тип файла: zip com.zip (36.2 Кб, 629 просмотров)
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 19:20.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot