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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Разработка устройств (http://pccar.ru/forumdisplay.php?f=18)
-   -   PCF8576 + Arduino (http://pccar.ru/showthread.php?t=19162)

macau 26.05.2013 00:03

а обязательно побитово слать? помню у меня тоже были проблемы с бинарной отправкой. в хексе все нормально слалось.

s.m. 26.05.2013 04:15

Цитата:

Сообщение от macau (Сообщение 259518)
а обязательно побитово слать? помню у меня тоже были проблемы с бинарной отправкой. в хексе все нормально слалось.

уже перевел в hex, те же, только в профиль.

s.m. 05.08.2013 02:57

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

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

Код:

#define I2C_ADDR 0x38
#define I2C_SEND_BUFFER_SIZE 17

#include

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 ?

s.m. 11.08.2013 20:05

Вложений: 1
Раскурил индикатор.

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

Код:

#define I2C_ADDR 0x38
#define I2C_SEND_BUFFER_SIZE 17

#include

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.


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

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