Moteur.c 3 KB
#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;
}