IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Programme en C


Sujet :

Embarqué

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut Programme en C
    Salut a tous ,

    Je suis nouveau sur ce forum , je suis 2 eme année de bts électronique .
    J'ai un gros probleme , je suis pas tres fort en language C et j'aurais besoin d'aide .
    Enfaite les profs nous ont présentés un Theme qui est La mesure d'un banc automobile . Ce thème a été découpé en 4 projets . Ont a pour but de visualiser des signaux circulant entre un moteur et un calculateur . Je dois réaliser le projet numéro 4 qui consiste a :
    recevoir des signaux numérisés du projet 3 à l’aide d’un microcontroleur 8535 la liaison entre le projet 3 et 4 se fait en parallèle .Une fois numérisés les signaux reçus seront transmis à un ordinateur via le programme Labview et pourront être sélectionnés par ce dernier. je dois être aussi
    en mesure d’envoyer au Projet 2 une donnée venant de Labview.En gros faut que je fasse un programme capable de recevoir les données du projet 3 , pour ensuite les transmettre a labview et je dois être capable aussi d'envoyer une trame au projet 2 et 3.


    Merci de votre aide
    Images attachées Images attachées  

  2. #2
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Dis-donc, il est intéressant, ton projet!

    Je le connaissais pas ton FT245, le FIFO qui s'interface entre ton micro et un port USB du PC. En prime, c'est super bien documenté:

    http://www.ftdichip.com/Products/ICs/FT245B.htm

    Je regardais le pdf, ça m'a l'air super simple à interfacer de ton point de vue: 4 signaux de contrôle (RD,WR,TXE,RXF), un port parallèle.

    Pour transmettre un byte:

    1) tu mets le port de donnée en sortie (mode initial: en entrée)
    2) t'attends que TXE soit à 0
    3) t'écris la donnée au port dédié
    4) tu fais passer le signal à WR à "1" puis tu le remets à "0"
    5) tu remets le port de donnée en entrée*

    * faudrait regarder les diagrammes de timing du FIFO, mais je doute qu'un délai soit requis entre 4 et 5.

    Pour recevoir, c'est toujours un peu plus compliqué, parce que tu ne sais pas quand exactement quand tu vas recevoir des données. Il y a le signal de contrôle RXF qui t'indique (avec un 0) que des données ont été reçu. Je ne sais pas où tu en es exactement au niveau de la programmation des microcontrôleurs, mais normalement, le traitement se ferait par interruption.

    J'ai cru comprendre d'après ton plan que tu t'occupes de la consigne qui vient du pc. Ton 8535 semble devoir transmettre par RS-232C des données. La doc du 8535 va te renseigner sur la programmation du USART.

    Ce qui est moins clair, c'est comment ton 8535 communique avec le ATMega48, je demanderais des éclaircissement à ton prof.

    Il y a aussi la gestion des consignes qui mériterait d’être plus détaillée.

    Chose certaine, si on me proposait de réaliser ce projet (moyennant rétribution) je le refuserais, car le cahier des charges est vraiment trop nébuleux.

    Si c'était plus clair, je le ferais peut-être ton projet (moyennant rétribution) , j'ai pas mal de temps libre (je suis cloué chez moi à cause de problèmes de santé, sinon je serais en Orégon en train de faire du windsurf).

    Mais ça me causerait des problèmes d'éthique. Tu sais, nous les profs, on donne des travaux aux étudiants pour qu'ils apprennent. Et on espère bien qu'il vont les faire eux-même.

  3. #3
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Dis-donc, il est intéressant, ton projet!

    Je le connaissais pas ton FT245, le FIFO qui s'interface entre ton micro et un port USB du PC. En prime, c'est super bien documenté:

    http://www.ftdichip.com/Products/ICs/FT245B.htm

    Je regardais le pdf, ça m'a l'air super simple à interfacer de ton point de vue: 4 signaux de contrôle (RD,WR,TXE,RXF), un port parallèle.

    Pour transmettre un byte:

    1) tu mets le port de donnée en sortie (mode initial: en entrée)
    2) t'attends que TXE soit à 0
    3) t'écris la donnée au port dédié
    4) tu fais passer le signal à WR à "1" puis tu le remets à "0"
    5) tu remets le port de donnée en entrée

    Pour recevoir, c'est toujours un peu plus compliqué, parce que tu ne sais pas quand exactement quand tu vas recevoir des données. Il y a le signal de contrôle RXF qui t'indique (avec un 0) que des données ont été reçu. Je ne sais pas où tu en es exactement au niveau de la programmation des microcontrôleurs, mais normalement, le traitement se ferait par interruption.

    J'ai cru comprendre d'après ton plan que tu t'occupes de la consigne qui vient du pc. Ton 8535 semble devoir transmettre par RS-232C des données. La doc du 8535 va te renseigner sur la programmation du USART.

    Ce qui est moins clair, c'est comment ton 8535 communique avec le ATMega48, je demanderais des éclaircissement à ton prof.

    Il y a aussi la gestion des consignes qui mériterait d’être plus détaillée.

    Chose certaine, si on me proposait de réaliser ce projet (moyennant rétribution) je le refuserais, car le cahier des charges est vraiment trop nébuleux.

    Si c'était plus clair, je le ferais peut-être ton projet (moyennant rétribution) , j'ai pas mal de temps libre (je suis cloué chez moi à cause de problèmes de santé, sinon je serais en Orégon en train de faire du windsurf).

    Mais ça me causerait des problèmes d'éthique. Tu sais, nous les profs, on donne des travaux aux étudiants pour qu'ils apprennent. Et on espère bien qu'il vont les faire eux-même.
    Je sais bien... Mais je suis vraiment en difficulté du coté de la programmation . j'ai réussi a faire la schematic ainsi que le typon , ma carte fonctionne car j'ai réussi a envoyé une rampe sur labview par ce programme en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <mega8535.h>
    #include <delay.h>
    
    void main(void)
    {
    DDRA=0x00;
    DDRC=0xFF;              // portC en sortie
    DDRD=0b00010110;         // WR=PD4 et RD=PD5 en sortie 
    PORTD.2=1;              // RD=1 
                 
    while(1)
    {
    /**********************************ENVOI DE DONNEES VERS LABVIEW***********************************/
    
    while(PIND.5==0)       // tant que la mémoire n'est pas pleine, TXE=0
    {
    PORTD.4=0;              // WR=0
    PORTD.4=1;              // WR=1 	
    	
    PORTC=PORTC+1;
    
    if  (PORTC==100)  // pour changer l'amplitude  (changer le seuil de déclenchement sur Labview)
    PORTC=0;
    
    delay_us(20);
    PORTD.4=0;              // données écrites sur front descendant de WR  
    delay_us(20);            }
    }
    }

    j'ai vraiment besoin d'aide , je ne comprends pas plusieurs choses dont l'envoie de la trame au projet 2 et 1 comment dois je faire intervenir ca dans mon programme ? Sous quelle forme ? La liaison entre le projet 3 et 4 se fait en liaison parallele . 8 bits de données + 3 bits de controle : Ok', Voie1' , Voie2'. Le ok' se met a 1 quand on recoit le signal , les voies 1 et 2 nous disent le signal qui nous ai envoyé par le projet 3 .
    Images attachées Images attachées  

  4. #4
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut
    Voila j'ai fais ce programme et je voulais savoir ce qui allait et ce qui n'allait pas ? Comment marche une interruption ? Faut il la lancer a partir de la boucle while ? Ou elle se lance toute seule si INT1 détecte un front montant ? Est ce que je suis dans le vrai ou mon programme ne va pas du tout ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <mega8535.h>
    #define ok PORTD.3
    #define voie1 PORTB.0
    #define voie2 PORTB.1
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    if(ok==1)  // des qu'une donnée va etre dispo Ok=1
    voie1=0;
    voie2=0;
    delay_us(1);
    PORTC=PINA; Envoi du PortA vers PortC
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    DDRA=0x00; // PortA en entrée
    DDRB=0b00111111;   //Miso , Mosi , Sck en sortie , Voie1 et Voie2 en entrée
    DDRC=0xFF; // PortC en sortie
    PORTD.2=1; // RD=1
    DDRD=0b00001100;//WR=PD4 et RD=PD5 en sortie , ok'=PD3 en entrée
    PORTD.4=1 // WR=1
    MCUCR=0b11000000; //Bits ISC00 et ISCO1 a 1 pour que INT1 demande une interruption lors d'un front montant
    GICR=0b00000010;  //Autorise le micro a appeler la fonction d'interruption a chaque fois que celle-ci est detecté
    
    TIMSK=0x01;
    ACSR=0x80;
    
    
    
    // Global enable interrupts
    #asm("sei")
    
    while (PIND.5==0) // tant que la memoire n'est pas pleine , TXE=0
          {
          PORTD.4=0 // WR=0 
          PORTD.4=1 // WR=1
          PORTC=PINA
          delay_us(20);
          PORTD.4=0; // données ecrites sur front descendant de WR
           
          
          
    
          }
    }
    Merci de votre aide

  5. #5
    Membre Expert

    Homme Profil pro
    .
    Inscrit en
    Janvier 2006
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Janvier 2006
    Messages : 703
    Par défaut
    Rouk06> J'ai édité tes messages, essaie d'utiliser à l'avenir les balises CODE quand tu copie/colle du code, c'est plus lisible pour nous.

  6. #6
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut
    Citation Envoyé par Aquanum Voir le message
    Rouk06> J'ai édité tes messages, essaie d'utiliser à l'avenir les balises CODE quand tu copie/colle du code, c'est plus lisible pour nous.
    Ok merci

  7. #7
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Citation Envoyé par Rouk06 Voir le message
    Voila j'ai fais ce programme et je voulais savoir ce qui allait et ce qui n'allait pas ? Comment marche une interruption ? Faut il la lancer a partir de la boucle while ? Ou elle se lance toute seule si INT1 détecte un front montant ? Est ce que je suis dans le vrai ou mon programme ne va pas du tout ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <mega8535.h>
    #define ok PORTD.3
    #define voie1 PORTB.0
    #define voie2 PORTB.1
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    if(ok==1)  // des qu'une donnée va etre dispo Ok=1
    voie1=0;
    voie2=0;
    delay_us(1);
    PORTC=PINA; Envoi du PortA vers PortC
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    DDRA=0x00; // PortA en entrée
    DDRB=0b00111111;   //Miso , Mosi , Sck en sortie , Voie1 et Voie2 en entrée
    DDRC=0xFF; // PortC en sortie
    PORTD.2=1; // RD=1
    DDRD=0b00001100;//WR=PD4 et RD=PD5 en sortie , ok'=PD3 en entrée
    PORTD.4=1 // WR=1
    MCUCR=0b11000000; //Bits ISC00 et ISCO1 a 1 pour que INT1 demande une interruption lors d'un front montant
    GICR=0b00000010;  //Autorise le micro a appeler la fonction d'interruption a chaque fois que celle-ci est detecté
    
    TIMSK=0x01;
    ACSR=0x80;
    
    
    
    // Global enable interrupts
    #asm("sei")
    
    while (PIND.5==0) // tant que la memoire n'est pas pleine , TXE=0
          {
          PORTD.4=0 // WR=0 
          PORTD.4=1 // WR=1
          PORTC=PINA
          delay_us(20);
          PORTD.4=0; // données ecrites sur front descendant de WR
           
          
          
    
          }
    }
    Merci de votre aide
    Là, c'est mieux tu commences à être un peu plus spécifique avec tes questions.

    Une fonction d'interruption va être appelée automatiquement lorsque l’événement associé à l'interruption se produit: un changement de niveau sur une broche, un débordement de Timer, une conversion numérique complétée...L'adresse de la prochaine instruction sera mémorisée, les interruptions seront dévalidées, la fonction d'interruption sera exécutée, puis le système d'interruption sera revalidé automatiquement au retour à l’adresse mémorisée.

    Pour que la fonction d'interruption soit appelée, il faudra que tu valides dans l'initialisation de ton programme les sources d'interruptions, puis valider le système d'interruption via l'instruction "sei" comme tu le fais.

    Ce que je trouve curieux dans ton code, c'est que ta fonction d'interruption est associée au débordement du Timer0, alors que tu parles d'interruption sur front montant INT1.

    Aussi, il y a le "if" qui cloche probablement, parce que tel que tu l'as écrit, ça correspond à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
       if(ok==1)  // des qu'une donnée va etre dispo Ok=1
       {
          voie1=0;
       }
      voie2=0;
      delay_us(1);
      PORTC=PINA; Envoi du PortA vers PortC
    }
    Je ne suis pas certain, mais il me semble que c'est plutôt ça que tu veux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
       if(ok==1)  // des qu'une donnée va etre dispo Ok=1
       {
          voie1=0;
          voie2=0;
          delay_us(1);
         PORTC=PINA; //Envoi du PortA vers PortC
       }
    }

  8. #8
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Là, c'est mieux tu commences à être un peu plus spécifique avec tes questions.

    Une fonction d'interruption va être appelée automatiquement lorsque l’événement associé à l'interruption se produit: un changement de niveau sur une broche, un débordement de Timer, une conversion numérique complétée...L'adresse de la prochaine instruction sera mémorisée, les interruptions seront dévalidées, la fonction d'interruption sera exécutée, puis le système d'interruption sera revalidé automatiquement au retour à l’adresse mémorisée.

    Pour que la fonction d'interruption soit appelée, il faudra que tu valides dans l'initialisation de ton programme les sources d'interruptions, puis valider le système d'interruption via l'instruction "sei" comme tu le fais.

    Ce que je trouve curieux dans ton code, c'est que ta fonction d'interruption est associée au débordement du Timer0, alors que tu parles d'interruption sur front montant INT1.

    Aussi, il y a le "if" qui cloche probablement, parce que tel que tu l'as écrit, ça correspond à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
       if(ok==1)  // des qu'une donnée va etre dispo Ok=1
       {
          voie1=0;
       }
      voie2=0;
      delay_us(1);
      PORTC=PINA; Envoi du PortA vers PortC
    }
    Je ne suis pas certain, mais il me semble que c'est plutôt ça que tu veux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
       if(ok==1)  // des qu'une donnée va etre dispo Ok=1
       {
          voie1=0;
          voie2=0;
          delay_us(1);
         PORTC=PINA; //Envoi du PortA vers PortC
       }
    }

    Exacte je me suis planté pour le timer 0 et INT1 . Et ce que j'ai mis dans la boucle while c'est bon ? J'aimerai faire un programme qui soit capable de recevoir des données du projet 3 (je communique en liaison parallele avec le projet 3 , 8 bits de données et 3 bits de controles qui sont : Ok',Voie1',Voie2') pour ensuite les envoyer a labview en faisant PORTC-PINA . Et apres il faut que mon programme soit capable de renvoyer une trame au projet 1 et 2 .
    J'ai vraiment du mal avec la structure du langage C .

    Merci pour votre aide

    Enfaite je dois faire ceci mais difficile de l'expliquer :
    Images attachées Images attachées  

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo