bonjour a tous,
j'ai encore des problèmes avec mon programme mais plutôt que de faire un "fourre tout" de mon premier topic j'en créer un nouveau

pour rappel voici mon code
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
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
/* Bibliothèque utilisée */
 
#include <avr/io.h>
#include <avr/interrupt.h>
 
/* Définition des variables d'entrées */
 
#define Aucun_Capteur					(0x00)
#define Capteur_Fin_Course_Contact_1	(0x01)
#define Capteur_Fin_Course_Conact_6		(0x02)
#define Capteur_Ir_2					(0x04)
#define Capteur_Ir_3					(0x08)
#define Capteur_Ir_4					(0x10)
#define Capteur_Ir_5					(0x20)
#define BAUD 9600 // vitesse du port série --> 9600bit/s
#define UCR 							(0x18)//reglage port série
#define UBRR 25//idem
/* Définitions des variables de sorties */
 
#define Aucun_Moteur					(0x00)
#define Marche_Arret_Moteur				(0x01)
#define Sens_Rotation_Moteur			(0x02)
#define Marche_Et_Sens					(0x04)
 
/* Fonction d'initialisation des périphériques   */  
unsigned char COMMANDE_PC; //variable contenant la valeur du port série
 
void Init_Periph(void)
{
	PORTA= 0x00; 	
	DDRA= 0xFF;
	PORTB= 0xFF;
	DDRC= 0x00;
}
 
/* ************************************************* */
/*                Programme Commande PC              */
/* ************************************************* */
   char a=2;
   void recoit_commande_pc(void)
   {
 	 if((USR & 0x80) == 0x80)         //Si une donnée vient d'arriver...
     {
      COMMANDE_PC = UDR;      //Sauvegarde donnée reçue
      USR = 0x80;                            //RAZ bit RXC
     }
     else
     {
      COMMANDE_PC = 0x00;       //Si pas de donnée reçue "00" servira signaler au programme principal que il n'y a rien à faire.
     }
   }	
 
/* ************************************************* */
/*                Programme A		                 */
/* ************************************************* */
void programme_A(void)
{
	if((Capteur_Fin_Course_Contact_1 & 0x01)== 0x01)
	{
	PORTB = Marche_Arret_Moteur;			/*mise en marche moteur*/
	}
 
	if((Capteur_Ir_2 & 0x04) == 0x04)
	{
	PORTB = Aucun_Moteur;
	}
}
 
 
/* ************************************************* */
/*                Programme B		                 */
/* ************************************************* */
void programme_B(void)
{
	if((Capteur_Fin_Course_Contact_1 & 0x01)== 0x01)
	{
	PORTB = Marche_Arret_Moteur;			/*mise en marche moteur*/
	}
 
	if((Capteur_Ir_3 & 0x08) == 0x08)
	{
	PORTB = Aucun_Moteur;
	}
 
}
 
/* ************************************************* */
/*                Programme C		                 */
/* ************************************************* */
void programme_C(void)
{
	if((Capteur_Fin_Course_Contact_1 & 0x01)== 0x01)
	{
	PORTB = Marche_Arret_Moteur;			/*mise en marche moteur*/
	}
 
	if((Capteur_Ir_4 & 0x10) == 0x10)
	{
	PORTB = Aucun_Moteur;
	}
 
}
 
/* ************************************************* */
/*                Programme D		                 */
/* ************************************************* */
void programme_D(void)
{
	if((Capteur_Fin_Course_Contact_1 & 0x01)== 0x01)
	{
	PORTB = Marche_Arret_Moteur;			/*mise en marche moteur*/
	}
 
	if((Capteur_Ir_5 & 0x20) == 0x20)
	{
	PORTB = Aucun_Moteur;
	}
 
}
/* ************************************************* */
/*                Programme principale               */
/* ************************************************* */
 
int main(void)
{
Init_Periph();
//char a=2;
	while(1)
	{
		recoit_commande_pc();
		if(COMMANDE_PC == 0x30)/*mémoire tampon rs232*/
		{
		programme_A();
		}
 
		if(COMMANDE_PC == 0x31) /*mémoire tampon rs232*/
		{
		programme_B();
		}
		if(COMMANDE_PC == 0x38)/*mémoire tampon rs232*/
		{
		programme_C();
		}
		if(COMMANDE_PC == 0x20)/*mémoire tampon rs232*/
		{
		programme_D();
		}
		if(COMMANDE_PC == 0x00)
		{
		main();
		} 
 
	}		/*fin du while(1) */
 
}			/* fin du main*/
je code sous AVR Studio pour un µC AT90S8535 disposait sur une STK-200 (ces infos servent a rien mais je les donne quand même )
mon problème se situe au niveau de la liaison série.
Le programme compile bien (grâce a vous merci!) mais quand je l'exécute est teste le tout la variable "COMMANDE_PC" ne prends pas la valeur du port série.
Je m'explique : pour que la variable prenne vraiment sa valeur il faut que "l'USR" passe a 0x80 mais, a chaque fois le bit n°5 se "réactive" tout seul ce bit correspond à "UART data register empty" une idée du pourquoi se rebelle revient tout seul?