prononcez une couleur en fonction des valeurs de bits avec l’image 18f4550

mise à jour 2

Je veux faire un programme qui peut jouer du son (qui peut dire rouge, vert et bleu) sur ma photo 18f4550 il y a un haut-parleur connecté au picdem, cette partie fonctionne bien, j’ai écrit le programme suivant avec la version 6.83 de la puce avec le compilateur.

J’ai besoin de récupérer la valeur en bits d’un fichier .wav, quand je dis en rouge (cela a un motif en bits). Ma bonne question, comment peut-on obtenir la valeur en bits de mon fichier .wav.

void main (void) { TRISD = 0x00; // PORTD als uitgang TRISB = 0b00110000; // RB4 en RB5 als ingang TRISA = 0x00; // RA output RCONbits.IPEN = 0; // interrupts INTCONbits.GIE = 1; INTCONbits.RBIE = 1; while(1) { _asm sleep _endasm } } #pragma interrupt ISR void ISR (void) { int red[] = {bit values off sound red???}; int blue[] = {bit values off sound green???}; int green[] = {bit values off sound blue???}; if (INTCONbits.RBIF==1) { if(PORTBbits.RB5==0) // S3 pressed? { int i = 0; int b; do { LATAbits.LATA2 = rood[i]; LATDbits.LATD1 ^= 1; b = 0; //do-while voor de frequentie (1500 is de freq) do { b++; }while(b <= 2000); i++; }while(rood[i] <= 50); //LATDbits.LATD1 ^= 1; // D2 togglen } } INTCONbits.RBIF = 0; } 

Réponse à la question initiale: La “fréquence du rouge, représente en bits” que vous avez demandée est de 480 à 405 THz, donc en bits, de 111100000 à 110010101. Mais vous avez également dit “sa définition est en nanomètres”, soit 630 à 740 nm. qui est 1001110110 à 1011100100 en binary. Si vous souhaitez piloter un haut-parleur avec une forme d’onde, vous avez besoin d’un exemple de forme d’onde audio ou d’une puce de synthèse vocale. Dans les deux cas, les valeurs binarys que je vous ai données n’ont rien à voir avec le son du mot “rouge” qui aurait besoin de beaucoup plus de bits pour représenter tout son audible (par exemple, un minimum de 0,5 seconde à 16 kbps PCM serait de 8 kbp = 1 kilo-octet).

Une autre façon de représenter une couleur en binary est le système RVB où rouge serait 0xFF0000, ce qui correspond à 111111110000000000000000 en binary.

Répondez à la question sur la manière d’obtenir des bits dans un fichier wav. Nous devons d’abord déterminer où le fichier wav est stocké. Il peut être stocké sous forme de tableau const dans le PIC ou dans un périphérique de mémoire externe où vous devez le lire sur un type de bus série ou parallèle. Étant donné que le PIC18F4550 a une mémoire flash de 32 000 octets, si votre programme est assez petit, il peut restr assez de place pour les 3 fichiers wav.

Ensuite, nous devons déterminer comment le matériel va jouer le son. Vous semblez essayer d’envoyer une valeur d’octet hors du port de bit en la décalant. Mais pour obtenir ce résultat, nous devons en savoir plus sur le matériel, car vous ne pouvez pas connecter un haut-parleur à un port de bit et vous attendre à une sortie audio (pas sans traitement supplémentaire du signal PCM de toute façon – essayez-vous une conception DAC 1 bit ? Si tel est le cas , il y a d’ autres notes ici mais c’est assez ambitieux).

En dehors de cela, les valeurs de bits dans le fichier wav seraient obtenues en obtenant chaque échantillon (8 bits?) Dans le fichier et en décalant une valeur de masque de 0x01 avec une opération AND au niveau du bit pour déterminer les bits définis.

Il n’ya absolument aucune corrélation entre les valeurs binarys qui composent l’encodage de quelques lettres de l’anglais et les valeurs PCM qui constitueraient une version échantillonnée du son de quelqu’un prononçant le mot encodé.

Si vous voulez reproduire le son de quelqu’un qui dit “rouge”, vous devez d’abord l’écouter et stocker les bits résultants quelque part, puis les alimenter dans votre sortie à un débit approprié. Le son échantillonné sera probablement beaucoup plus grand que la représentation ASCII de “rouge” (qui est de 24 bits).

Il existe des puces intégrées contenant de tels échantillons et capables de générer des sons à partir d’un mot codé en ASCII, par exemple. Sauf si une telle puce est connectée à votre MCU, votre question n’a pas beaucoup de sens.

D’après ce que vous avez dit dans vos commentaires, il semblerait que vous souhaitiez obtenir un stream de bits à partir de la représentation ASCII d’une chaîne telle que "red" . Vous pouvez le faire en passant en boucle sur chaque caractère de la chaîne, puis sur chaque position de bit:

 const char *str = "I hate programming"; // Loop over each character for (i = 0; i < strlen(str); i++) { // Loop over each bit for (j = 0; j < 8; j++) { // Extract bit #j of character i, using bit-shift and mask bit = (str[i] >> j) & 1; // bit will be 0 or 1, so do something with it here } } 

Si vous voulez que les bits de chaque caractère soient dans l’ordre inverse, inversez simplement l’ordre de la boucle inner ( j ).

Notez que, comme @unwind l’a dit dans sa réponse, cela n’a rien à voir avec la génération d’ un signal audio pour les mots parlés.