Documente Academic
Documente Profesional
Documente Cultură
6/8/2014
Plan de la formation
Description du Mega328P
6/8/2014
Plan de la formation
Description et fonctionnement
Description et Fonctionnement
Contrle de lintensit lumineuse dune diode LED
Contrle continu
A partir des touches + et -
Convertisseur Numrique/analogique
6/8/2014
Plan de la formation
I2C Synchrone
Description et Fonctionnement
Les interruptions
6/8/2014
Introduction
6/8/2014
Introduction
En lan 1002, le roi Arduin (Arduino en italien) devint le seigneur de la petite ville
dIvrea.
Un bar dans une rue pave de la ville, honore sa mmoire, Bar di Re Arduino.
La philosophie
6/8/2014
Introduction
Les plus
Cette simplification permet tout un public nayant pas les comptences en lectronique
et informatique de crer et innover.
Note
(1) Le temps dapprentissage dun microcontrleur peut prendre quelques jours quelques mois en fonctions de la
complexit des priphriqes quil intgre. Les librairies open source permettent de saffranchir de cet apprentissage en utilisant
des fonctions logicielles qui intgrent la complexit de programmation des priphriques.
6/8/2014
Introduction
Les moins
6/8/2014
6/8/2014
AREF
Entre/sortie Numrique
Gnd
Gnd
vin
Entre Analogique/Numrique
6/8/2014
10
6/8/2014
11
shield thernet
shield GPS/GSM
shield zeebe
Shield prototype
shield audio
Shield SD card
Description de lAtmega328P
6/8/2014
14
Description de lATmega328P
15
Description de lATmega328P
Taille
Opration dcriture/Lecture
Programme
- 32 kOctets de mmoire
Flash.
Donnes Volatiles
- 1 koctets de mmoire
EEPROM.
- Plusieurs koctets de
mmoire
Flash.
Notes :
- FLASH : Propprit qui permet deffacer/crire rapidement une grande portion de la mmoire
-Technologie qui permet de raliser une mmoire qui peut tre crite/efface lectriquement.
- Le contenu de la mmoire est maintenu lorsque lalimentation est teinte.
- RAM
6/8/2014
16
Description de lATmega328P
6/8/2014
17
Description de lATmega328P
6/8/2014
18
6/8/2014
19
//===========================================================
//-- La librairie LCD est utilise.
//===========================================================
#include <LiquidCrystal.h>
//===========================================================
//-- La diode LED est connecte la broche 13.
//===========================================================
Int led=13;
//===========================================================
//-- Construit un objet LCD et prcise que les broches 12,11,5,4,3,2 connecte
//-- le LCD la carte Arduino.
//-----------------------------------------------------------------------------------------------------//-- broche 12 : RS -11:Enable 5: D4 4:D5 -3 : D6 - 2 : D7
//===========================================================
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//===========================================================
void setup() {
//-- Dfinit le nombre de caractre par ligne ainsi que le nombre de ligne
lcd.begin(16, 2);
//-- Affiche le message Hello World.
lcd.print("hello, world!");
}
//===========================================================
void loop() {
Int compteur;
// set the cursor to column 0, line 1
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
++compteur;
}
//===========================================================
6/8/2014
20
Dfinition
Donne dont la valeur est modifie en fonction de lactivit du programme.
6/8/2014
21
Type (Atmega328)
boolean
char
int
long
float
double
Taille
1-bit
8-bits
16-bits
32-bits
32-bits
64-bits
-3.40282347e+38
+3.40282347E38
-1.79769313486231570e308
1.79769313486231570e308
float freq ;
double freq;
Nbre doctets
Dynamique de codage
(sign)
0
1
-127
+128
-32768
+32767
Dynamique de codage
(non sign)
0
1
0
255
0
65535
0
4 294 967 295
Exemple
Boolean ON;
Char freq;
Int vitesse;
long distance;
6/8/2014
22
4 octets
1 variables long
2 octets
1 variables int
1 octet
8 bits
1 variables char
8 variables boolennes
6/8/2014
23
Structure qui permet de rpter plusieurs fois le mme traitement jusqu ce que la
condition de fin apparaisse.
int i;
.
for (i=1 ; i<=10 ; i++)
{
serial.print(I = ); serial.printl(i);
}
Le traitement est effectu 10 fois. La variable i est teste puis incrmente avant chaque
traitement. Le nombre de passage dans la boucle est dtermine ds le dpart.
6/8/2014
24
Structure qui permet de rpter plusieurs fois le mme traitement jusqu ce que la
condition de fin apparaisse.
int i;
.
i=1;
while (i<=10)
{
serial.print(I = ); serial.printl(i);
i=i+1;
}
Le traitement est effectu 10 fois. La variable i est dabord teste puis incrmente dans la
boucle de traitement si la condition de fin nest pas atteinte. Le nombre de passage dans la
boucle dpend de comment est gr la variable i.
6/8/2014
25
Structure qui permet de rpter plusieurs fois le mme traitement jusqu ce que la
condition de fin apparaisse.
Faire le traitement
si la condition est vrifie alors rpter le traitement
int i;
.
i=1;
do
{
serial.print(I = ); serial.printl(i);
i=i+1;
}
while (i<=10);
Le traitement est effectu au minum une fois puis rpt tant que I <= 10
6/8/2014
26
int condition;
.
condition=10;
.
if (condition==1)
{
serial.print(condition = ); serial.println(condition);
}
else
{
serial.print(condition = ); serial.println(condition);
}
6/8/2014
27
Si
la condition1 est vrifie
sinon si la condition2 est vrifie
sinon si la condition3 est vrifie
sinon si la condition4 est vrifie
int condition;
.
condition=2;
.
if (condition==1)
{
serial.print(condition 1 = ); serial.printl(condition);
}
elseif (condition==2)
{
serial.print(condition 2 = ); serial.printl(condition);
}
elseif (condition==3)
{
serial.print(condition 3 = ); serial.printl(condition);
}
elseif (condition==4) {.}
6/8/2014
28
Test (var)
si var=condition1 alors faire traitement1
si var=condition2 alors faire traitement2
char var;
.
var = A;
.
Switch (var)
{
case A :
{
serial.print(var_A = ); serial.printl(var);break ;
}
case B :
{
serial.print(var _B= ); serial.printl(var);break ;
}
6/8/2014
29
6/8/2014
30
Proprits
Ce sont des E/S qui ont deux tats et dont ceux-ci sont contrls par lutilisateur
(programme).
Celles qui ne sont pas des E/S simples sont des E/S analogiques et des E/S spcifiques.
Indiquer la direction de lE/S est-ce que lutilisateur besoin dune Entre ou une Sortie?
pinMode( Signal1,OUTPUT); ou pinMode(Signal1,INPUT);
En fonction du besoin du programme, forcer la Sortie ltat haut(VDD) ou bas (GND) ou lire
lEntre.
Sortie : digitalWrite(Signal1,HIGH); ou digitalWrite(Signal1,LOW);
Entre : var = digitalRead(Signal1);
6/8/2014
31
Faire clignoter la led associe la broche 13 avec une priode de 1 seconde si la broche
2 est ltat 1 (VDD=5v) et 2 secondes si elle est 0 (Gnd=0v).
Programme
Void loop()
{
boolean Toggle;
if (digitalRead(Interrupt)==1) delay(1000) ;
else delay(2000) ;
if (Toggle==1)
{
digitalWrite(Led,LOW) ; Toggle=0;
}
else
{
digitalWrite(Led,HIGH) ; Toggle=1;
}
C.F exprimentation_1
6/8/2014
32
trait : 3 x tpoint
Interval entre deux lettres : Interv1 = 3 x tpoint
Interval dentre deux mots : Interv2 = 7 x tpoint
1 x tpoint
3 x tpoint
1 x tpoint
7 x tpoint
3 x tpoint
C.F exprimentation_2
6/8/2014
33
Exemple 2
Programme
int Led=13;
while(1){
//--- Dcodeur morse
switch (Morse_Tab[i]){
case 0: {
digitalWrite(Led,HIGH); delay(point);
digitalWrite(Led,LOW); delay(point);
break;
}
case 1: {
digitalWrite(Led,HIGH); delay(2*point);
digitalWrite(Led,LOW) ; delay(point);
break;
}
case 2:{
digitalWrite(Led,LOW); delay(3*point);
break;
}
case 3:{
digitalWrite(Led,LOW); delay(7*point);
break;
}
};
++i;
if (i>10)i=0;
}
}
6/8/2014
34
Convertisseur Analogique/Numrique
Dfinition et fonctionnement
Fonction lectronique intgre dans CTRL qui asssure linterface entre me
monde analogique et le monde numrique Conversion analogique/numrique
(CAN).
Monde numrique
Bit: chiffre binaire qui ne peut prendre que deux valeurs :
0 ou 1
0 ou VDD : Grandeur binaire au sens lectrique du terme 0 la masse VDD
5v,3v,
Chiffre cod
4 bits
8 bits
16 bits
sur N bits
: codage de 16 valeurs
: codage de 256 valeurs
: codage de 65536 valeurs
Monde analogique
Grandeur qui peut prendre une infinit de valeur au cours du temps qui passe.
Il faudrait une infinit de bit pour coder une grandeur analogique pas ralisable
physiquement.
Rsolution (la plus petite valeur que le CAN peut coder:
Res= Vref/2^Nbits, exemple Vref=5v , Nbits=8 Res = 5/256 =19mV.
Le convertisseur analogique numrique arrondit donc la grandeur analogique (troncature).
Formation arduino - ARALA - F4GSC - Jean-Luc Levant 2014
6/8/2014
35
Convertisseur Analogique/Numrique
Description et fonctionnement
6/8/2014
36
Convertisseur Analogique/Numrique
C.F exprimentation_3
6/8/2014
37
Convertisseur Analogique/Numrique
C.F exprimentation_4
T = RxC > C =
T
R
6/8/2014
38
Convertisseur Analogique/Numrique
void loop() {
float capa;
float tc;
//--- Implusion de charge
digitalWrite(Pulse,HIGH);
tc=0;
//--- boucle de mesure du temps de charge de la capa Cx correspondant T = RC
while ((analogRead(Capa)*5.0/1023) < Seuil)
{
delay(1) ; ++tc;
}
//--- Calcul de Cx, t > 1 correspond la valeur de Cx mimnimale.
if (tc>1) capa=tc*1000/R - Cpar;
else capa=0;
//--- Affichage de la valeur via le serial port
Serial.print(" Capa(nF) =")
; Serial.println(capa);
Serial.print(" Temps de charge(ms) =") ; Serial.println(tc);
Serial.println(" ");
//--- RAZ de limplusion
digitalWrite(Pulse,LOW);
//--- Dcharge de Cx
pinMode(RAZ,OUTPUT) ; digitalWrite(RAZ,LOW);
Delay(1);
//--- Remise en entre de RAZ
pinMode(RAZ,INPUT);
delay(1000);
}
Description et fonctionnement
Signal priodique
Pin 5 : Priode fixe standard T=490Hz
Pin 6 : Priode fixe standard T=980Hz
La priode peut est ajuste.
Numrique
Analogique
6/8/2014
40
TW
var_ MLI
= 5
T
255
const byte Periode=20;
void setup() {
}
void loop() {
byte var_MLI;
for (var_MLI=0;var_MLI<256;var_MLI++)
{
//=======================================================
//=== La largeur de l'impulsion varie de 0 255:
//
PWM0
: est la sortie PWM sur laquelle
//
est branche la LED.
//
var_MLI : est la variable contenant la
//
valeur de la largeur d'impulsion.
//=======================================================
analogWrite(PWM0,var_MLI);
delay(Periode);
}
}
6/8/2014
41
6/8/2014
42
Contrle de lintensit lumineuse dune diode LED partir des touches du clavier +
et -, valides par lappui de la touche Enter.
6/8/2014
43
Convertisseur Numrique/Analogique
Principe de fonctionnement
T= 500Hz (PWM0)
Transforme de
Fourier
e(f)
E0=E x
t
T
0Hz
Filtre Passe-Bas
C.F exprimentation_5
- Mise en vidence du contenu spectral,
du filtrage et de la valeur moyenne.
- Frquence dchantillonnage = 2kHz
- FC = 20Hz et 2Hz
- E=5v
continu
F= 1
T
F1
F2
F3
f(Hz)
s(f)
Tension continue
E0=E x
t
T
6/8/2014
44
44f(Hz)
Convertisseur Numrique/Analogique
Loi de conversion numrique analogique
Compteur 8-bit : 0<= n <=255
n=1
t = t
n=k
t = k t
n = 255
t=T
E0 = E
t
n
= E
T
255
Rsolution
0 E0 E
0 n 255
Analogique
0 E0 E
0 E
n
E
255
E
255
Exemple
0 E0 5v
0 E
255
5v
255
5
= 19.6mV
255
6/8/2014
45
Convertisseur Numrique/Analogique
Exemple 1 :Ralisation dune rampe une pente:
Frquence = 500ms
Amplitude 5v
PWM sur la broche 5
const int PWM0=5;
const byte Periode=2;
byte var_MLI;
void setup() {
}
void loop()
{
for (var_MLI =0; var_MLI <255; var_MLI ++)
{
//-- Mise jour du PWM avec la nouvelle valeur
analogWrite(PWM0, var_MLI);
delay(Periode);
}
}
6/8/2014
46
Convertisseur Numrique/Analogique
Exemple 2: Ralisation dune rampe double pentes:
Frquence = 500ms
Amplitude 5v
PWM sur la broche 5
const int PWM0=5;
const byte Periode=2;
void setup()
{
byte var_MLI =0;
}
void loop()
{
for (var_MLI =0; var_MLI <255; var_MLI ++)
{
//-- Mise jour du PWM avec la nouvelle valeur
analogWrite(PWM0, var_MLI);
//-- Fixe le pas de mise jour du PWM
delay(Periode);
}
for (var_MLI =255; var_MLI >0; var_MLI --)
{
analogWrite(PWM0, var_MLI);
delay(Periode);
}
}
6/8/2014
47
Convertisseur Numrique/Analogique
Exemple 3: Ralisation dun signal sinusodal
Frquence = 500ms
Amplitude 2.5v centr sur 2.5v
Tension dalimentation,
VDD = 5 ;
Nombre de point dans la sinusode, N = 255;
Equation de la sinusode
y = 2.5 + 2.5 x sin(2*pi*n/N))
Sinus variant
entre 0v et 5v
Dcalage
de +2.5v
Le PWM naccepte que des nombres entiers (pas de nombre dcimal)
m = partie entire (y*N/VDD)
C.F exprimentation_8
6/8/2014
48
Convertisseur Numrique/Analogique
Exemple 3: Ralisation dun signal sinusodal
#include <avr/pgmspace.h>
// --- Enregistrement des points dfinissant une priode de sinusode complte et fournir au PWM.
prog_uchar SinusTab[] PROGMEM=
{128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,218,220,222,224,226,228,230,23
2,234,235,237,239,240,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,79,81,84,87,90,93,96,99,103,106,109,112,115,118,121,124,127
};
// ------- Dfinition des constantes et affection de la broche la fonction PWM
const int PWM0 = 5 ; const byte Periode = 2;
// --- Programme dinitialisation Ici aucune initialisation nest requise.
void setup() {
}
// --- Programme proncipale qui sxcutera jusqu lextinction de lalimentation
void loop()
{
// ---- Dclaration des variables du programme
byte Pulse=0 ; byte k=0 ; unsigned char sinus;
//--- Boucle sans fin qui fournir les points de la sinusode au PWM.
for (k=0;k<256;k++)
{
// ---- Acquisition dunpoint de la sinusode depuis la tabke SinusTab
sinus=pgm_read_byte_near(&SinusTab[k]);
// ---- Chargement dans le PWM
analogWrite(PWM0,sinus);
// --- Ajuste le dlais entre deux points de la sinusode et de sa priode ( T= 255 x dlais)
delay(Periode);
}
}
6/8/2014
49
Convertisseur Numrique/Analogique
Exemple 3: Ralisation dun signal sinusodal
Effet du filtre sur lamplitude de la sinusode et le niveau des harmoniques
Pour une sinusode de frquence de 2Hz:
FC = 2Hz, le filtre apporte une attnuation de -3db soit 0.7 x
lamplitude maximale
VM =0.7*2.5=1.8v.
FC=20Hz est une dcade de la frquence du signal lamplitude du
signal ne subit pas dattnuation due au filtre par contre les
harmoniques sont moins attnues de 20dB par rapport FC = 2Hz.
C.F exprimentation_2
- Mise en vidence du contenu spectrale,
du filtrage et de la valeur moyenne.
- Frquence dchantillonnage = 2kHz
- FC = 20Hz et 2Hz
- E=5v
Formation arduino - ARALA - F4GSC - Jean-Luc Levant 2014
6/8/2014
50
G
BS170
U
N
O
Buzzer
100kohms
D
R
3
Modul
8
G
BS170
100kohms
GND
6/8/2014
51
Description et fonctionnement
Exemple 4: Gnrer un appel gnral en morse en audio: CQ de F5KEQ
//---- 0 : 1 point, 1: un trait, 2: sparation entr deux
lettres
//---- 3 : sparation entre deux mots.
//---- Message trasmettre en morse :
// C Q de F 5K Q
Byte Morse_Tab[]={1,0,1,0,2,1,1,0,1,3,1,0,0,
2,0,3,0,0,1,0,2,0,0,0,0,0,2,1,0,1,2,0,2,1,1,0,1,3};
//--- Nbre de symbole contenu dans le message
const int NbSymb = 38;
//--- Vitesse du point
int point = 110;
//--- Freq audio = 490hz
int Audio = 9;
//--- Contrle de la modulation
int Modul = 8;
//--- Led
int Led = 13;
void setup() {
pinMode(Led,OUTPUT);
analogWrite(Audio,127);
}
void loop() {
byte code ;
int i;
while(1){
//--- Dcodeur morse audio et visuel
switch (Morse_Tab[i]){
case 0: {
digitalWrite(Led,HIGH) ; digitalWrite(Modul,HIGH); delay(point);
digitalWrite(Led,LOW) ; digitalWrite(Modul,LOW); delay(point) ; break;
}
case 1: {
digitalWrite(Led,HIGH); digitalWrite(Modul,HIGH); delay(2*point);
digitalWrite(Led,LOW) ; digitalWrite(Modul,LOW) ; delay(point) ; break;
}
case 2:{
digitalWrite(Modul,LOW); digitalWrite(Led,LOW); delay(2*point) ; break;
}
case 3:{
digitalWrite(Modul,LOW); digitalWrite(Led,LOW);delay(7*point) ; break;
}
};
++i;
if (i>NbSymb)i=0;
}
}
6/8/2014
52
6/8/2014
53
Introduction
6/8/2014
54
Introduction
La liaison peut tre ASYNCHRONE si lHORLOGE nest pas transmise avec les donnes.
La liaison est SYNCHRONE si lHorloge est physiquement transmises en mme temps
que le flux de donnes.
Les liaisons sries se caractrisent par leur protocole et leurs spcifications
lectriques.
6/8/2014
55
6/8/2014
56
1 Bit stop
1 Bit start
Bit de parit
6/8/2014
57
6/8/2014
58
Baud
Symbole
6/8/2014
59
Ct Equipement et carte
Cble de liaison
+12v
+5v
0v
0v
-12v
6/8/2014
60
//=======================================================
//-- Envoie un caractre via la liaison srie
//=======================================================
void setup()
{
//--- Cration dun objet liaison srie Asynchrone
Serial.begin(9600);
//=======================================================
//-- Reoit un caractre via la liaison srie
//=======================================================
byte incomingByte;
void setup()
{
//--- Cration dun objet liaison srie Asynchrone
Serial.begin(9600);
}
}
void loop()
{
//======================================================
//--- Dbut dune transmission
//=======================================================
while (!Serial);
Serial.println('U');
delay(50);
}
void loop()
{
//======================================================
//--- Attend l'arrive d'un caractre
//=======================================================
if (Serial.available() > 0) {
//--- le caractre est reu
incomingByte = Serial.read();
//--- Envoit vers le terminal srie
Serial.print("Caractre reu ") ; Serial.println(incomingByte, DEC);
}
}
6/8/2014
61
6/8/2014
62
6/8/2014
63
6/8/2014
64
Bus de liaison srie synchrone de communication entre un ou plusieurs circuits intgrs (ADC,
IO, DAC, horloge temps relle, mmoire...). Chacun des CI est repr par une adresse Adrn.
Adr1
Adr2
Adr3
Lhorloge est transmise en mme temps que les donnes (registre dcalage).
Ligne SDA : Serial Data line
Ligne SCL : Serial Clock line
Condition de dbut
de transfert
Condition de Fin
de transfert
Adresse/Donnes/Signaux de contrle
6/8/2014
65
Vitesse
(kBit/s)
TR
Max. Cload
(pF)
Rp
Standard
100
1s
400
2700
Fast
400
300ns
400
820
120ns
550
270
Fast +
High-speed
Ultra-fast
3.4
5
6/8/2014
66
6/8/2014
67
Arduino
Sous-adresse choisie
par lutilisateur
Ex: 0x70 (112 dec)
SDA
SCL
PCF8574
PCF8574A
Ecriture
6/8/2014
68
6/8/2014
69
6/8/2014
70
6/8/2014
71
6/8/2014
72
6/8/2014
73
6/8/2014
74
void setup()
{
//--- Cration dun objet I2C
Wire.begin();
//--- Cration dun objet liaison srie
Serial.begin(9600);
}
byte val = 0;
void setup()
{
//--- Cration dun objet I2C
Wire.begin();
}
void loop()
{
//======================================================
//--- Dbut dune transmission par lenvoie de ladresse du priphrique
//=======================================================
Wire.beginTransmission(44);
//=======================================================
//-- envoie de la valeur
//=======================================================
Wire.write(val);
//=======================================================
//--- Fin de transmission
//=======================================================
Wire.endTransmission();
val++;
if(val == 64)
{
val = 0;
}
delay(500);
}
//========================================================
//-- Transmission vers la liaison srie des caractres reus par la liaison I2C.
//========================================================
#include <Wire.h>
void loop()
{
//=======================================================
//--- Demande de lecture de 6 octets du priphrique dadresse 0x02
//========================================================
Wire.requestFrom(2, 6);
//========================================================
//--- Attente de la rception dun caractre
//========================================================
while(Wire.available())
{
//======================================================
//--- Lecture dun caractre reu depuis la liaison I2C et envoi vers
//--- la liaison srie
//======================================================
char c = Wire.read();
Serial.print(c);
}
delay(500);
}
6/8/2014
75
PCF8574
6/8/2014
76
void loop()
{
{
//--- Attent l'arrive d'un caractre
if (Serial.available()) {
//--- Tempo pour pour tre sur la transmission srie est termine
delay(100);
//--- RAZ de l'affichage
lcd.clear();
//--- Lecture de tous les caractres reus et affichage sur le lCD
while (Serial.available() > 0) {
//--- Affichage sur le LCD
lcd.write(Serial.read());
}
}
}
}
6/8/2014
77
Les Interruptions
6/8/2014
78
Les Interruptions
6/8/2014
79
Les Interruptions
6/8/2014
80
Les Interruptions
temps
t1
t2
t3
t4
t5
t6
t7
6/8/2014
81
Les Interruptions
Supposons que le rcepteur dtecte le dclenchement dun relais (R7) et quil soit
ncessaire de mesurer le niveau du signal reu pour lafficher.
Il faut donc attendre 1 seconde avant daller mesurer la force du signal reu et
lafficher.
1s
0.5s
2s
0.5s
6/8/2014
82
Les Interruptions
Supposons que la tche mesure du Smtre soit la tche prioritaire et quelle doit
tre excute sans dlai.
1s
0.5s
temps
La tche Tche de changement de freq est une TACHE DE FOND qui est excute linfini
tant que le microcontrleur na rien dautre faire.
La tche Tche de mesure du Smtre est une TACHE ou ACTION TEMPORAIRE considre
comme tant plus prioritaire que la tche de fond. Elle est dclenche par un vnement matriel
(ici le squelch ).
6/8/2014
83
Les Interruptions
Bien quil ny ait quune seule Unit de calcul, il y a bien deux tches diffrentes qui sont
excutes et gres par le matriel multitche.
Demande dinterruption
Ressources
matrielles
Sources dinterruption:
- Base de temps
- Liaison srie
- Entres/sorties
-
Tche de fond
Tche de fond interrompue
Tche temporaire
Tche de fond
6/8/2014
84
Les Interruptions
PC
Tx
Rx
UART
Atmega328
Base de temps
Une interruption temporaire de la tche de fond est demande par la base de temps pour
indiquer que le temps de rfrence est coul ( ex: 1 seconde).
Base de temps
Demande dinterruption
Demande dinterruption
Atmega328
Comparateur analogique
Une interruption temporaire est demande par le comparateur analogique pour indiquer
que le signal dentre dpasser la tension de comparaison.
Signal comparer
Tension de rfrence
Comparateur
Analogique
Demande dinterruption
Atmega328
6/8/2014
85
Les Interruptions
6/8/2014
86
Les Interruptions
Initialise et dfinie
la source dinterruption
utilise.
6/8/2014
87
Les Interruptions
6/8/2014
88
Les Interruptions
Non
Non
Temp=1s?
Oui
Oui
sqOn=0
etat==1?
Oui
sqOn=1
sqOn==1?
Afficher SQUELCH OFF
Sec=sec+1
Afficher SQUELCH ON
Non
Sec=0
Dclenchement
Afficher dure
Dclenchement
Afficher dure
6/8/2014
89
Les Interruptions
#include "LiquidCrystal.h"
LiquidCrystal lcd(8,9,4,5,6,7);
void Squelch()
{
etat=!etat;
int squelchIn = 0;
volatile int etat = LOW;
int sqOn;
int sec;
if (etat)
{
lcd.setCursor(0,0);lcd.print("
");
attachInterrupt(squelchIn,Squelch,RISING);
lcd.setCursor(0,0);lcd.print("SQUELCH ON ");
sqOn=1;
}
else
{
attachInterrupt(squelchIn,Squelch,FALLING);
lcd.setCursor(0,0);lcd.print("SQUELCH OFF ");
sqOn=0;
}
void setup()
{
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,0);lcd.print("Interruption ex ");
attachInterrupt(squelchIn,Squelch,RISING);
}
void loop()
{
delay(1000);
if (sqOn)
{
if (sec==60) sec=0;
sec=sec++;
lcd.setCursor(0,1);lcd.print("Time= ");
lcd.setCursor(6,1);lcd.print("
");
lcd.setCursor(6,1);lcd.print(sec,DEC);
}
else
{
sec=0;
lcd.setCursor(0,1);lcd.print("Time= ");
lcd.setCursor(6,1);lcd.print(sec,DEC);
}
}
}
6/8/2014
90
Les Interruptions
Non
Squelch
Squelch
Temp=1s?
Oui
sqOn=0
Oui
sqOn=1
sqOn==1?
Sec=sec+1
Non
Afficher SQUELCH ON
Sec=0
Afficher dure
Afficher dure
Dclenchement
Dclenchement
Les Interruptions
void SquelchOff()
{
lcd.setCursor(0,0);lcd.print("SQUELCH OFF ");
sqOn=0;
attachInterrupt(squelchIn,SquelchOn,RISING);
}
void SquelchOn()
{
lcd.setCursor(0,0);lcd.print("SQUELCH ON ");
sqOn=1;
attachInterrupt(squelchIn,SquelchOff,FALLING);
}
void loop()
{
delay(1000);
if (sqOn)
{
lcd.setCursor(0,1);lcd.print("Time= ");
lcd.setCursor(6,1);lcd.print("
");
lcd.setCursor(6,1);lcd.print(sec,DEC);
sec=sec++;
if (sec>=60) sec=0;
}
else
{
sec=0;
lcd.setCursor(0,1);lcd.print("Time= ");
lcd.setCursor(6,1);lcd.print(sec,DEC);
}
}
Les Interruptions
Autres fonctions
noInterrupts() : Les demandes dinterruption ne sont pas autorises et ne seront pas
prises en compte.
interrupts()
: Toutes les demandes dinterruption sont autorises condition que les
interruptions utilises soient autorises individuellement.
detachInterrupt(numro_interruption): La demande dnterruption numro_interruption
nest plus prise en compte.
6/8/2014
93