Oui c'est bon.
Maintenant va falloir s'attaquer au programme.
Comme je fais du Basic, je ne te serai pas d'un grand secours en C.
Oh tu sais, même si tu ne t'y connais pas en C, tu pourras quand même comprendre une partie
Sinon, on est en train de faire la liste des composants, pour le quartz ( standard donc ) il n'y a pas de différence à mettre une valeur dans tmr1h n'est ce pas ? Je veux dire si tu précharges une valeur dans tmr1h au début et à chaque interruption, cela influe t il sur la précision, rapidité ... ?
Merci
Ce qui change quelque chose à TMR1H est la fréquence du Qz.Oh tu sais, même si tu ne t'y connais pas en C, tu pourras quand même comprendre une partie
Sinon, on est en train de faire la liste des composants, pour le quartz ( standard donc ) il n'y a pas de différence à mettre une valeur dans tmr1h n'est ce pas ? Je veux dire si tu précharges une valeur dans tmr1h au début et à chaque interruption, cela influe t il sur la précision, rapidité ... ?
Merci
Tu en as cité 3 différents, il faudra recalculer la valeur à recharger si tu mets un autre Qz qu'un qui fait 3,2768MHz.
La précision sera toujours celle du Qz.
On trouvera une solution.
Bon, seul le 2.0480 MHz est dispo chez gotronic, 2.097152 MHz n'étant chez aucun des 2 fournisseurs ( gotronic/selectronic )
Donc Fosc/4 = 512 000 Hz prescaler 1:1 tmr1h=6 tmr1l=0 ==> 8 IRQ/s
c'est juste ?
++
Non !
Avec 512 000 en entrée de TMR1, pour avoir un nb entier d'IRQ, tu dois diviser par 4096.
Tu dois charger TMR1H avec 1111 0000b (F0h)pour avoir 125 IRQ/s, c'est le 1er nb entier d'IRQ.
je n'ai fait qu'appliquer ta méthode en plus
car si je prend ta méthode : en changeant tmr1h=6;, on a 6*256 = 1536 incrémentations donc il reste 65 536 - 1536 = 64 000 incrémentations restantes. Donc 512 000 / 64 000 = 8 IRQ/s
C'est pas juste ? ( on a donné la liste des composants au prof avec ce quartz, tu vas pas me faire ça bon je vais tout de suite voir si on peut pas modifier la liste aujourd'hui ... )
Merci
P----N, j'avais les neurones en compote !
je n'ai fait qu'appliquer ta méthode en plus
car si je prend ta méthode : en changeant tmr1h=6;, on a 6*256 = 1536 incrémentations donc il reste 65 536 - 1536 = 64 000 incrémentations restantes. Donc 512 000 / 64 000 = 8 IRQ/s
C'est pas juste ? ( on a donné la liste des composants au prof avec ce quartz, tu vas pas me faire ça bon je vais tout de suite voir si on peut pas modifier la liste aujourd'hui ... )
Merci
Que la honte soit sur moi !
C'est toi qui a raison.
Merci Gérard. J'ai pu corriger l'erreur avec mon prof. Mille Merci pour ton aide jusqu'à présent.
Je vais commencer dans ces prochains jours a rédiger le programme, par contre, faudrait que j'en apprenne un peu plus sur le CAN, notamment comme lire la valeur ... je devine que c'est avec ADRESH et ADRESL
Merci
je reformule : j'ai pu annuler la modification de la valeur du quartz, donc nous restons sur un quartz de 2.0480 MHzJ'ai pu corriger l'erreur
Pour la lecture de la valeur acquise, en C, il doit y avoir une fonction qui fait le travail.
Il faudra définir une variable (de 16 bit) pour stocker la valeur.
Nous verrons le moment venu.
Salut,
ahh ces derniers temps, je suis débordé, d'où mon absence
alors, voilà déjà un premier jet, sans le CAN, et j'ai une (2) question déjà :
Alors, est ce que déjà, c''est bien ? ( ou si quelqu'un de bon en C peut venir jeter un coup d'oeil sinon, tu devrais avoir quelques notions en C mon cher Gérard :P )Code:#pragma chip PIC12F675 // déclaration du pic #pragma library 1 #pragma config |= 0x31E1 #define sortie GPIO int irq; char sec; #include "int16CXX.h" // fichier interruptions //------------------interruption----------------------- #pragma origin 4 interrupt timer1( void) { int_save_registers // W, STATUS (and PCLATH if required) //char sv_FSR = FSR; // save FSR if required // handle the interrupt (insert application code here) if (TMR1IF) {++irq;TMR1IF=0;TMR1H=6;TMR1L=0;} //FSR = sv_FSR; // restore FSR if saved int_restore_registers // W, STATUS (and PCLATH if required) /* IMPORTANT : GIE should normally NOT be set or cleared in the interrupt routine. GIE is AUTOMATICALLY cleared on interrupt entry by the CPU and set to 1 on exit (by RETFIE). Setting GIE to 1 inside the interrupt service routine will cause nested interrupts if an interrupt is pending. Too deep nesting may crash the program ! */ } void main(void) { TRISIO = 0b00111100; sortie = 0b00000010; T1CON = 0b00000001; CMCON = 0b00000111; //comparateur désactivé TMR1H=6; TMR1L=0; TMR1IF=0; INTCON = 0b11000000; PIE1 = 0b00000001; for (;;) { if (irq==8) {++sec;irq=0;} } }
Que me conseilles-tu ? De mettre le "if (irq==8) {++sec;irq=0;}" dans l'interruption, ou le laisser dans le programme ( for (; ) ? Je ne sais pas ce qui est le mieux ? Mais je me dis que si je met ca dans l'interruption, il va prendre plus de temps pour sortir de l'interruption, or il me semble que pendant l'interruption, il n'incrémente pas le timer1, dites moi si je me trompe alors que si je le met dans le programme ( donc for (; ), il continuera à incrémenter le timer1 tout en vérifiant que irq==8, j'espère m'être bien exprimé
2ème question : la variable irq aura comme valeur max 8 ( car 8 irq/s ) donc dois je mettre char ou int ? ( le meilleur ? )
Merci
Tu mets la condition dans l'IRQ.
TMR1 est incrémenté par l'oscillateur de façon indépendante par rapport au programme. Ce sera fait (l'incrémentation), que tu sois en IRQ ou dans la boucle principale.
Je pense que : "if (irq==8) {++sec;irq=0;}"
fait la même chose que :
inc irq
if irq = 8 then
inc sec
irq = 0
endif
Si oui, tu as bon.
Pour la question 2, voir ton compilateur, les déclarations.
Désolé, j'ai toujours mon allergie au C. Les antibiotiques ne m'aident pas.
ok, donc je mets cette ligne dans l'interruption et non dans la boucle principale. C'est juste que je croyais qu'il mettrait plus de temps à gérer l'interruption, et que donc il n'ait pas le temps de faire l'interruption suivante ( si tu vois ce que je veux dire )
Pour la 2, je croyais que c'était général Je vais voir alors dans le fichier du CC5X
Merci
bon, passons au CAN
Je sais que le CAN est déclaré sur 10 bits, par ADRESH et ADRESL. Par contre, comment mettre en place ? ( si tu veux, en basic est possible aussi )
Merci encore.
++
ah bah faut encore que je configure le CAN déjà avant de le metre en place
alors, ADCON0 :
bit 7 : importance ?
bit 6 : 0 ( Vdd )
bit 5-4 : 00
bit 3-2 : 10 ( je crois )
bon par contre, les bit 1 et 0 j'hésite
Pour ANSEL :
bit 7 : 0
bit 6-4 : ca va etre a déterminer par un calcul ( demain )
bit 3-0 : alors là je suis pas sur de ce que je mets ( la patte qui va être comparée à Vdd, donc GP2, doit etre mis en digital input ? )
Merci
C'est la justification du résultat de conversion. Voir page 40.
Si tu mesures sur AN2 --> 10 pour les bit 2 et 3
Bit 0 : mise sous tension du CAN
Bit 1 : lancement de la conversion
Je mets x11, jamais de soucis.
Tu mets toutes les broches qui doivent convertir une tension en ana (1), les autres tu mets 0.
Je devine que ça va nous servir pour la suite ...C'est la justification du résultat de conversion. Voir page 40.
Oui, c'est la pin GP2 qui est raccordée au pont diviseur, Vdd étant la référence ...Si tu mesures sur AN2 --> 10 pour les bit 2 et 3
Bit 0 : mise sous tension du CAN
Bit 1 : lancement de la conversion
Par contre, dans le datasheet, j'aiDonc, l'un des 2 bits doit être mis à 0, non ?Note: The GO/DONE bit should not be set in same instruction that turns on the A/D.
J'ai remarqué qu'il y avait proportionnalité, donc quand tu divises les fréquence, tu trouves un coefficient de proportionnalité, et tu multiplies par la valeur correspondante et tu trouves l'autre valeur ( si tu vois ce que je veux dire mais je le détaillerai demain )Je mets x11, jamais de soucis.
Vdd est la référence, et GP2 est la pin reliée au pont diviseur ( avec 2 résistances au 12V, donc la batterie )Tu mets toutes les broches qui doivent convertir une tension en ana (1), les autres tu mets 0.
Donc je mets AN2 en digital input, et les 2 autres en analog input, c'est ça ? ( bien sur, GP1 et GP0 sont en sortie, donc ils seront ignorés ?! ... )
Merci
A la suite : Je fais ce calcul dont je t'ai parlé :
alors, datasheet p44 tu as donc ce fameux tableau "TABLE 7-1:TAD vs. DEVICE OPERATING FREQUENCIES"
Quand tu regardes par exemple les colonnes 5MHz et 4MHz :
5 / 4 = 1.25
avec un Fosc / 8, on a pour 5MHz un temps d'acquisition de 1.6us. 1.6 * 1.25 = 2us et c'est bien 2us qu'on trouve dans 4MHz ...
je sais pas si c'est le hasard, mais c'est ça pour toutes les valeurs du tableau, sauf la ligne correspondant aux RC ( qui doit etre spéciale )
Donc on a f=2.0480 MHz
prenons Fosc/8 ( comme c'est la ligne avec le moins de case grisé enfin je sais pas si je pourrai faire mieux ... )
Par rapport à 4MHz : 4 / 2.0480 = 1,953125
Pour Fosc/8, f=4 MHz on a un temps d'acquisition de 2us donc pour f=2.0480 MHz, on aura 2 * 1,953125 = 3,90625us
Bon, je sais pas si ma méthode est juste, mais ça a l'air juste.
Par contre, je sais pas si je peux faire ça avec Fosc / 4 pour éviter d'être "en dehors des valeurs recommandées". On obtiendrait 1us * 1,953125 = 1,953125us pour Fosc/4 ( avec f=2.0480 MHz bien sur )
Donc sauf si je peux prendre Fosc/4 ( ton avis ? ), je prend pour l'instant ADCS = 001
Note: The GO/DONE bit should not be set in same instruction that turns on the A/D.
Donc, l'un des 2 bits doit être mis à 0, non ?
Non, le CAN doit être alimenté AVANT de lancer une conversion.
Vdd est la référence, et GP2 est la pin reliée au pont diviseur ( avec 2 résistances au 12V, donc la batterie )
Donc je mets AN2 en digital input, et les 2 autres en analog input, c'est ça ? ( bien sur, GP1 et GP0 sont en sortie, donc ils seront ignorés ?! ... )
GGGRRRR !!!!
Si GP2 est relié au pont diviseur, c'est cette entrée qui doit être une entrée ana !
donc AN2 en ana et les 3 autres en digital input, de toute façon, les 3 AN restants seront utilisés en sorties ( à part GP4 pour le quartz ) donc ils seront ignorés nan ?Vdd est la référence, et GP2 est la pin reliée au pont diviseur ( avec 2 résistances au 12V, donc la batterie )
Donc je mets AN2 en digital input, et les 2 autres en analog input, c'est ça ? ( bien sur, GP1 et GP0 sont en sortie, donc ils seront ignorés ?! ... )
GGGRRRR !!!!
Si GP2 est relié au pont diviseur, c'est cette entrée qui doit être une entrée ana !
au fait, si je prends un quartz de 32.768 KHz, tu crois que c'est mieux ? ( j'aurais 1 IRQ / s ) Je sais plus pourquoi je l'ai oublié celui là ...
ah bah non, pour le calcul, le minimum étant Fosc/2, j'obtiendrais 61us :S
bon après, je sais pas si ça va influer sur le timer1 ou/et interruptions etc ...
GO/DONE et ADON sont à 0 à la mise sous tension.
Tu veux utiliser le CAN :
1 tu mets ADON à 1
2 quand tu veux lancer une conversion, tu mets GO/DONE à 1
Il faut le faire dans cet ordre. Pour comparer :
1 tu démarres le moteur
2 tu parts avec la voiture
Je ne sais pas si c'est meiux, ça dépend pour quoi.
Pour la consommation, c'est mieux, pour la vitesse d'exécution, c'est moins bien.
Le 1 IRQ/s dépend du rechargement de TMR1H lors de l'IRQ.
Mets x11, ne te casses pas la tête.
Si tu utilises TMR1 en interruption et le CAN pas en interruption, TMR1 ne sera pas inffluencé par le CAN.
J'ai pas compris, donc la valeur du quartz est importante ?Ben tmr1h sera toujours rechargé avec 128Le 1 IRQ/s dépend du rechargement de TMR1H lors de l'IRQ.
Enfin, je vois pas ce que tu veux dire ... ( on reste sinon sur le 2.0480 MHz )