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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2013, 12:41   #1
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
По умолчанию PCF8576 + Arduino

Привет всем.
Сломал мозг уже, пытаясь оживить панель от старой магнитолы.
Подключил уже кнопки и энкодер, но аппетит приходит во время еды, поэтому хочу оживить и LCD индикатор.

В панели стоит PCF8576, подключенная к 8 разрядам на 14 символов и одному на 7 символов плюс несколько значков - FM, RDS, TA.
Хочу заставить на 14 символьные выводить произвольную инфу из Ардуины.

Подключил к ней Teensy 2.0 ++ по I2C.

За основу скетча взял код отсюда

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

В идеале заполучить бы работающий образец кода именно под Ардуину, который выводит произвольную строку.

Адрес слэйва известен - 0x38

Конфиг тоже проходит вроде вот этим

Wire.send(B11001101);

А вот как сконфигурить правильно BIAS, Duty и собсно, отправить данные - непонятно.
Даташит читал, вроде подходят два варианта

11001101
11001110


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

Еще трабла в том, что для отправки данных требуется 12 байт, а так как Ардуины 8-битные - нужно как-то разбивать пакеты отправки данных.


Пробовал сниффер I2C отсюда
Подключил его к работающей магнитоле - там такой бешенный обмен по I2C, что с ним надо очень долго разбираться, кто что шлет. Может еще придется в этом разбираться.
В этой магнитоле еще и тюнер и аудиопроцессор подключены к I2C.

У кого есть какие мысли?
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 20.05.2013, 14:33   #2
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 вне форума   Ответить с цитированием
Старый 20.05.2013, 14:38   #3
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 Посмотреть сообщение
по поводу сниффера- то что по ссылке выше-шняга. с тинси он работает неправильно. я в качестве сниффера использовал из ардуиновской иде примеры, с небольшой правкой. с их помощью отснифил протокол тюнера, там тоже наркоманское управление, пачки байтов...
можешь кинуть сюда сниффер? и на чем построен тюнер, может у меня такой же?
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 20.05.2013, 19:17   #4
AngelOfGrief
Старший Пользователь
 
Регистрация: 17.01.2009
Возраст: 49
Город: Москва
Регион: 77, 97, 99, 177
Машина: Audi A5 3.2FSI Q, Porsche 996 Turbo
Сообщений: 669
AngelOfGrief is a jewel in the roughAngelOfGrief is a jewel in the roughAngelOfGrief is a jewel in the rough
По умолчанию

Я не понял, в итоге на экран вообще что-то выводится? Или не работает совсем? Проблема в конфигурации регистров PCF8576 или вообще
в настройке самого интерфейса?

Сниффер i2c я в молодости делал под DOS на LPT. В принципе можно самой Ардуиной и посниффить если найти библиотеки кода slave.
Если скорость слишком большая, можно в магнитоле кварц поменять на более медленный. i2c - статический протокол.
AngelOfGrief вне форума   Ответить с цитированием
Старый 20.05.2013, 19:48   #5
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
По умолчанию

Цитата:
Я не понял, в итоге на экран вообще что-то выводится? Или не работает совсем? Проблема в конфигурации регистров PCF8576 или вообще
в настройке самого интерфейса?
Я же и говорю, выводится, но непонятно что.
Если выбираешь в MODE SELECT один режим - одно выводится, если другой режим - другое.
Метода была такая - по даташиту пытался подать команду
MODE SELECT
Wire.send(B11001101);

потом
выставляю адрес

Wire.send(B00100000); - это вроде адрес старшего разряда

потом шлю данные
Wire.send(B00100000);

получаю 1 на LCD в старшем разряде.

Все вроде ок.
Но, меняя данные, получаю только вертикальные символы в знакоместе, типа 1 слева разряда, 1 справа разряда, -1 и 1-.

Напоминаю, индикатор 15-ти разрядный.
Все, только комбинации таких символов, как бы я не извращался с байтом данных.

Меняя байт разряда получаю аналогичную картину на других знакоместах.

Вот и не пойму, где порылась собака?
Поэтому и спрашиваю, может кто-то имел дело с подобными микрухами?
Чувствую, что где-то близко, но не пойму, в чем трабла.
Может где-то тайминги нарушены? Может где-то напихать задержек?
Или все-таки ошибка в конфиге?
Пошел курить даташит до полного просветления...
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 24.05.2013, 20:44   #6
macau
Старший Пользователь
 
Регистрация: 22.10.2012
Регион: 78, 98
Сообщений: 758
macau is just really nicemacau is just really nicemacau is just really nicemacau is just really nice
По умолчанию

#include <Wire.h>
#define ADDR 0x88 //адрес устройства
void setup()
{
Serial.begin(115200);//скорость обмена с компом
Wire.begin(ADDR); //определим как ведомый с указанным адресом
Wire.onReceive(receive_handler); //ждем данных от мастера, функция возвращает int число байт данных
}

void loop() {}

void receive_handler(int numbytes)
{
for (int i=0;i<numbytes;i++) //читаем весь пакет
{
Serial.print(Wire.receive(), HEX); // принимаем значение и передаем компьютеру
}
Serial.println(' '); //перенос строки

}
или

#include <Wire.h>

void setup()
{
Wire.begin(0x44); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // regis-ter event
Serial.begin(9600); // start serial for output
}

void loop()
{
delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
while(1 < Wire.available()) // loop through all but the last
{
// char c = Wire.read(); // receive byte as a character
// Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x, HEX);
Serial.println(x, BIN); // print the integer
}

в зависимости от тупости железки работает либо тот, либо тот.
еще для тинси есть интересный проект: bus-ninja
macau вне форума   Ответить с цитированием
Старый 25.05.2013, 18:03   #7
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
По умолчанию

заработал первый скетч.
отснифал им HEX-коды, перевел в бинарный вид, запихнул в скетч - не палит.
По-прежнему показывает чушь.
Или он криво снимает или я опять туплю.

надпись CODE выдает последовательность

E0CBF000000A96311460A1000
E0CBF02000156CE062C1460000

перевожу в бинарный вид

11100000 11001011 11110000 00000000 00000000 00001010 10010110 00110001
11100000 11001011 11110000 00100000 00000000 00010101 01101100 11100000

первый байт всегда адрес слэйва, второй выбор режима, третий - управление миганием сегментов (всегда выключено), а дальше по идее идут сами байты данных.
Так как здесь используется drive mode 1:3 и bias соответственно одна треть, то по датaшиту должна быть соответствующая адресация данных.
Опять что-то не так, но что именно, не пойму.

Сейчас такой скетч, он должен показывать надпись CODE

PHP код:
#define I2C_ADDR B0111000

#include <Wire.h>

void setup()
{
  
  
  
Wire.begin();
 
 
/* init
E0CBF000000000000000 
E0CBF020000000000000 
E0CBF000000000000000 
E0CBF020000000000000  
 
11100000 11001011 11110000 00000000 00000000 00000000 00000000 00000000 
11100000 11001011 11110000 00100000 00000000 00000000 00000000 00000000
11100000 11001011 11110000 00000000 00000000 00000000 00000000 00000000
11100000 11001011 11110000 00100000 00000000 00000000 00000000 00000000
*/

 
  
Wire.beginTransmission(I2C_ADDR);
 
  
Wire.send(B11001011); // MODE SElECT
  
Wire.send(B11110000); // BLINK OFF

  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
  
Wire.endTransmission();
  
  
Wire.beginTransmission(I2C_ADDR);
 
  
Wire.send(B11001011); // MODE SElECT
  
Wire.send(B11110000); // BLINK OFF

  
Wire.send(B00100000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
  
Wire.endTransmission();
  
  
Wire.beginTransmission(I2C_ADDR);
 
  
Wire.send(B11001011); // MODE SElECT
  
Wire.send(B11110000); // BLINK OFF

  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
  
Wire.endTransmission();
  
  
Wire.beginTransmission(I2C_ADDR);
 
  
Wire.send(B11001011); // MODE SElECT
  
Wire.send(B11110000); // BLINK OFF

  
Wire.send(B00100000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
  
Wire.endTransmission();
 
/* CODE
E0CBF000000A96311460A1000 
E0CBF02000156CE062C1460000 
E0CBF00000188404118000 
E0CBF020004118840410000 

11100000 11001011 11110000 00000000 00000000 00001010 10010110 00110001
11100000 11001011 11110000 00100000 00000000 00010101 01101100 11100000
*/
 
  
Wire.beginTransmission(I2C_ADDR);
 
  
Wire.send(B11001011); // MODE SElECT
  
Wire.send(B11110000); // BLINK OFF

  
Wire.send(B00000000);
  
Wire.send(B00000000);
  
Wire.send(B00001010);
  
Wire.send(B10010110);
  
Wire.send(B00110001);
  
  
Wire.endTransmission();  
  
  
Wire.beginTransmission(I2C_ADDR);
 
  
Wire.send(B11001011); // MODE SElECT
  
Wire.send(B11110000); // BLINK OFF

  
Wire.send(B00100000);
  
Wire.send(B00000000);
  
Wire.send(B00010101);
  
Wire.send(B01101100);
  
Wire.send(B11100000);
  
  
Wire.endTransmission(); 
  
}


void loop()



Показывает вот что
Миниатюры
Нажмите на изображение для увеличения
Название: IMG_20130525_161337.jpg
Просмотров: 1282
Размер:	103.5 Кб
ID:	31380  
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 25.05.2013, 19:27   #8
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
По умолчанию

Оказывается, что после первого же пакета возникает NACК - нет ответа от девайса...
Хм...
__________________
Мой проект: Citroen Xsara Android CarPC
s.m. вне форума   Ответить с цитированием
Старый 25.05.2013, 20:32   #9
awtoap
Гуру
 
Аватар для awtoap
 
Регистрация: 19.09.2009
Возраст: 46
Город: Мелитополь
Регион: Украина
Сообщений: 2,022
awtoap is a splendid one to beholdawtoap is a splendid one to beholdawtoap is a splendid one to beholdawtoap is a splendid one to beholdawtoap is a splendid one to beholdawtoap is a splendid one to beholdawtoap is a splendid one to behold
По умолчанию

Проверь какая установлена скорость шины I2C с дуины.
awtoap вне форума   Ответить с цитированием
Старый 25.05.2013, 21:06   #10
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
По умолчанию

Цитата:
Сообщение от awtoap Посмотреть сообщение
Проверь какая установлена скорость шины I2C с дуины.
По умолчанию стоит 100 кГц, попробовал поставить 400, как здесь

http://copysol.blogspot.com/2013/01/...2c-eeprom.html

перестартовал, пересобрал, перезалил - тоже самое.

Но проблема была в синтаксисе, правильно вот так

PHP код:
Wire.beginTransmission(I2C_ADDR);

byte dataArray[7] = {B11001011B11110000B00000000B00000000B00000000B00000000B00000000};

Wire.write(dataArray7);

Serial.print(Wire.endTransmission()); 
Теперь пакеты доходят, но по-прежнему показывает фигню...
__________________
Мой проект: Citroen Xsara Android CarPC

Последний раз редактировалось s.m.; 25.05.2013 в 22:49.
s.m. вне форума   Ответить с цитированием
Ответ


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

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

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



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


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