Un extrait de Bigo :
Code:;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 clrf EEADR ; permet de diminuer la consommation bsf STATUS,RP0 ; sélectionner banque 1 movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x0c ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,6 ; tester si fin zone atteinte (>=40) goto init1 ; non, boucler btfss FSR,4 ; tester si fin zone atteinte (>=50) goto init1 ; non, boucler bcf TRISA,0 ; Bit PORTA.0 en sortie (exemple)
Bonsoir marc2009,
D'accord avec Gerard : l'initialisation des ports et variables est une
très bonne habitude à prendre, ça évite bien des problèmes.
On avance, la routine d'acquision A/N devrait fonctionner,
sauf mes doutes sur la configuration des registres.
(Oui, je suis un peu lourd ... et modeste !)
Mais.. peux-tu analyser ce bout de programme et me dire
si tu subodores une "grosse cata" ? (Petit exercice)
... dans l'esprit de ce que tu as fait avec while (GO) ?Code:if (CAN<531) { led!=led; if (sec==1200) {sec=1199;} if (sec>1200) {moteur=0;sec=0;} }
Bonne soirée quand même, mictour.
c'est ce que j'ai fait avec TRISIO et GPIO ...l'initialisation des ports et variables est une
très bonne habitude à prendre, ça évite bien des problèmes.
c'est mauvais ? ( tu veux que je détaille :P ? )On avance, la routine d'acquision A/N devrait fonctionner,
sauf mes doutes sur la configuration des registres.
(Oui, je suis un peu lourd ... et modeste !)
le problème n'est pas avec led=!led; ? Si c'est le cas, j'allais y venir ^^Mais.. peux-tu analyser ce bout de programme et me dire
si tu subodores une "grosse cata" ? (Petit exercice)
++
Bonsoir marc2009,
Excuse-moi, je n'ai pas que très peu de temps en ce moment !
...c'est ce que j'ai fait avec TRISIO et GPIO ...
Attention : TRISIO configure les pattes de ta bête en entrée ou en sortie et
GPIO met les dites pattes à un ou à zéro.
...c'est mauvais ? ( tu veux que je détaille :P ? )
Mais non, je voudrais juste que tu trouves ce qui ne "colle" pas entre les registres. (A/N).
...le problème n'est pas avec led=!led; ? Si c'est le cas, j'allais y venir ^^
Cette instruction est bien placée et doit fonctionner sans problème.
Bonne soirée, mictour.
pas graveExcuse-moi, je n'ai pas que très peu de temps en ce moment !
oui je sais, c'est pourquoi il est plus logique de configurer TRISIO et après GPIOAttention : TRISIO configure les pattes de ta bête en entrée ou en sortie et
GPIO met les dites pattes à un ou à zéro.
la patte qui est connectée au pont diviseur ( et qui donc sert au CAN ) doit être configuré en analogique, nan ?? ( sinon je vois pas o_O)Mais non, je voudrais juste que tu trouves ce qui ne "colle" pas entre les registres. (A/N).
sinon, je vois pas ?! ( pour le clignotement de la led, faudrait juste que j'en discute avec toi plus tardCette instruction est bien placée et doit fonctionner sans problème.
++
Bonsoir marc2009,
la patte qui est connectée au pont diviseur ( et qui donc sert au CAN ) doit être configuré en analogique, nan ?? ( sinon je vois pas o_O)
Oui, bien sur. Donc concentres-toi sur cette patte...
sinon, je vois pas ?! ( pour le clignotement de la led, faudrait juste que j'en discute avec toi plus tard )
Pas de problème. Mais bon, à part que c'est une led et quelle clignote
pour indiquer que la tension est trop basse ... mictour.
Je vois vraiment pas où est le problème avec les registres, et la partie de mon code que tu as cité ....
Si tu pouvais m'éclairer ..
Merci
Justement non, ce n'est pas logique.
La sécurité veut que l'on mette d'abord GPIO à 0 puis on configure TRISIO.
Voir post #362.
Ben oui.
SP_TEMPO:
LED = 1
TEMPO500ms
LED = 0
TEMPO500ms
return
Dans ton prog tu écriras
gosub SP_TEMPO
(gosub, c'est du Basic, tu traduiras)
alainav1 m'a dit le contraire, m'enfin bon si tu le dis ...Justement non, ce n'est pas logique.
La sécurité veut que l'on mette d'abord GPIO à 0 puis on configure TRISIO.
Voir post #362.
faut mettre une tempo ? Mais comment :-/ donc va falloir que je déclare une autre variable ? ( 1 seconde allumé, 1 seconde éteinte on va dire )SP_TEMPO:
LED = 1
TEMPO500ms
LED = 0
TEMPO500ms
return
Dans ton prog tu écriras
gosub SP_TEMPO
(gosub, c'est du Basic, tu traduiras)
sinon, est ce que ça va pas "déranger" les interruptions ? Enfin les interruptions ne vont pas déranger le fonctionnement du programme, car bon, s'il y a un clignotement toutes les 500ms ou 1seconde, je vois mal "interruptions toutes les 125ms et clignotement" enfin si tu vois ce que je veux dire ...
++
Tu relis le post #362, c'est un extrait de Bigo.
Alain a du se tromper. Ca arrive aux meilleurs.
Bien sur que les irq vont ralentir la tempo mais de si peu que tu n'y verras que du feu !faut mettre une tempo ? Mais comment :-/ donc va falloir que je déclare une autre variable ? ( 1 seconde allumé, 1 seconde éteinte on va dire )
sinon, est ce que ça va pas "déranger" les interruptions ? Enfin les interruptions ne vont pas déranger le fonctionnement du programme, car bon, s'il y a un clignotement toutes les 500ms ou 1seconde, je vois mal "interruptions toutes les 125ms et clignotement" enfin si tu vois ce que je veux dire ...
++
Et déclarer une variable n'est pas la fin du monde.
Laisse tomber le C et fais du Basic !
oui mais alors, pour obtenir 500ms, je dois incrémenter une variable irq2 par exemple et que lorsque irq2==4, alors 500ms sont passés nan ?
Bon réveil à vous tous !
...faut mettre une tempo ? Mais comment :-/ donc va falloir que je déclare une autre variable ? ( 1 seconde allumé, 1 seconde éteinte on va dire )
sinon, est ce que ça va pas "déranger" les interruptions ? Enfin les interruptions ne vont pas déranger le fonctionnement du programme,
car bon, s'il y a un clignotement toutes les 500ms ou 1seconde,
je vois mal "interruptions toutes les 125ms et clignotement" enfin si tu vois ce que je veux dire ...
Nous avons déja notre base de temps avec le TIMER1 et "irq" !
...oui mais alors, pour obtenir 500ms, je dois incrémenter une variable irq2 par exemple et que lorsque irq2==4, alors 500ms sont passés nan ?
(irq==8) donne : une seconde allumée, une seconde éteinte. C'est juste un question de "structure" du programme ! En fait une simple " } " (accolade fermante) à (re)placer au bon endroit... Rien d'autre à faire.
...Laisse tomber le C et fais du Basic !
Chacun ses choix ! L'important : que chacun trouve son bonheur ...
...D'ailleurs, comment faire sans pointeurs??
Jettes un oeil aux fichiers .lst, tu y verras un usage intensif de l'adressage indirect (FSR). la gestion des pointeurs est donc intégrée.
MICROC, je pense, procède de la même maniére ...
mictour.
Nous avons déja notre base de temps avec le TIMER1 et "irq" !si on fait un clignotement 1seconde allumé, 1seconde éteint ... mais je vais pas toucher à irq, c'est plutôt à "sec"(irq==8) donne : une seconde allumée, une seconde éteinte. C'est juste un question de "structure" du programme ! En fait une simple " } " (accolade fermante) à (re)placer au bon endroit... Rien d'autre à faire.
sinon, pour les registres, et autres erreurs, et le problème dans la partie du code que tu as cité, je vois vraiment pas, je donne ma langue au chat
Je pense que tu devrais faire des essais avec des morceaux de programme.
Ca te permettrait de valider étape par étape.
Je t'ai donné un prog entier, à toi de le traduire.
Les exemples dont vous parlez en C ne m'intéressent pas, je ne les lis pas.
Je voulais dire, qu'à un certain moment, il faut passer à la pratique.
mais oui, mais la pratique je peux pas, comme tu le sais, on a pas le matériel ... et oui j'ai regardé ton prog, il se ramène au mien ...
Bonsoir marc2009,
Quelques petits indices ?
Bon, revenons à la coherence.
( mais si, tu sais bien, mes idées fixes! )
a) Voyons :
#define sortie GPIO
#define led GPIO2
#define moteur GPIO1
et :
sortie = 0b00000010;
Peux-tu me dire ce qui va se passé après ces instructions ?
b) Et ceci :
TRISIO = 0b00111100;
ANSEL = 0b01000001;
Même question sur la cohérence ...
Ne modifie pas irq ou sec, c'est seulement après if (can < 531)
qu'il te faut analyser pour voir comment le programme va réagir.
En fait, nous avons tout ce qu'il nous faut mais la "logique"
ne répond pas tout à fait à nos désirs !
Bonne soirée, mictour.
le moteur sera allumé Comme j'ai dit, j'ai pas encore vérifié les registres, ça va pas tardera) Voyons :
#define sortie GPIO
#define led GPIO2
#define moteur GPIO1
et :
sortie = 0b00000010;
Peux-tu me dire ce qui va se passé après ces instructions ?
ou est par contre là le problème ?b) Et ceci :
TRISIO = 0b00111100;
ANSEL = 0b01000001;
Même question sur la cohérence ...
je comprends pas faut bien utiliser "sec" pour le clignotement ...Ne modifie pas irq ou sec, c'est seulement après if (can < 531)
qu'il te faut analyser pour voir comment le programme va réagir.
En fait, nous avons tout ce qu'il nous faut mais la "logique"
ne répond pas tout à fait à nos désirs !
++
Bonjour marc2009,
le moteur sera allumé
Vois-tu mieux de quelle "cata" je te parlais ?
ou est par contre là le problème ?
Exactement la question que je te pose.
Pour y répondre, il te faut la DOC du 12F pour analyser ces deux registres ...
Je comprends pas faut bien utiliser "sec" pour le clignotement
... seulement si tu veux compliquer un peu. Sinon (irq == 8) suffit.
Bonne soirée, mictour.
Je viens de corrigerVois-tu mieux de quelle "cata" je te parlais ?
Oui ... ( je vais revoir )Pour y répondre, il te faut la DOC du 12F pour analyser ces deux registres ...
Je vois pas du tout comment mettre ça ! ( ou je déplace le if (CAN<531) dans l'accolade de if (irq == 8 ) ? )... seulement si tu veux compliquer un peu. Sinon (irq == 8) suffit.
Je viens de corriger
Très bien. sinon le moteur aurait tourné pendant 20 minutes !! D'ou la cata.
(J'espère que du côté GM ils ont prévu des butées de fin de course ...)
Je vois pas du tout comment mettre ça ! ( ou je déplace le if (CAN<531) dans l'accolade de if (irq == 8 ) ? )
C'est dans l'esprit. Analyse ce bout de prog et demande toi ce qu'il fait actuellement.
Rien d'autre à déplacer qu'une -simple- accolade...
Ensuite je regarderai ta nouvelle version, quand tu l'enverra.
Bon dimanche, mictour.
Très bien. sinon le moteur aurait tourné pendant 20 minutes !! D'ou la cata.
(J'espère que du côté GM ils ont prévu des butées de fin de course ...)
ah ok, je vois ... mais alors faut que j'enlève le else ... c'est ça ?C'est dans l'esprit. Analyse ce bout de prog et demande toi ce qu'il fait actuellement.
Rien d'autre à déplacer qu'une -simple- accolade...
Ensuite je regarderai ta nouvelle version, quand tu l'enverra.
bon, voilà le programme, j'ai pas encore vérifié les registres s'il y a un problème ...
Code:#pragma chip PIC12F675 // déclaration du pic //#pragma config |= 0x31E1 #define sortie GPIO #define led GPIO2 #define moteur GPIO1 uns8 irq; uns16 sec; uns16 CAN; #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;TMR1H=6;TMR1IF=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 = 0b.0011.1001; OPTION = 0b.1100.0000; sortie = 0b.0000.0100; T1CON = 0b.0000.0001; CMCON = 0b.0000.0111; INTCON = 0b.1100.0000; PIE1 = 0b.0000.0001; ANSEL = 0b.0100.0001; ADCON0 = 0b.1000.0001; TMR1H=6; TMR1L=0; CAN=600; for (;;) { if (irq==8) { ++sec; irq=0; GO=1; // lance la conversion while(GO); // attente que GO passe à 0 CAN.high8 = ADRESH; CAN.low8 = ADRESL; if (CAN<531) { led!=led; if (sec==1200) {sec=1199;} if (sec>1200) {moteur=0;sec=0;} } } if (CAN>531) { led=1; if (sec==1200) {moteur=1;} if(sec>1200) // pour être sur de stopper. { moteur=0; sec=0; } // fin if ... else } // fin if ... } // fin for }
Bonjour marc2009,
Voici ton programme ré-écrit, avec quelques commentaires et questions ...
(pour ne pas perdre mes mauvaises habitudes)
A) TRISIO : Les pattes 4 et 5 doivent-elles être positionnées,
ou sont-elles prises en charge automatiquement par l'option XTAL de la config ?
(Je ne me suis pas plongé dans la doc !! )
B) as-tu essayé de compiler ce programme et si oui, quel est le résultat... ? ! ?
Mais bon, ça avance, mictour.Code:#pragma chip PIC12F675 // déclaration du pic #pragma config |= 0x31E1 // indispensable ! #define sortie GPIO #define led GPIO2 #define moteur GPIO1 uns8 irq; uns16 sec; uns16 CAN; #include "int16CXX.h" // fichier interruptions //------------------interruption----------------------- #pragma origin 4 interrupt timer1( void) { int_save_registers // W, STATUS (and PCLATH if required) if (TMR1IF) {++irq; TMR1H=6; TMR1IF=0;} int_restore_registers // W, STATUS (and PCLATH if required) } void main(void) { TRISIO = 0b.0011.1001; OPTION = 0b.1100.0000; sortie = 0b.0000.0100; T1CON = 0b.0000.0001; CMCON = 0b.0000.0111; INTCON = 0b.1100.0000; PIE1 = 0b.0000.0001; ANSEL = 0b.0100.0001; ADCON0 = 0b.1000.0001; TMR1H=6; TMR1L=0; CAN=600; for (;;) { if (irq==8) { ++sec; irq=0; GO=1; // lance la conversion while(GO); // attente que GO passe à 0 CAN.high8 = ADRESH; // résultat dans CAN CAN.low8 = ADRESL; // ... if (CAN<531) // batterie faible { led!=led; // clignotte (1s. / 1s.) if (sec==1200) // tu peux m'expliquer cette instruction ? {sec=1199;} // ... et celle-çi ? if (sec>1200) // ... idem ? {moteur=0;sec=0;} // ... } } if (CAN>531) { led=1; if (sec==1200) { moteur=1; } if(sec>1200) // pour être sur de stopper. { moteur=0; sec=0; } } }
salut,
j'ai pas bien compris Toutes les pattes sont en entrées, seules les pattes GP2 et GP1A) TRISIO : Les pattes 4 et 5 doivent-elles être positionnées,
ou sont-elles prises en charge automatiquement par l'option XTAL de la config ?
(Je ne me suis pas plongé dans la doc !! )
J'essaierai quand je serai sous windows :P ( je suis sous linux )B) as-tu essayé de compiler ce programme et si oui, quel est le résultat... ? ! ?
Oui, elle est dans le header je l'ai commenté dans le programme, pour que tu saches quel est le config utilisé#pragma config |= 0x31E1 // indispensable !
ben imagines qu'arrivé à 20 minutes, le niveau de la batterie passe sous la tension de points .... il va pas démarrer le moteur ! donc je le fait "reculer" d'une seconde Tu vois ?if (sec==1200) // tu peux m'expliquer cette instruction ?
{sec=1199;} // ... et celle-çi ?
imagines que 20 minutes sont passées, le moteur démarre ... 1 seconde est passée, la conversion donne une valeur de tension inférieur au points ... faut arrêter le moteur ^^ donc j'ai mis la même commande ...if (sec>1200) // ... idem ?
{moteur=0;sec=0;} // ...
++
Bonsoir marc2009,
Bon reprenons ensemble :
A) TRISIO : Les pattes 4 et 5 doivent-elles être positionnées,
ou sont-elles prises en charge automatiquement par l'option XTAL de la config ?
(Je ne me suis pas plongé dans la doc !! )
j'ai pas bien compris Toutes les pattes sont en entrées, seules les pattes GP2 et GP1 sont en sorties.
Regarde la doc 12F en 9.1 et 9.2 et tu comprendras pourquoi je m'interroge.
B) as-tu essayé de compiler ce programme et si oui, quel est le résultat... ? ! ?
J'essaierai quand je serai sous windows :P ( je suis sous linux )
Veux-tu dire que MPLAB + CC5X ne tournent pas sous LINUX ? ?
#pragma config |= 0x31E1 // indispensable !
Oui, elle est dans le header je l'ai commenté dans le programme, pour que tu saches quel est le config utilisé.
Qu'entends-tu par "elle est dans le HEADER" ? (à mon tour de ne pas comprendre !)
if (sec==1200) // tu peux m'expliquer cette instruction ?
{sec=1199;} // ... et celle-çi ?
ben imagines qu'arrivé à 20 minutes, le niveau de la batterie passe sous la tension de points ....
il va pas démarrer le moteur ! donc je le fait "reculer" d'une seconde Tu vois ?
if (sec>1200) // ... idem ?
{moteur=0;sec=0;} // ...
imagines que 20 minutes sont passées, le moteur démarre ... 1 seconde est passée,
la conversion donne une valeur de tension inférieur au points ... faut arrêter le moteur ^^ donc j'ai mis la même commande ...
Il me semble que l'on peut faire plus simple.
Le problème est que tu ne puisses ni compiler ni simuler,
sinon il y à longtemps que tu aurais terminé ce programme.
Bonne soirée, mictour.