Blame view

main.c 4.19 KB
142ecdaf   rguillom   first commit
1
  #include <avr/io.h>		// for the input/output register
db0bdba2   rguillom   boutons+joy OK
2
  #include <util/delay.h>
142ecdaf   rguillom   first commit
3
4
5
  
  // For the serial port
  
01b3f0af   rguillom   PAD.c modif fonct...
6
7
8
9
  #define CPU_FREQ        16000000L   // Assume a CPU frequency of 16Mhz
  #define tempo			25
  #define debit			9600		//débit liaison série en bauds
  #define debut_serial_tx	0xff		//pour détecter la transmission d'une trame pour le 16u2
142ecdaf   rguillom   first commit
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  
  void init_serial(int speed)
  {
  /* Set baud rate */
  UBRR0 = CPU_FREQ/(((unsigned long int)speed)<<4)-1;
  
  /* Enable transmitter & receiver */
  UCSR0B = (1<<TXEN0 | 1<<RXEN0);
  
  /* Set 8 bits character and 1 stop bit */
  UCSR0C = (1<<UCSZ01 | 1<<UCSZ00);
  
  /* Set off UART baud doubler */
  UCSR0A &= ~(1 << U2X0);
  }
  
  void send_serial(unsigned char c)
  {
01b3f0af   rguillom   PAD.c modif fonct...
28
29
  	loop_until_bit_is_set(UCSR0A, UDRE0);
  	UDR0 = c;
142ecdaf   rguillom   first commit
30
31
32
  }
  
  unsigned char get_serial(void) {
01b3f0af   rguillom   PAD.c modif fonct...
33
34
  	loop_until_bit_is_set(UCSR0A, RXC0);
  	return UDR0;
142ecdaf   rguillom   first commit
35
36
37
38
39
40
  }
  
  // For the AD converter
  
  void ad_init(unsigned char channel)   
  {   
01b3f0af   rguillom   PAD.c modif fonct...
41
42
43
44
  	ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);   
  	ADMUX|=(1<<REFS0)|(1<<ADLAR);
  	ADMUX=(ADMUX&0xf0)|channel;   
  	ADCSRA|=(1<<ADEN);
142ecdaf   rguillom   first commit
45
46
47
48
  }   
  
  //récupère la valeur de l'ADCH
  unsigned int ad_sample(void){
01b3f0af   rguillom   PAD.c modif fonct...
49
50
51
  	ADCSRA|=(1<<ADSC);
  	while(bit_is_set(ADCSRA, ADSC));
  	return ADCH;
142ecdaf   rguillom   first commit
52
53
54
55
  }
  
  // For the I/O 
  void output_init(void){
01b3f0af   rguillom   PAD.c modif fonct...
56
  	DDRB |= 0b00111111; // PIN 8-13 as output (LED)
142ecdaf   rguillom   first commit
57
58
  }
  
db0bdba2   rguillom   boutons+joy OK
59
  /*
142ecdaf   rguillom   first commit
60
  void output_set(unsigned char value){
01b3f0af   rguillom   PAD.c modif fonct...
61
  	if(value==0) PORTB &= 0xfe; else PORTB |= 0x01;
142ecdaf   rguillom   first commit
62
  }
db0bdba2   rguillom   boutons+joy OK
63
  */
142ecdaf   rguillom   first commit
64
65
  
  void input_init(void){
db0bdba2   rguillom   boutons+joy OK
66
67
  	DDRD &= 0b10000011;	// PIN 2-6 as input (Bouton Joystick + boutons)
  	PORTD |= 0x7C; // Pull up de 0 à 1
142ecdaf   rguillom   first commit
68
69
  }
  
5e9ff3d3   rguillom   supp comm inutiles
70
  /*
142ecdaf   rguillom   first commit
71
  unsigned char input_get(void){
01b3f0af   rguillom   PAD.c modif fonct...
72
  	return ((PIND&0x04)!=0)?1:0;
142ecdaf   rguillom   first commit
73
  }
5e9ff3d3   rguillom   supp comm inutiles
74
  */
142ecdaf   rguillom   first commit
75
  
48fa7247   rguillom   avancées code + f...
76
  /* Commande des LED */
65705671   rguillom   Début prog
77
78
  void commande_leds(){
  	unsigned char temp_serial, leds;
48fa7247   rguillom   avancées code + f...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  	temp_serial = UDR0;
  	if (temp_serial !=0){
  		leds = temp_serial;
  		// Allumer LED de 'A' à 'F'
  		if (leds == 65) PORTB = PORTB | 0x01; 
  		if (leds == 66) PORTB = PORTB | 0x02;
  		if (leds == 67) PORTB = PORTB | 0x04;
  		if (leds == 68) PORTB = PORTB | 0x08;
  		if (leds == 69) PORTB = PORTB | 0x10;
  		if (leds == 70) PORTB = PORTB | 0x20;
  		
  		// Eteindre LED de 'a' à 'f'
  		if (leds == 97) PORTB = PORTB & 0xfe;
  		if (leds == 98) PORTB = PORTB & 0xfd;
  		if (leds == 99) PORTB = PORTB & 0xfb;
  		if (leds == 100) PORTB = PORTB & 0xf7;
  		if (leds == 101) PORTB = PORTB & 0xef;
  		if (leds == 102) PORTB = PORTB & 0xdf;
  	}
65705671   rguillom   Début prog
98
99
  }
  
48fa7247   rguillom   avancées code + f...
100
  /* Récupération de la valeur des boutons et mise en forme */
db0bdba2   rguillom   boutons+joy OK
101
  unsigned char get_buttons(void){
db0bdba2   rguillom   boutons+joy OK
102
103
104
105
106
107
  	unsigned char boutons = PIND;
  	boutons = boutons >>2;
  	boutons = boutons & 0b00111111;
  	boutons = boutons | 0b00100000;
  	
  	return boutons;
48fa7247   rguillom   avancées code + f...
108
  }
142ecdaf   rguillom   first commit
109
  
48fa7247   rguillom   avancées code + f...
110
  /* Met en forme l'octet de l'axe pos du joystick */
db0bdba2   rguillom   boutons+joy OK
111
  unsigned char shape_joy(unsigned char pos){
5e9ff3d3   rguillom   supp comm inutiles
112
  	pos = pos >>3;	//On récupère les 5 bits de poids forts de l'ADCH (diminuer sensibilité)
db0bdba2   rguillom   boutons+joy OK
113
114
115
  	pos = pos & 0b00111111;
  	pos = pos | 0b00100000;
  	return pos;
48fa7247   rguillom   avancées code + f...
116
  }
65705671   rguillom   Début prog
117
  
48fa7247   rguillom   avancées code + f...
118
  /* Récupération de la valeur de l'axe du joystick sur la chaîne channel du CAN */
db0bdba2   rguillom   boutons+joy OK
119
  unsigned char get_joystick(int channel){
01b3f0af   rguillom   PAD.c modif fonct...
120
121
122
123
124
  	unsigned char axis;
  	ad_init(channel);
  	axis = ad_sample();
  	axis = shape_joy(axis);
  	return axis;
48fa7247   rguillom   avancées code + f...
125
126
127
128
  }
  
  /* Dummy main */
  int main(void){
db0bdba2   rguillom   boutons+joy OK
129
130
  
  	//INITIALISATIONS  
01b3f0af   rguillom   PAD.c modif fonct...
131
132
133
  	unsigned char boutons, boutons_anc;
  	unsigned char joystick_x=0x10, joystick_x_anc=0x10;
  	unsigned char joystick_y=0x10, joystick_y_anc=0x10;
db0bdba2   rguillom   boutons+joy OK
134
    
01b3f0af   rguillom   PAD.c modif fonct...
135
136
137
  	init_serial(debit);
  	output_init();
  	input_init();
48fa7247   rguillom   avancées code + f...
138
139
  
  	//Récupération des valeurs des boutons et joystick, et mise en forme
01b3f0af   rguillom   PAD.c modif fonct...
140
141
142
  	boutons = get_buttons();
  	joystick_x = get_joystick(0);
  	joystick_y = get_joystick(1);
48fa7247   rguillom   avancées code + f...
143
    
01b3f0af   rguillom   PAD.c modif fonct...
144
  	while(1){
48fa7247   rguillom   avancées code + f...
145
146
147
  		boutons_anc = boutons;
  		joystick_x_anc = joystick_x;
  		joystick_y_anc = joystick_y;
142ecdaf   rguillom   first commit
148
      
01b3f0af   rguillom   PAD.c modif fonct...
149
150
151
152
153
  		//Récupération des valeurs des boutons et joystick, et mise en forme
  		boutons = get_buttons();
  		joystick_x = get_joystick(0);
  		_delay_ms(tempo);
  		joystick_y = get_joystick(1);
48fa7247   rguillom   avancées code + f...
154
      	
01b3f0af   rguillom   PAD.c modif fonct...
155
156
157
158
159
160
161
162
163
164
165
166
  		//Port série libre
  		if ((UCSR0A & (1<<RXC0)) == 0){
  			// Si une des grandeurs a changé
  			if ((boutons_anc != boutons) || (joystick_x_anc != joystick_x) || (joystick_y_anc != joystick_y)){
  				/* On envoie la trame des grandeurs */
  				send_serial(debut_serial_tx);	//début de trame
  				send_serial(boutons);			//état global des grandeurs
  				send_serial(joystick_x);
  				send_serial(joystick_y);    	  	
  				//retour chariot
  				send_serial(0x0a);
  				send_serial(0x0d);
db0bdba2   rguillom   boutons+joy OK
167
  			}
db0bdba2   rguillom   boutons+joy OK
168
169
170
  		}
  		
  		//Port série occupé	
48fa7247   rguillom   avancées code + f...
171
  		else{
01b3f0af   rguillom   PAD.c modif fonct...
172
  			commande_leds();	//On gère la commande des leds
48fa7247   rguillom   avancées code + f...
173
  		}
01b3f0af   rguillom   PAD.c modif fonct...
174
  	}  
65705671   rguillom   Début prog
175
  	return 0;
142ecdaf   rguillom   first commit
176
  }
65705671   rguillom   Début prog