Commit 686fbdf053cff08478d10bdf4914936b304f683c
1 parent
e742bccc
UPDATE - Mise à jour des fonctions utiles ou non dans le fichier Moteur.c
Mise en place des fonctions de gestion de led, gestion de moteur (utilisation d'une PWM) Fonctions testées sur un terminal serie, en fonction de la commande envoyé on peut désormais : - allumer une led - eteindre une led - faire tourner le moteur vers la droite - faire tourner le moteur vers la gauche - stopper le moteur
Showing
1 changed file
with
78 additions
and
114 deletions
Show diff stats
Moteur/Moteur.c
1 | -#include <avr/io.h> // for the input/output register | |
1 | +#include <avr/io.h> | |
2 | 2 | #include <util/delay.h> |
3 | - | |
4 | -// For the serial port | |
5 | - | |
6 | -#define CPU_FREQ 16000000L // Assume a CPU frequency of 16Mhz | |
7 | - | |
8 | -void init_serial(int speed) //initialisation de la liaison série | |
3 | +#include "serial.h" | |
4 | +#include <avr/interrupt.h> | |
5 | + | |
6 | +#define LED_ON 0x01 | |
7 | +#define LED_OFF 0x02 | |
8 | +#define MOVE_RIGHT 0x04 | |
9 | +#define MOVE_LEFT 0x08 | |
10 | +#define MOVE_STOP 0x10 | |
11 | + | |
12 | +//******************************************* | |
13 | +// Init of PWM signal deliverd on pin 9 (PB1) | |
14 | +//******************************************* | |
15 | +void init_pwm() | |
9 | 16 | { |
10 | -/* Set baud rate */ | |
11 | -UBRR0 = CPU_FREQ/(((unsigned long int)speed)<<4)-1; | |
17 | + // initialize | |
18 | + cli(); // disable global interrupts | |
12 | 19 | |
13 | -/* Enable transmitter & receiver */ | |
14 | -UCSR0B = (1<<TXEN0 | 1<<RXEN0); | |
15 | 20 | |
16 | -/* Set 8 bits character and 1 stop bit */ | |
17 | -UCSR0C = (1<<UCSZ01 | 1<<UCSZ00); | |
21 | + //initialisation pwm sur broche 13 = PB1 | |
22 | + DDRB |= 0x02 ; | |
23 | + // PD6 is now an output | |
24 | + TCCR1A = (1 << WGM10) | (1 << COM1A1); | |
25 | + // set none-inverting mode | |
26 | + TCCR1B = (1 << WGM12) | (1 << CS10) |(1 << CS12); | |
27 | + // set prescaler to 8 and starts PWM | |
28 | + OCR1A= 0xFF ; | |
18 | 29 | |
19 | -/* Set off UART baud doubler */ | |
20 | -UCSR0A &= ~(1 << U2X0); | |
21 | -} | |
22 | - | |
23 | -void send_serial(unsigned char c) //envoyer un carctère sur le port série | |
24 | -{ | |
25 | -loop_until_bit_is_set(UCSR0A, UDRE0); | |
26 | -UDR0 = c; | |
27 | -} | |
30 | + DDRB |= (1 << DDB1)|(1 << DDB2); | |
31 | + // PB1 and PB2 is now an output | |
28 | 32 | |
33 | + TCCR1B |= (1 << CS10); | |
34 | + // START the timer with no prescaler | |
29 | 35 | |
30 | -unsigned char get_serial(void) //récupérer un caractère envoyé sur le port série | |
31 | -{ | |
32 | -loop_until_bit_is_set(UCSR0A, RXC0); | |
33 | -return UDR0; | |
36 | + sei(); | |
34 | 37 | } |
35 | 38 | |
36 | - | |
37 | -// For the AD converter | |
38 | - | |
39 | -void ad_init(unsigned char channel) //channel 0 ou 1 | |
40 | -{ | |
41 | -ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); | |
42 | -ADMUX|=(1<<REFS0)|(1<<ADLAR); | |
43 | -ADMUX=(ADMUX&0xf0)|channel; | |
44 | -ADCSRA|=(1<<ADEN); | |
45 | -} | |
46 | - | |
47 | - | |
48 | -unsigned int ad_sample(void) //récupère la valeur de sortie du port de conversion analogique/numérique | |
49 | -{ | |
50 | -ADCSRA|=(1<<ADSC); | |
51 | -while(bit_is_set(ADCSRA, ADSC)); | |
52 | -return ADCH; | |
39 | +//*********************************************************************** | |
40 | +// Set of functions resulting movement to a servomotor connected on pin 9. | |
41 | +//*********************************************************************** | |
42 | +void motor_right(){ | |
43 | + OCR1A = 0x80 ; | |
53 | 44 | } |
54 | 45 | |
55 | - | |
56 | -// For the I/O | |
57 | - | |
58 | -void output_init(void) | |
59 | -{ | |
60 | - DDRB |= 0x07; // PIN 8, 9, 10 en sortie | |
46 | +void motor_left(){ | |
47 | + OCR1A = 0x08 ; | |
61 | 48 | } |
62 | 49 | |
63 | -void output_set(unsigned char value, unsigned char led) //permet d'allumer et éteindre les led | |
64 | -{ | |
65 | - if(led==1) | |
66 | - { | |
67 | - if(value==0) PORTB &= 0xfe; else PORTB |= 0x01; | |
68 | - } | |
69 | - if(led==2) | |
70 | - { | |
71 | - if(value==0) PORTB &= 0xfd; else PORTB |= 0x02; | |
72 | - } | |
73 | - if(led==3) | |
74 | - { | |
75 | - if(value==0) PORTB &= 0xfb; else PORTB |= 0x04; | |
76 | - } | |
50 | +void motor_stop(){ | |
51 | + OCR1A = 0xFF; | |
77 | 52 | } |
78 | 53 | |
54 | +//********************************** | |
55 | +// Functions for the led management | |
56 | +//********************************** | |
79 | 57 | |
80 | -void input_init(void) | |
81 | -{ | |
82 | -DDRD &= 0xf3; // PIN 2 et 3 en entrée (2 pour le bouton du joystick, 3 pour D3) | |
83 | -PORTD |= 0x0c; // Pull-up activé sur les PIN 2 et 3 | |
58 | +void init_led(void){ | |
59 | + //Led must be placed on pin 7 (PD7) | |
60 | + DDRD |= 0x80 ; | |
61 | + PORTD = 0x00 ; | |
84 | 62 | } |
85 | -/* | |
86 | -unsigned char input_get(unsigned char bouton) //récupère et retourne l'état des PIN 2 et 3 | |
87 | -{ | |
88 | - if(bouton==1) //joystick | |
89 | - { | |
90 | - return ((PIND&0x04)!=0)?1:0; | |
91 | - } | |
92 | - if(bouton==2) //D3 | |
93 | - { | |
94 | - return ((PIND&0x08)!=0)?1:0; | |
95 | - } | |
96 | -} | |
97 | -*/ | |
98 | 63 | |
99 | -void led(unsigned char led) //permet de faire clignoter la LED dont le numéro est en paramètre | |
100 | -{ | |
101 | - output_set(1,led); | |
102 | - _delay_ms(50); | |
103 | - output_set(0,led); | |
104 | - _delay_ms(50); | |
64 | +void led_on(void){ | |
65 | + PORTD |= 0x80 ; | |
105 | 66 | } |
106 | 67 | |
68 | +void led_off(void){ | |
69 | + PORTD &= 0x7F ; | |
70 | +} | |
107 | 71 | |
108 | 72 | int main(void) |
109 | 73 | { |
110 | - output_init(); //initialisation des ports | |
111 | - input_init(); | |
74 | + init_led(); | |
112 | 75 | init_serial(9600); //on choisit une vitesse de 9600 bauds pour la transmission série |
113 | - | |
76 | + uint8_t r ; | |
77 | + init_pwm(); | |
114 | 78 | while(1) |
115 | - { | |
116 | - // output_set(1,1); //Allumage de la LED 1 qui indique que l'arduino est sous tension | |
117 | - | |
118 | -//Gestion de la direction avec le joystick | |
119 | - unsigned char r; | |
120 | - // int i=1; | |
121 | - //ad_init(0); //channel 0 pour gauche et droite | |
122 | - //unsigned int a=ad_sample(); | |
123 | - // ad_init(1); //channel 1 pour haut et bas | |
124 | - // unsigned int b=ad_sample(); | |
125 | - //send_serial('d'); //on envoie le caractère 'd' | |
126 | - //led(2); //on fait clignoter la 2ème LED quand on envoie | |
127 | - | |
128 | - //On récupère un carcatère sur la liaison série. | |
129 | - r=get_serial(); | |
130 | - while(r=='a') | |
131 | - { | |
132 | - led(1); | |
133 | - if(r=='z') | |
134 | - { | |
135 | - break; | |
136 | - } | |
137 | - r=get_serial(); | |
138 | - } | |
139 | - } | |
79 | + { | |
80 | + r = get_serial(); | |
81 | + switch(r){ | |
82 | + case LED_ON: | |
83 | + led_on(); | |
84 | + send_ack(); | |
85 | + break; | |
86 | + case LED_OFF: | |
87 | + led_off(); | |
88 | + send_ack(); | |
89 | + break; | |
90 | + case MOVE_RIGHT: | |
91 | + motor_right(); | |
92 | + send_ack(); | |
93 | + break; | |
94 | + case MOVE_LEFT: | |
95 | + motor_left(); | |
96 | + send_ack(); | |
97 | + break; | |
98 | + case MOVE_STOP: | |
99 | + motor_stop(); | |
100 | + send_ack(); | |
101 | + break; | |
102 | + } | |
103 | + } | |
140 | 104 | return 0; |
141 | 105 | } | ... | ... |