Je pars en vacances pour 1 semaine, je répondrai à tes questions en rentrant.
Vive la bronzette !
-----
Je pars en vacances pour 1 semaine, je répondrai à tes questions en rentrant.
Vive la bronzette !
@alainav1
Salut,
j'ai regardé le datasheet, mais étant donné que je ne travaille pas sur ce pic, je ne me suis pas très intéressé au datasheet Nous hésitons entre le 12f629 et 12f675 ( enfin c'est une autre histoire )
Le 16f627 n'est là que parce que je peux utiliser le quartz externe, sinon, on ne va pas l'utiliser pour le projet.
Sinon, ton programme fait bien état d'une temporisation, mais n'utilise pas les timer Je connais le WaitMs, mais la précision est misérable
Par ailleurs, Gérard m'avait dit qu'il n'y avait pas moyen d'obtenir un chiffre rond d'IRQ par seconde avec une horloge interne, ou un quartz externe de 4 MHz, si tu as des suggestions, n'hésites pas
Merci ++
bonjour,
de quelle precision as tu besoin?
cordialement
Alain
ah, euh pas trop
On fait marcher le moteur pendant 1 seconde toutes les 20 minutes, on va dire que l'utilisateur le laisse allumer 6 heures ( dans la journée ). Donc la précision n'est pas très importante dans l'absolue, mais si la précision devient trop grande ( de plusieurs minutes, dizaine, vingtaine .... car il me semble la précision baisse au cours du temps ), là ça pose quand même un problème.
++
bonjour,
c'est pas un probleme que la precision du waitms soit miserable si c'est toujours le même ecart .
tu fais un programme avec des boucles imbriquées du type
for j=1 tu 10'soit 10 min
for i=1 to 60 'soit 60S =1 min
led1=1
waitms 1000 '1S
next i
nextj
led=0
tu lances le programme et dans 10min la LED s'eteint si il y a un ecart tu modifies la valeur de 1000 en tenant compte de l'ecart mesuré .
(pour ne pas attendre 10min tu commences par une boucle plus courte 120 secondes par exemple )
Cordialement
Alain
Alors, voilà le programme que j'ai fait avec la fonction delay:
voilà ce que contient le delay.cCode:#include "delay.c" #pragma chip PIC12F629 // déclaration du pic #pragma library 1 #pragma config = 0x31E4 #define sortie GPIO char min; bit led1 @ GPIO2; void main(void) { OSCCAL = 0b10000000; TRISIO = 0b11111011; CMCON = 0b00000111; sortie = 0; for (;;) { delay_10ms(100);led1=!led1; } }
Alors dans ce fichier delay.c, j'ai mis en commentaire les 2 fonctions que je n'ai pas utilisées pour optimiser mon programmeCode:/* delay_10us (char) : delay en multiple de 10 us pour un quartz de 4 MHz delay_ms (char) : delay en ms pour un quartz de 4 MHz delay_10ms (char) : delay en multiple de 10 ms pour un quartz de 4 MHz */ //-----delay en multiple de 10 us pour un quartz de 4 MHz------ /*void delay_10us (char usecs) { while (-- usecs > 0) { clrwdt(); nop(); nop(); nop(); nop(); } } */ //---------delay en ms pour un quartz de 4 MHz--------- /*void delay_ms( uns16 millisec) // Delays a multiple of 1 milliseconds at 4 MHz // using the TMR0 timer { char next = 0; OPTION = 2; // prescaler divide TMR0 rate by 8 TMR0 = 2; // deduct 2*8 fixed instruction cycles delay do { next += 125; clrwdt(); // needed only if watchdog is enabled while (TMR0 != next) // 125 * 8 = 1000 (= 1 ms) ; } while ( -- millisec != 0); }*/ //------delay en multiple de 10 ms pour un quartz de 4 MHz------- void delay_10ms (char n) { char i; OPTION = 7; do { i = TMR0 +39; while (i != TMR0); } while (--n > 0); }
Bon, en attendant d'en acheter un autre, j'ai essayé avec le 16f627 et le quartz externe, et j'ai un excellent temps ! reste à voir avec l'oscillateur interne...
Merci ++
avec l'horloge interne, avec un OPTION donc à 0b10000101 et un config avec _INTRC_OSC_NOCLKOUT, avec la fonction delay, j'ai un retard toutes les minutes de 2 secondes. Avec le timer0, j'ai 1.5 secondes de retard !
Bon, ce que je trouve étrange, c'est que je ne peux pas mettre pour OPTION "horloge externe sur RA4" ( je suis sur le 16f627 ) lorsque j'utilise le quartz externe de 4 MHz ! J'ai manqué un paramètre ?
Merci
je précise que si je met sur "horloge interne", il marche ( mais je sais pas s'il utilise le quartz externe alors dans ce cas, ou s'il utilise l'horloge interne, CONFIG étant laissé à XT pour le quartz externe )
Si tu mets "horloge interne", il prendra en compte soit le Qz externe soit l'oscillateur interne.
Vacances finies !
Donc mieux vaut mettre horloge interne pour que ça reste synchro, non ? Enfin c'est quoi les avantages/inconvénients de mettre sur horloge interne, ou sur transition sur (port)" ?
merci
ps : dommage que tes vacances soient finies
Horloge interne : tu prends en compte la même horloge que celle qui fait travailler l'UC, quelle vienne d'un Qz externe ou de l'oscillateur interne.
Le comptage sur le port est une autre fonction : tu peux (par ex) compter le nombre d'impulsions pendant un temps donné.
donc je laisse sur horloge interne.
Bon maintenant, on a décidé d'utiliser un quartz externe plutôt que l'oscillateur interne en raison de l'imprécision ! ( donc un quartz de 3.2768 MHz )
Bon, tu me conseilles quoi ? Doit on utiliser les interruptions ( donc avec ta méthode, avec le timer1 ), ou les "delays" ou autre ?
merci
Avec TMR1 ce sera plus précis.
donc quartz externe de 3.2768 MHz avec comme paramètre "horloge interne" ( incrémentations sur état haut --> état bas ou l'inverse n'a donc que peu d'importance ), tu me conseilles tmr1 plutôt que delay ( et autres ). Donc j'utilise ta méthode avec les interruptions, c'est ça ?
Bon, je vais m'y mettre, je proposerais aussi un programme, lorsque j'aurais le matériel, ou même avant, même si je l'aurais pas testé.
Sinon, en fait, nous allons prendre un 12f675 et non un 12f629. Je me demandais si tu connaissais la partie "comparateur" par rapport à une valeur de référence. A priori, tu peux avec ce pic donner une valeur qui servira de valeur de référence et ainsi comparer une tension d'entrée a cette valeur ... ?!
Merci
Oui.
Tu peux écrire et tester après, de toute façon, ça ne marche jamais du 1er coup.
Jamais utilisé les comparateurs.Sinon, en fait, nous allons prendre un 12f675 et non un 12f629. Je me demandais si tu connaissais la partie "comparateur" par rapport à une valeur de référence. A priori, tu peux avec ce pic donner une valeur qui servira de valeur de référence et ainsi comparer une tension d'entrée a cette valeur ... ?!
Merci
Par contre, le 675 possède un CAN, tu peux donc lire une valeur analogique.
pas faux
Aurais tu une doc la dessus ? ou pourrais tu m'expliquer stp ? Je parle pas du comparateur ( CMCON ) mais le 12f675 possède un module Analog-To-Digital donc pour une utiliser une valeur de référence entrée manuellement ...
Merci
Regarde la datasheet page 39, il y a un schéma explicite.
Il faudra configurer ADCON0 et ANSEL. Leur fonctionnement est décrit dans les pages suivantes.
Tu lis et tu viens avec des questions précises concernant ce que tu n'as pas compris.
En plus, tu feras des progrès en anglais.
ah oui super, mais je l'ai déjà lu mon cher
Ce que je comprends pas, c'est comment le configurer ? Je veux dire comme lui indiquer une tension de référence ? La pin GP1 est la seule que je peux utiliser comme V-ref, et je met VCFG=1 ! Et alors comment configurer cette valeur de référence ? Est ce la valeur de la tension que le pic va mesurer juste après son "démarrage" ? ( et puis c'est pas vraiment l'anglais le problème, mais surtout les notations et le "langage" pic )
Merci
je rajoute :
concernant le nombre d'interruptions par seconde, est ce que c'est bien ou mauvais d'avoir un nombre d'interruptions par seconde important ? Ou c'est pas du tout important ?
Merci
C'est effectivement GP1 qui peut servir de Vref avec VCFG = 1.ah oui super, mais je l'ai déjà lu mon cher
Ce que je comprends pas, c'est comment le configurer ? Je veux dire comme lui indiquer une tension de référence ? La pin GP1 est la seule que je peux utiliser comme V-ref, et je met VCFG=1 ! Et alors comment configurer cette valeur de référence ? Est ce la valeur de la tension que le pic va mesurer juste après son "démarrage" ? ( et puis c'est pas vraiment l'anglais le problème, mais surtout les notations et le "langage" pic )
Merci
La tension analogique que tu mettras sur GP1 sera la réference, tu utilises une référence de tension (voir TL431).
Exemple : Ref de 3V
la conversion se fera entre 0 et 3V au lieu de 0 et VCC.
Tu auras une plus grande résolution.
Ca dépend de ce que tu veux faire.
Dans un de mes cas, je voulais 25 IRQ/s, c'est un choix.
Plus tu as d'IRQ, plus le programme sera ralenti, forcement, on l'interrompt plus souvent. C'est quand même relatif.
Je commence à hésiter entre utiliser ANSEL et ADCON, ou le comparateur ... j'ai compris comment il fonctionnait, et donc si j'ai bien compris, en mettant les 3 dernier bits de CMCON à 100, j'ai au VIN+ la valeur de référence interne, et au VIN- le port GP1, donc je peux utiliser GP0 et GP2 en I/O, c'est ça ?C'est effectivement GP1 qui peut servir de Vref avec VCFG = 1.
La tension analogique que tu mettras sur GP1 sera la réference, tu utilises une référence de tension (voir TL431).
Exemple : Ref de 3V
la conversion se fera entre 0 et 3V au lieu de 0 et VCC.
Tu auras une plus grande résolution.
Tu me conseilles quoi ? d'utiliser le comparateur, ou le ADCON/ANSEL ? ( le convertisseur, j'ai pas trop compris son fonctionnement en fait, surtout entre "entrée analogique" et "entrée digitale", je comprend pas ces 2 notions )
Merci
je suis allé a la page 44 du datasheet, et je suis sur le tableau "TAD vs. DEVICE OPERATING FREQUENCIES" bon j'ai pas trop compris, mais je crois que c'est le temps que va mettre le pic pour lire la tension et la comparer ?
Je devrais peut être utiliser un quartz à plus basse fréquence, notamment pour les interruptions, et pour rester avec des temps ( cf tableau )
Merci pour tes éclaircissements ( comme dab )
Entrée digitale : ne peut que prendre 2 valeurs, 1 ou 0, soit 5V ou 0V.Je commence à hésiter entre utiliser ANSEL et ADCON, ou le comparateur ... j'ai compris comment il fonctionnait, et donc si j'ai bien compris, en mettant les 3 dernier bits de CMCON à 100, j'ai au VIN+ la valeur de référence interne, et au VIN- le port GP1, donc je peux utiliser GP0 et GP2 en I/O, c'est ça ?
Tu me conseilles quoi ? d'utiliser le comparateur, ou le ADCON/ANSEL ? ( le convertisseur, j'ai pas trop compris son fonctionnement en fait, surtout entre "entrée analogique" et "entrée digitale", je comprend pas ces 2 notions )
Merci
Entrée analogique : on met une valeur de tension comprise entre 0V et 5V. (digital = numérique)
Le comparateur : tu mets une valeur analogique en entrée, la sortie du comparateur sera à 0 ou à 1 suivant la cofiguration du comparateur.
Le comparateur compare V- et V+ et agit sur la sortie suivant la config.
Le CAN (Convertisseur Analogique Numérique) : tu mets une valeur analogique en entrée, le CAN va la convertir en une valeur numérique.
Ex (si pas de VRef utilisée) pour 0V, tu auras 0 point, pour 5V tu auras 1023 points, pour 2,5V tu auras 512 points.
Ceci parce que c'est un CAN 10 bit.
Pour ton utilisation, que veux-tu faire ?
Le comparateur te donne une valeur en fonction d'un seuil de tension.
Le CAN convertie la valeur de l'entrée et tu peux utiliser cette valeur numérique dans des calculs.
Je ne vois pas de quel tableau tu parles.je suis allé a la page 44 du datasheet, et je suis sur le tableau "TAD vs. DEVICE OPERATING FREQUENCIES" bon j'ai pas trop compris, mais je crois que c'est le temps que va mettre le pic pour lire la tension et la comparer ?
Je devrais peut être utiliser un quartz à plus basse fréquence, notamment pour les interruptions, et pour rester avec des temps ( cf tableau )
Merci pour tes éclaircissements ( comme dab )
euh c'est pas le contraire ?Entrée digitale : ne peut que prendre 2 valeurs, 1 ou 0, soit 5V ou 0V.
Entrée analogique : on met une valeur de tension comprise entre 0V et 5V. (digital = numérique)
pour l'utilisation : ben au départ, on avait pensé pouvoir utiliser la patte GP3 pour gérer la partie "déchargement" de la batterie. Une patte est à 1 lorsqu'une tension de 2V à 5V est appliquée en entrée, et à 0 si la tension en entrée se situe entre 0V et 2V. Tu es d'accord là ?
Donc ( on a choisit une batterie au plomb de 12V ), d'après wikipedia, la batterie au plomb se décharge lorsque U=10.8V donc il faudrait qu'à 11V - 10.9V, il y ait passage de l'état haut à l'état bas ( donc en dessous de 2V ) et comme ça, on fait clignoter une led, et le système est bien sûr en "pause". Mais on se demande si on ne pourrait pas se servir soit du comparateur, soit du CAN pour mener à bien cette fonction. Car si on utilise le comparateur, je "perds qu'1 seul port ( GP1 ), par contre si j'utilise le CAN, je vais perdre 2 ports, non ?
mais c'est pas un RC, et le controle ne se fera pas en SLEEP mode ( point 4: When the device frequency is greater than 1 MHz, the A/D RC clock source is only recommended if the conversion will be performed during SLEEP.)
alors, mon cher Gérard, j'ai gardé 3 valeurs possibles pour le quartz externe : soit 2.0480 MHz, soit 3.2768 MHz, soit 2.097152 MHz. Quelle valeur mettre pour ces 3 valeurs ( par exemple pour 3.2768 MHz ) ? Mais attend mon cher Gérard, si je fais par rapport à Vdd, ça sera toujours du 5V ( régulateur 78L05 ), non ?