Aller au contenu


Photo
- - - - -

Probléme interruption


  • Veuillez vous connecter pour répondre
1 réponse à ce sujet

#1 Khalou

Khalou

    Membre

  • Membres
  • 30 messages
  • Gender:Male
  • Interests:Électronique, Robotique, bricolage...

Posté 03 décembre 2011 - 04:34

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

#2 thorium90

thorium90

    Membre

  • Membres
  • 20 messages
  • Gender:Male
  • Location:Lyon
  • Interests:Devine ?

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 :

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




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users