Bonjour
Voici un programme qui permet la commande d'un moteur pas a pas bipolaire, j'ai l'ajouté une interruption qui permet de changer le sens de rotation de sens2 vers sens1 lorsque le pin_B0 est activé.
Le problème que l'interruption ne fonctionne pas et le moteur ne change pas son état, il reste toujours en sens2.
Voici le programme compilé par ccsc compiler:
#include<18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay (clock=4000000)
BYTE b = 0;
#int_rb
void button_isr() {
if( !input(PIN_B0) && b )
b = 1;
else
if( !input(PIN_B0) && b )
b = 0;
}
void sens1()
{
output_c(0b11); //excitation des deux phases du mpp pour effectué le1er pas
delay_ms(300); //attente pendant 0.5 s
output_c(0b1100); //excitation des deux phases du mpp pour effectué le2ém pas
delay_ms(300); //attente pendant 0.5 s
output_c(0b110000); //excitation des deux phases du mpp pour effectué le3ém pas
delay_ms(300);//attente pendant 0.5 s
output_c(0b11000000);//excitation des deux phases du mpp pour effectué le4ém pas
delay_ms(300);//attente pendant 0.5 s
}
void sens2()
{
output_c(0b11000000); //excitation des deux phases du mpp pour effectué le1er pas
delay_ms(500); //attente pendant 0.5 s
output_c(0b110000); //excitation des deux phases du mpp pour effectué le2ém pas
delay_ms(500); //attente pendant 0.5 s
output_c(0b1100); //excitation des deux phases du mpp pour effectué le3ém pas
delay_ms(500);//attente pendant 0.5 s
output_c(0b11);//excitation des deux phases du mpp pour effectué le4ém pas
delay_ms(500);//attente pendant 0.5 s
}
void main()
{
enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge( L_TO_H );
while (true)
{
sens2();
if(b==1)
{
sens1();
}
}
}
Merci

Probléme interruption
Débuté par Khalou, déc. 03 2011 04:34
1 réponse à ce sujet
#1
Posté 03 décembre 2011 - 04:34
#2
Posté 13 décembre 2011 - 07:06
Bonjour,
Je tiens à remarquer qu'il existe les balises code qui sont symbolisées par le signe <> en bleu dans l'interface d'edition d'un message faisant ressembler ton code à quelque chose du genre :
Concernant ton problème, c'est juste liè a la conception.
Donc on pourrai déjà penser qu'il faille plutôt un truc du genre :
Par la suite, on constate que la fonction gérant le changement d'état de b qui se nomme button_isr() n'est jamais appelée.
ne te faut t'il pas faire un appel régulier a cette fonction? a mettre par exemple au début de ton while(1) ?
Dernier point, dans la fonction button_isr() tes 2 conditions sont identiques et il me semble trop "complex" pour rien.
En toute logique, je ne connais pas ta fonction input, mais celle ci doit normalement retourner un booleen : true si c'est Ok, et false sinon, autrement dit tu peux résumer ta fonction en :
Voilà mes premières hypothèses.
Bonne soirée et bon courage.
Je tiens à remarquer qu'il existe les balises code qui sont symbolisées par le signe <> en bleu dans l'interface d'edition d'un message faisant ressembler ton code à quelque chose du genre :
setup() { if(jePresenteBienMonCode) { OnMeComprendraMieux(); } else { cestMoche(); } } loop() { jaide_Mon_Prochain_A_me_Comprendre(); }
Concernant ton problème, c'est juste liè a la conception.
while (true) { sens2(); #Pas de conditions, passage obligatoire par sens 2 if(b==1) { sens1(); } }En effet, dans ta boucle While infinie, tu lui stipule simplement d'aller automatiquement en sens2() et seulement apres tu lui fais vérifier l'état de b. Si celui ci est a 1 alors tu lui demande d'aller dans le sens1()
Donc on pourrai déjà penser qu'il faille plutôt un truc du genre :
while (true) { if(b==1) { sens1(); } else if(b==0) { sens2(); } }
Par la suite, on constate que la fonction gérant le changement d'état de b qui se nomme button_isr() n'est jamais appelée.
ne te faut t'il pas faire un appel régulier a cette fonction? a mettre par exemple au début de ton while(1) ?
Dernier point, dans la fonction button_isr() tes 2 conditions sont identiques et il me semble trop "complex" pour rien.
En toute logique, je ne connais pas ta fonction input, mais celle ci doit normalement retourner un booleen : true si c'est Ok, et false sinon, autrement dit tu peux résumer ta fonction en :
void button_isr() { b = input(PIN_B0); }
Voilà mes premières hypothèses.
Bonne soirée et bon courage.
Website : | Python | Arduino | Android | www.siliciumcorp.com
MyPastebin : Tous mes codes sources pastebin.com/u/thorium90
MyPastebin : Tous mes codes sources pastebin.com/u/thorium90
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users