/***sélection de fréquence par liaison série***/
void PCC(){
int FIN= 0;
int j =8;
int calc = 0;
int tab;
int Tab;
int X;
int selection = 0;
int bp2=0;
unsigned long U=1;
do{
Frek = 0;
Serial.println("définir une fréquence et finir par un .");
byte tableau[11] = {}; //tableau ou je vais mettre les valeurs
do
{ //remplissage du tableau
if (Serial.available() > 0) { //si des données entrantes sont présentes
tableau[j]= Serial.read(); //remplissage du tableau
calc++; //incrémentation du nombre de case utilisées
if (tableau[j]== '.') { //sortie si on reçois le point
j=0;
}
j--;
}
}while(j>0);
do{
Tab=calc-1; //ordre de passage
tab = Tab-1; //nombre de passage
while(tab>0) {
U=U*10; //mise à niveau des centaines dizaines unités
tab--;
}
j=8; //on commence à l'emplacement 7 du tableau ou se trouve la première donnée (et non pas 0)
//création de la valeur
do {
Frek = Frek+(tableau[j]-48)*U; //calcul de la fréquence, le -48 car il garde la désignation ascii
U=U/10; //toujours les centaines dizaines unités
j--;
Tab--;
}while(Tab>0);
Serial.println(Frek);
}while(FIN>0);
//configuration timer
//mise à zéros des registres
TCCR2B = 0;
TCCR2A = 0;
if(Frek > 0 && Frek <= 400){
selection=1;
}
else if (Frek > 400 && Frek <= 1500){
selection=2;
}
else if (Frek > 1500 && Frek <= 3000){
selection=3;
}
else if (Frek > 3000 && Frek <= 6000){
selection=4;
}
else if (Frek > 6000 && Frek <= 13000){
selection=5;
}
else if (Frek > 13000 && Frek <= 50000){
selection=6;
}
else if (Frek > 50000 && Frek <= 8000000){
selection=7;
}
switch (selection) { //foc= fcryst/(2*prescaler*(1+ocr) calcul a appliquer
//1+0cr = fcryst/(foc*presc)
//ocr+1
//ocr-1=(foc*presc*2)/fcryst
case (1):
//première plage de sélection
TCCR2B = ( 1<<CS22 | 1<<CS21 | 1<<CS20 /* prescaler 111 1024*/);
PCPResk=1024;
PCCPR();
break;
case (2):
TCCR2B = ( 1<<CS22 | 1<<CS21 /* prescaler 110 256*/);
PCPResk=256;
PCCPR();
break;
case (3):
TCCR2B = ( 1<<CS22 | 1<<CS20 /* prescaler 101 128*/);
PCPResk=128;
PCCPR();
break;
case (4):
TCCR2B = ( 1<<CS22 /* prescaler 100 64*/);
PCPResk=64;
PCCPR();
break;
case (5):
TCCR2B = ( 1<<CS21 | 1<<CS20 /* prescaler 011 32*/);
PCPResk=32;
PCCPR();
break;
case (6):
TCCR2B = ( 1<<CS21 /* prescaler 010 8*/);
PCPResk=8;
PCCPR();
break;
case (7):
TCCR2B = ( 1<<CS20 /* prescaler 001 1*/);
PCPResk=1;
PCCPR();
break;
}
Serial.println("pour sortir du mode commande pc");
Serial.println("envoyer un . en appuyant sur les 2");
Serial.println("bouton poussoir ou");
plus = digitalRead(8); //lecture du bouton poussoir
moin = digitalRead(9); //lecture du bouton poussoir
if(plus == HIGH && moin == HIGH ){ //si les deux sont haut retour au mode manuel
bp2 = 1;
}
}while(bp2 != 1);
}
/***calcul de l'ocr***/
/***********calcul de l'ocr*************/
void PCCPR(){
int OCR2;
TCCR2A = ( 1<<WGM21/*ctc mode*/ | 1<<COM2A0 /*toggle mode*/ );
Frekpc = (Frek*PCPResk*2);
Frekpc = 16000000/Frekpc;
Frekpc = --Frekpc;
OCR2A=Frekpc; //calcul de l'ocr
OCR2=OCR2A;
OCR2=OCR2+1; //préparation au calcul de frequence
FOC=long(OCR2)*long(PCPResk)*2; //changement de type de variable et multiplication
FREQ=16000000/FOC;
aff(); //afichage sur l'ecran lcd
PCC(); //retour à la detection
}
avec un petit schéma
