Carte Monitoring


 

Cette carte est issue d'un mini-projet (réalisé entre autre par ma pomme).

Il devrait y avoir un rapport (que je n'ai pas). Il me reste les spécifications (fichier pdf).

 

Cette carte a été rebricolée dans tous les sens, il n'y a pas de schéma *exact* (a carte reste extrêmement simple). Voilà un schéma grossier

 

A noter que l'afficheur utilisé est un afficheur récupré. Celui-ci avait quelques pistes de 'détruites' à l'arrière. Il n'est donc mécaniquement pas très fiable.

Côté soft, celui utilisé se trouve dans : Projets\monitor (sur le CD). Il s'agit du source issu du miniprojet, revisité... (sic)
Celui-ci est composé des fichiers (utiles)

 

Aperçu global

La carte pour le miniprojet, supportait 2 modes (changé par le bp sur la carte). Il y avait un mode monitoring et un mode analyseur logique. Le mode était choisi par la variable mode
Dans le robot, seul le mode monitoring est utilisé, (mais le code analyseur logique traine tjrs dans le fichier)

Fonctionnement

La carte commence par s'initialiser. Elle entre ensuite dans une boucle (machine d'état), qui va assurer le rafraichissement de l'affichage (tension, température).
L'acquisition des données à monitorer est réalisé de façon permanente (à chaque acquisition terminée, une IT est déclenchée, elle acquiert la valeur et lance une autre acquisition). Cette IT se charge de faire les calculs et de mettre les résultat à afficher dans 3 tableaux (temper, intensité, tension)
A noter que le watchdog est utilisé, car cette carte recevant toutes les alims bénéficie aussi de TOUS les parasites (plantage +++).
Le monitoring passe par 2 étapes :

Code

Seuls les morceaux utiles à la comprhension de l'appli sont présentés ici.

Initialisation (main.c -- void main())

setup_counters (RTCC_INTERNAL, WDT_144MS); Watchdog
setup_port_a(ALL_ANALOG); Toutes les entrées du port A en analogique (cf datasheet)
setup_adc(ADC_CLOCK_DIV_2);
Init ADC
lcd_init();
Initialisation LCD (initialisation port E/S + envoi commande initialisation LCD)
ext_int_edge( H_TO_L );
Sert au changement de mode (inutile ici)
enable_interrupts(INT_EXT);
Sert au changement de mode (inutile ici)
enable_interrupts(INT_ADC);
Interruption en fin de conversion
enable_interrupts(global);
Active tte les IT
mode=mode_monitoring_init;
mode monitoring au démarrage
enable_interrupts(INT_RTCC);
watchdog + clignotage led alerte
restart_wdt();
watchdog

Boucle principale (main.c -- void main())

while(1){ // y supporterais pas le switch case ?????? restart_wdt();

if (mode==mode_monitoring_init){

moniteur_init(); Initialise l'affichage
mode=mode_monitoring;
Passe en monitoring au tour suivant
can_channel=0;
Choix de l'entrée
n_acq=0; // n° de conversion
Pour faire un moyennage des valeurs acquises
start_adc=0; // adc juste démarré (ne pas prendre les valeurs en compte)
set_adc_channel(can_channel);
Choisi physiquement la voie à mesurer
reset=0;
Cette variable permettre de périodiquement tout réafficher (le LCD lui aussi arrive à planter à cause des perturbations)
}

else if (mode==mode_monitoring){

moniteur(); Affiche les valeurs acquises
reset++;
Réaffichage périodique cf au dessus

if (reset>100){
mode=mode_monitoring_init;
}
...

Conversion (main.c -- ad_isr() )

A chaque fin de conversion, cette routine d'IT est appelée. Elle réalise :

Routines LCD : (lcd.c)

Routines issue du code généré par PCW, réécrit en bonne partie (la 4 lignes de données de l'afficheur ne sont pas connectées de façon contigûe au pic).

Cette structure contient le mapping des pattes du LCD

struct lcd_pin_map { //
boolean data3; // Bit de poids faible (x0)
boolean data2; // (x1)
boolean data1; // (x2)
boolean reserve1; // utilise par l'I2C SDA
boolean reserve0; // utilise par l'I2C SCL
boolean rs; // register select
boolean enable; // chip select
boolean data0; // (x3) } lcd;
}

Cette variable le port utilisé

#byte lcd = 7 // port C (at adresse 7)

Le reste est à rapprocher de la doc du LCD (que je n'ai pas sous la main).

Routines Affichage - Intialisation: (moniteur_init() -- monitor.c)

R.A.S, se contente d'afficher ce quui ne bouge pas sur l'écran du LCD (la déco quoi)

Routines Affichage - Affichage: (moniteur() -- monitor.c)

Affiche les tensions et température. Fait en plus clignoter les tensions et températures qui sont hors limite (clignotage à la main, c'est la variable al qui fait le compteur)

Powered by HardCodage_de_bourrin_tard_dans_la_nuit...