Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C > Liaison série > Lecture du sujet

Liaison série

sur µC rabbit2000

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Orochi # Posté le 03/05/2008 à 16:59:46
Avatar
Groupe : Membres
Bonjour à tous,

Je suis actuellement en train de travailler sur un projet dans le cadre des études, il s'agit de faire communiquer deux cibles à base de µC (le rabbit200) par liaison série, le but étant de s'envoyer des messages par l'intermédiaire d'un clavier matriciel et d'un petit afficheur LCD (mais nous utilisons également le fenêtre de débug de l'IDE (dynamic C) en attendant de mettre tous les massages sur le LCD)

Nous avons réussi à coder ce programme et les messages (sous forme de nombres) se transmettent bien, voici le code:

Secret (cliquez pour afficher)
Code : C
  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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#define HICONFIG  	 	0x0000
#define FUNCTION_SET    	0x38
#define DISPLAY_CLEAR   	0x01
#define ENTRY_MODE_SET  	0x06
#define DISPLAY_ON      	0x0E
#define DISPLAY_OFF     	0x08
#define CURSOR_HOME     	0x02
#define RS              	8
#define EN              	9
#define MASK			0x01
#define TAILLE			100

void COM_PutChar(char c);
void LCD_Init(void);
void LCD_Control(char cmd);
void OutPortByte(char b);
void LCD_Putchar(char c);
void LCD_Puts(char *s);
void LCD_clear(void) ;
char KeyBoard_Scan(void);
void msDelay(unsigned long duration);
void COM_Init(int bauds);
void COM_Puts(char *s);
void COM_GetS(char *ch, char delimiteur, int taille);
char COM_GetChar(void);
void reception(void);
void emission(void);

int main(void)
{
    char c;

    brdInit();
    digOutConfig(HICONFIG);
    COM_Init(2400);

    do
    {
        LCD_Init();
	    printf("veuillez choisir le mode emission-reception\n(1)emission\n(2)reception\n\n");
        do
            c = KeyBoard_Scan();
        while(c!='1' && c!='2');
        if(c == '1')
            emission();
        if(c == '2')
            reception();
    }while(1);

    return 0;
}

void LCD_Init(void)
{
    LCD_Control(FUNCTION_SET);
    LCD_Control(FUNCTION_SET);
    LCD_Control(FUNCTION_SET);
    LCD_Control(DISPLAY_ON);
    LCD_Control(DISPLAY_CLEAR);
    LCD_Control(ENTRY_MODE_SET);
}

void LCD_Control(char cmd)
{
    digOut(RS,0);
    digOut(EN,1);
    msDelay(1);
    OutPortByte(cmd);
    msDelay(1);
    digOut(EN,0);
}

void OutPortByte(char b)
{
    int i;
    char bit;
    for(i=0; i<8 ; i++)
    {
   	bit = b & MASK ;
        digOut(i,bit);
        b = b>>1;
    }
}

void LCD_Putchar(char c)
{
    digOut(RS,1);
    digOut(EN,1);
    msDelay(1);
    OutPortByte(c);
    msDelay(1);
    digOut(EN,0);
}

void COM_Puts(char *s)
{
    do
        COM_PutChar(*s++);
    while(*s);
    COM_PutChar('\0');
}

void LCD_clear(void)
{
    LCD_Control(DISPLAY_CLEAR);
    msDelay(1000);
    LCD_Control(CURSOR_HOME);
}

void msDelay(unsigned long duration)
{
    unsigned long t;
    t = MS_TIMER+duration;
    while ((long)(MS_TIMER-t)<0)
        ;
}

char KeyBoard_Scan(void)
{
    char tp, liste_touches[13];
    int i, it, j, test;
    strcpy(liste_touches, "123456789*0#");
    do
    {
        for (i=0; i<4; i++)
        {
   	    for (j=0; j<4; j++)
      	    digOut(j,1);
            digOut(i,0);
            msDelay(1);
            for (j=0; j<3; j++)
            {
      	        test = digIn(j);
                if (test == 0)
                {
                    it = i*3+j;
                    tp = liste_touches[it];
                    while (!digIn(j))
                        ;
                    return tp;
                }
            }
        }
        digOut(i,1);
    }while(1);
}

void COM_PutChar(char c)
{
    int test;
    do
        test = serCputc(c);
    while (test != 1);
}

char COM_GetChar(void)
{
    int c;
    do
    {
     	c = serCgetc();
    }
    while(c == -1);
    return (char)c;
}

void COM_Init(int bauds)
{
    int test1, test2;
    do
        test1 = serCopen(bauds);
    while (test1 != 1);
    do
        test2 = serMode(0);
    while (test2 != 0);
    serCparity(0x01);
    serCdatabits(0x01);
}

void COM_GetS(char *ch, char delimiteur, int taille)
{
    int i, c;
    i = 0;
    do
    {
        c = COM_GetChar();
        if (c != delimiteur)
            ch[i++] = c;
    }while (c != delimiteur && i < taille);
    ch[i] = '\0';
}

void reception(void)
{
    char tab1[TAILLE];
    strcpy(tab1, "");

    COM_GetS(tab1, '\0', TAILLE);

    printf("                                        \r"); /* pour effacer l'ecran */
    printf("Voici le nombre recu >>  %s\n\n", tab1);

}

void emission(void)
{
    char go, c, tab[TAILLE];
    int i;
    i=0;
    go=0;

    printf("Saisir nombre et terminer par #\r");

    while (c != '#')
    {
       	c = KeyBoard_Scan();
       	LCD_Putchar(c);
        tab[i++] = c;
    }
    tab[--i]='\0';
	i=0;

    printf("                                        \r"); /* pour effacer l'ecran */
    printf("Nombre envoye >>  ");
    while (tab[i] != '\0') 
        putchar(tab[i++]);  //*/
    printf("\n\n");
    COM_Puts(tab);

    msDelay(20);
}


Le code offre quelques particularités dues au fait que le compilateur n'est pas ANSI-C (en fait il est vraiment moisi mais c'est un autre débat):
- Il est impossible d'initialiser les variables en même temps que leurs déclaration.
- A certains endroits il y a des Delay() pour que ça fonctionne (ne me demandez pas pourquoi ça fonctionne pas sans).

voici les fonctions "offertes" par dynamic-C:
- brdInit() & digOutConfig() servent à initialiser la carte.
- digOut() et digIn() servent à recevoir et envoyer des bits sur le port parallèle pour le controle du clavier matriciel et de l'afficheur LCD.
- serCputc() & serCgetc() envoient et reçoivent un char sur le port série C (de la carte du µC).
- serCopen() & serMode() servent à initialiser le port série (avec définition de la parité de contrôle).

voila, je pense que vous avec toutes les infos pour comprendre le code et j'aimerais donc que vous critiquiez mon code le plus possible dans le but de m'aider à l'améliorer :)

Merci d'avance.
Hors ligne Orochi # Posté le 04/05/2008 à 20:58:38
Avatar
Groupe : Membres
SVP, j'aimerais juste des conseils de codage, de structuration ou de bonnes habitudes à prendre.
Merci.
Édité le 04/05/2008 à 21:00:59 par Orochi

Retour au forum "Langage C" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 296 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0913s (0.0723s)