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

C Discussion :

Programmation en C


Sujet :

C

  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 Programmation en C
    Bonjour ,

    Voila j'essaye de progresser en Langage C pour être au point pour ma licence pro l'année prochaine , le prof nous avait donner un projet a faire qui était de recevoir des données numérises du projet 3 et de les renvoyer par usb a un ordinateur portable sur le logiciel Delphi et il fallait aussi envoyer une trame a un autre projet . J'ai réalise un programme pas assez complet mon prof ma filé le sien en me disant qu'il fallait comprendre celui la afin d’être bien au point et je n'y parviens pas . J'ai bien compris tous les registres MCUCR , GICR etc ... mais le programme en lui même non , je comprends bien que il a une interruption sur front montant a chaque fois que le projet 3 m'envoie une donnée et je comprends aussi que les interruptions se bloquent pour lancer le programme principal . Mais j'arrive pas a voir ce que fais le programme principal et l'interruption. Je vous post le programme ainsi que sa schématique si quelqu'un serait me l'expliquer . 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include <mega8535.h>
    #include <delay.h>
    #include <stdio.h>    
     
    #define okp PIND.3
    #define voie1p PORTB.0
    #define voie2p PINB.1
    #define rd_b PORTD.2     // rd_barre
    #define wr PORTD.4
    #define txe PIND.5
    #define rxf_b PIND.0     // rxf_barre : si =0 alors données à lire dans UM245
    #define test PORTD.7
     
    #define tempo 10
     
    unsigned char cpt_interrupt,data,voie,adresse1,adresse2;
    unsigned char tab[6];
     
    // External Interrupt 1 service routine
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    // Reception d'une donnée du projet 3  (front montant)
    //test=1;
    if (PINA==255) {cpt_interrupt=1;} else {tab[cpt_interrupt]=PINA; cpt_interrupt++;}
    if (cpt_interrupt==5) {DDRC=0xFF;
                           PORTC=255; wr=1;wr=0;
                           PORTC=tab[1];wr=1;wr=0;
                           PORTC=tab[2];wr=1;wr=0;
                           PORTC=tab[3];wr=1;wr=0;
                           PORTC=tab[4];wr=1;wr=0;
                          }
    //test=0;                      
    }
     
    void main(void)
    {
    // Port A : en entrée
    PORTA=0x00;DDRA=0x00;
     
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=Out 
    PORTB=0x00; DDRB=0xF9; // ob11111001
     
    // Port C en entrée
    PORTC=0x00; DDRC=0x00;
     
    // Port D initialization
    // Func7=Out Func6=In Func5=In Func4=Out Func3=In Func2=Out Func1=Out Func0=In 
    // State7=T State6=T State5=T State4=0 State3=T State2=0 State1=0 State0=T 
    PORTD=0x00;
    DDRD=0x96; // 0b01100000
     
    // External Interrupt(s) initialization
    // INT0: Off - // INT1: On - // INT1 Mode: Rising Edge - // INT2: Off
    GICR|=0x80; MCUCR=0x0C;MCUCSR=0x00;GIFR=0x80;
     
     
    // USART Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off - // USART Transmitter: On
    // USART Mode: Asynchronous - // USART Baud rate: 2400
    UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x01; UBRRL=0xA0;
     
    // Global enable interrupts
    #asm("sei")
     
    // Initialiasations
    rd_b=1;
    wr=0;
    adresse1=0;
    adresse2=15;
    delay_ms(1000);
    cpt_interrupt=0;
    test=0;
     
    while (1)
          {
        // Reception des données du PC vers Projet      
        if (rxf_b==0)
        { // if rxf==0
          #asm("cli")
          DDRC=0x00;
          rd_b=0; rd_b=0; data=PINC; delay_us(10); rd_b=1;delay_us(10);  // Reception entete = 170
          if (data==170) 
             { // if 170
             rd_b=0; rd_b=0; voie=PINC; delay_us(10); rd_b=1;delay_us(10);
             rd_b=0; rd_b=0; adresse1=PINC; delay_us(10); rd_b=1;delay_us(10);
             rd_b=0; rd_b=0; adresse2=PINC; delay_us(10); rd_b=1;delay_us(10);
             rd_b=0; rd_b=0; data=PINC; delay_us(10); rd_b=1;delay_us(10);
             if (data==225) 
                 { // if data==225
                 // Ecriture vers Projet 1
                 UDR=170;  // envoi entete
                 delay_ms(tempo);
                 UDR=voie;    // envoi N° de la voie (voie N°1)
                 delay_ms(tempo);
                 UDR=adresse1;    // envoi adresse N°1
                 delay_ms(tempo);      
                 UDR=adresse2;    // envoi adresse N°2
                 delay_ms(tempo);
                 UDR=225;    // envoi fin de trame
                 delay_ms(tempo);
                 #asm("sei")
                 }  // if data==225
             } // if 170
        } // if rxf==0
       };  // while(1)
    } // end final
    Images attachées Images attachées  

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Je pense que ton programme va recevoir des données A, il va donc les lire puis il va renvoyer des données extraite des données A.

    Par contre je ne vois pas l'utilité de ceci :
    Après c'est de la programmation bas niveau, je suis sûr qu'un membre plus qualifié que moi viendra te répondre.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    salut,

    Difficile de bien t'aider sans savoir comment fonctionne les CI auxquels ton système est connecté. Le programme est relativement simple mais il faut que tu lise les datasheets des CI pour savoir ce qu'il attendent...

    j'ai commenter ton code en espérant que ça t'aide :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    // *************************************************************
    // *************************************************************
    // *************************************************************
    // gestion interruption
     
    // c'est quoi PINA ???
    // => la fonction s'initialise lorsque PINA = 255 (cpt_interrupt = 1) 
    //    sinon, elle recupère régulièrement les valeurs de PINA dans le tableau 'tab' : ça echantillone PINA
    // => pourquoi cpt_interrupt est initialisé à 1 et non pas à 0 => il y a quoi dans tab[0] ?... je pense qu'il y a un problème dans le programme tab[0] n'est jamais utilisé
    if (PINA==255) {
    	cpt_interrupt=1;
    } else {
    	tab[cpt_interrupt]=PINA; 
    	cpt_interrupt++;
    }
     
    // toutes les 5 intérruptions, les valeurs de 'tab' sont envoyées vers le port C
    // 1- on met la valeur a envoyer sur PORTC
    // 2- on génère une implusion pour que le CI connecté au port C sache quand récupérer les données
    if (cpt_interrupt==5){
    	DDRC=0xFF;
    	PORTC=255; 
    	wr=1;wr=0; // génération d'une impulsion
    	PORTC=tab[1];wr=1;wr=0;
    	PORTC=tab[2];wr=1;wr=0;
    	PORTC=tab[3];wr=1;wr=0;
    	PORTC=tab[4];wr=1;wr=0;
    }
     
     
     
    // *************************************************************
    // *************************************************************
    // *************************************************************
    // main
     
    while (1){
     
    	// Reception des données du PC vers Projet      
    	if (rxf_b==0){ // if rxf==0
    		#asm("cli")
    		DDRC=0x00;
     
    		rd_b=0; rd_b=0; data=PINC; delay_us(10); rd_b=1;delay_us(10);  // Reception entete = 170
    		// a priori, il faut mettre rd_b = 0 (front descendant) pour pouvoir récupérer les données dans data (qui proviennent de PINC)
    		// => je pense qu'on met rd_b=0 pour dire au CI qui est en face d'envoyer les données (à confirmer) puis on refait rd_b=0, 
    		//    pour etre sure que le CI est eu le temps de modifier l'etat de ces sorties
     
    		if (data==170){ // if 170
    			// début de la trame detectée (data = 170)
     
    			// récupération des données de la trame
    			rd_b=0; rd_b=0; voie=PINC; delay_us(10); rd_b=1;delay_us(10);
    			rd_b=0; rd_b=0; adresse1=PINC; delay_us(10); rd_b=1;delay_us(10);
    			rd_b=0; rd_b=0; adresse2=PINC; delay_us(10); rd_b=1;delay_us(10);
    			rd_b=0; rd_b=0; data=PINC; delay_us(10); rd_b=1;delay_us(10);
     
    			if (data==225){ // if data==225
    				// Ecriture vers Projet 1
    				UDR=170;  // envoi entete
    				delay_ms(tempo);
    				UDR=voie;    // envoi N° de la voie (voie N°1)
    				delay_ms(tempo);
    				UDR=adresse1;    // envoi adresse N°1
    				delay_ms(tempo);      
    				UDR=adresse2;    // envoi adresse N°2
    				delay_ms(tempo);
    				UDR=225;    // envoi fin de trame
    				delay_ms(tempo);
    				#asm("sei")
    			}  // if data==225
    		} // if 170
    	} // if rxf==0
     
    };  // while(1)

  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
    Salut ,

    Merci pour ton aide sur mon sujet . Le PINA ce sont des données numérisés reçu par le projet numero 3 .

    Je comprends pas bien une ligne dans le programme :
    rd_b=0;
    rd_b=0;
    voie=PINC;
    delay_us(10);
    rd_b=1;
    delay_us(10);

    Pourquoi mettons rd_b 2 fois d'affilé a 0 .
    Et que veut dire voie=PINC , ca veut dire que les données du PINC vont dans voie. Mais c'est quoi voie ?
    Je comprends pas l'écriture unsigned voie , on declare la variable voie je pense mais je vois pas l'intérêt ?

    Dernière question c'est quoi UDR ? un registre ?

    Merci de votre aide si vous ne pouvez pas répondre je comprendrais . En tout cas merci pour tout .

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Citation Envoyé par Rouk06 Voir le message
    Je comprends pas bien une ligne dans le programme :
    rd_b=0;
    rd_b=0;
    voie=PINC;
    delay_us(10);
    rd_b=1;
    delay_us(10);

    Pourquoi mettons rd_b 2 fois d'affilé a 0 .
    Je pense que rd_b est une sortie qui indique que tu veux lire les données de PINC lorsqu'il est à 0. Donc le système qui est en face envoie ses données lorsqu'il détecte que rd_b=0. Si tu récupères les valeurs juste après avoir mis rd_b à 0, le système qui est en face risque de ne pas avoir eu le temps de mettre ses sorties aux bons niveaux : je pense donc que le second (rd_b=0) sert juste à faire une petite tempo (ou une erreur de copier/coller ?).
    Je pense qu'il serait mieux d'écrire ton programme comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    rd_b=0;
    delay_us(10); 
    voie=PINC; 
    rd_b=1;
    delay_us(10);
    Tout ceci n'est que spéculation car je ne sais pas exactement comment fonctionne ton système (sans plus d'informations sur la manière qu'utilisent tes différents CI, pour communiquer entre eux je ne pourrais pas t'aider plus => chronogrammes).
    C'est ton prof qui a codé ça ? ... car je trouve que ce n'est pas très clean comme code XD





    ----------------------------------------
    Citation Envoyé par Rouk06 Voir le message
    Et que veut dire voie=PINC , ca veut dire que les données du PINC vont dans voie. Mais c'est quoi voie ?
    Je comprends pas l'écriture unsigned voie , on declare la variable voie je pense mais je vois pas l'intérêt ?
    voie est une variable codée sur 8 bits. Voir le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char cpt_interrupt,data,voie,adresse1,adresse2;
    elle sert a stocker l'état de PINC à un moment donné pour pouvoir le renvoyer vers ton projet 1.





    ---------------------------------------
    Citation Envoyé par Rouk06 Voir le message
    Dernière question c'est quoi UDR ? un registre ?
    A toi de me le dire....je pense que c'est un registre qui est déclaré dans un fichier .h livré avec ton compilo vu que je ne vois pas sa déclaration dans ton code. Je pense qu'il doit permettre d'envoyer des données sur un périphérique ou un port.

  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
    Oki voila le chronogramme du CI .
    Images attachées Images attachées  

  7. #7
    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
    if (PINA==255) {
    cpt_interrupt=1;
    } else {
    tab[cpt_interrupt]=PINA;
    cpt_interrupt++;
    }

    Ca veut dire que :
    Si le PINA = 255 le compteur =1
    si ce n'est pas egal a 255 elle recupere les valeurs de PINA dans le tableauet le compteur s'incremente de 1

    ou est ce que ca veut dire :

    Si le PINA = 255 le compteur =1
    alors elle recupere les valeurs de PINA dans le tableau et le compteur s'incremente de 1

    Je suis perdu je comprends pas ça .

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Le site comporte plein de tuto, je te conseille de lire au moins les bases :
    http://c.developpez.com/cours/poly-c...age_3#LIII-B-4

    C'est normal qu'il y a des tempo de 10µs alors que le bus est prévu pour tourner avec des valeurs en ns ?

    pour la gestion d'interruption, je ferais un truc du genre (ça ressemblera plus à ton chronogramme. De plus le code que tu as mis a potentiellement un risque de bug) :
    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
    50
    51
    52
    53
    54
    55
     
    #define wr PORTD.4
     
    // pour faire une tempo
    #define CUSTOM_TEMPO() nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
    // => nop() : fonction qui ne fait rien
    // => nombre de nop() à definir suivant la vitesse du bus
     
     
    static unsigned char cpt_interrupt;
    static unsigned char tab[5];
     
     
    // External Interrupt 1 service routine
    // => forme de la trame : commence par 0xFF suivit de 4 octets de donnée
    interrupt [EXT_INT1] void ext_int1_isr(void){
     
    	// il ne faut pas désactiver l'interruption le temps de traiter le code ?
     
     
    	if (PINA == 0xFF) { // 0xFF = 255
    		cpt_interrupt=0;
    	}
     
    	if(cpt_interrupt < 5){
    		tab[cpt_interrupt]=PINA; 
    		cpt_interrupt++;
    	}
     
    	if (cpt_interrupt==5){
    		// envoie des données vers un autre système
     
    		DDRC=0xFF; // c'est quoi ? un registre , un port ? ça sert à quoi ?
     
    		int i;
    		for(i=0; i<cpt_interrupt; i++){
     
    			wr=1;
    			CUSTOM_TEMPO();
     
    			PORTC = tab[i];
    			CUSTOM_TEMPO();
     
    			// génération du front descendant
    			// => le système qui est en face échantillonne le signal sur front descendant 
    			wr=0; 
    			CUSTOM_TEMPO();CUSTOM_TEMPO();
    		}
    		cpt_interrupt++;
    	}
     
    	// il n'y a pas besoin de réinitialiser le flag d'interruption ? ... je suis quasiment sure qu'il faut le faire...
     
     
    }
    => tu as une carte de test pour tester ton programme (commence par faire fonctionner un périphérique à la fois) ?

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