Test 1er programme (TPE)

  • Auteur de la discussion guiguix3000
  • Date de début

guiguix3000

Nouveau membre
Bonjour, dans le cadre des TPE à l'école (1è S SI), je réalise une éolienne sur laquelle je met une girouette. Pendant les vacances, je me suis mis à programmer la girouette en C afin qu'elle indique la direction du vent. Le mât de la girouette sera monté sur un potentiomètre sans fin. Le problème c'est que je ne sais pas comment tester le programme que j'ai commencé à écrire... :heink:

Je voulais aussi savoir en même temps si vous pouviez me dire comment introduire le test pour les autres directions du vent (nord-est, est, sud-est...) après le 1er if. Un seul else ne suffirait pas...

Voilà le programme (pas trop cousu de fautes, je l'espère)

Code:
int 8 tension;

void config (void)
{
setup_adc(adc_clock_div_2);
setup_adc_ports(all_analog);
set_adc_channel(0);
}

void main (void)
SET_TRIS_A(0x01)
SET_TRIS_B(0x00)
config();
do
{
tension=read_adc();
if((tension=0x10)&&(tension>0xE0))
{
printf("Nord/n");
}

Merci !
 

boub popsyteam

Grand Maître
1/ Balises
Code:
 stp ;)

2/Un switch / case ?

Si tu les as dans le C de ton microcontrolleur ...
 

guiguix3000

Nouveau membre
excuse moi pour la balise, par contre un switch/case c'est a dire ??

Pour tester mon programme j'ai entendu qu'il y avait des émulateurs sur pc disponible en shareware mais je ne sais pas lesquelles ni rien, c'est pr ca que je m'adresse a vous
 

zeb

Modérateur
switch est un mot réservé du langage C. En lisant ton manuel sur le sujet, tu vas tout de suite comprendre pourquoi boubpopsyteam te le propose.

A propos d'émulateurs, tu cherches un programme qui simule ton environnement ? C'est peut être trop spécifique, non. Sinon, il est possible que le fabriquant de ton système électronique mette gracieusement les outils dont tu as besoin. C'est un problème récurrent en info indus et le monde Linux propose pas mal de solutions dans le cadre de la compilation croisée (crosscompil).
 

guiguix3000

Nouveau membre
J'ai aucun manuel sur le sujet, on a fait que 2 cours sur le sujet en classe...

Le fabricant du système électronique c'est moi, donc j'ai aucun manuel ni quoi que ce soit. Ms le prof m'a parlé juste avant les vacs, pdt le TPE, d'un logiciel qui me permettait de simuler tout ca, mais il ne se souvenait plus lequel...:s
 

zeb

Modérateur
2h de cours pour maîtriser le C ????
Bon, alors tu fais 4 tests différents pour Nord Sud Est Ouest et tu te prends pas la tête. Sauf si la programmation t'intéresse vraiment, mais là il faut investir dans un bon bouquin.

Tu as bien une interface entre ton potard et ton PC. Tu as utilisé un truc tout fait ou tu as refais la gestion RS232 dans un PIC ?

Explique-nous un peu d'où sortent les fonctions xxxxx_adc(). La clef est peut-être là.
 

guiguix3000

Nouveau membre
On a eu 8h de cours (2*4h)
Je pourrais faire des tests différents à chaque fois c'est vrai mais en effet la programmation m'intéresse vraiment. Je pensais acheter le 1er bouquin de cette page http://www.developpez.com/c/livres/ mais en attendant de l'avoir faut bien que j'avance :)

Sinon en cours, on envoyait tout le toutime dans une petite carte avec un microcontroleur en passant par un boitier (c'est ça le PIC nan ??) et on avait un logiciel qui faisait la compilation et l'envoi tout seul, mais on m'a di qu'il ne pouvait pas simuler...:s

Les fonctions xxxxx_adc() ce sont des facilités du logiciel en questions qui lui sont intégrées.
 

zeb

Modérateur
Ah !!! Je savais bien que tu n'avais pas tout fait tout seul !!
PIC c'est une marque de microcontroleur. Il est possible que ce soit une puce d'une autre marque.

Bon, donne un peu plus de précision. Le programme compilé, il doit tourner sur un PC ou dans le µC ?
 

zeb

Modérateur
Autre question. Quelles sont les valeurs renvoyées par read_adc() ? Min, Max. Pour quelle valeur a-t-on le Nord, le Sud, etc. Combien de branche a ta rose des vents ?

Envoie, on va essayer de t'aider.
 

Emmanuel Delahaye

Expert

Bah, un programme, c'est plus ou moins tçujours des entrées, des traitements et des sorties. Il suffiu donc de simuller les entrées, de visualiser les sorties, et de comparer avec les valeurs attendues.

A toi de définir le lien entre la position du potentiomètre et la direction du vent (ça, c'est évident) et surtout entre la grandeur physique mesurée (resistance, tension, linéarité...) et la position. Là, çà peut être plus complexe. Voir aussi les problèmes de résolution. (Tu as un CAN ? Combien de bits ?, Quelle fréquence d'échantillonage...)

Nota : une roue codeuse serait, AMA, plus adaptée à la situation...
Je voulais aussi savoir en même temps si vous pouviez me dire comment introduire le test pour les autres directions du vent (nord-est, est, sud-est...) après le 1er if. Un seul else ne suffirait pas...
Tant qu'on ne connait pas le lien entre grandeur physique et position, on ne peut rien dire...
Voilà le programme (pas trop cousu de fautes, je l'espère)

int 8 tension;
Merci de lire les regles du forum et d'utiliser les balises 'code'...
void main (void)
main() retourne int. Toujours.



printf("Nord/n");
[fixed]printf("Nord\n");[/fixed]
Sinon, pour définir des intervalles, tu peux continuer avec if else etc.
[fixed]
if (tension >= V_WNW && tension < V_NNE)
{
printf ("Secteur Nord\n");
}
else if (tension >= V_NNE && tension < V_ENE)
{
printf ("Secteur Nord Est\n");
}
else if (tension >= V_ENE && tension < V_ESE)
{
printf ("Secteur Est\n");
}
[/fixed]
etc.
 

guiguix3000

Nouveau membre
Je vais essayer de répondre à toutes les questions :)
Le programme va ds un CAN pour qu'ensuite on puisse retourner Nord, Sud...
Les valeurs pour Nord, Sud etc etc je ne les connais pas encore (j'ai eu le potard juste avant les vacances donc pas eu de temps pour les tests)
Les branches de la roses des vents : Nord, Nord-Est, Est, Sud-Est, Sud, Sud-Ouest, Ouest, Nord-Ouest.
Il suffiu donc de simuller les entrées, de visualiser les sorties, et de comparer avec les valeurs attendues.
Et je fais ca comment et avec quel logiciel ?
Et surtout entre la grandeur physique mesurée (resistance, tension, linéarité...) et la position
C'est une tension qui rentre ds le CAN.
Nota : une roue codeuse serait, AMA, plus adaptée à la situation...
C'est quoi ? :D
Merci de lire les regles du forum et d'utiliser les balises 'code'...
Désolé, c'est maintenant fait.
Sinon, pour définir des intervalles, tu peux continuer avec if else etc.
Merci, je vais pouvoir faire le reste.
main() retourne int. Toujours.
J'ai toujours du mal a comprendre ce qu'est int... :??:
 

zeb

Modérateur
Emmanuel est un intégriste orthodoxe. Et ce qui m'énerve le plus, c'est qu'il a toujours raison. :ange: int c'est entier en C. Un programme doit toujours renvoyer un code entier au système d'exploitation, en C c'est le return de main() qui fait ça. Je crois que tu es loin de ces considérations mais puisque tu débutes, autant prendre tout de suite de bonnes habitudes.

C'est quoi ton histoire de programme dans un CAN ? Un CAN pour moi (et sans doute pour d'autres) c'est un convertisseur analogique/numérique, pas un µP ou un µC. Comme je n'ai toujours pas compris ton montage, je vais encore te demander des précisions sur ton montage complet : un potard (analogique), un convertisseur (analogique-->numérique), un PC (numérique) ?

J'ai tellement envie qu'il y ait un PC, juste pour que printf() est un sens dans ton programme.

Il est interdit sur un forum de dire : "C'est quoi un ......." , même quand il s'agit d'une roue codeuse. Google est ton ami pour ça.

Bon, on revient au C.

Code:
/* Valeur bidon : à mesurer ! */
#define TENSION_UN_TOUR 0x012A

int tension2degre ( int tension )
{
	/* Transforme une tension en degré
	 *
	 *  Un tour complet de potard, c'est tant d'unité en tension : TENSION_UN_TOUR
	 *  On espère que le potard est linéaire.
	 *
	 *  Le signe pourcent, c'est le modulo (reste de la division entière)
	 *
	 */
	
	return ( tension * 360 / TENSION_UN_TOUR ) % 360 ;
}

void degre2rose ( int degre )
{
	/ * Tranforme des degrés en affichage "Rose des vents"
	  *
	  *  Le Nord, (zéro) c'est donc une plage de 45° entre -22.5° et +22.5°
	  *  On travaille en entier et de 0° à 359°,
	  *  donc je propose de décaler de 22°. Faire un dessin !!
	  *
	  *  Modulo 360 et Division par 45, il y a donc 8 valeurs possibles :
	  *
	  * /
	  
	switch ( ( ( degre + 360 - 22 ) % 360 ) / 45 )
	{
	case 0 : printf ( "Nord" );       break;
	case 1 : printf ( "Nord-Est" );   break;
	case 2 : printf ( "Est" );        break;
	case 3 : printf ( "Sud-Est" );    break;
	case 4 : printf ( "Sud" );        break;
	case 5 : printf ( "Sud-Ouest" );  break;
	case 6 : printf ( "Ouest" );      break;
	case 7 : printf ( "Nord-Ouest" ); break;
	}
}

Bon, maintenant les tests.
Soit tu testes les entrées, soit tu testes les sorties.

Pour tester les entrées, tu te refais un ptit bout de programme qui ne fait qu'afficher les données brutes :

Code:
[...]

int main ( )
{
	int tension;
	
	[...]
	
	tension = read_adc();
	printf ( "%x\n", read_adc() );
	
	return 0;
}

Pour les sorties, tu mets en commentaires la récupération des valeurs de la girouette et tu mets un simple scanf. Tu peux alors entrer des valeurs (au format décimal, hein!) à la main :

Code:
[...]

int main ( )
{
	int tension;
	
	[...]
	
	/* tension = read_adc(); */
	scanf ( "%d", & tension ) ;
	
	[...]	
}
 

Emmanuel Delahaye

Expert

Tu veux dire le potentiomètre, je suppose ?
Les valeurs pour Nord, Sud etc etc je ne les connais pas encore (j'ai eu le potard juste avant les vacances donc pas eu de temps pour les tests)
Les branches de la roses des vents : Nord, Nord-Est, Est, Sud-Est, Sud, Sud-Ouest, Ouest, Nord-Ouest.
Et non en ° d'angle. Donc tu vas te contenter de définir des plages d'angle, et d'indiquer des secteurs, pas des directions. (comme dans l'exemple que j'avais posté). Attention, je suis un ancien marin (d'eau plus ou moins douce), alors soyons précis ... dans l'inexactitude.

Vous devez être connecté pour voir les images.


Un petit logiciel pour calculer les secteurs :
[fixed]
#include <stdio.h>
#include <math.h>

int main (void)
{
int nb_sect = 8;
double const angle_sect = 360 / nb_sect;
double const offset = angle_sect / 2;

static char const *as[] =
{
"NE",
"E",
"SE",
"S",
"SW",
"W",
"NW",
"N",
};
int i;
for (i = 0; i < nb_sect; i++)
{
printf ("%10s : %.2f .. %.2f\n", as
, fmod (offset + ((i + 0) * angle_sect), 360)
, fmod (offset + ((i + 1) * angle_sect), 360)
);
}

return 0;
}
[/fixed]
Ce qui donne
[fixed]
NE : 22.50 .. 67.50
E : 67.50 .. 112.50
SE : 112.50 .. 157.50
S : 157.50 .. 202.50
SW : 202.50 .. 247.50
W : 247.50 .. 292.50
NW : 292.50 .. 337.50
N : 337.50 .. 22.50
[/fixed]
Il suffit donc de simuler les entrées, de visualiser les sorties, et de comparer avec les valeurs attendues.
Et je fais ca comment et avec quel logiciel ?
[/quote]
Un logiciel que tu écris. Un tableau avec des valeurs, un fichier..
Et surtout entre la grandeur physique mesurée (resistance, tension, linéarité...) et la position
C'est une tension qui rentre ds le CAN.
Est-elle bien linéaire ? sinon, il va valloir apporter une correction (tableau de conversion...). Il va falloir faire une mesure très précise de la tension, que celle-ci soit très stable (quelque soit la météo) etc.
Nota : une roue codeuse serait, AMA, plus adaptée à la situation...
C'est quoi ? :D
Marche plus ton Google ?
main() retourne int. Toujours.
J'ai toujours du mal a comprendre ce qu'est int... :??:
Là je dis stop. Si tu ne connais pas les bases du C, pas la peine de continuer. Il faut te former et vite. Tu ne peux pas apprendre 25 choses en même temps. Une à la fois et ensuite la suivante.
 

boub popsyteam

Grand Maître
Vu qu'il n'y a pas d'OS, il n'y a aucune raison que main renvoie une valeur a qui que ce soit ... Donc AMHA, Void est tres bien dans ce cas particulier ...

C.A.N. --> Convertisseur Analogique Numérique. On ne lit pas un potard directement ;)
 

guiguix3000

Nouveau membre
Ok pour la fonction int j'ai regardé un cours sur le net, mais sinon je comprend pas tout ce que vous me racontez, je crois que je vais attendre d'avoir mon bouquin parce que la...
 

ArnaudDragon

Nouveau membre
A titre d'information, si tu veux apprendre le C le Site du Zero est le mieux que je connaisse (c'est avec lui que j'ai appris).

 

guiguix3000

Nouveau membre
Par contre j'ai toujours pas compris pourquoi vous utilisez les angles et non les tensions ?? Ce serait quand même plus simple non ?
 

boub popsyteam

Grand Maître
Les tensions ne sont que le medium representant l'angle ;)
Une fois passé dans ton CAN ce n'est qu'une valeur.
 

zeb

Modérateur
C'est surtout parce qu'une rose des vents, ce sont des angles. Alors un marin comme Emmanuel ou un aviateur comme votre serviteur pensent en degré d'angle. Mais tu peux sauter cette étape et convertir directement tes tensions.

Pour info, un cap se donne en 4 directions : N,S,E,O, en 8 : N, NE, E, etc., en seize N, NNE, NE, ENE, E, etc, en 36 : 01, 02, 03, .. 36 ou en 360 ..... D'où le réflexe de te proposer des angles... Et puis surtout, un modulo 360° est clair et évident...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 060
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut