RSS
people

Mazda MP3 Player — Dritte Folge

Ich bin wieder da!

Hoffe, dass ihr hier nicht gelangweilt ohne mich?

Ich habe aber eine Ausrede. Ich habe die Bugs in meinem Player gesucht. Und muss man sagen, ganz erfolgreich. 

In der CPLD Firmware habe ich den Modul zum Selectieren des Memory-Banks mit einem VHDL-Analog ersetzt.

In der Player-Firmware habe einige Änderungen in Heap-System gemacht, da das System hängt direkt von Memory-Banken. 

Jetzt werden alle Memory-Banken benutzt.

Es wurde alete Bug gefunden, der ich selber reinprogrammiert habe, weil ich noch jung und unerfahren war. In dem MP3-Datei-Abspiel-System wurde ein der Memory-Banken benutzt. Und damals wusste ich noch nicht, wofür ich so viel speicher brauchen kann (30 Stuck), habe ich mich den 2. augesucht, und hard kodiert. Und jetzt ist das aufgetaut, weil dieser Bank wird für Technikal Info aller Dateien benutzt.

Das System funktionierte bis ertste Abspielvorgang der MP3-Dateien. Wenn man aber versucht, die nächste Datei zu wählen, hängte das System und resetete sich durch Watchdog.

In der Firmware wurde die Kommandos des Zugrifes zu den Festplaten von einfachen Zuweisungen auf die Funktionen ersätzt, die schreiben und lesen die Daten nicht über den external Memory-Interface, sonder über GPIO zugrife über Ports PORTA, PORTC und Pins N_RD, N_WR und ALE. Diese Bremse habe ich deswegen eingebaut, weil jetzige CPLD-Firmware ist ein bisschen langsam bei der Abarbeitung der Adresse. Und ab dem Zeitpunkt als die N_RD, bzw. N_WR Pins gesetzt werden, braucht man ca. 100 Nanosekunden, bis alles Signale durch CPLD von Mukro zu die Festplatte durchkommen. Und Mikro ist schon am Ende des Lese/Schreib Zyklus, aber Festplatte fängt erst an zu reagieren. Also, CPLD ist ein bisschen langsam im Moment. 

Deswegen habe ich die einfache Zuweisungen auf external Memory-Interface durch langsame Funktionen ersätzt. Ist zwahr langsamer geworden aber funktioniert.

Ich bi aber dabei die CPLD-Firmware zu modificieren, damit die schneller arbeitet.

Und jetzt reden wir über die M-Bus. Wie man die Daten davon rausliest, oder die dort reinschreibt.

Lesevorgang ist über external Interrupt realisiert. Und zum Schreiben wird ein Timer benutzt.  

Leseforgang fängt bei fallende Flanke des pins.

  1. /*
  2.  *   Receive interrupt
  3.  */
  4. SIGNAL(MBUS_RX_SIG_INT)
  5. {
  6.   u08 register bTimerVal;
  7.   if ( MBRProcess.bCanReceive )
  8.   {
  9.     switch ( MBRProcess.bBitRecState )
  10.     {
  11.       default:
  12.       case  MBR_WAITING:
  13.         if ( MBTProcess.bSending == 0 )
  14.         {
  15.           MBRProcess.bBitCounter = 0;
  16.           MBRProcess.bBitRecState++;
  17.         }
  18.       case MBR_FALLING:
  19.  
  20.         MBUS_RX_TCNT        = 0;
  21.         MBUS_RX_TIMER_TCCR  = MBUS_RX_PRESCALE;                      
  22.  
  23.         MBUS_RX_EICR &= ~MBUS_RX_INT_MSK;
  24.         MBUS_RX_EICR |=  MBUS_RX_INT_RIS;
  25.         MBRProcess.bBitRecState++;
  26.       break;
  27.  
  28.       case MBR_RISING:
  29.         bTimerVal = MBUS_RX_TCNT;
  30.  
  31.         MBRProcess.bBitsArray[ MBRProcess.bBitCounter / 8 ] &= ~(1 << ( 7 - (MBRProcess.bBitCounter % 8) ) );
  32.         if (
  33.              ( bTimerVal >= ( MBUS_TCNT_LOW_ONE - MBUS_TCNT_TOLERANCE ) ) &&
  34.              ( bTimerVal <= ( MBUS_TCNT_LOW_ONE + MBUS_TCNT_TOLERANCE ) )
  35.            )
  36.         {
  37.           MBRProcess.bBitsArray[ MBRProcess.bBitCounter / 8 ] |= (1 << ( 7 - (MBRProcess.bBitCounter % 8) ) );
  38.         }
  39.  
  40.         MBRProcess.bBitCounter++;                                    
  41.  
  42.         MBUS_RX_EICR &= ~MBUS_RX_INT_MSK;
  43.         MBUS_RX_EICR |=  MBUS_RX_INT_FAL;
  44.         MBRProcess.bBitRecState = MBR_FALLING;                        
  45.  
  46.         SWTLoad(SWT_MBUS_PACKET_TIMER, SWT_MBUS_PACKET_TIMER_VAL);
  47.       break;
  48.  
  49.       case MBR_DONT_RECEIVE:
  50.       break;
  51.     }
  52.  
  53.     if ( MBRProcess.bBitRecState >= MBR_MAX_STATES )
  54.     {
  55.       MBRProcess.bBitRecState = MBR_FALLING;
  56.     }
  57.     if ( MBRProcess.bBitCounter >= (MBUS_MAX_PACKET_LEN * 8) )
  58.     {
  59.       MBRProcess.bBitRecState = MBR_DONT_RECEIVE;
  60.       MBRProcess.bReceived    = 1;
  61.     }
  62.   }
  63. }

In der Zeile 188 wir schauen, ob wir überchaupt was hören mussen. Es gibt Momente, wann man lieber gar nicht hören soll.

Falls wir doch was hören wollen, was in der Welt passiert, dann prüfen wir, in welhem Zustand befindet sich unsere Empangssystem. 

Es gibt insgesamt 4 Zustände:

case MBR_WAITING: — Hier sind wir, wenn wir erst angefangen mit dem Empfang, oder schon haben ein oder anderen Bit empfangen und warten auf den nächsten Bit. Ohne Warten gehen wir zu nächsten Zustand

case MBR_FALLING: — Also, Pin ist in 0 gestzt. Es ist gerade die Zeitpunkt zu merken, wie lange den Pin in 0 Zustand bleibt.

Dafür starten wir Teimer, und setzen wir die external Interrupts Parametern so, damit wir bei der Steigende Flange wieder hier landen können.

case MBR_RISING: — Hier fängt das Interesante — die Definition der Zeit, die vergangen ist zwieschen der falende und steigende Flanken. Das kann man mit dem Timer Kounter definieren. Und bahängig von der Dauer wird das Bit entwere als 0, oder 1 erkannt. Als nächstes, inkrementieren wir den Bitzähler, setzen das external Interrupt auf fallende Flanke, und stezen den nächsten Zustand auf  MBR_FALLING

Und so fahren wir in Kreisen.

Die erfahrene Lesern werden fragen, wie erkennt man den, wan Paket zu Ende ist? Sonst bleiben wir in den Kreis für immer.

Genau dafür haben wir in der Zeile 227 den Timer auf 6 Milisekunden  gestarted:  SWTLoad (SWT_MBUS_PACKET_TIMER, SWT_MBUS_PACKET_TIMER_VAL); Ich habe verschiedene Zeiten hier ausprobiert, dieser Wert passt am Besten dafür. 

So. Timer ist gestartet. In dem Hardware-Timer ist die Abarbeitung von dem:

  1.  if ( SWTFlag(SWT_MBUS_PACKET_TIMER) )
  2.  {
  3.    SWTClear(SWT_MBUS_PACKET_TIMER);
  4.    MBus_ReceivedPacket();
  5.  }

Und wenn der Timer abgelaufen ist, wird die Funktion MBus_ReceivedPacket (); aufgerufen:

  1. /*
  2.  * Called on Receive timeout, sets a flag, that data received, and stops receive process
  3.  */
  4. void MBus_ReceivedPacket(void)
  5. {
  6.   MBUS_RX_TIMER_TCCR = 0;
  7.   MBRProcess.bBitRecState = MBR_DONT_RECEIVE;
  8.   MBRProcess.bReceived = 1;
  9.   SWTLoad( SWT_MBUS_ANSWER_TIMER, SWT_MBUS_ANSWER_AFTER_REQUEST_TIMER_VAL );
  10. }

In der Funktion setzen wir unser Empfänger in den gehöhrlose Zustand — 4. Zustand: MBR_DONT_RECEIVE, setzen Flag, dass die Daten empfangen sind (MBRProcess.bReceived ), starten noch ein Timer, der für die Stille sorgt. Ich habe ein bisschen experimentiert, und habe herausgefunden, dass man sofort nach dem Empfang lieber leise bleiben soll. Sonst wird man uns nicht verstehen.

Und weiter ist alles simple. In der Funktion, die bei dem main Zyklus aufgerufen wird, wird der Empfangs-Flag MBRProcess.bReceived überprüft, und wenn der gesetzt ist, werden die Daten abgearbeited.

Das war es für Heute. Bis Später!

P.S.:

Habe ganz fergessen: die neue Firmware:  mmp3p_v_01_01 und xilinx_v_01_01.

10 комментариев к “Mazda MP3 Player — Dritte Folge”

  1. olzhan пишет:

    Прочитал с интересом но не хватает опыта работы с микроконтролерами. Вертится такой вопрос в голове — а намного ли проще будет устройство которое только общается по M-Bus с головным устройством и ключами управляет каким либо MP3 плэером, коих сейчас валом по 5 долларов за штуку. Т.е. не нужно будет думать за битрейт файла, работу с диском и т.д. Просто возможно такому новичку как я будет проще собрать такое устройство. X-Car Audiolink раздражает своей ценой (у нас порядка 400 долларов) и ограниченностью(тлеет надежда, что Вы разберетесь с CAN интерфейсом стандартного маздиного экранчика). Да и просто было бы приятней собрать своими руками)). СПАСИБО за проделанный труд!!!

  2. MasterAlexei пишет:

    Ого, это где ж у него такая цена? У нас на E-Bay можно за 99 евро найти.

    Просто управлять готовым плеером — думаю можно, но тогда надо найти способ подключиться к этому готовому плееру. Т.е. надо сам плеер препарировать, что не всегда является возможным, так как сейчас их компонуют довольно мелко, глаза поломаешь, пока найдешь, где что и откуда растет. Ну и потом это будет уже не монолитная конструкция, а набор проводов, торчащих в разные стороны, что в машине не приемлимо. Там вибрация постоянная, и что нибудь да отвалится. А так — думаю — можно и такое сделать. Про экран мазды — есть такая задумка, я ее все еще прорабатываю. Но тут все дело в том, что надо ставить свой контроллер между дисплеем и остальным миром. А моя машина еще на гарантии, хоть и частичной, и я не знаю, как к этому отнесется ОД (официальный диллер). Но я думаю в эту сторону. Как всегда — не хватает времени свободного на все.

  3. olzhan пишет:

    Цена такая на него близ города Актау, западный Казахстан. Надеюсь на Казахстан никаких обид не затаили?)) Оченно мне импонирует что земляки такие вещи творить способны. Я и сам с Алматы, токо Политех оканчивал. В качества плеера я в руках верчу ФМ модулятор китайского производства- платка 3см диаметром, питание 12В, разъемы под USB и SD, дисплейчик отображающий ID теги, три кнопки Play, Prev,Next-просто контакты. И всего 500тенге или 2 евро. Их не жалко и с десяток в экспериментах попортить. У головы есть ниша под MD проигрыватель прикрытая пластиковой пластинкой. Очень красиво получатся эту пластинку пропилить- будто у головы появились USB и SD разъемы. Вот такие фантазии. Спасибо!

  4. MasterAlexei пишет:

    Да, я тоже засматриваюсь на эту панельку, дмаю туда какой нить дисплейчик прикрутить, чтобы с моего плеера инфу показывал, а то номер дорожек и дисков не совпадает с тем, что на самом деле играет. Да и полгода пользования плеером показали, что при огромном количестве файлов и при наличии 50 плейлистов, забываешь, где что находится, какой трек в каком плейлисте, и в какую сторону крутить надо, чтобы добраться до нужной дорожки.

    Ну а подпаяться к кнопкам, думаю, труда не составит. Но голове все равно надо говорить, чего показывать. Т.е. дисплей самой мазды будет уже показывать не то, что играет на самом деле. И даже время не покажешь точно. Но сделать можно. Было бы желание.

  5. Rewerd пишет:

    Хотелось бы узнать как обстоят дела с чтеним МР3 по USB, если эта возможность предусмотренна!?

    Спасибо!

  6. MasterAlexei пишет:

    Смотря что имеется ввиду. Тот USB порт, что на плате — это обычный UART от меги. И на компе он как обычный USB< ->Serial конвертер распознается и на данный момент только для отладочной инфы используется.

    Идея была по этому порту заливать музыку на плеер, но это будет требовать много времени, так как скорости там не шибко шустрые, по этому я начал копать в сторону возможности копирования с CF карточки на винт. Но пока все так и осталось в зачаточном состоянии, так как время — оно такое. Вроде оно и есть, и как бы его и нет. В общем — как только — так сразу.

    Если же имеется ввиду возможность чтения файлов с USB накопителей, подключаемых к плееру — такой возможности не рассматривалось, по причине не поддерживаемости мегой USB-on-the-Go, или как там его. В общем — нету в этой меге USB встроенного, а самому реализовывать его не охота, да и есть вероятность, что в мегу он не влезет просто. Ну и железо подгонять придется.

  7. Rewerd пишет:

    Спасибо за скорый ответ!

    Ввиду имелся 2 вариант.

  8. Rewerd пишет:

    Жаль, хотел поддержку USB-stick в Mazde3 сделать.

    Будем копать дальше!

  9. MasterAlexei пишет:

    Для этого можно прикупить уже готовые девайсы типа USB-Link кажется или MP3-Link называются. На E-Bay их полно по 99 долларей.

  10. Mazda MP3 Player — Продолжение 4 | Fun Electronic пишет:

    [...] Analyzer V. 3.0marshallab on Мои инструменты: Logic Analyzer V. 3.0MasterAlexei on Mazda MP3 Player — Продолжение 3 МеткиБезопасность Выпайка Инструменты Кабель [...]

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

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