programmer un débimètre !! - C - Programmation
Marsh Posté le 27-05-2006 à 12:55:18
romain78420 a écrit : Bonjour, je suis actuellement en stage et je fais un petit bloquage sur |
Tu as oublié de poster le code avec lequel tu as un problème...
Quand à la démarche, elle n'est pas nouvelle :
1 - Spécification.
OK, c'est fait et c'est assez clair)
2 - Conception
Il y a des éléments dans l'énoncé, à toi de les compléter, d'imaginer une architecture logicielle (threads, peut être...), des fonctions, des interfaces, des comportements (algorithmes, machines à états...).
3 - Réalisation
Codage et tests unitaire... A toi de jouer
Marsh Posté le 29-05-2006 à 21:25:24
euh donc pour realiser mon debimetre jai realisé ce ptit programme mais je sais pas quoi mettre dans les deux boucles do/while donc si vous pouvez me donner un ptit coup de main et me dire si le reste est faux par la meme occase merci davance ...
/***********************************************************************************
* SIMULATEUR DE PULSES POUR COMPTAGE DE FLUIDES *
***********************************************************************************/
#include <alarme.h>
#include <upsd.h>
#include <stdio.h> // define I/O functions
#include <string.h>
// externes
extern struct demande_livraison idata LIVRAISON_EN_COURS;
extern struct typ_generation_pulses xdata GENERATION_PULSES [6];
// Port B ( non bit adressable )
#define RELAIS_1_ON 0x01
#define RELAIS_2_ON 0x02
#define RELAIS_3_ON 0x04
#define RELAIS_4_ON 0x08
#define RELAIS_5_ON 0x10
#define RELAIS_6_ON 0x20
// Valeur des débimètres (pulses par litres)
#define PPL_10 10
#define PPL_14 14
#define PPL_16 16
#define PPL_26 26
#define PPL_35 35
#define PPL_52 52
#define PPL_72 72
#define PPL_100 100
#define PPL_328 328
#define PPL_1400 1400
#define NB_VOIES_A_SCRUTER 6
struct typ_generation_pulses {
MOT PPL; // type debimètre
OCTET RAPPORT_CYCLIQUE; // de 1 à 100
MOT DEBIT_SIMULE; // en pulse/minutes de 1 à 65535 PPM
}GENERATION_PULSES [NB_VOIES_A_SCRUTER];
struct demande_livraison {
OCTET no_livraison;
OCTET code_retour_fdl;
DBL_MOT DEMANDE_LIVR; //quantité à livrer en 1/100 de litres
DBL_MOT QTE_LIVREE;
int timerZ;
OCTET general;
OCTET bascule_faite;
}LIVRAISON_EN_COURS;
OCTET genere_pulses (OCTET voie)
{
/************************
*Numéro de voie (1 à 6)*
************************/
N = no_livraison; ????? // permet d'identifier la voie à tester
/***********
*LIVRAISON*
***********/
nb_pulses = (DEMANDE_LIVR /100) * PPL // Formule de conversion litres/pulsations
/**************************
*DEBIT / RAPPORT CYCLIQUE*
**************************/
for( ij;ij<nb_pulses;ij++)
{
int timerZ = ton = 128ms; // valeur maximale du temps haut
PORT_B_OUT |= RELAIS_N_ON; // RELAIS N EN MARCHE
// Boucle qui va permettre de réduire le temps haut
do
{
//on doit produire des temps haut des plus en plus petit
timerZ-- ; ??????? // décrémente de 1 le timer pour diminuer le temps haut
}while(timerZ > 0);
int timerZ = toff = 128ms; // Valeur maximal du temps bas
PORT_B_OUT &= ~RELAIS_N_OFF; // RELAIS N EN ARRET
// Boucle qui va permettre de réduire le temps bas
do
{
// on doit produire des temps bas de plus en plus petit ...
timerZ-- ; ??????? // décrémente de 1 le timer pour diminuer le temps bas
}while(timerZ > 0);
}
return(0);
}
Marsh Posté le 27-05-2006 à 12:47:45
Bonjour, je suis actuellement en stage et je fais un petit bloquage sur
cet exercice donc jvous joint l'énoncé ci-dessous en espérant que quelqu'un
puisse m'aider à le résoudre ou a me faire comprendre qu'elle démarche je dois
suivre.
Toutes les remarques concernant cet exercices sont les bienvenues.
Merci.
Module de simulation de pulses de comptage de fluides.
Objectif:
Ecrire et mettre au point un module qui puisse émuler un débimètre cad un
compteur qui délivre des impulsions au passage d'un fluide,
cela dans le cadre du développement d'un outil de test en fin de production
des matériels A3B.
Spécifications:
Ce module écrit en C devra tourner en tache de fond sur la carte MULTIFONCTIONs,
au sein du programme chargé sur UPSD_ES.
Pour produire les pulses, il devra actionner un relais(ON/OFF) selon:
une fréquence, un rapport cyclique et une quantité.
Le mieux serait que l'initialisation et la conclusion se fasse en tache d'avant
plan et que le décomptage se fasse en routine d 'interruption timers.
BASEs
a/ actionner un relais
// Port B ( non bit adressable )
# define RELAIS_1_ON 0x01
# define RELAIS_2_ON 0x02
# define RELAIS_3_ON 0x04
# define RELAIS_4_ON 0x08
# define RELAIS_5_ON 0x10
# define RELAIS_6_ON 0x20
exemple :
PORT_B_OUT | = RELAIS_3_ON; // relais 3 ON
PORT_B_OUT & = ~RELAIS_3_ON // relais 3 OFF
b/ parametres statistiques de génération de pulses :
# define NB_VOIES_A_SCRUTER 6
struct typ_generation_pulses {
MOT PPL; // type débimètre
OCTET RAPPORT CYCLIQUE; // de 1 à 100
MOT DEBIT_SIMULE; // en pulse/minutes de 1 à 65535 PPM
(et autres si nécessaires)
}GENERATION_PULSES [NB_VOIES_A_SCRUTER];
Valeurs des débimètres ( pulse par litres) :
#define PPL_10 10
#define PPL_14 14
#define PPL_16 16
#define PPL_26 26
#define PPL_35 35
#define PPL_52 52
#define PPL_72 72
#define PPL_100 100
#define PPL_328 328
#define PPL_1400 1400
c/ paramètres dynamiques pour la livraison
struct demande_ivraison
{
OCTET no_livraison;
OCTET code_retour_fdl;
DBL_MOT DEMANDE_LIVR; //quantité à livrer en 1/100 de litres
DBL_MOT QTE_LIVREE;
int timer;
OCTET general;
OCTET bascule_faite;
}LIVRAISON_EN_COURS;
=> il y a un lien entre la qté demandée et le nombre de pulses à générer :
nb_pulses = (DEMANDE_LIVR /100) * PPL
d/ Timers :
La machine dispose d'interruptions où on peut gérer des timers qui
battent au choix : 1/4 ms, 1ms, 10ms, 256ms
par exemple LIVRAISON_EN_COURS.timer bat la 10ms
4/ appel de fonction et code retour :
prototype : OCTET genere_pulses (OCTET voie):
le parametre voie vaut de 1 à 6 code pour la voie actionnée
le code retour vaut :
0 si OK
autre valeur code erreur .(à definir)