Non je ne me suis pas encore penché sur le CAN...je suis un peu en stress et j'essaye de faire fonctionner correctement mes relais et le BP oN OFF...
-----
Non je ne me suis pas encore penché sur le CAN...je suis un peu en stress et j'essaye de faire fonctionner correctement mes relais et le BP oN OFF...
LU
Alors un conseil pour l'alimentation du pic utilise un LM317 afin de régler la tension d'alimentation à 4,096V.Pour ton programme je ne vois pas. Tu as deux possibilités utiliser l'int par RB0 ou test de RA5 dans la boucle principale quelle solution as-tu choisi ?
Bon mon programme se débloque un tout petit peu...OUF
bon maintenant j'ai encore une question sur les résistances de pull up...ou plutot une résistance de pull down...dois en mettre une sur RA4??
Merci encore de votre aide
Nicolas
RA4 drain ouvert donc résistance pull up, pas pull down
Dernière modification par Pom26 ; 12/11/2007 à 15h09.
Essai ça déjà et dis moi ce que dis le compiloCode:#include <p18f4682.h> #define A4 PORTAbits.RA4 #define A5 PORTAbits.RA5 #define RETRO PORTCbits.RC0 int i; void init_uc(void); void main (void) { init_uc(); i=0; A4=0; PORTB=0x00; while(1) { while(i==0) { if(A5==0) { A4=1; RETRO=1; i=1; } if(A5==1) { A4=0; } } while(i==1) { if(A5==0) { A4=0; RETRO=0; i=0; } if(A5==1) { A4=1; } } } } /*************************************************************************** **************************SOUS - PROGRAMMES ******************************** ***************************************************************************/ /*************************************************************************** Nom : void init_uc(void) Role :Initialisation du PIC *****************************************************************************/ void init_uc(void) { TRISA=0x33; // PORTA en sortie sauf 0-1-5 en entree TRISB=0x00; // PORTB en sortie TRISC=0x00; // PORTC en sortie TRISD=0x00; // PORTD en sortie TRISE=0x00; // PORTE en sortie ADCON1=0b00001110; //Configuration du portA en numérique sauf A0 en analogique
Pom26, ou les autres...
En fait, le test de RA5, est aléatoire, tout dépend combien de temps nous restons appuyé sur le BP...
Je pense donc Utiliser une interruption, là au moins cela fonctionnera a tous les coups.. à moins que vous ayez une solution?
Sinon pour les interruptions, es ce que vous connaitriez la procédure complete à suivre pour que lorsque l'on ai un changement d'état sur RB0,l'on vient interrompre le programme et agir sur RA4..Le mieux pour moi serait un exemple plus des explications.....cela serait le MUST du MUST...
Je sais d'après le lien de POM26 qu'il faut agir sur le registe OPTIONREGmais après...?
Encore mille merci pour vos aides ....je ne sait pas où j'en serais sinon!!!
Nicolas
Merci Hulk, je viens juste de voir ton code...j'essaye ça tout de suite...
encore merci
Nicolas
LU
Pour faire int RB0 validation par INTCON.INTE , FLAG INTCON.INTF
le front par OPTION_REG
Pour le front 1 montant 0 descendant
tu as tout pour faire ton int. En asm c'est adresse 0X04 en C tu as une routine d'interruption bien sur RB0 en entrée
Hulk28, j'ai testé ton programme...il est moins aléatoire que le miens, mais il le reste encore...et si on ajoute une tempo quelque par???
Sinon je peut m'orienter vers une interruption sur RB0, qu'en penses tu?
Je te remercie beaucoup
Nicolas
jorg1n je te laisse avec homme vert,car le C ce n’est pas ma tasse de Thé.Je reviendrai pour le CAN
a bientôt
Je te remercie POM 26 de ton aide..
A bientot et bonne soirée
Nicolas
Le soucis est à la mise sous tension ou au moment du "ON", le µC est non alimenté donc une interruption ne changera rien au problème.
Tu peux essayer ça si il y a des rebonds:
while(i==0)
{
if(A5==0)
{
Delay_ms(100); //Tempo anti-rebonds
A4=1;
RETRO=1;
i=1;
}
..............
}
Tu fais pareil avec la condition de stop.
@+
Bonjour,
pour la tempo de 100 ms secondes, la fonction delay_ms(...), n'existe pas avec le compilateur C18(enfin je crois..)..(ce n'est pas avec le compilateur de CCS??)
Avec le C18 c'est :
Delay1TCY()
* Delay10TCY()
* Delay10TCYx()
* Delay100TCYx()
* Delay1KTCYx()
* Delay10KTCYx()
Mais comment peut on déterminer le temps exact de la tempo, quel est le calcul a faire sachant que mon quartz est un 20MHz...Je sais cque cela correspond a des temps de cycles, mais combien vaut un temps de cycles??
Merci de votre aide
Nicolas
Salut,
un temps de cycle correspond à Fosc/4 soit dans le cas d'un quartz à 20MHz:
20.000.000/4=5.000.000 cycles soit le nombre d'instructions exécutées par seconde (hors interruptions)
Voici une routine que tu peux utiliser dans ton programme:
Code:/**************************************************************** Temporisation en millisecondes ****************************************************************/ void DelayMs(uchar cpt) { ushort t ; while (cpt != 0) { CLRWDT() ; -- cpt ; t = 450 ; while (t !=0) -- t ; } }
Pour l'utiliser tu fais ensuite DelayMs(100), 100 étant l'argument que tu envoie à la fonction DelayMs(), correspondant à la tempo en ms voulue.
@+
Donc temps de cycle avec 20MHz est 1/(20.000.000/4) -> 200ns.Bonjour,
pour la tempo de 100 ms secondes, la fonction delay_ms(...), n'existe pas avec le compilateur C18(enfin je crois..)..(ce n'est pas avec le compilateur de CCS??)
Avec le C18 c'est :
Delay1TCY()
* Delay10TCY()
* Delay10TCYx()
* Delay100TCYx()
* Delay1KTCYx()
* Delay10KTCYx()
Mais comment peut on déterminer le temps exact de la tempo, quel est le calcul a faire sachant que mon quartz est un 20MHz...Je sais cque cela correspond a des temps de cycles, mais combien vaut un temps de cycles??
Merci de votre aide
Nicolas
Merci beaucoup Hulk.
J'essaye ça tout de suite...et je te tiens au courant.
Nicolas
Excuse moi Hulk, mais le "uchar", ce ne searait pas pour un autre compilateur?
Moi j'utilise le C18, et ça doit etre "unsigned char", et de meme que pour "ushort", non?
Sinon pour la fonction CLRWDT() ; je la trouve dans quelle librairie?
Merci
Nicolas
LU jorg1n
Attention lors d'un reset power, les sorties des ports sont dans un état aléatoire donc !!!!!! pour RA5 si = 1 peut-être rèsistance serie avec RA5
Bon c'est bon ça marche, encore un peu aléatoirement, mais c'est pas mal...la fonction principal n'est pas ça!!la prochaine fois je me lancerai dans une procédure avec des interruptions un le mode sleep...mais chaque chose en son temps...
Bon maintenant , POM26 (et les autres bien sur...)je vais m'attaquer à la conversion analogique numérique. sur AN0.
Je récolte toutes les informations que j'avais déja vu et je vous envois ça.
Encore merci de votre aide
Nicolas
PS: dois je ouvrir une nouvelle discussion??
Non on est bien ici lol, mis en suivi
Il faut que tu regardes dans la doc du compilo, soit elle existe toute faite ou il faut l'écrire en utilisant timer0 par exemple.
Je n'utilise pas C18.
Sinon pour l'instant tu peux dévalider le watchdog en mettant la fonction en commentaires.
C'est ce que j'avais fait, et ça marchait correctement.
Je te remercie.
La je suis entrain d'écrire une petite présentation ce se que je souhaite faire..et il y aura des morceaux de programme que j'ai déja réalisé..
Encore merci
Nicolas
Principe :
Ma tension varie entre 10 et 14V, par la suite elle variera entre 3,6 et 5,034V.
Ensuite ce que je souhaite faire c’est comparer le résultat de la conversion à ces tensions(valeurs décimale dans le programme) : 14,5 - 13,5 - 12,5 - 10,5 - 9.
En fonction dans quelle fourchette on se trouve, j’attibue une valeur decimale pour les variables I(intensité) et C(capacité) et j’active l’une de mes sortie du PIC pour activé mes relais.
J’ai fais un petit chronogramme pour bien comprendre le fonctionnment.
La dernière chose qu’il me restera c’est d’afficher sur un LCD 2x16 la variable I, la variable C , l’état dans lequel on fonctionne ON (charge)ou OFF(décharge), mais on vera ça après…
Voila les informations que j’ai a propos de ma conversion analogique et le fonctionnement :
-J’utilise un quartz de 20MHz
-Je mesure une tension qui varie entre 10V et 14V, mais à la suite de mon petit montage pont diviseur, AOP en suiveur, ma tension que je souhaite mesurer varie entre 3,6V et 5,034V.
Pour informations, ma mesure n’a pas besoin d’etre tres précise, car je fais la comparaison du résultat de la conversion avec des seuils (cités au dessus).
Je fais appelle a la libraire adc.h et j’ai créé une fonction convAD :
Je stocke le résultat dans « résult ».Faudrait que je le reconvertisse en décimal avec 1 chiffre après la virgule pour le comparer…a mes seuils…Code:void convAD(void) { OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH0 & ADC_INT_OFF,7); Delay10TCYx(5); //Delay pour 50 TCY => 10µs ConvertADC(); //Start Conversion while(BusyADC());//Attente de l'accomplissement result=ReadADC();//Lecture du résultat CloseADC(); }
Donc ce qui va poser souci je crois c’est la tension Vref
J’avais configurer ADCON1=0x0E, mais il faut que Vcc =5V ??
Merci de votre aide encore
Nicolas
LU
Problème tu ne peux pas avoir VE >vdd VREF>vdd .
slt tlm,je dois réaliser un projet sagissant de l'afficheur 7 segments et je voudrais savoir si je peut remplacer les TRIAC par des RELAIS.merci ...
desolé pour le language sms je suis nouveau ici !!
Bonjour,
pour un sujet différent il faut ouvrir un nouveau topic.
Bonjour Skyline,
Pour l'équivalence entre les triacs et les relais, ne sait pas du tt...
Comment je peut faire alors...pour le Vref?
Quand mon micro est allumé, j'ai 4,95V en vdd mais lorsque mon micro est éteint, j'ai 3,6V...
on ne peut pas réaliser la conversion avec 4,95V de tension d'alimentation??
si on fixe la tension d'entré sur AN0 de 4,95V max?
merci de tes informations.
Nicolas