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












