41f6cbfd
dmohamed
first commit
|
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
|
#include <avr/io.h> // for the input/output register
#include <util/delay.h>
// For the serial port
#define CPU_FREQ 16000000L // Assume a CPU frequency of 16Mhz
void init_serial(int speed) //initialisation de la liaison série
{
/* 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) //envoyer un carctère sur le port série
{
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = c;
}
unsigned char get_serial(void) //récupérer un caractère envoyé sur le port série
{
loop_until_bit_is_set(UCSR0A, RXC0);
return UDR0;
}
// For the AD converter
void ad_init(unsigned char channel) //channel 0 ou 1
{
ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADMUX|=(1<<REFS0)|(1<<ADLAR);
ADMUX=(ADMUX&0xf0)|channel;
ADCSRA|=(1<<ADEN);
}
unsigned int ad_sample(void) //récupère la valeur de sortie du port de conversion analogique/numérique
{
ADCSRA|=(1<<ADSC);
while(bit_is_set(ADCSRA, ADSC));
return ADCH;
}
// For the I/O
void output_init(void)
{
DDRB |= 0x07; // PIN 8, 9, 10 en sortie
}
void output_set(unsigned char value, unsigned char led) //permet d'allumer et éteindre les led
{
if(led==1)
{
if(value==0) PORTB &= 0xfe; else PORTB |= 0x01;
}
if(led==2)
{
if(value==0) PORTB &= 0xfd; else PORTB |= 0x02;
}
if(led==3)
{
if(value==0) PORTB &= 0xfb; else PORTB |= 0x04;
}
}
void input_init(void)
{
DDRD &= 0xf3; // PIN 2 et 3 en entrée (2 pour le bouton du joystick, 3 pour D3)
PORTD |= 0x0c; // Pull-up activé sur les PIN 2 et 3
}
/*
unsigned char input_get(unsigned char bouton) //récupère et retourne l'état des PIN 2 et 3
{
if(bouton==1) //joystick
{
return ((PIND&0x04)!=0)?1:0;
}
if(bouton==2) //D3
{
return ((PIND&0x08)!=0)?1:0;
}
}
*/
void led(unsigned char led) //permet de faire clignoter la LED dont le numéro est en paramètre
{
output_set(1,led);
_delay_ms(50);
output_set(0,led);
_delay_ms(50);
}
int main(void)
{
output_init(); //initialisation des ports
input_init();
init_serial(9600); //on choisit une vitesse de 9600 bauds pour la transmission série
while(1)
{
// output_set(1,1); //Allumage de la LED 1 qui indique que l'arduino est sous tension
//Gestion de la direction avec le joystick
unsigned char r;
// int i=1;
//ad_init(0); //channel 0 pour gauche et droite
//unsigned int a=ad_sample();
// ad_init(1); //channel 1 pour haut et bas
// unsigned int b=ad_sample();
//send_serial('d'); //on envoie le caractère 'd'
//led(2); //on fait clignoter la 2ème LED quand on envoie
//On récupère un carcatère sur la liaison série.
r=get_serial();
while(r=='a')
{
led(1);
if(r=='z')
{
break;
}
r=get_serial();
}
}
return 0;
}
|