Je pense que je peux avoir un problème de débordement de pile ou quelque chose de similaire dans mon code de firmware embarqué. Je suis un nouveau programmeur et je n'ai jamais eu affaire à un SO donc je ne sais pas si c'est ce qui se passe ou pas. Le microprogramme commande un périphérique avec une roue dont les aimants sont régulièrement espacés et la carte est équipée d'un capteur à effet Hall qui détecte la présence d'un aimant. Mon microprogramme actionne le stepper et compte également les pas tout en surveillant le capteur magnétique afin de détecter si la roue a calé. J'utilise une interruption de minuterie sur ma puce (8 bits, 8057 acres) pour régler les ports de sortie pour contrôler le moteur et pour la détection de calage. Le code de détection de décrochage ressemble à ceci ...Cela ressemble-t-il à un débordement de pile?
// Enter ISR
// Change the ports to the appropriate value for the next step
// ...
StallDetector++; // Increment the stall detector
if(PosSensor != LastPosMagState)
{
StallDetector = 0;
LastPosMagState = PosSensor;
}
else
{
if (PosSensor == ON)
{
if (StallDetector > (MagnetSize + 10))
{
HandleStallEvent();
}
}
else if (PosSensor == OFF)
{
if (StallDetector > (GapSize + 10))
{
HandleStallEvent();
}
}
}
ce code est appelé chaque fois que l'ISR est déclenché. PosSensor est le capteur d'aimant. MagnetSize est le nombre de pas de pas qu'il faut pour traverser le champ magnétique. GapSize est le nombre de pas entre deux aimants. Donc, je veux détecter si la roue se coince soit avec le capteur sur un aimant ou pas sur un aimant.
Cela fonctionne très bien pendant longtemps, mais après un moment, le premier événement de décrochage se produira car 'StallDetector> (MagnetSize + 10)' mais quand je regarde la valeur de StallDetector, il est toujours autour de 220! Cela n'a pas de sens parce que MagnetSize est toujours autour de 35. Donc l'événement de décrochage aurait dû être déclenché à 46, mais d'une manière ou d'une autre jusqu'à 220? Et je ne définis pas la valeur du détecteur de décrochage ailleurs dans mon code.
Avez-vous un conseil sur la façon dont je peux traquer la racine de ce problème?
L'ISR se présente comme suit
void Timer3_ISR(void) interrupt 14
{
OperateStepper(); // This is the function shown above
TMR3CN &= ~0x80; // Clear Timer3 interrupt flag
}
HandleStallEvent
définit quelques-uns variables à leurs valeurs par défaut afin qu'il puisse tenter un autre mouvement ...
#pragma save
#pragma nooverlay
void HandleStallEvent()
{
///*
PulseMotor = 0; //Stop the wheel from moving
SetMotorPower(0); //Set motor power low
MotorSpeed = LOW_SPEED;
SetSpeedHz();
ERROR_STATE = 2;
DEVICE_IS_HOMED = FALSE;
DEVICE_IS_HOMING = FALSE;
DEVICE_IS_MOVING = FALSE;
HOMING_STATE = 0;
MOVING_STATE = 0;
CURRENT_POSITION = 0;
StallDetector = 0;
return;
//*/
}
#pragma restore
On dirait que cela a résolu le problème. Je ne suis toujours pas sûr de savoir comment StallDetector a pu obtenir jusqu'à 200+ mais j'ai ajouté une ligne de code qui met en cache la valeur PosSensor au début de cette fonction, a changé quelques noms de variables et maintenant il a été exécuté pour plus de 1500 mouvements séquentiels sans problèmes! – PICyourBrain
PosSensor et LastPosMagState étaient tous deux désactivés. Cela a permis à StallDetector d'approcher la valeur (GapSize + 10). Alors la condition de course frappe; PosSensor est activé après if (PosSensor! = LastPosMagState), mais avant if (PosSensor == ON), donc StallDetector n'est pas mis à 0 alors qu'il aurait dû l'être, ce qui permet de comparer la valeur GapSize'd StallDetector avec votre MagnetSize – ajs410
Ohhhhh qui a du sens! Merci pour l'exp. – PICyourBrain