RSS
people

Mazda MP3 Player — Vierte Folge

Also, in der letzten Folge haben wir festgestelld, was HU von uns braucht. Jetzt wäre nich schlecht zu sagen, das wir den HU verstanden haben.  

Und machen wir das mit der Hilfe des hardware Timers, der für und die Kommandos Bit-weise senden wird: 

  1. /*
  2.  *   Transmitt timer interrupt
  3.  */
  4. SIGNAL(MBUS_TX_SIG_INT)
  5. {
  6.   switch ( MBTProcess.bTxState )
  7.   {
  8.     case MBTS_START:
  9.       if ( MBTProcess.bSending )
  10.       {
  11.         if ( MBTProcess.bCurBit < MBTProcess.bBitsCount )
  12.         {
  13.           if ( MBTProcess.bBitsArray[ MBTProcess.bCurBit / 8 ] & ( 1 << ( 7 - ( MBTProcess.bCurBit % 8 ) ) ) )
  14.           {
  15.             MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  16.             MBUS_TX_TCNT = MBUS_TX_TCNT_LOW_ONE;
  17.             MBTProcess.bTxState = MBTS_LOW_1;
  18.           }
  19.           else
  20.           {
  21.             MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  22.             MBUS_TX_TCNT = MBUS_TX_TCNT_LOW_ZERRO;
  23.             MBTProcess.bTxState = MBTS_LOW_0;
  24.           }
  25.           MBUS_TX_PIN_LOW();
  26.           MBTProcess.bCurBit++;
  27.         }
  28.         else
  29.         {
  30.           MBUS_TX_PIN_HIGH();
  31.           MBUS_SEND_OFF();
  32.           MBTProcess.bTxState   = MBTS_START;
  33.           MBTProcess.bSending   = 0;
  34.           MBTProcess.bCurBit    = 0;
  35.           MBTProcess.bBitsCount = 0;
  36.           TIMSK                &= ~MBUS_TX_INT_EN;
  37.           MBUS_TX_TCCR          = 0; // MBUS_TX_PRESCALE_1;
  38.           MBUS_TX_TCNT          = 0xFF;
  39.           SWTLoad(SWT_MBUS_ANSWER_TIMER, SWT_MBUS_ANSWER_BETWEEN_PACKETS_TIMER_VAL);
  40.         }
  41.       }
  42.     break;
  43.     case MBTS_LOW_0:
  44.       MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  45.       MBUS_TX_TCNT = MBUS_TX_TCNT_HIGH_ZERRO;
  46.       MBUS_TX_PIN_HIGH();
  47.       MBTProcess.bTxState = MBTS_START;
  48.     break;
  49.     case MBTS_LOW_1:
  50.       MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  51.       MBUS_TX_TCNT = MBUS_TX_TCNT_HIGH_ONE;
  52.       MBUS_TX_PIN_HIGH();
  53.       MBTProcess.bTxState = MBTS_START;
  54.     break;
  55.     default:
  56.     case MBTS_END:
  57.       MBTProcess.bTxState = MBTS_START;
  58.     break;
  59.   }
  60. }

Hier braucht man ein bisschen mehr Körperbewegungen, als beim Empang. Und wie immer, ganze Prozess besteht aus mehreren Zustände:

case MBTS_START: —  Hier ist, eigentlich, alles klar — Bit ist angefangen. Und auch, es wird geprüft, ob man senden soll oder nicht. Also wird geprüft, ob alles gesendet wurde oder gibt noch was. Danach schauen wir, was gesendet werden soll — 1 oder 0. Abhänging davon setzten wir den Timer so, dass beim nächsten mal werden wir hier landen genau um den Zeitpunkt, der dem 1 oder 0 entspricht. Für 0 müssen wir 0.5 millisekunden warten, für 1 — 1.8 Milisekunden. Gesamte Zeit für ein Bit ist 3 Milisekunden und daraus wird die Restzeit definiert, um den nächsten Bit am richtigen Zeitpunkt zu starten.

So, die Zeiten sind kalkuliert, setzen wir den Pin in 0.

case MBTS_LOW_0: und case MBTS_LOW_1: — sind die Zustände, wann die Zeit, während der Pin in 0 ist, abgelaufen ist. Hier setzen wir den Pin zurück in 1, und starten den Timer für die Restzeit.

In der zweite Teil des MBTS_START Zustandes, wenn alle Bits empfangen sind, schalten wir den Pin auf eingang, schalten wir den Empfangs-Interrupt, und breiten wird das System für die nächste Sende vor. Also, laden wir den Zwischen-Paketen-Timer. 

Der Sende-timer startet selber nicht. Den muss man dann starten, wann man es wirklich braucht. Dafür gibt es die Funktion MBus_SendPacket (), die, falls es was zu senden gibt, startet den Timer. 

  1. /*
  2.  *  Start transmitt process
  3.  */
  4. void MBus_SendPacket(void)
  5. {
  6.   if ( MBTProcess.bBitsCount )
  7.   {
  8.     #ifdef MBUS_SEND_DEBUG
  9.       u08 i;
  10.       u08 bNibbles;
  11.       bNibbles = MBTProcess.bBitsCount / 4 + ((MBTProcess.bBitsCount % 4) == 0 ? 0 : 1);
  12.       DEBUG_OUTP( PSTR("MBus S: |") );
  13.       for ( i = 0; i < bNibbles; i++ )
  14.       {
  15.         DEBUG_OUTP(PSTR("%X"), ((MBTProcess.bBitsArray[i / 2] >> (4 - (4 * (i%2))) ) & 0x0F) );
  16.       }
  17.       DEBUG_OUTP( PSTR("|n") );
  18.     #endif
  19.     MBTProcess.bSending = 1;
  20.     MBUS_SEND_ON();
  21.     MBTProcess.bTxState = MBTS_START;
  22.     MBTProcess.bCurBit  = 0;
  23.     MBUS_TX_TCCR  = MBUS_TX_PRESCALE_1;
  24.     MBUS_TX_TCNT  = 0xFF;
  25.     TIMSK |= MBUS_TX_INT_EN;
  26.     /*
  27.     while ( MBTProcess.bSending == 1 )
  28.     {
  29.       wdt_reset();
  30.     }
  31.     */
  32.   }
  33. }

Hier, wen wir sehen dass es was zu senden gibt, setzen den Flag, dass wir gerade sprechen, schalten den Pin auf Ausgan um, setzen einige Parameres für das Senden und schalten den Sende-Timer

Damit ist das Paket raus.

Die Makrosen für Umschalten des Pins auf Aingang oder Ausgang sehen so aus:

  1. // switch ports to sending mode on or off
  2. #define MBUS_SEND_ON()    sbi(MBUS_DIR, MBUS_RX_PIN); EIMSK &= ~(1 << MBUS_RX_INT);
  3. #define MBUS_SEND_OFF()   cbi(MBUS_DIR, MBUS_RX_PIN); EIMSK |=  (1 << MBUS_RX_INT); EIFR |= (1 << MBUS_RX_INT);

Wie man sieht, es wird nicht nur Pin selber umgeschaltet, sonder auch, beim Senden das Empfangs Interrupt augeschalted, und wieder eingeschaltet, wenn man den Pin auf Eingang umschaltet.

Das muss man machen, damit wir unsere Echo nicht hören können, sonst fallen wir in die Rekursion.

Das ist eigentlich ganze Kommuniktaionsprocess über M-Bus.

Falls Ihr die Fragen habt, schreib ainfach ein Kommentar da unten, ich werde versuchen die zu beantworten.

Bis Bald!

22 комментария к “Mazda MP3 Player — Vierte Folge”

  1. nofaith.oneid.ru/ пишет:

    Алексей, здравствуйте!

    Есть несколько вопросов по плееру и штатному ГУ Мазды.

    1. Возможно ли вместо VS1001 использовать VS1033, чтобы получить поддержку Wave-файлов и spdif выход с плеера? Потребуется ли изменение прошивки, или достаточно будет запустить VS1033 в режиме совместимости?

    2. Способно ли штатное ГУ управлять по шине M-Bus какими либо еще устройствами, кроме чейнджера. Интересует подключение к ней процессора Sony. Т.е. я хочу попробовать вывести из ГУ оптику, и отправить ее на внешний DSP. Сама настройка процессора (кроссовер, эквалайзер, временная коррекция) происходит с компьютера. Встает проблема управления процессором: нужно его включить, иметь возможность выбрать источник сигнала (оптика\аналог) и регулировать громкость.

    Спасибо! С уважением, Евгений.

  2. MasterAlexei пишет:

    Прошу прощения за поздний ответ - я тут работу менял, да отпуск на носу - так что на сайт мало захожу сейчас.

    — И так — про vaw файлы — В принципе — можно и заменить, Только проблемой встанет то, что нынешняя прошивка до того загружена задачами, что процессор будет просто не в состоянии быстро предоставит данные из vaw файла декодеру. Представьте себе, он должен будет за тот же промежуток времени прокачать в 10-11 раз больше данных. И все это по SPI интерфейсу, а их еще и считать надо ведь с диска. На данный момент прошивка еле справляется с mp3 файлами с битрейтом в 160 кБ/с. Так что тут надо не только прошивку менять, но и сам микроконтроллер, чтобы пошустрее был. Арм там какой нибудь.

    — Судя по протоколу, штатное ГУ управляет только CD-чейнджерами. Т.е. вам надо будет писать свое ПО таким образом, чтобы ГУ думало, что оно управляет CD чейнджером. А подключить уже можно будет что угодно.

  3. Евгений пишет:

    Спасибо!

    С плеером понятно. А насчет второго я наверное не полностью описал, что хочу сделать.

    Суть в том, что нужно «подружить» штатное ГУ с DSP-процессором, чтобы оно полностью им управляло: включить/выключить, выбрать источник сигнала, изменить громкость. Как я понимаю, управляющие сигналы можно получить на чейнджерном выходе, по CAN-шине, либо уже внутри головы по I2C, после чего конвертировать их в протокол процессора (в моем случае Unilink). Буду признателен, если подскажите, куда копать.

  4. MasterAlexei пишет:

    Ну тут я только про сигналы на чейнджерном выходе знаю. А про то, что в ГУ внутри делается — я даже и не ведаю.

    Насколько я понимаю, через CAN головой управлять не получится. А сама голова через CAN шлет только инфу для дисплея (я пока до туда не добрался, но в планах уже сделал пометку). А вот команды от кнопок все появляются именно на чейнджерном входе. Т.е. вам скорее всего придется сделать этакий переходник между MBus и Unilink'ом.

    Но мне почему-то кажется, что будет проще намного сделать небольшой пультик именно для вашего устройства, и поместить его где нибудь рядом с основными органами управления магнитоллой (можно даже стилизовать его красиво под магнитолу), а к ГУ само устройство как обычный CD чейнджер подключить и управлять им уже с обоих по очереди или одновременно.

    Алексей.

  5. Евгений пишет:

    Спасибо за ответ!

    «Небольшой пультик» не совсем то, вернее совсем не то. Идея в том чтобы управление было именно с головы.

    Если я правильно понимаю, то на чейнджерном выходе присутствуют сигналы о нажатых клавишах? А они там присутствуют постоянно при наличии устройства, или только при активации внешнего входа на ГУ? Вопрос принципиальный, иначе нужно либо использовать CAN-шину, либо лезть внутрь. По сути связь должна быть односторонняя, сам процессор обратно ГУ ничего сообщать не должен. Так что вполне подходит и вариант брать информацию с CAN.

    Собственно задача сводится к тому чтобы сделать переходник MBus->Unilink или CAN->Unilink. Где от ГУ требуется сообщать устройству об изменении уровня громкости и о текущем активном режиме(радио, CD).

    Реально для этой цели использовать MBus?

    Проблема в том что я «уперся» в качество звучания штатного ГУ, а установка вместо штатного или дополнительного ГУ не выход по многим причинам.

    Евгений.

  6. MasterAlexei пишет:

    Здравствуйте, Евгений.

    По поводу звука в автомагнитоле — был замечательный топик на одном из форумов про это от форумчанина Halin. Но почему-то я не могу его найти, и некоторые топики закрыли для незарегистрированных пользователей, но что-то мне подсказывает, что это вот этот m3club.ru/forum/index.php?showtopic=22686

    Если не лень, зарегистрируйтесь там и поглядите, пожалуйса.

    Вот еще пара ссылок для наводки на эту тему:

    www.pccar.ru/showthread.php?t=5700

    www.ma3da.ru/forum/viewto...&highlight=halin

    www.ma3da.ru/forum/viewto...&highlight=halin

    В общем — рекомендую поискать на этих форумах сообщения форумчан Slider и Halin. Они много чего интересного понаделали там ;-)

    По нашей теме:

    Нажатие отдельных кнопок по MBus не отловить, так как там идут уже конкретные команды — типа — «проиграть такую-то дорожку», или «включить режим случайного проигрывания». Причем, в зависимости от режима некоторые кнопки вообще не имеют никаких функций. Я описывал уже в своих статьях случай с переключением дорожек — иногда работало, а иногда нет.

    И, соответственно, идут эти команды только тогда, когда устройство присутствует и успешно определилось головой.

    Кнопки громкости обрабатываются головой и дальше нее не идут. Т.е. на шине MBus вообще нет никакой реакции при нажатии кнопок на руле. Так что, тут либо саму голову расковыриывать, либо ловить все в CAN шине. Я пока что еще не разбирался в CAN, но если вы что нибудь найдете в этом направлении — не сочтите за труд, поделитесь со мной, и я здесь это все обнародую в рамках очередного проекта и естественно с указанием источника, т.е. вас.

    Просто есть у меня одна задумка про дисплей, но я пока что не нашел удобоваримой информации о том, какая инфа и в каком виде ходит по CAN шине между головой и дисплеем. Я пробовал связаться со Slider'ом, но видимо он сменил свой адрес Емаил.

    Заранее спасибо.

  7. bit4bit пишет:

    Привет. Очень нужна помощь. Машина Mazda6 2005 г.р. Недавно попробывал по статье mazda-axela.ru/index.php?..8&Itemid=766 сделать себе самопальный AUX. Собрал девайс, зашил, подключил к головному устройству, после пары нажатий на кнопку СД, магнитола замолчала. Кнопки ФМ1, ФМ2, АМ переключают на режим, дисплей показывает каналы и т.д., но в динамиках молчание, ни треска, ни шелеста. После отключения самопала кнопка СД вообще не реагирует. Подключаешь самопал — кнопка пищит при первом нажатии, но все также молчит. Попробовал голову без чейнджера — все. Может я в какой то режим голову перевел? Или отключил как то звук в системе? Если есть какие нибудь идеи то буду признателен. Если что мой ящик — 4vip@inbox.ru

  8. MasterAlexei пишет:

    Вот даже не знаю, чего сказать, так как если по той статье делать, то вроде как все должно работать.

    Единственно один момент — в описании ног разъема CD чейнджера, пины 8 и 16 местами перепутаны.

    Тут вот более правильный вариант:

    www.fun-electronic.net/la... -player-nachalo/

    третья картинка с низу.

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

  9. bit4bit пишет:

    Спасибо. Попробую по этой схеме. А каким образом проверить можно что ГУ увидело чейнджер (кроме как в самой работе). Нет ли сброса на заводские предустановки самой головы?

  10. MasterAlexei пишет:

    Про сброс — надо искать на форумах по мазде, например тут mazda6.ru/m/ я находил много полезного.

    Проверить что ГУ увидело чейнджер — разве что на дисплее будет написано — EX:XX где XX номер диска. Ну и звук если подать на вход, то голова должна его отрабатывать, т.е. играть должна именно то, что подается на вход и, соответственно, регулировать громкость сего.

    Кстати — еще момент — на моей по крайней мере так — чейнджер ищется при каждом включении зажигания!

    Например на соньковском ГУ — он ищется один раз при подаче общего питания. А тут вот при каждом. И если оно в очередной раз не нашло чейнджер, то проигрываются обычные CD и радио и вход отключается, ну и звук вроде как не должен пропадать у нее.

  11. bit4bit пишет:

    Т.е. ищет? Надо какие то дополнительные манипуляции совершить? А питание с головы я снимал уже не раз, пока все эти напайки перепайки осуществлял консоль приходилось снимать. Но до этого снимал — ничего не пропадало. По последнему предложению не понял «И если оно в очередной раз не нашло чейнджер, то проигрываются обычные CD и радио и вход отключается,». Вход — имеешь ввиду AUX, а обычные СД — это что? У себя в комплекте не видел. Два блока всего голова и сверху чейнджер, который мне все диски выплюнул уже по моей просьбе)))

  12. bit4bit пишет:

    А магнитола прошивается как нибудь сама?

  13. MasterAlexei пишет:

    Ищет по шине MBus. По Вашей ссылке же в схеме есть микроконтроллер, который как раз обрабатывает все запросы ГУ, и притворяется чейнджером, чтобы ГУ включило вход. Можете почитать мои статьи на эту тему, их там не так много, всего 5 штук, вроде как было.

    «В очередной раз не нашло» значит, что при очередном включении зажигания, точнее, не зажигания, а когда ключ зажигания поворачивается на одно деление (0 кажется это, точно не помню), ГУ опрашивает MBus на наличие устройств на ней. И вот, иногда мой плеер не успевает в этот момент ответить, и ГУ его не находит и думает, что его нет вовсе. И вход AUX не включается.

    Обычные CD — имел ввиду встроенный в ГУ проигрыватель CD. У всех по разному, есть и встроенный чейнджер, как у Вас и у меня а есть одиночный CD проигрыватель.

    Магнитола то может и прошивается, но я про это не в курсе.

  14. bit4bit пишет:

    Статьи читал, спасибо за выложенные труды. По ответам вопросов нет) Буду эксперементировать.

  15. bit4bit пишет:

    Не подскажите сколько должно быть на ноге ACC в разъеме вольт? У меня 5 показывает. По схеме внутренней вроде бы 12 должно быть.

  16. MasterAlexei пишет:

    Вообще то 12 вольт. У меня, по крайней мере — 12 вольт. Я еще ставил специально LM2775-05 для понижения питания. И все сигналы MBus тоже 12 вольт, если я правильно помню. По крайней мере в схеме стоит делитель :) на MBus линии. Но про сигнальные линии, я бы уточнил.

  17. bit4bit пишет:

    Спасибо. 12 Вольт и должно быть)). Транзистор сгорел на схеме, заменили, радио ожило. Попробовали подключить AUX, играет, но очень тихо. Вроде сопротивления большие стоят. Уфффффф. Ощущение как в казино, вроде пора остановится, а не хочется.

  18. MasterAlexei пишет:

    :) О. Поздравляю, что все заработало!

  19. bit4bit пишет:

    Спасибо. Только интересно, когда в режим AUX входит на дисплее надпись «RSES» высвечивается. Что это значит? Попробовали сопротивления на 56к убрать с селектора, звук погромче стал, но с шипением.

  20. MasterAlexei пишет:

    Про RSES гугль вот такое рассказывает: mazda-cx.ru/oldforum/view...php?f=17&t=3

    Пункт 7.

    Т.е. скорее всего, когда ваш «эмулятор» представляется ГУ, то он, видимо неправильный код посылает, и ГУ распознает его не как обычный CD чейнджер.

    Чего то не пойму, про какие сопротивления вы говорите. Я никаких не ставил между аудио выходом MP3 декодера и входом ГУ. Только конденсаторы-электролиты. Т.е. обычная стандартная схема включения VLSI VS1011.

  21. bit4bit пишет:

    По RSES примерно понял. Спасибо. А по сопротивлениям, схема такая разъем AUX — С — R — Селектор. Это на всех R+ L+ R- L- такая схема сопротивление на 56 к и 50V2.2 кондюр. Попробовали в обход сделать, но все равно звук тихий и с шипением. По схеме нашли вроде как дифференциальный вход. AUX кстати активировать пришлось — на один из штекеров 5 В подали тогда только RSES появился.

  22. n1bs пишет:

    Добрый день, господа!

    Появилась необходимость раскурить MBus Mazda3, точнее очень заинтересовали пины TEXT DATA & TEXT CLOCK. Может кто уже использовал их, или знает как использовать ? :) а то гугл меня скоро забанит уже. Цель — научить магнитоллу выводить ан штатный дисплей названия треков, которые принимает блютуз гарнитура, контролируемая через КАН шину.

    Кстати если еще актуально — есть наработки в управлении штатной головой, точнее текстом на экране, прям через ОБД2 разъем.

Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.