Programme avec un PIC 16F876

hoshima -  
 marcel48 -
Bonjour,
je dois programmé un pic 16f876 pour mon projet de fin d'année de BTS.
Je connais pas grand chose à la programmation. Je dois programmer un pic 16F876 avec Mplab et j'ai choisis CC5x comme compilataur.
Le programme que je dois faire
c'est à partir d'une valeur de tension la comparer grace au pic et si elle est dans la plage de fonctionnement elle doit faire allumer une led. Si elle la valeur ne se situe pas dans la plage de fonctionnemenet elle doit allumé une autre led.

Je ne sais pas du tout par où commencer.

Pouvez-vous m'aidez.

Merci
A voir également:

3 réponses

hoshima
 
Bonjour

Voici une partie de mon programme
pouvez vous me dire s'il est à peu près correcte et si la configuration du can est bonne? (je ne sais pas comment on fait pour récupérer la valeur qu'il convertit?)
#define <p16f873>
#include <delays.h>
#include <stdio.h>
#include <stdlib.h>

// shortcut definition

#define Temp_ok portb.7 //temperature is good
#define Temp_nok portb.6 //temperature is not good
#define Pressure_ok portb.5 //pressure is good
#define Pressure_nok portb.4 //pressure is not good
#define short_circuit_GND portb.3 //short circuit GND
#define short_circuit_supply portb.2 //short circuit supply
#define ill portb.1 //sensor is ill
#define open_circuit portb.0 //open circuit
#define battery_output portc.7 //battery
#define sensor_pressure_input porta.0 //pressure signal sensor
#define sensor_temp_input porta.1 //temperature signal sensor
#define battery_input porta.5 //signal battery

//constant and variable declaration

unsigned double sensor_output,sensor_pressure_input,sensor_temp_input;
unsigned double s1,s2,s3,s4,s5;

void main ()
{
// initialization (we initialize all variable)
failure=0;
short_circuit_supply=0;
short_circuit_GND=0;
Pressure_nok=0;
Pressure_ok=0;
Temp_nok=0;
Temp_ok=0;
open_circuit=0;
battery_output=0;
}
while (1)
{
// Analog Digital Conversion configuration
{
ADFM=1; //Left justified

Result.low8=ADRESSH //to retrieve only 16-Bits word instead 2 8-bits word
Result.hignt=ADRESSL // to retrieve only 16-Bits word instead 2 8-bits word

PDCF0=0; // enable to config pin like analog or digital input with this config AN0=AN1=AN4=analog input
PDCF1=0; // enable to config pin like analog or digital input
PDCF2=0; // enable to config pin like analog or digital input
PDCF3=1; // enable to config pin like analog or digital input

ADCS1=0 // bit which enable to choose frenquency for ADC
ADCSO=1 // bit which enable to choose frequency for ADC

CHS2=0 //bit which enable to select analog input to convert
CHS1=0 //bit which enable to select analog input to convert
CHS0=0 //bit which enable to select analog input to convert


GO/DONE=1 //bit which launch conversion
ADON=1 // Actuate ADC

GO/DONE=0 //bit which switch off conversion

ADON=0 // Switch off ADC
}
// level definition

0<s1<0,2 // s1= short circuit GND
0,2<s2<1,8 // s2=ill
1,8<s3<2,2 // s3= good sensor
2,2<s4<3,15 // s4=ill
3,15<s5<3,55 // s5=open circuit
3,55<s6<4,8 // s6=ill
s7<4,8 // s7=short circuit supply




//level pressure comparaison
if (sensor_temp_input=s1) //if the voltage level is between 0V and 0,2V
{
portb.7=0; //temperature is good
portb.6=1; //temperature is not good
portb.3=1; //short circuit GND
portb.2=0; //short circuit supply
portb.1=0; //sensor is ill
portb.0=0; //open circuit
}

else if (sensor_temp_input=s2) //if the voltage level is between 0,2V and 1,8V
{
portb.7=0; //temperature is good
portb.6=1; //temperature is not good
portb.3=0; //short circuit GND
portb.2=0; //short circuit supply
portb.1=1; //sensor is ill
portb.0=0; //open circuit
}

else if (sensor_temp_input=s3) // if the voltage level is between 1,8V and 2,2V
{
portb.7=1; //temperature is good
portb.6=0; //temperature is not good
portb.3=0; //short circuit GND
portb.2=0; //short circuit supply
portb.1=0; //sensor is ill
portb.0=0; //open circuit
}

else if (sensor_temp_input=s4) // if the voltage level is between 2,2 V and 3,15V
{
portb.7=0; //temperature is good
portb.6=1; //temperature is not good
portb.3=0; //short circuit GND
portb.2=0; //short circuit supply
portb.1=1; //sensor is ill
portb.0=0; //open circuit
}

else if (sensor_temp_input=s5) // if the voltage level is between 3,15V and 3,55V
{
portb.7=0; //temperature is good
portb.6=1; //temperature is not good
portb.3=0; //short circuit GND
portb.2=0; //short circuit supply
portb.1=0; //sensor is ill
portb.0=1; //open circuit
}

else if (sensor_temp_input=s6) // if the voltage level is between 3,55V and 4,8V
{
portb.7=0; //temperature is good
portb.6=1; //temperature is not good
portb.3=0; //short circuit GND
portb.2=0; //short circuit supply
portb.1=1; //sensor is ill
portb.0=0; //open circuit
}

else if (sensor_temp_input=s7) // if the voltage level is "superieur à " 4,8V
{
portb.7=0; //temperature is good
portb.6=1; //temperature is not good
portb.3=0; //short circuit GND
portb.2=1; //short circuit supply
portb.1=0; //sensor is ill
portb.0=0; //open circuit
}
}
4
hoshima
 
J'ai oublié de dire que je fais le programme en C
0
marcel48
 
appelez moi au 06 20 86 79 25 , je pense avoir la réponse a votre soucis.Je suis originaire du GARD (Ales).
Je vous ferais passer la solution à votre programmation.
SI toutefois vous êtes dans la région possibilité de se rencontrer , je suis un passionné de Pic.
0
fanta759
 
https://www.microchip.com/wwwproducts/en/en010239
la tu as la datasheet complète de ton pic.
il faut que tu commence par paramétrer le convertiseur analogique/numérique (tu trouveras tout sur le liens plus haut). une fois configuré, un while(1){......} et tu remplace les ..... par le code pour lancer la convertion et tu compares avec tes valeurs de plage
if(resultat_conv > plage_min && resultat_plage < plage_max)
//allume une led
else
// allume l'autre led.
0
hoshima69
 
javance petit à petit (après avoir mis 4 jours pour définir les variables mais un nouveau problème se présente

Je dois utiliser un timer pour allumer les leds?
Est-ce que je dois utiliser un quartz?
Si oui où est-ce que je le vois sur la doc technique?
et comment je le choisis?
0
loupius Messages postés 789 Statut Membre 148 > hoshima69
 
Oh non il n'est pas nécessaire d'utiliser un quartz pour allumer une led. Tu utiliseras un timer (8 bits ou 16 bits selon le PIC utilisé (voir la doc)) cadencé par l'oscillateur de ton PIC; tu as le choix de l'oscillateur, selon la précision voulue tu pourras prendre l'oscillateur interne ou un oscillateur externe (circuit RC ou quartz (voir la doc)).
Bonne continuation.
0
hoshima69 > loupius Messages postés 789 Statut Membre
 
C'est quoi le mieu? un oscillateur interne ou externe?
0
hoshima69 > hoshima69
 
Car apres je vais devoir ajouter d'autre fonction a mon programme

notamment un mode sleep, un mode reset/wake-up et un mode burn out( une led clignote pour prevenir lorsqu'on aura une tension en dessou d'un niveau)
0
loupius Messages postés 789 Statut Membre 148 > hoshima69
 
Tout est une question de précision; il est évident qu'un quartz est plus précis, mais c'est plus encombrant. Voir la doc pour la mise en oeuvre.
Bon choix.
0