Code source C DMX-512
Répondre à la discussion
Affichage des résultats 1 à 30 sur 30

Code source C DMX-512



  1. #1
    invitec6b43af9

    Exclamation Code source C DMX-512


    ------

    Bonsoir,
    je viens de m'inscrire car j'espère que vous pourrez m'apporter un peu d'aide.
    voila depuis un certain temps je cherchais des montages sur le DMX-512 ainsi que sur la façon dont il est créé/reçu, et donc recherche également de code de préférence en C.

    J'ai pratiquement trouvé mon bonheur sur ce site: http://www.stielec.ac-aix-marseille....t.htm#pilotage
    mais d'une part je n'ai pas l'habitude de MPLAB (je programme habituellement avec CCS PIC) et de plus j'ai l'impression qu'il manque des fichiers notamment header "fichier.h".

    Ce que j'aimerais faire c'est créer deux sous-programmes que je puisse utiliser dans d'autres projets avec d'autres PIC:

    - un qui regroupe tout ce qui concerne l'envoi de donnée DMX,

    - le second qui gère toute la partie réception,

    Pour qu'au final je n'ai que des variables à gérer dans mes "main". Par exemple pour un récepteur, faire appel à la variable que je veux:
    Code PHP:
    If (canal_1<=127)
       {
       
    output_low (PIN_C0);
       }
    else
       {
       
    output_high (PIN_C0);
       } 
    Et par la suite utiliser ces variables pour gérer du PWM comme c'est le cas aussi dans les projets du site.

    Mon problème est que bien que je relise plusieurs fois les codes fournis je me perds, je n'aime pas trop la façon dont c'est structuré et il y a plein de "noms" que je ne connais pas et donc ne comprends pas à quoi ils servent, et à part utiliser le code tel quel avec le PIC défini par le créateur je ne peux pas faire grand chose tant que je n'aurai pas réussi à séparer le DMX des sorties

    Je vous remercie de votre attention et pour votre aide.
    cordialement.

    -----

  2. #2
    invitec6b43af9

    Re : Code source C DMX-512

    personne?

  3. #3
    RISC

    Re : Code source C DMX-512

    Salut,

    Il existe aussi une note d'application pour les PIC18 en C18 : AN1076.

    a+

  4. #4
    invitec6b43af9

    Re : Code source C DMX-512

    Je vais y jetter un oeil, merci beaucoup

  5. A voir en vidéo sur Futura
  6. #5
    invitec6b43af9

    Re : Code source C DMX-512

    Ah c'est de l'assembleur, je vais voir si j'arrive à l'intégrer en C (il me semble que c'est possible) et ensuite utiliser les variables en C. Par contre j ai une petite question, le "p18f24j10.inc" est-ce que je peux l'enlever et le remplacer par "PIC18Fxxxx.h" (en l'enlevant de l'assembleur bien sur) ?

  7. #6
    invitec6b43af9

    Exclamation Re : Code source C DMX-512

    Bon après un bon nombre d'essais pas moyen d en tirer quelque chose, l'assembleur c'est vraiment incompréhensible... et pour ce qui est des fichiers en C du site sti elec je crois que c'est pareil j arrive rien à en faire, j ouvre le fichier projet avec mplab mais il me dit que plusieurs fichiers sont introuvables, comme "p18f2520.h" par exemple... évidemment ils ne sont pas dans l'archive... j ai essayer de contacter les gens du site mais pas de réponse...

  8. #7
    invite5637435c

    Re : Code source C DMX-512

    Citation Envoyé par I-had-it Voir le message
    ... j ai essayer de contacter les gens du site mais pas de réponse...
    Bonsoir,

    ben oui faut bien bosser aussi.

    Il faut juste être un peu patient et les réponses arriveront spontanément.

    Code:
    Ce que j'aimerais faire c'est créer deux sous-programmes que je puisse utiliser dans d'autres projets avec d'autres PIC
    C'est tout l'intérêt du C de pouvoir le réutiliser en se créant des bibliothèques de fonctions.

    Concernant votre projet il faut en dire davantage et surtout être bien plus précis.
    Je ne comprend pas bien, vous voulez réorganiser un code existant ou créer de toute pièce un code ?
    Vous connaissez bien le C ou vous êtes plutôt débutant ?
    Quel compilateur utilisez-vous, quel sont les fonctionalités (le cahier des charges en gros), etc

    Bref il nous faut savoir avec quoi vous partez comme bagages (schéma, codes, ou juste votre enthousiasme).
    Plus on en saura sur ce projet et vos besoins exacts plus nous serons précis à notre tour.

    Quand il n'y a pas de réponses en général c'est que ça manque de clareté et on a juste envie de zapper.

    @+

  9. #8
    invitec6b43af9

    Re : Code source C DMX-512

    En fait voila je programme sous CCS donc c'est pas le meme environnement que MPLAB donc il y a des trucs que certains compilateurs font tout seul et que d'autres ne font pas. Vu que j ai CCS et que j ai l'habitude de l'utiliser je pensais faire une adaptation car j'ai un peu de mal avec MPLAB et je ne veux pas m'y mettre tout de suite.

    En fait le but c'est de créer un sous-programme qui gère les infos DMX (enfin TTL issues du MAX485) et qui stock chaque valeur de chaque canal (8 ou 10 voir plus) dans les variables que je connais (enfin que je parviens à identifier) correspondant à chaque canal.

    Le but étant, après d'avoir ce sous programme, de l'intégrer sans avoir à le modifier dans des projets, je le définis et après j ai juste à manipuler les variables pour piloter un moteur pas à pas, du PWM, des leds, etc...

    Et sa permet, en cas d'erreur, de savoir que le problème ne vient pas de là.

    Sinon pour la programmation je suis débutant, enfin je maitrise le LCD, l'ADC, le RS-232, les variables aussi, je vais bientot me lancer dans le SPI avec un petit DAC et un thermometre, je ferai de meme avec l'I2C... Le monde de la programmation est vaste

  10. #9
    invite5637435c

    Re : Code source C DMX-512

    Rien ne t'oblige à travailler avec MPLAB pour développer ton code C.
    Fais toi une petite carte avec un connecteur ICSP et tu envoies ton hex dans le PIC avec ton MPLAB et juste ça, tu vois si ça colle et au besoin tu retravailles ton code et hop tu reflashes le bazar, etc jusqu'à obtenir un résultat correct.
    L'avantage des PIC16Fxxx c'est qu'ils sont reflashables un sacré paquet de fois, largement assez en tout cas pour que tu développes ton truc à ton rythme.

  11. #10
    invite5637435c

    Re : Code source C DMX-512

    Il faut bien distinguer le langage d'une part et le matériel de l'autre.
    Si tu es à l'aise avec le C le matériel n'est rien en comparaison avec le temps d'apprentissage nécessaire d'un langage tel que le C.

    Les ressources matériels sont variables d'un µC à l'autre, il suffit juste de lire la doc et de faire ce qui est dit dedans, même si parfois il faut savoir aussi lire entre les lignes dans certaines...

    Pour un débutant le plus difficile est souvent de savoir bien cerner son besoin et son µC et d'organiser le programme qui devra être écrit sans partir tout azimut et à en oublier la lisibilité et la cohérence générale.

    En fait le but c'est de créer un sous-programme qui gère les infos DMX (enfin TTL issues du MAX485) et qui stock chaque valeur de chaque canal (8 ou 10 voir plus) dans les variables que je connais (enfin que je parviens à identifier) correspondant à chaque canal.
    Pas compris ce passage en rouge.

  12. #11
    invite860936ec

    Re : Code source C DMX-512

    Bonsoir,
    beaucoup de fichier header sont inclus dans mplab et dans mplab C18
    si le programme est en c.
    Attention tu as besoin d'instaler c18 (une vertion studient est dispo chez microchip) pour pouvoir compiller un projet en C
    sous mplab.
    @+

  13. #12
    invitec6b43af9

    Re : Code source C DMX-512

    Je suis à peu près à l'aise avec le langage C (je veux dire par là que avec les fonctions de base j'arrive à faire pas mal de trucs, envoyer une liste avec du texte et des variables par RS-232 sur un PC avec un virtual terminal, utiliser l'ADC, gérer les variables et les sous-programmes... En bref j ai déjà fait des projets qui me paraissent assez complexe). Ce qui me parait difficile justement c'est le changement d'environnement, meme si ça s'apprend. J'ai commencer à programmer (en C seulement) en cours il y a meme pas un an. La difficulté que je rencontre c'est évidemment des fonctions que je ne connais pas et dont je ne comprends pas leur role, mais aussi la différence de syntaxe. Par exemple prenons "ADCON0bits.GO_DONE" je sais que c'est lié à l'ADC mais je ne sais pas comment la retranscrire sous CCS. De même "TRISCbits.TRISCx" (ou x est un nombre)... Il y en a plein comme ça.
    Quand je vois un "void" ou un "define" y a pas de problème, mais des que je rencontre une syntaxe inconnue et qui n'est pas déclaré je bloque.

    Pour ce qui est de la phrase en rouge effectivement je me suis trompé, les variables je les connais puisqu elles sont normalement déclarées. Mon problème c'est les entrées/sorties, il n'y a pas de "input" ou "output" donc comment savoir quelle entrée ou sortie
    est sollicitée à une ligne précise du code? surtout qu'ils ont pas fourni les .h donc pour savoir si ils ont modifié le nom ou autre c'est impossible. Je pensais que trouver un programme en C serait plus simple que de l'ASM mais au final je galère autant

  14. #13
    invitec6b43af9

    Re : Code source C DMX-512

    Ah j avais pas vu le dernier message. Ouio pour ce qui est de p18fxxxx.h" ça je l'ai, mais il y a bien un autre fichier qui a le meme nom que le projet où est configuré la fréquence, si on autorise la MCLR, la PLL... en l'ocurrence sous CCS j ai donc 3 fichiers: Exemple.c, Exemple.pjt, Exemple.h, plus apres compilation Exemple.hex et Exemple.cof.
    Dans Exemple.h j'ai mes fusibles, si j'utilise la RS-232, c'est ici que j'aurai #FUSE use RS-232 (baud 57600, N, 9, Xmit PIN_C6,...)
    si j'utilise l'oscillateur interne #FUSE INTRC...
    et de meme si je modifie le nom des I/O...
    et le problème c'est que ce fichier est propre à un projet, et malheureusement il ne m'est pas fourni sinon ce serait plus simple pour des manipulations

  15. #14
    invite860936ec

    Re : Code source C DMX-512

    Bonjour,
    le fonctionnement de C18 est semblable à ccs (ca rest du c)
    certain petit projets ne necessite pas de fichier header (hello world, bilinkking led.......Et au contraire certain proejet trés gros sont de vris fourmilieres( usb task , ethernet.....)ou les fichiers snt dispatchés dans plusieurs repertoires.

    En theorie les fichiers header sont inclues en debut de fichier c:
    include <p18f4520.h> // fichier se trouvant dans mplab
    include <delay.h> // fichier se trouvant dans mplab
    include "main.h" //fichier se trouvant dans le dossier du projet

    mais certain fichiers se trouvent dans des dossiers annexes(comme pour les piles microchip, les fichiers headers sont classés dans un dossier include indepandant des dossiers de projets.
    sela permet deja de repérer pas mal de fichiers,
    si la compile se fait , c'est que tous les fichiers sont presents

  16. #15
    invitec6b43af9

    Re : Code source C DMX-512

    bonjour et merci
    le problème c'est justement que la compilation ne se fait pas,
    j'ai utilisé mplab et c18 pour la première fois ce matin pour recréer un projet donc avec PIC18F2520...
    Lorsque je compile j'ai "BUILD FAILED" et aucun rapport d'erreur...

    J'ai donc essayé sous CCS c'est exactement pareil:
    des erreurs comme "_asm GOTO" qui ne fonctionne pas,
    "unsigned char existence_page(),premier_appui ;" qui renvoie l'erreur: définition de la fonction différente de la définition précédente...

    Je sais vraiment plus quoi faire avec ce programme...

  17. #16
    invite860936ec

    Re : Code source C DMX-512

    Peux tu faire un imprime écran du resultat de la compile ou un copier coler .

  18. #17
    invitec6b43af9

    Re : Code source C DMX-512

    en piece jointe un apperçu écran sous CCS dont le code est ci-dessous:

    "DMX.c"
    Code HTML:
    #include <DMX.h>
    #include <com.h>   // declaration commune
    
    // Definitions
    
    // DŽclaration des fonctions utilisŽes
    
    void InitTX(void);            // initialize the I/O ports and TMR0 pour transmission DMX
    void SetupSerial(void);         // initialize serial comm
    void DMXTransmit(void);        // Execute the state machine
    void init_console(void);      // initialisation de la console
    void acq_pot(void);            // acquisition des 4 tensions analogiques conversion en nombre sur 4 adresses 
    void Affectation_canal(void);   // attribue la conversion au canal
    void Determine_page(void);      // determine si appui sur BP de chagement de page
    void init_affichage(void);      // affichage apres mise sous tension
    void raf_aff_valeur(void );         // Rafraichi l'affichage si pot varie
    void raf_aff_ad_DMX(void );         // Rafraichi l'affichage adresse DMX si BP appuyŽ
    void aff_POT(void );
    
    // variables
    unsigned char existence_page(),premier_appui;
    extern unsigned char debut_canal[nb_BP];
    extern unsigned char Passage_inter;
    
    
    
    // Force l'Žcriture ˆ l'adresse 08 (interruption haute prioritŽ)
    #pragma code inter_h=0x08
    void inter_h(void)
    {
     _asm GOTO Determine_page _endasm   // lors d'une interruption haute priorite appeller la fonction temp_multiplex
    }
    
    
    #pragma code            // redonne au linker le choix de l'adresse de l'Žcriture en flash
    
    // programme principal
    void main(void)
    {   
       unsigned char test,i;
       InitTX();               // initialize the I/O ports and TMR0
       SetupSerial();             // initialize serial comm
       init_console();            // initialisation de la console
       init_affichage();         // Affiche les info de demarrage
       premier_appui=0;
       while(1)
          {
             acq_pot();           // ACQUISITION TENSIONS sur les pot
          
             if(debut_canal[0]==2 || debut_canal[1]== 2 || debut_canal[2]==2) test =1; // si une valeur =2  scanner(s) selectionnŽ(s)
             else 
                {
                test=0;
                for(i==0;i<nb_BP;i++)
                   {
                   if (debut_canal[i]==0) test=0; 
                   else {test=1; break;}   
                   }
                }
             if (test==1 ) // Rafraichi l'affichage 
             {
                raf_aff_valeur();
                Affectation_canal();   // attribue la conversion au canal
             }
             if (premier_appui==1) 
             {      
                aff_POT();      // AFFICHE DONNEE POT 
                premier_appui++;    
             }
             if (Passage_inter==1) 
             {      
                raf_aff_ad_DMX();      // Rafraichi l'affichage adresse DMX si BP appuyŽ 
                Passage_inter=0;   
             }
          
          DMXTransmit();        // transmission
          }
    }
    
    }
    "DMX.h"
    Code HTML:
    #include <18F2550.h>
    #device ICD=TRUE
    #device adc=8
    
    #FUSES NOWDT                    //No Watch Dog Timer
    #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
    #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
    #FUSES NOPROTECT                //Code not protected from reading
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES BORV20                   //Brownout reset at 2.0V
    #FUSES NOPUT                    //No Power Up Timer
    #FUSES NOCPD                    //No EE protection
    #FUSES STVREN                   //Stack full/underflow will cause reset
    #FUSES DEBUG                    //Debug mode for use with ICD
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOWRT                    //Program memory not write protected
    #FUSES NOWRTD                   //Data EEPROM not write protected
    #FUSES IESO                     //Internal External Switch Over mode enabled
    #FUSES FCMEN                    //Fail-safe clock monitor enabled
    #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
    #FUSES NOWRTC                   //configuration not registers write protected
    #FUSES NOWRTB                   //Boot block not write protected
    #FUSES NOEBTR                   //Memory not protected from table reads
    #FUSES NOEBTRB                  //Boot block not protected from table reads
    #FUSES NOCPB                    //No Boot Block code protection
    #FUSES MCLR                     //Master Clear pin enabled
    #FUSES LPT1OSC                  //Timer1 configured for low-power operation
    #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
    #FUSES PLL1                     //No PLL PreScaler
    #FUSES CPUDIV1                  //No System Clock Postscaler
    #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
    #FUSES VREGEN                   //USB voltage regulator enabled
    
    #use delay(clock=16000000)
    "com.h"
    Code HTML:
    //***************************************************
    // Declaration communes aux fichiers consoles      *
    //***************************************************
    
    // Definitions
    #define adresse_DMX 12            // nombre de canaux DMX a envoyer 
    #define nb_pot 4               // nombre de potentiometre
    #define nb_BP 3                  // nombre de Scanner PAR NB DE POT
    Je ferai un apperçu écran sous mplab demain je ne l ai pas encore réinstaller.

    Et encore merci pour votre aide
    Images attachées Images attachées  

  19. #18
    invitec6b43af9

    Re : Code source C DMX-512

    C'est dommage que les constructeurs ne se mettent pas d'accord sur la syntaxe dans leur compilo, au moins on pourrait transporter le fichier d un compilo à l'autre sans avoir à tout reprendre

  20. #19
    invite860936ec

    Re : Code source C DMX-512

    Bonsoir,
    il semble que tu n'ais pas tous les fichiers.
    Ou est le code correspondant au déclarations des fonctions ?
    Pour la premiere erreur dans ccs , une deffinition de variable ne contient pas de parenthéses (enfin je n'en ai jamais utilisé) et comme le compilateur bloque sur la def, premier appui n'est pas créé, donc les erreures suivantes, pour l'erreur asm voir si ccs connait cette instruction et sous quelle cintaxe.
    dans c18 la deffinition des fusibles ce fait par des #deffines ou plus simplement par le menu configure , onglet configuration bits (bien décocher "config bits set in code").
    @+

  21. #20
    invite831b139b

    Re : Code source C DMX-512

    Là déja les erreurs me semblent normales puisque le programme a été fait sous mplab et que je l ai ouvert avec CCS (pas la meme syntaxe donc, mais je voulais quand meme essayer).
    Par contre le fait est que mise à part <p18f2520.h> et <delays.h> il ne me semble pas qu'il manque de programme dans l'archive (console pilotage.rar) mais il semble qu'ils ne soient pas tous liés entre eux, j'ai donc un main.c qui pour moi est le fichier principal, seulement j en ai un autre qui s'appelle console.c et qui regroupe pas mal d'infos mais qui n'est pas inclus dans main.c... donc je sais pas trop ce qu'ils ont foutu mais il n'y a pas moyen de faire grand chose avec ça. Il y a bien un fichier compilé .cof qui doit fonctionner mais c'est pas ça qui m'intéresse.

    Donc vu que le main.c a appriori pas grand chose à faire ici, voici les autres codes:

    console.c:
    Code:
    #include <p18F2520.h>   // bibliotheque du PIC utilise
    #include <delays.h>      // bibliotheque de gestion de temps par cycle micro
    #include <com.h>   // declaration commune
    
    // Definitions
    #define voyant_1_4   PORTBbits.RB3
    #define voyant_5_8   PORTBbits.RB5
    #define voyant_9_12   PORTBbits.RB4
     
    #define BP_9_12      INTCON3bits.INT2IF      //
    #define BP_5_8       INTCON3bits.INT1IF      //
    #define BP_1_4       INTCONbits.INT0IF      // 
    
    // DŽclaration des fonctions utilisŽes
    
    void init_console(void);      // initialisation de la console
    void acq_pot(void);            // acquisition des 4 tensions analogiques conversion en nombre sur 4 adresses 
    void Affectation_canal(void);   // attribue la conversion au canal
    void Determine_page(void);      // determine si appui sur BP de chagement de page
    void tempo_S_H(void);         // tempo laissant le temps ˆ l'echantillonage et blocage
    extern void XLCDInit(void);         // initialisation du LCD (par Maestro)
    extern void black_out(void);   // tous les canaux sont remis ˆ 0
    
    // variables
    unsigned char Passage_inter=0 ;
    unsigned char TxBuffer[adresse_DMX];   // buffer de transmission serie   
    unsigned char canal_adc;            // canal de conversion 1 parmis 4
    unsigned char Resultat_Conv[nb_pot];    // Resultats de conversion des 4 pot
    unsigned char debut_canal[nb_BP]={0,0,0};      // Adresse DMX de debut de page 
    extern premier_appui;
    
    
    // Acquisition des tensions AN (POT)
    void acq_pot(void)
    {
       if(ADCON0bits.NOT_DONE==1) return ;            // ATTENTE FIN DE CONVERSION
       Resultat_Conv[canal_adc]=ADRESH;            // AFFECTATION DU RESULTAT DE CONVERSION
       canal_adc++;                           // VOIE SUIVANTE
       if(canal_adc==4) canal_adc=0 ;               // SI FIN REINITIALISER
       switch(canal_adc)                        // COMMANDE MUX DE L ADC
          {
             case 0 :   ADCON0=0x01; break;        // SELECTION du canal 0
             case 1 :   ADCON0=0x05; break;          // SELECTION du canal 1
             case 2 :   ADCON0=0x09; break;          // SELECTION du canal 2
             case 3 :   ADCON0=0x0D; break;          // SELECTION du canal 3
             default :  ADCON0=0x01; break;
          }
       tempo_S_H();      // tempo SAMPLE HOLD
       ADCON0bits.GO=1;   // lancement de la conversion
    }
    
    void Affectation_canal(void)
    {
    unsigned char i;
    
    if (debut_canal[0]==0 && debut_canal[1]== 0 && debut_canal[2]==0) 
       {
       black_out();
       return;
       }
       
    for (i=0;i<nb_pot;i++)
       {
       if (debut_canal[0]==2) TxBuffer[i]=Resultat_Conv[i];      //remplissage des 4 canaux pour la page 1
       if (debut_canal[1]==2) TxBuffer[i+4]=Resultat_Conv[i];      //remplissage des 4 canaux pour la page 2
       if (debut_canal[2]==2) TxBuffer[i+8]=Resultat_Conv[i];      //remplissage des 4 canaux pour la page 3
    
       }
    
    
    }
    
    /* Gestion des pages par BP et interruptions */
    
    void Determine_page(void)      
    {
    premier_appui++;
    if (premier_appui>2) premier_appui=2;
    
     if(BP_1_4==1)            // test si BP appuye, gestion des adresses 1 a 4
       {
        voyant_1_4=!voyant_1_4;         //allume / eteint voyant
       BP_1_4=0;                  // reinit pour prochaine interrupt
       if (voyant_1_4==1)debut_canal[0]=2; else debut_canal[0]=1;
       Passage_inter=1;
       }
    if(BP_5_8==1)      // test si BP appuye, gestion des adresses 5 a 8
       {
        voyant_5_8=!voyant_5_8;      //allume / eteint voyant
       BP_5_8=0;               // reinit pour prochaine interrupt
       if (voyant_5_8==1)debut_canal[1]=2; else debut_canal[1]=1;
       Passage_inter=1;
       }
    
    if(BP_9_12==1)       // test si BP appuye, gestion des adresses 9 a 12
       {
       voyant_9_12=!voyant_9_12;      //allume / eteint voyant
       BP_9_12=0;   
       if (voyant_9_12==1)debut_canal[2]=2; else debut_canal[2]=1;
       Passage_inter=1;
       }
    INTCONbits.GIEH=1;         // Validation globales des interruptions sur vecteur 08
    }
    
    
    
    // Initialisation entrŽes analogiques (POT) select debut adresse (BP) et voyants et afficheur
     
    void init_console(void )
    {
    ADCON1=0x0B;            // AN0 ˆ AN3 et le reste en numŽrique
    ADCON0=0x00;            // SELECTION du canal 0
    ADCON2=0x05;             // exploitation de l'ADC en 8 bits, TAD=0, TAD=16TOSC
    ADCON0bits.ADON=1;         // Mise en service de l'ADC
    TRISB=0b11000111;
    voyant_1_4=0;            // RAZ VOYANTS
    voyant_5_8=0;
    voyant_9_12=0;
    INTCON=0b00010000;         // Validation de l'interruption INT0
    INTCON2=0b10000000;         // Prise en compte des interruptions sur front descendant
    INTCON3=0b11011000;         // Inter haute prioritŽ sur INT (hard) et validation des inter INT1 & 2   
    RCONbits.IPEN=1;         // activation de la prioritŽ sur interruption
    INTCONbits.GIEH=1;         // Validation globales des interruptions sur vecteur 08
    XLCDInit();
    }   
    
    void tempo_S_H(void)      // tempo laissant le temps ˆ l'echantillonage et blocage sup 2,4µS
    {
    Delay10TCYx(3);            // bibliotheque delay 30 cycles (4µs)
    }[/QUOTE]
    
    trame_DMX.c: 
    
    [QUOTE]#include <p18F2520.h>   // bibliotheque du PIC utilise
    #include "com.h"   // declaration commune
    
    // Definitions
    
    #define IDLE 10          // preload value for TMR0 IDLE
    #define T100US 131          // preload value for TMR0 to roll over in 100us
    #define T60US 181             // 60us value
    #define T13US 240             // 60us value
    
    #define config_pin_BREAK TRISCbits.TRISC5    // sortie intervenant pour l'Žtat bas BREAK
    #define   Sortie_BREAK LATCbits.LATC5
    
    // DŽclaration des fonctions utilisŽes
    
    void InitTX(void);         // initialize the I/O ports and TMR0
    void SetupSerial(void);      // initialize serial comm
    void DMXTransmit(void);     // Execute the state machine
    void SENDBREAK (void );
    void SENDMAB (void );
    void SENDDATA (void );
    void SENDSTARTCODE (void );
    void black_out(void);
    
    
    // DŽclaration de VARIABLES
    unsigned char DmxTxState=0;      // State Variable 
    unsigned char Count;         // counter 256           //
    extern unsigned char TxBuffer[];         // Reservation pour le contenu des adresses DMX
    unsigned char *RamPtr;
    
    
    //DMX Transmit state machine
    // The DMX transmit code is driven by the TMR0 roll-over
    // events. Just return if a roll-over has not occured.
    
    
    void DMXTransmit(void)
    {
       SENDBREAK();
       SENDMAB();
       SENDSTARTCODE();
       SENDDATA(); 
    
    }
    
    // InitTX init Timer0, clear TXbuffer, init state machine
    void InitTX(void)
    {
    
       // raz ADRESSES dmx
       black_out();
    
    // init Timer0
       T0CON = 0xC1;             //  enable Timer0, as an 8-bit timer, use prescaler 1:4 (0,8 us tick@20MHz)
       TMR0L=T100US;             // preload timer for 100us interval to roll over
       INTCONbits.TMR0IF=0;       // clear roll over flag
    
       Count=0;               // init 8-bit counter 
    
       DmxTxState=3;             // init state machine
       config_pin_BREAK=0;       //make pin  an output
       Sortie_BREAK=0;          //pull  output low to force a break condition
    }
    
    
    //Setup Serial port
    void  SetupSerial(void)
    {
       TRISCbits.TRISC7=1;    // allow the UART RX to control pin RC7
       TRISCbits.TRISC6=1;    // allow the UART TX to control pin RC6
       TXSTA=0x65;          // enable TX, 9-bit mode, high speed mode, 9th bit =1 (2 stop)
       RCSTA=0x80;          // enable serial port, disable receiver 
    //   BAUDCONbits.BRG16=1;   // select EUART 16-bit Asynchronous mode operation
       SPBRG=4;            // init baud rate generator for 250k baud (assume Fosc=20MHz)
    }
    
    
    //***********
    // DmxTxState = 3. Generates a Break Signal (100uSec)
    void  SENDMAB(void)
    {
       config_pin_BREAK=1 ;       // tri-state pin RC5 to end break signal/ 
       TMR0L=T13US ;            // duree MAB
       INTCONbits.TMR0IF=0;
       while(!INTCONbits.TMR0IF);   // Attente fin tempo
    }
    
    
    // ***********
    // DmxTxState = 2. Mark After Break (line IDLE for 100uSec) send a start code
    void  SENDSTARTCODE(void)
    {
       TXREG=0 ;       //send NULL START CODE
    }
    
    //***********
    // DmxTxState = 1. wait for UART to complete transmission of current byte and an additional short
    // amount of time
    
    void  SENDDATA(void)
    {
       Count=0;
       RamPtr=&TxBuffer[0];     // Affecte au pointeur l'adresse de debut de table
       
       while(Count<adresse_DMX)      // emettre toute les trames
       {
          if(PIR1bits.TXIF==1)          // make sure TX buffer is available
          {
             TXREG=*RamPtr++;         //  On affecte au registre de transmission le contenu pointe par RamPtr puis on incremente le pointeur   
             Count++;               //  Incremente le compteur jusqu'ˆ l'adresse max
          }
          if(Count%7==0) 
          {
             TMR0L=T100US;            //pre-load TMR0 pour 100us delay tous les 7 canaux
             INTCONbits.TMR0IF=0;          // clear the flag
             while (INTCONbits.TMR0IF==0);
          }
    
       }
       if (Count==adresse_DMX)
       {
          TMR0L=IDLE;               //pre-load TMR0 for a 100us delay before the frame repeats
          INTCONbits.TMR0IF=0;       // clear the flag
          while (INTCONbits.TMR0IF==0);
          TMR0L=IDLE;               //pre-load TMR0 for a 100us delay before the frame repeats
          INTCONbits.TMR0IF=0;       // clear the flag
          while (INTCONbits.TMR0IF==0);
          TMR0L=IDLE;               //pre-load TMR0 for a 100us delay before the frame repeats
          INTCONbits.TMR0IF=0;       // clear the flag
          while (INTCONbits.TMR0IF==0);
       }
    }
    
    
    //DmxTxState = 0. sends Mark Before repeating the frame transmission
    void SENDBREAK(void)
    {
       TMR0L=T100US;             // pre-load the timer for 100us BREAK
       INTCONbits.TMR0IF=0;       // clear the flag
       config_pin_BREAK=0;       // make pin  an output
       Sortie_BREAK=0;          // pull pin low to force a break condition
       while(!INTCONbits.TMR0IF);   // Attente fin tempo
    }
    
    //RAZ de toutes les sorties
    
    void black_out(void)
    {
       unsigned char i;
       for (i=0;i<adresse_DMX;i++)
       {
       TxBuffer[i]=0;
       }   
    }
    Je viens d ouvrir carrément le projet mais évidemment il me met que "p18f2520.lkr" n a pas été trouvé. par contre il ne me met appriori pas d'erreur de fichier manquant pour "p18f2520.h" ce qui est sans doute normal, mais le plus étonnant c'est qu'il ne semble pas non plus manquer "delays.h" alors qu'il n'est pas dans le dossier "header files".

    encore merci

  22. #21
    invitec6b43af9

    Re : Code source C DMX-512

    euh il se passe quoi avec mon psudo, il y a eu un petit soucis je crois ^^ je ne suis pas mica25chose mais c'est bien moi aui ait posté le message au dessus ?? Enfin bref peu importe ^^

  23. #22
    invite860936ec

    Re : Code source C DMX-512

    en lngaga C le programme commence toujours par la fonction main{}
    surement presente dans main.c puis utilise des fonctions présente soit dans main.c ou dans d'autre fichiers .c

    avec mplab , il faut toujours ouvrir le projet, c'est lui qui permet de faire le lien entre les differents fichiers.
    les .h doivent etres obligatoirements declarés dans le .c qui les utilise.
    mais pour les .c lors de la compilation mplab va chercher les fonctions utilisées dans les differents fichiers source integrés au projet

    les linkers par default se trouve dans le repertoir de c18 , une fois le linker trouvé , tu peus faire un copier coler de celuici vers le rep de ton projet.
    ne pas oublier d'indicer à mplab l'emplacement du linker.

    Tout la getion des fichiers (.c .h .lkr) se fait par l'explorateur de projet (menu view onglet project)

    pour delay.h tu ne le trouve pas dans ton projet car il est déclaré avec des <> donc c'est un fichier qui apartien au librairies de C18, donc mplab sait où aller chercher.
    @+

  24. #23
    invitec6b43af9

    Re : Code source C DMX-512

    Ah ok merci pour les infos je vais voir ça, par contre oue c'est bien de savoir parce que dans CCS lorsqu'on met des <> à la place de "" ça sert justement à remplacer "C:\Mes documents/dossier..." mais ce n'est pas pour cela qu'il se trouve au coeur de CCS, c'est simplement que lui va le chercher dans le dossier ou se trouve les fichiers .c, .h, etc...
    donc je fais un essai, j'en ai trouvé un où il n'y a qu'un seul fichier .c donc logiquement le seul truc qui va me manquer c'est le linker que je vais pouvoir trouver

  25. #24
    invitec6b43af9

    Re : Code source C DMX-512

    Bon ce code seul fonctionne sous mplab apres avoir trouver le linker. Je vais essayer de le migrer sous CCS voir quelle syntaxe il faut que je change et je vous tiens au courant... et si j y arrive j aurai plus qu'à faire de meme avec les autres pour mieux les éplucher
    encore merci je vais déja (j'espere) pouvoir avancer un peu plus dans mes recherches

  26. #25
    invite860936ec

    Re : Code source C DMX-512

    pour ton post precedent , si mplab a reussi a compiller jusqu'au linker( une des derniéres operation effectué pour la compilation) c' est qu il a trouvé tous les autre fichiers, donc si tu lui indique le .lkr la compil a de forte chance de réussir.
    (pour les puristes , quand je parle de compilation , j'inclue tous les processus pour arriver à un .hex )
    @+

  27. #26
    invitec6b43af9

    Re : Code source C DMX-512

    Donc oui effectivement la premiere erreur que je rencotre est "TRISCbits.TRISC7=1;" je peux le remplacer par "output_high (PIN_C7);" ?
    de meme j'ai "INTCONbits.TMR0IF=0;" , "LATCbits.LATC4=1;"

    et est ce que je peux remplacer ça:

    TXSTA=0x65; // enable TX, 9-bit mode, high speed mode, 9th bit =1 (2 stop)
    RCSTA=0x80; // enable serial port, disable receiver
    SPBRG=4; // init baud rate generator for 250k baud

    par #use rs232... ?

    apres y a un peu de syntaxe autour du timer0, je vais essayer de voir comment la modifier, et pareil au niveau du buffer de TX je crois...

    merci beaucoup

  28. #27
    invite860936ec

    Re : Code source C DMX-512

    Bonjour,
    attention
    le registre TRISx controle seulement le sens du port tris=255 port en entrée, tris=0 port en sortie donc 1 ou 0 pour entree sortie pour des pins seuls.
    l' instruction outpin (c7) me semble etre plutot une foncyion qui , deffinie le sens de la pin puis la passe à un etat haut.(mais je connais trés peu ccs).
    si tu connais bien ccs , il te sufit juste de comparer et d'étudier un peu la sintaxe de c18, mais c'est toutafait possible de transposer l'un vers l'autre.
    un lien qui contient plein d'exemples et de tutos:
    http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    (merci RISC , j'avais perdu le lien , mais vous l'avait posté dans un autre topic)

    bon courage @+

  29. #28
    invite5637435c

    Re : Code source C DMX-512

    Citation Envoyé par I-had-it Voir le message
    C'est dommage que les constructeurs ne se mettent pas d'accord sur la syntaxe dans leur compilo, au moins on pourrait transporter le fichier d un compilo à l'autre sans avoir à tout reprendre
    Un compilateur C ne possède pas de bibliothèques normalement, à toi donc d'utiliser ou non celles qui sont proposées.
    En principe on écrit ses propres bibliothèques en choisissant de respecter les appellations des registres du µC pour s'y retrouver plus facilement.
    La portabilité dépend donc d'une part du respect de la syntaxe C et de l'autre de la manière dont les fonctions sont structurées pour pouvoir les porter avec un minimum de modifications.

    La grande mode est de proposer des bibliothèques "clé en main" surtout sur les compilateurs de µC avec 2 inconvénients au moins.
    Le premier est une lisibilité des plus douteuses bien souvent, la seconde la plus ennuyeuse est que ces bibliothèques ne sont pas toujours publiques donc pas modifiables ou opaques sur la manière dont sont réalisées ces fonctions (pour gérer l'I2C, l'UART, etc).
    Là la portabilité est quasi impossible sans tout recasser.

    En choisissant des compilateurs avec bibliothèques intégrées on croit faire un bon choix à priori, ensuite à l'usage on prend le parti de se les faire soi même.

    ADCON0bits.GO_DONE

    Là il faut impérativement lire la doc pour comprendre comment interprêter ce bit 0 du registre ADCON.

    GO -> aller ----------------> on lance en placant à 1 ce bit la conversion.
    DONE -> fait --------------> le flag passe à 0 lorsque la conversion est terminée donc à surveiller dans les interruptions.

  30. #29
    invitec6b43af9

    Re : Code source C DMX-512

    Merci pour toutes ces infos
    Oui HULK28 c'est vrai que le mieux serait de faire ses propres librairies, seulement quand on débute c'est pas ce qui est de plus simple et je doute qu'à l'heure d'aujourd'hui j'arrive à créer ma propre bibliothèque. Mais quand je me sentirai une certaine motivation pour éplucher une documentation (PIC10F par exemple) j'essaierai de me lancer Après pour ce qui est du compilateur le lycée nous a mis à disposition une licence pour CCS donc autant s'en servir , de plus c'est avec celui ci que j ai vraiment appris à programmer (j'avais commencer il y a quelques temps sous AVR mais pas plus loin que if/while)

    Pour ce qui est de la compilation avec C18 oui aucun soucis maintenant que le linker a été identifié. Je vais essayer de recompiler avec toutes les autres archives comme ça je serai sur des codes et au pire je pourrai déjà essayer de les migrer sur un autre PIC en restant sous C18, puis progressivement tenter de "traduire" l'ensemble sous CCS.

  31. #30
    invitec6b43af9

    Lightbulb Re : Code source C DMX-512

    Bonsoir,
    le sujet est toujours d'actualité, j'ai essayer de faire un bout de code d'apres ce que je sais sur le DMX mais je n'ai rien pour le tester (pas d'oscillo facile à synchroniser ni de récepteur DMX) donc j'aimerais savoir si vous arriveriez à me dire si c'est bon d'apres le code:

    DMX_512.h :

    Code:
    #include <18F4550.h>
    #device ICD=TRUE
    #device adc=8
    
    #FUSES NOWDT                    //No Watch Dog Timer
    #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
    #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
    #FUSES NOPROTECT                //Code not protected from reading
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES BORV20                   //Brownout reset at 2.0V
    #FUSES NOPUT                    //No Power Up Timer
    #FUSES NOCPD                    //No EE protection
    #FUSES STVREN                   //Stack full/underflow will cause reset
    #FUSES DEBUG                    //Debug mode for use with ICD
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOWRT                    //Program memory not write protected
    #FUSES NOWRTD                   //Data EEPROM not write protected
    #FUSES IESO                     //Internal External Switch Over mode enabled
    #FUSES FCMEN                    //Fail-safe clock monitor enabled
    #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
    #FUSES NOWRTC                   //configuration not registers write protected
    #FUSES NOWRTB                   //Boot block not write protected
    #FUSES NOEBTR                   //Memory not protected from table reads
    #FUSES NOEBTRB                  //Boot block not protected from table reads
    #FUSES NOCPB                    //No Boot Block code protection
    #FUSES NOMCLR                   //Master Clear pin disabled
    #FUSES LPT1OSC                  //Timer1 configured for low-power operation
    #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
    #FUSES PLL1                     //No PLL PreScaler
    #FUSES CPUDIV1                  //No System Clock Postscaler
    #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
    #FUSES VREGEN                   //USB voltage regulator enabled
    #FUSES ICPRT                    //ICPRT enabled
    
    #use delay(clock=20000000)
    #use rs232(baud=250000,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
    #define Tx PIN_C6
    DMX_512.c :

    Code:
    #include <DMX_512.h>
    #include <lcd.c>
    #include <variable.c>
    
    #define LCD_ENABLE_PIN  PIN_C3
    #define LCD_RS_PIN      PIN_D1
    #define LCD_RW_PIN      PIN_D0
    #define LCD_DATA4       PIN_C2
    #define LCD_DATA5       PIN_C1
    #define LCD_DATA6       PIN_C0
    #define LCD_DATA7       PIN_E2
    #define LCD_TYPE 2
    
    #define break_0 output_low (Tx); delay_us (90);
    #define MAB output_high (Tx); delay_us (8);
    #define start output_low (Tx); delay_us (4);
    #define stop output_high (Tx); delay_us (8);
    #define start_code start; printf ("0x00"); stop;
    #define CH_01_08  !input (PIN_B0)
    #define CH_09_16  !input (PIN_B1)
    #define CH_17_24  !input (PIN_B2)
    #define CH_25_32  !input (PIN_B3)
    #define CH_33_40  !input (PIN_B4)
    
    #define frame_01 start; printf ("CH_01"); stop;
    #define frame_02 start; printf ("CH_02"); stop;
    #define frame_03 start; printf ("CH_03"); stop;
    #define frame_04 start; printf ("CH_04"); stop;
    #define frame_05 start; printf ("CH_05"); stop;
    #define frame_06 start; printf ("CH_06"); stop;
    #define frame_07 start; printf ("CH_07"); stop;
    #define frame_08 start; printf ("CH_08"); stop;
    #define frame_09 start; printf ("CH_09"); stop;
    #define frame_10 start; printf ("CH_10"); stop;
    #define frame_11 start; printf ("CH_11"); stop;
    #define frame_12 start; printf ("CH_12"); stop;
    #define frame_13 start; printf ("CH_13"); stop;
    #define frame_14 start; printf ("CH_14"); stop;
    #define frame_15 start; printf ("CH_15"); stop;
    #define frame_16 start; printf ("CH_16"); stop;
    #define frame_17 start; printf ("CH_17"); stop;
    #define frame_18 start; printf ("CH_18"); stop;
    #define frame_19 start; printf ("CH_19"); stop;
    #define frame_20 start; printf ("CH_20"); stop;
    #define frame_21 start; printf ("CH_21"); stop;
    #define frame_22 start; printf ("CH_22"); stop;
    #define frame_23 start; printf ("CH_23"); stop;
    #define frame_24 start; printf ("CH_24"); stop;
    #define frame_25 start; printf ("CH_25"); stop;
    #define frame_26 start; printf ("CH_26"); stop;
    #define frame_27 start; printf ("CH_27"); stop;
    #define frame_28 start; printf ("CH_28"); stop;
    #define frame_29 start; printf ("CH_29"); stop;
    #define frame_30 start; printf ("CH_30"); stop;
    #define frame_31 start; printf ("CH_31"); stop;
    #define frame_32 start; printf ("CH_32"); stop;
    #define frame_33 start; printf ("CH_33"); stop;
    #define frame_34 start; printf ("CH_34"); stop;
    #define frame_35 start; printf ("CH_35"); stop;
    #define frame_36 start; printf ("CH_36"); stop;
    #define frame_37 start; printf ("CH_37"); stop;
    #define frame_38 start; printf ("CH_38"); stop;
    #define frame_39 start; printf ("CH_39"); stop;
    #define frame_40 start; printf ("CH_40"); stop;
    
    void main()
    {
       lcd_init();
       port_b_pullups(TRUE);
       setup_adc_ports(NO_ANALOGS|VSS_VDD);
       setup_adc(ADC_CLOCK_DIV_2);
       setup_psp(PSP_DISABLED);
       setup_spi(SPI_SS_DISABLED);
       setup_wdt(WDT_OFF);
       setup_timer_0(RTCC_INTERNAL);
       setup_timer_1(T1_DISABLED);
       setup_timer_2(T2_DISABLED,0,1);
       setup_comparator(NC_NC_NC_NC);
       setup_vref(FALSE);
    
    while (true)
       {
       set_adc_channel( 0 );
       A0 = read_adc();
       set_adc_channel( 1 );
       A1 = read_adc();
       set_adc_channel( 2 );
       A2 = read_adc();
       set_adc_channel( 3 );
       A3 = read_adc();
       set_adc_channel( 4 );
       A4 = read_adc();
       set_adc_channel( 5 );
       A5 = read_adc();
       set_adc_channel( 6 );
       A6 = read_adc();
       set_adc_channel( 7 );
       A7 = read_adc();
    
       if (CH_01_08)
          {
          CH_01=A0; CH_02=A1; CH_03=A2; CH_04=A3; CH_05=A4; CH_06=A5; CH_07=A6; CH_08=A7;
          output_d (0x01);
       while (CH_09_16 | CH_17_24 | CH_25_32 | CH_33_40);
          }
          
       if (CH_09_16)
          {
          CH_09=A0; CH_10=A1; CH_11=A2; CH_12=A3; CH_13=A4; CH_14=A5; CH_15=A6; CH_16=A7;
          output_d (0x02);
       while (CH_01_08 | CH_17_24 | CH_25_32 | CH_33_40);
          }
          
       if (CH_17_24)
          {
          CH_17=A0; CH_18=A1; CH_19=A2; CH_20=A3; CH_21=A4; CH_22=A5; CH_23=A6; CH_24=A7;
          output_d (0x04);
       while (CH_01_08 | CH_09_16 | CH_25_32 | CH_33_40);
          }
          
       if (CH_25_32)
          {
          CH_25=A0; CH_26=A1; CH_27=A2; CH_28=A3; CH_29=A4; CH_30=A5; CH_31=A6; CH_32=A7;
          output_d (0x08);
       while (CH_01_08 | CH_09_16 | CH_17_24 | CH_33_40);
          }
          
       if (CH_33_40)
          {
          CH_33=A0; CH_34=A1; CH_35=A2; CH_36=A3; CH_37=A4; CH_38=A5; CH_39=A6; CH_40=A7;
          output_d (0x0B);
       while (CH_01_08 | CH_09_16 | CH_17_24 | CH_25_32);
          }
    
    break_0    ;
    MAB        ;
    start_code ;
    frame_01   ;
    frame_02   ;
    frame_03   ;
    frame_04   ;
    frame_05   ;
    frame_06   ;
    frame_07   ;
    frame_08   ;
    frame_09   ;
    frame_10   ;
    frame_11   ;
    frame_12   ;
    frame_13   ;
    frame_14   ;
    frame_15   ;
    frame_16   ;
    frame_17   ;
    frame_18   ;
    frame_19   ;
    frame_20   ;
    frame_21   ;
    frame_22   ;
    frame_23   ;
    frame_24   ;
    frame_25   ;
    frame_26   ;
    frame_27   ;
    frame_28   ;
    frame_29   ;
    frame_30   ;
    frame_31   ;
    frame_32   ;
    frame_33   ;
    frame_34   ;
    frame_35   ;
    frame_36   ;
    frame_37   ;
    frame_38   ;
    frame_39   ;
    frame_40   ;
       }
    }
    variable.c :

    Code:
    void variable ();
    
    int A0;
    int A1;
    int A2;
    int A3;
    int A4;
    int A5;
    int A6;
    int A7;
    
    int CH_01   ;
    int CH_02   ;
    int CH_03   ;
    int CH_04   ;
    int CH_05   ;
    int CH_06   ;
    int CH_07   ;
    int CH_08   ;
    int CH_09   ;
    int CH_10   ;
    int CH_11   ;
    int CH_12   ;
    int CH_13   ;
    int CH_14   ;
    int CH_15   ;
    int CH_16   ;
    int CH_17   ;
    int CH_18   ;
    int CH_19   ;
    int CH_20   ;
    int CH_21   ;
    int CH_22   ;
    int CH_23   ;
    int CH_24   ;
    int CH_25   ;
    int CH_26   ;
    int CH_27   ;
    int CH_28   ;
    int CH_29   ;
    int CH_30   ;
    int CH_31   ;
    int CH_32   ;
    int CH_33   ;
    int CH_34   ;
    int CH_35   ;
    int CH_36   ;
    int CH_37   ;
    int CH_38   ;
    int CH_39   ;
    int CH_40   ;
    Comme vous pouvez le voir il ne génère que 40 voies, mais j'ai vu que c'était possible d envoyer moins de 512 canaux en envoyant un "break" apres le dernier canal.

    Ce que je redoute c'est que les bits ne soient pas assez longs ou trop lents, et que la polarité ne soit pas correcte...

    Merci

Discussions similaires

  1. Question sur une simulation d'un cable DMX 512
    Par invite080d1204 dans le forum Physique
    Réponses: 3
    Dernier message: 17/01/2011, 09h20
  2. Dmx 512
    Par invite68e98c84 dans le forum Électronique
    Réponses: 3
    Dernier message: 13/09/2010, 21h42
  3. dmx 512
    Par invite877a9ba7 dans le forum Électronique
    Réponses: 5
    Dernier message: 13/06/2010, 00h33
  4. Dmx 512
    Par invite0d1cb8a8 dans le forum Électronique
    Réponses: 8
    Dernier message: 17/10/2009, 18h19
  5. demande de documentation pour dmx 512
    Par invite5b2b2d2b dans le forum Électronique
    Réponses: 1
    Dernier message: 24/07/2006, 22h36
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...