Commit 686fbdf053cff08478d10bdf4914936b304f683c

Authored by dmohamed
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
1 -#include <avr/io.h> // for the input/output register 1 +#include <avr/io.h>
2 #include <util/delay.h> 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 int main(void) 72 int main(void)
109 { 73 {
110 - output_init(); //initialisation des ports  
111 - input_init(); 74 + init_led();
112 init_serial(9600); //on choisit une vitesse de 9600 bauds pour la transmission série 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 while(1) 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 return 0; 104 return 0;
141 } 105 }