CARTE DE DECOMPRESSION MP3

Description:

Voici la description d'une carte électronique permettant la décompression et l'écoute de fichiers MP3 avec un minimun de materiel. L'objectif est d'utiliser du materiel peu couteux. Vous avez tous dans vos placards une vieille carte mère PC 286, 386 ou 486 qui ne sert plus a rien. Avec cette application, vous avez la possibilité de la ressortir et de l'utiliser comme elle ne l'avait jamais été auparavant; l'utiliser pendant des heures et heures pour vous faire écoutez votre musique préférée.

Si vous êtes plus courageux, vous pouvez développer votre propre carte CPU qui sera moins encombrante et moins gourmande en energie qu'une carte mère PC.
En fait, le principe est d'utiliser la carte mere PC (ou autre) uniquement pour le transfert des fichiers MP3 d'un CDROM vers la carte de décompression. Un clavier et afficheur ou ecran permet la selection des titres a écouter.
La carte PC (ou autre) transfert la totalité du fichier MP3 a l'état brute sur le port parallele a l'aide d'un protocole optimisé. Sur la carte de décompression, un microcontroleur (PIC16F84) effectue une conversion paralléle-serie des octets reçus afin de les transferer au circuit de décompression, le MAS3507D. Ce circuit est un DSP muni d'un Firmware spécifique, apres reconnaissance automatique du format du fichier MP3, il effectue la décompression et transfert le signal audio numérique (I2S) sur ses sorties PIO. Un convertiseur D/A CS4334 suivi d'un ampli se charge du reste.

 

Voici quelques photos du prototype que j'ai réalisé :


 
Ceci est la maquette qui fonctionne depuis 6 mois. Bien sur, il manque le clavier et l'ecran, mais ils seront
remplacés par un petit clavier 16 touches et un afficheur LCD (logé a droite sur la face avant du boitier). De gauche a droite vous avez :
l'alim, lecteur disquette, CDROM et carte de décompression(en bleu), puis la carte PC 286 avec carte video et controleur.

Voici la carte de décompression (désolé, la photo est floue). Je n'ai pas encore pris le temps de réaliser un cuivre.
De gauche a droite vous avez : le connecteur de liaison parrallele avec le PC, le PIC16F84, 7417
(dessous), regulateurs de tension (au dessus), le MAS3507D (en PLCC44), le CS4334
(en CMS), le TL082 puis le jack pour la sortie audio stéréo.

Schémas :
Voici les schémas de la carte de décompression :


 
Comme vous pouvez le constatez, le PIC est overclocké. En effet, son travail est de demander d'un octet au PC et de le sérialiser pour le MAS3507D. Les fichiers MP3 compressés a 196Kbit/s posaient des gros problemes de débit. La frequence de l'horloge du PIC dépend aussi de la rapidité du PC comme le montre ce tableau :
 







Mp3 128Kbit/sMp3 196Kbit/s
PC 486 DX2 66 MhzHorloge à 8MhzHorloge à 10Mhz
PC 286 16MhzHorloge à 12 MzHorloge à 16Mhz

Le MAS3507D doit être alimenter en 3V5. Les signaux vennant du PIC ou de l'oscillateur doivent être abaissés a 3V5. Les signaux I2C sont cablés sur le connecteur du port parallele mais il ne sont pas encore gérés par le soft.
 
Softs :

Le PC doit permettre la selection du fichier MP3 a écouter puis l'ouvrir pour le transferer à la carte de décompression.
En fait, dès que le signal ACK du port parallele est remonté, il copie un octet du fichier sur les datas du port parallele et monte le signal strobe. Le PIC descend aussitot son signal ACK et sérialise l'octet vers le MAS. A la redescente du signal ACK, le PC descend son signal strobe.
Si la demande du MAS (signal demand) est toujours active, le PIC remonte le signal ACK pour recevoir l'octet suivant de la part du PC, et ainsi de suite ...
Le MAS contient un buffer interne, il peut donc desactiver le signal demand dès que celui ci est plein.

Soft PIC : Voici Le programme PIC .( Attention au timing, chaque cycle CPU a son importance.)

( Copier et coller dans un fichier Asm )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;             MP3_PIC.ASM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Interface Port parallele --> bus I2S MAS3507D
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        LIST            P=16C84
        ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES
        __CONFIG        3FF1H   ;XT OSC, WATCHDOG
        __IDLOCS        1234    ;DUMMY ID WORDS


; Register file declaration
;============================    
PORTA       EQU     5
PORTB       EQU     6
TRISA       EQU     85H
TRISB       EQU     86H
OPTREG      EQU     81H
INTCON    EQU    0BH    
STATUS      EQU     3

; bit number of STATUS byte
;===========================
W        EQU        0
F        EQU        1
CARRY      EQU     0
ZERO        EQU        2    ; bit Z de STATUS    
RP0        EQU     5
INTF        EQU        1    ; bit RB0/INT interupt
TOIF        EQU        2    ; bit timer overflow


; affectation port A
;===================
SID    EQU    0    ; out
SIC    EQU    1    ; out
DEM    EQU    2    ; in
ACK    EQU    3    ; out
STROBE    EQU    4    ; in

; declaration variables
;=======================
VALUE    EQU    0CH     ; Data recu du port B




    ORG        0
    GOTO        MAIN

; Routine d'interuption
;========================
    ORG        4
    RETFIE

;========================================================
;
;
;
;========================================================
MAIN
    BSF        STATUS,RP0     ; SELECT REGISTER BANK 1   
    MOVLW    14H        ;set RA2 and RA4  input
    MOVWF    TRISA        ;
    MOVLW    0FFH
    MOVWF      TRISB          ; PORTB INPUT

    BCF        STATUS,RP0     ; SELECT REGISTER BANK 0  

    BCF    PORTA,ACK
    BCF    PORTA,SIC
    BCF    PORTA,SID


;    Reception octet
;=============================
    BSF    PORTA,ACK    ; pres pour recevoir un octet

Recept_data
    BTFSS    PORTA,ACK
    GOTO LectValue

loop_strobe
    BTFSC    PORTA,STROBE    ; boucle attente octet
    GOTO    loop_strobe
    BCF    PORTA,ACK    ; stop reception

LectValue
    MOVF    PORTB,0        ; lecture octet port parallele
    MOVWF    VALUE        
    
loop_dem
    BTFSS    PORTA,DEM    ; boucle si DEM = 0
    GOTO    loop_dem



;    transfert bit 7
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,7
    BCF        PORTA,SID
    BTFSC    VALUE,7
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BTFSC    PORTA,STROBE    
    GOTO        GO_B6

;    transfert bit 6
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,6
    BCF        PORTA,SID
    BTFSC    VALUE,6
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BTFSC    PORTA,STROBE    
    GOTO        GO_B5

;    transfert bit 5
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,5
    BCF        PORTA,SID
    BTFSC    VALUE,5
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BTFSC    PORTA,STROBE    
    GOTO        GO_B4

;    transfert bit 4
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,4
    BCF        PORTA,SID
    BTFSC    VALUE,4
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC
    
    BTFSC    PORTA,STROBE    
    GOTO        GO_B3

;    transfert bit 3
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,3
    BCF        PORTA,SID
    BTFSC    VALUE,3
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC
    
    BTFSC    PORTA,STROBE    
    GOTO        GO_B2


;    transfert bit 2
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,2
    BCF        PORTA,SID
    BTFSC    VALUE,2
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC
    
    BTFSC    PORTA,STROBE    
    GOTO        GO_B1

;    transfert bit 1
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,1
    BCF        PORTA,SID
    BTFSC    VALUE,1
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC
    
    BTFSC    PORTA,STROBE    
    GOTO        GO_B0

;    transfert bit 0
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,0
    BCF        PORTA,SID
    BTFSC    VALUE,0
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

ATT_STROBE_1
    BTFSS    PORTA,STROBE        ; attente strobe remonte de l'octet precedent
    GOTO        ATT_STROBE_1
    BSF        PORTA,ACK        ; demande octet suivant
    GOTO        Recept_data


;=====================================================
;        Demande octet suivant en montant ACK
;        Continue le transfere bit
;=====================================================
GO_B6
;    transfert bit 6
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,6
    BCF        PORTA,SID
    BTFSC    VALUE,6
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC
    NOP
GO_B5
;    transfert bit 5
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,5
    BCF        PORTA,SID
    BTFSC    VALUE,5
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC

    BTFSS    PORTA,STROBE    ; si strobe bas ==> octet arrivé
    GOTO        END_B4
    
GO_B4
;    transfert bit 4
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,4
    BCF        PORTA,SID
    BTFSC    VALUE,4
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC
    
    BTFSS    PORTA,STROBE    ; si strobe bas ==> octet arrivé
    GOTO        END_B3

GO_B3

;    transfert bit 3
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,3
    BCF        PORTA,SID
    BTFSC    VALUE,3
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC
    
    BTFSS    PORTA,STROBE    ; si strobe bas ==> octet arrivé
    GOTO        END_B2

GO_B2

;    transfert bit 2
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,2
    BCF        PORTA,SID
    BTFSC    VALUE,2
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC
    
    BTFSS    PORTA,STROBE    ; si strobe bas ==> octet arrivé
    GOTO        END_B1

GO_B1

;    transfert bit 1
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,1
    BCF        PORTA,SID
    BTFSC    VALUE,1
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC
    
    BTFSS    PORTA,STROBE    ; si strobe bas ==> octet arrivé
    GOTO        END_B0

GO_B0

;    transfert bit 0
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,0
    BCF        PORTA,SID
    BTFSC    VALUE,0
    BSF        PORTA,SID
    BSF        PORTA,ACK    ; pres pour recevoir un octet
    BCF        PORTA,SIC

    GOTO        loop_strobe

;=====================================================
;        Descend ACK
;        Termine le transfere bit
;=====================================================
END_B4    
;    transfert bit 4
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,4
    BCF        PORTA,SID
    BTFSC    VALUE,4
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BCF        PORTA,ACK    ; Stop reception

END_B3
;    transfert bit 3
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,3
    BCF        PORTA,SID
    BTFSC    VALUE,3
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BCF        PORTA,ACK    ; Stop reception

END_B2
;    transfert bit 2
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,2
    BCF        PORTA,SID
    BTFSC    VALUE,2
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BCF        PORTA,ACK    ; Stop reception

END_B1
;    transfert bit 1
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,1
    BCF        PORTA,SID
    BTFSC    VALUE,1
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BCF        PORTA,ACK    ; Stop reception

END_B0
;    transfert bit 0
;=============================
    BSF        PORTA,SIC
    BTFSS    VALUE,0
    BCF        PORTA,SID
    BTFSC    VALUE,0
    BSF        PORTA,SID
    NOP
    BCF        PORTA,SIC

    BCF        PORTA,ACK    ; Stop reception

    GOTO        LectValue


    
;
        ORG     2100H           ;SOME DUMMY EEDATA
;
        DE      " 1999 EDY "
        END

Aucun commentaire:

Enregistrer un commentaire