UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
Tp2 : développer votre propre drive
Réalisé par :
- Elmrabet aziz
Encadré par :
- Pr. SAAD MOTAHHIR
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
I) Objectif du TP :
L’objectif du TP est de développer un drive qui permet de gérer les pins numérique du microcontrôleur
Atmega328p en langage C en utilisant Amel studio.
II)Les APIs
Fonction de configuration du sens des pins digitales :
- Void pinMode (struct DIGITAL_IO, unsigned char mode) ;
DIGITAL_IO : structure qui contient deux champs(le PORT et le numéro de la pin).
Mode : output or input.
Fonction d’écriture sur les pins digitales :
- Void setState(struct DIGITAL_IO,unsigned char value) ;
DIGITAL_IO : structure qui contient deux champs(le PORT et le numéro de la pin).
value : HIGH or LOW.
Fonction de lecture des données sur les pins digitales :
- int getState(struct DIGITAL_IO) ;
DIGITAL_IO : structure qui contient deux champs(le PORT et le numéro de la pin).
Return: HIGH or LOW.
III) Les ateliers du TP :
Atelier 1 :
- Réaliser un système embarqué qui permet de faire clignoter une LED connectée avec la pin
RB5 sans modifier l’état des autres pins.
Atelier 2 :
- Réaliser un système embarqué qui fait clignoter une LED avec un Delay graduel au fil du
temps, au début la LED commencera à clignoter à 100ms de pause, et à chaque itération du
programme la pause va se doubler.
Atelier 3 :
- Réaliser un système embarque qui permet de faire un chenillard avec 4 LEDs en utilisant
la boucle foret sans modifier l’état des autres pins.
Atelier 4 :
- Réaliser un programme permettant d’allumer une LED branchée sur la pin RB5 lorsque le
bouton branché sur la pin RB2 est appuyé.
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
IV) My_drive
1) Fichier .c
#include <avr/io.h>
#include <avr/interrupt.h>
#include "my_drive.h"
void pin_mode (unsigned char port, int pin, unsigned char mode)
{
if (pin <= 7)
{
switch (mode)
{
case 'i' :
case 'I' :
if (port == 'B')
{
PORTB &= (~ (1<<pin));
DDRB &= (~(1<<pin));
}
else if (port == 'C' && pin<6)
{
PORTC &= (~(1<<pin));
DDRC &= (~(1<<pin));
}
else if(port == 'D')
{
PORTD &= (~(1<<pin));
DDRD &= (~(1<<pin));
}
break;
case 'o' :
case 'O' :
if(port == 'B')
{
PORTB &= (~(1<<pin));
DDRB |= (1<<pin);
}
else if(port == 'C' && pin<6)
{
PORTC &= (~(1<<pin));
DDRC |= (1<<pin);
}
else if(port == 'D')
{
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
PORTD &= (~(1<<pin));
DDRD |= (1<<pin);
}
break;
}
}
}
void set_state(unsigned char port,int pin,int state)
{
if(pin <= 7 )
{
switch( port )
{
case 'B' :
if( DDRB & (1<<pin) )
{
if(state==1)
PORTB |= (1<<pin);
else if(state==0)
PORTB &= (~(1<<pin));
}
break;
case 'C':
if(pin >= 6) break;
if( DDRC & (1<<pin) )
{
if(state==1)
PORTC |= (1<<pin);
else if(state==0)
PORTC &= (~(1<<pin));
}
break;
case 'D':
if( DDRD & (1<<pin) )
{
if(state==1)
PORTD |= (1<<pin);
else if(state==0)
PORTD &= (~(1<<pin));
}
break;
}
}
}
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
int get_state(unsigned char port,int pin)
{
if(pin <= 7 && (port=='B' || port=='C' || port=='D') )
{
switch( port )
{
case 'B' :
if (PINB & (1<<pin))
{
return 1;
}
else
{
return 0;
}
break;
case 'C':
if(pin>=6) break;
if (PINC & (1<<pin))
{
return 1;
}
else
{
return 0;
}
break;
case 'D':
if (PIND & (1<<pin))
{
return 1;
}
else
{
return 0;
}
break;
}
}
else
return -1;
}
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
void pinMode(struct DIGITAL_IO PIN,unsigned char mode)
{
pin_mode(PIN.port,PIN.pin,mode);
}
void setState(struct DIGITAL_IO PIN, int stat)
{
set_state(PIN.port,PIN.pin,stat);
}
int getState(struct DIGITAL_IO PIN)
{
return get_state(PIN.port,PIN.pin);
}
2) Fichier .h
#ifndef MY_DRIVE_H
#define MY_DRIVE_H
#include <avr/io.h>
#define INCLUDE_XTAL_PINS
enum TERMS { input='i', output='o', input_pullup='p', HIGH=1, LOW=0 };
typedef struct DIGITAL_IO
{
unsigned char port;
int pin;
}DIGITAL_IO;
void pin_mode(unsigned char, int,unsigned char);
void pinMode(struct DIGITAL_IO,unsigned char);
void set_state(unsigned char,int,int);
int getState(struct DIGITAL_IO);
void setState(struct DIGITAL_IO,int);
int get_state(unsigned char,int);
#endif
V) Atelier 1
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
2) Code
3) Circuit
VI) Atelier 2 :
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
1) Code
2) circuit
VII) Atelier 3 :
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
1) Code
2) circuit
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
VIII) Atelier 4 :
1) Code
2) circuit
UNIVERSITE SIDI MOHAMED BEN ABDELAH
Ecole Nationale des Sciences Appliquées – Fès-
Département Industriel
Génie Mécanique et systèmes automatisés
IX) conclusion