Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Communication avec un synthé



  1. #1
    FantomX

    Communication avec un synthé

    Bonjour,

    But recherché : Je cherche à jouer une note de musique en appuyant sur un interrupteur. Pour celà, je veux utiliser un PIC16F88 qui va transmettre via l'USART un code MIDI au synthé.

    Paramètres de la connection MIDI : c'est un transfert de 1bit start + 8bits + 1bit stop sans parité en asynchrone à 31.250 bauds.

    Le code MIDI : 1 octet de statut ( 91 = jouer une note sur le canal MIDI 1 / 81 = ne plus jouer une note sur le canal 1) + 1 octet note ( 60 = do ) + 1 octet volume ( 7F = volume max ).

    Voici mon programme :

    #pragma bit detect @ PORTB.0 //interrupteur
    #pragma bit led @ PORTB.1

    void main(void)
    {
    OSCCON = 0b01100110; //oscillateur interne à 4MHz
    TRISB = 0b00000001;
    TX9 = 0; //pas de 9eme bit
    SYNC = 0; //mode asynchrone
    BRGH = 0; //faible vitesse
    SPBRG = 0x01; //31.250bauds

    for(;; ) { if(detect==1)
    { TXEN = 1; //demande d'emission
    TXREG = 0x91; //canal synthé actif
    TXREG = 0x60; //note do
    TXREG = 0x7F; //volume max
    led=1;
    }
    else { TXEN = 1;
    TXREG = 0x81; //canal synthé inactif
    TXREG = 0x60;
    TXREG = 0x7F;
    led=0;
    }
    }
    }

    Je pense que je ne sais pas bien paramétrer l'USART car quand j'appuie sur l'inter, il ne se passe rien ( j'ai mis une led sur RB5 pour constater un transfert de données ). La demande est bien prise en compte ( quand j'appuie sur l'inter, une autre led témoin s'allume ).

    Voilà, pouvez-vous me dire où je me trompe pour déclarer la transmission et pour l'envoi des octets ?

    Merci.

    Greg

    -----


  2. Publicité
  3. #2
    umfred

    Re : Communication avec un synthé

    voila ce que dit le datasheet:
    When setting up an asynchronous transmission, follow these steps:

    1. Initialize the SPBRG register for the appropriate baud rate. If a high-speed baud rate is desired, set bit BRGH (Section 11.1 “AUSART Baud Rate Generator (BRG)”).

    2. Enable the asynchronous serial port by clearing bit SYNC and setting bit SPEN.

    3. If interrupts are desired, then set enable bit TXIE.

    4. If 9-bit transmission is desired, then set transmit bit TX9.

    5. Enable the transmission by setting bit TXEN which will also set bit TXIF.

    6. If 9-bit transmission is selected, the ninth bit should be loaded in bit TX9D.

    7. Load data to the TXREG register (starts transmission).

    8. If using interrupts, ensure that GIE and PEIE (bits 7 and 6) of the INTCON register are set.
    Tu a donc déja oublié de mettre à 1 le bit SPEN.

    Ensuite je pense que tu recharge trop vite le registre TXREG. Je rajouterai une boucle pour tester le passage à 1 du bit TXIF ou TRMT (voir les figures 11-2 et 11-3 e la doc). il se pourrait qu'il perde un ou deux mots vu la faible vitesse de transmission.

  4. #3
    FantomX

    Re : Communication avec un synthé

    Merci pour ces indications,

    Je vais corriger de suite et tester.

    Je rendrai compte du résultat.

    @+

    Greg

  5. #4
    FantomX

    Re : Communication avec un synthé

    Voici les modifications que j'ai apportées :

    #pragma bit detect @ PORTB.0 //interrupteur
    #pragma bit led @ PORTB.1

    void main(void)
    {
    OSCCON = 0b01100110; //oscillateur interne à 4MHz
    TRISB = 0b00000001;
    TX9 = 0; //pas de 9eme bit
    SYNC = 0; //mode asynchrone
    BRGH = 0; //faible vitesse
    SPEN = 1;
    SPBRG = 0x01; //31.250bauds
    TXEN = 1; //demande d'emission

    for(;; ) { if(detect==1)
    { led=1;
    TXREG = 0x91; //canal synthé actif
    while(TRMT!=1) { }
    TXREG = 0x60; //note do
    while(TRMT!=1) { }
    TXREG = 0x7F; //volume max
    while(TRMT!=1) { }
    }
    else { led=0;
    TXREG = 0x81; //canal synthé inactif
    while(TRMT!=1) { }
    TXREG = 0x60;
    while(TRMT!=1) { }
    TXREG = 0x7F;
    while(TRMT!=1) { }

    }
    }
    }

    Ca ne marche toujours pas.

    D'autres idées/remarques ?

    @+

    Greg

  6. #5
    FantomX

    Re : Communication avec un synthé

    personne pour m'aider ?

  7. A voir en vidéo sur Futura
  8. #6
    umfred

    Re : Communication avec un synthé

    Tentes en remettant à 1 le bit TXEN après les while.

    PS: la boucle infini avec le for( ; ; ) je connaisait pas, j'aurais plutot opter pour un while(1).

    PS: mets le TXEN=1 qui est avant la boucle infini à l'intérieur de celle-ci. Tu peux aussi te créer un petit sous-programme d'envoi de donnée, ce qui rendra plus lisible le programme :
    void send_data(byte data)
    {
    TXEN=1;
    TREG=data;
    while(TRMT!=1);
    }
    ta boucle deviendrait :

    while(1)
    {
    if(detect==1)
    {
    led=1;
    send_data(0x91); //canal synthé actif
    send_data(0x60); //note do
    send_data(0x7F);
    }
    else
    {
    led=0;
    send_data(0x81); //canal synthé inactif
    send_data(0x60);
    send_data(0x7F);
    }
    }

  9. Publicité
  10. #7
    FantomX

    Re : Communication avec un synthé

    En fait j'avais oublié de cabler MCLR. Quel boulet !

    Mais y'a toujours un problème : RB5 ( transmission ) reste toujours allumée. Et j'ai l'impression qu'en appuyant sur mon inter il n'y a pas d'envoi.

    Je suis perdido. Y aurait-il un pro de la transmission de données avec PIC dans l'assistance ?

    @+

    Greg

  11. #8
    umfred

    Re : Communication avec un synthé

    Si l'aapui sur le bouton marche et que le synthé joue la note souhaité, alors ça marche comme prévu (y compris la RB5(TX) allumée).

    Et oui, si on regarde de plus près le programme, on envoie toujours des données au synthé, y compris quand le bouton n'est pas appuyé.

    Il faudrait rajouté un bit ou variable pour détecté que l'on a déja fait relaché le bouton:

    Si je reprend mon exemple, ca donne:

    Code:
    bouton_appuye=0;
    while(1)
    {
    
        if(detect==1)
    
            {
    
                led=1;
                send_data(0x91); //canal synthé actif
                send_data(0x60); //note do
                send_data(0x7F);
                bouton_appuye=1; //indique que l'on vient d'appuyer sur le bouton
            }
    
        else
        {
            if(bouton_appuye==1)
            {
                    led=0;
                    send_data(0x81); //canal synthé inactif
                    send_data(0x60);
                    send_data(0x7F);
                    bouton_appuye=0; //le bouton est relaché
             }
        }
    
    }
    PS: on peut faire la même la chose dans le 'if (detect==1)' si il n'y a pas besoin de tout le temps envoyé la commande au synthé

  12. #9
    FantomX

    Re : Communication avec un synthé

    Oui j'avais pensé à ça mais RB5 reste quand même allumée. Voilà le programme que j'avais fait :

    #pragma bit detect @ PORTB.0 //interrupteur
    #pragma bit led @ PORTB.1

    void main(void)
    {
    int a=1;
    OSCCON = 0b01100110; //oscillateur interne à 4MHz
    TRISB = 0b00000001;
    TX9 = 0; //pas de 9eme bit
    SYNC = 0; //mode asynchrone
    BRGH = 0; //faible vitesse
    SPEN = 1;
    SPBRG = 0x01; //31.250bauds
    led=0;

    for(;; ) { if(detect==1 && a==1)
    { led=1;
    TXEN=1;
    TXREG = 0x91; //canal synthé actif
    while(TRMT!=1) { }
    TXREG = 0x60; //note do
    while(TRMT!=1) { }
    TXREG = 0x7F; //volume max
    while(TRMT!=1) { }
    TXEN=0;
    a=0;
    }
    if(detect==0 && a==0)
    { led=0;
    TXEN = 1;
    TXREG = 0x81; //canal synthé inactif
    while(TRMT!=1) { }
    TXREG = 0x60;
    while(TRMT!=1) { }
    TXREG = 0x7F;
    while(TRMT!=1) { }
    TXEN=0;
    a=1;

    }
    }
    }

    Ca m'énerve je sens que je suis pret du but mais ça ne fonctionne pas. Relié au synthé il ne se passe rien.

  13. #10
    umfred

    Re : Communication avec un synthé

    en fait les tests sur TRMT doivent être:

    Code:
    while (TRMT!=0);
    pour respecter le chronogramme de la figure 11-2 de la datasheet. (TRMT est à 0 tant que l'on a pas envoyer tout les bits de TXREG)

Sur le même thème :

Discussions similaires

  1. communication avec iss
    Par luckywendy dans le forum Astronautique
    Réponses: 5
    Dernier message: 23/11/2007, 10h24
  2. HID communication avec un pc
    Par hakim34 dans le forum Électronique
    Réponses: 2
    Dernier message: 04/07/2007, 22h23
  3. communication avec un appareil photo
    Par bert.b.83 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 01/03/2007, 14h13
  4. communication série avec 68HC11
    Par chrichri71 dans le forum Électronique
    Réponses: 5
    Dernier message: 30/01/2007, 21h42
  5. communication avec matlab via un rs485
    Par madmat dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 27/10/2005, 22h37