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.
Schémas :
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 :
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
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/s | Mp3 196Kbit/s | |
PC 486 DX2 66 Mhz | Horloge à 8Mhz | Horloge à 10Mhz |
PC 286 16Mhz | Horloge à 12 Mz | Horloge à 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.
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