Post by ausbots on Apr 24, 2023 12:04:51 GMT
Hello.
I am using the shield buddy to control the ropulsion for an autonomous boat. It has various safety featuures built into the code which run on different cores. The code in Core 3 freezes occassionally. There is no loop that should create a trap. I have an LED controlled at the end of the main loop which is toggled each loop and I can see that it stays on or off which means the code has stopped looping. There are a couple of interupts attached that read a PWM signal, but these should not cause a trap. I have no idea why it freezes occassionally. Any help appreciated. Here is the loop code for Core 3;
void loop2() {
while ( START == false )
{
tone(7, 1000); // Send 1KHz sound signal...
digitalWrite(5, HIGH); // LED
while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
SerialASC.println("BOOT Waiting....");
Htx_UnlockResource(&SerialASC.PortInUse);
delay (100);
}
noTone(7); // Stop sound...
while (VESC == false)
{
ToneTwoCount++;
if (ToneTwoCount > 5)
{
ToneState = !ToneState;
if (ToneState == false) ToneTwo = 1000;
if (ToneState == true) ToneTwo = 1500;
ToneTwoCount = 0;
}
tone(7, ToneTwo); // Send 1KHz sound signal...
digitalWrite(5, HIGH); // LED
while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
SerialASC.println("VESC Waiting....");
Htx_UnlockResource(&SerialASC.PortInUse);
delay (1000);
}
noTone(7); // Stop sound...
digitalWrite(5, LOW); // LED
while ( ARMED == false )
{
while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
SerialASC.println("Arming....");
Htx_UnlockResource(&SerialASC.PortInUse);
delay (1000);
RawPwm = pwm_value;
DutyCycle = (RawPwm - 1000)/1050;
if (DutyCycle < 0.0) DutyCycle = 0.0;
}
if ( LEASH == false)
{
DutyCycle = 0;
digitalWrite(9, HIGH); // sets the digital pin 13 on
delay(5000);
LEASH = true;
SafetyCount = 0;
digitalWrite(9, LOW); // sets the digital pin 13 on
}
RawPwm = pwm_value;
PWM = pwm_value;
DemDutyCycle = (RawPwm - 1000)/1050;
if (DemDutyCycle < 0.0) DemDutyCycle = 0.0;
for (j = 0; j < 9; j++)
{
PWMseq[j] = PWMseq[j+1];
}
PWMseq[9] = PWM;
PWMcheck = 0;
for (k = 0; k < 9; k++)
{
if ( PWMseq[k] == PWMseq[9]) PWMcheck++;
}
if (PWM > 1050 && PWM < 2000 && PWMcheck > 8)
{
FREEZE = true;
digitalWrite(5, HIGH); // LED
}
else
{
FREEZE = false;
}
if (TimeOut > 30 )
{
TimeTone = TimeTone + 100;
if (TimeTone > 2000) TimeTone = 750;
TimeOut = 45;
DutyCycle = 0;
digitalWrite(3, LOW); // sets the digital pin 13 on
digitalWrite(4 , LOW); // sets the digital pin 13 on
digitalWrite(5, HIGH); // LED
digitalWrite(6, LOW); // LED
tone(7, TimeTone); // Send 1KHz sound signal...
}
else
{
if (DutyCycle < 0.05 && DemDutyCycle > 0.05)
{
DutyCycle = DutyCycle + 0.005;
}
else
{
DutyCycle = DemDutyCycle;
}
digitalWrite(3, HIGH); // sets the digital pin 13 on
digitalWrite(4, HIGH); // sets the digital pin 13 on
digitalWrite(5, LOW); // LED
digitalWrite(6, HIGH); // LED
noTone(7); // Stop sound...
}
TimeOut++;
delay(50);
TEST = !TEST;
if (TEST)
{
digitalWrite(10, HIGH); // sets the digital pin 13 on
}
else
{
digitalWrite(10, LOW); // sets the digital pin 13 on
}
// while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
// SerialASC.print(PWM);
// SerialASC.print(" ");
// SerialASC.println(PWMcheck);
// Htx_UnlockResource(&SerialASC.PortInUse);
}
I am using the shield buddy to control the ropulsion for an autonomous boat. It has various safety featuures built into the code which run on different cores. The code in Core 3 freezes occassionally. There is no loop that should create a trap. I have an LED controlled at the end of the main loop which is toggled each loop and I can see that it stays on or off which means the code has stopped looping. There are a couple of interupts attached that read a PWM signal, but these should not cause a trap. I have no idea why it freezes occassionally. Any help appreciated. Here is the loop code for Core 3;
void loop2() {
while ( START == false )
{
tone(7, 1000); // Send 1KHz sound signal...
digitalWrite(5, HIGH); // LED
while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
SerialASC.println("BOOT Waiting....");
Htx_UnlockResource(&SerialASC.PortInUse);
delay (100);
}
noTone(7); // Stop sound...
while (VESC == false)
{
ToneTwoCount++;
if (ToneTwoCount > 5)
{
ToneState = !ToneState;
if (ToneState == false) ToneTwo = 1000;
if (ToneState == true) ToneTwo = 1500;
ToneTwoCount = 0;
}
tone(7, ToneTwo); // Send 1KHz sound signal...
digitalWrite(5, HIGH); // LED
while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
SerialASC.println("VESC Waiting....");
Htx_UnlockResource(&SerialASC.PortInUse);
delay (1000);
}
noTone(7); // Stop sound...
digitalWrite(5, LOW); // LED
while ( ARMED == false )
{
while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
SerialASC.println("Arming....");
Htx_UnlockResource(&SerialASC.PortInUse);
delay (1000);
RawPwm = pwm_value;
DutyCycle = (RawPwm - 1000)/1050;
if (DutyCycle < 0.0) DutyCycle = 0.0;
}
if ( LEASH == false)
{
DutyCycle = 0;
digitalWrite(9, HIGH); // sets the digital pin 13 on
delay(5000);
LEASH = true;
SafetyCount = 0;
digitalWrite(9, LOW); // sets the digital pin 13 on
}
RawPwm = pwm_value;
PWM = pwm_value;
DemDutyCycle = (RawPwm - 1000)/1050;
if (DemDutyCycle < 0.0) DemDutyCycle = 0.0;
for (j = 0; j < 9; j++)
{
PWMseq[j] = PWMseq[j+1];
}
PWMseq[9] = PWM;
PWMcheck = 0;
for (k = 0; k < 9; k++)
{
if ( PWMseq[k] == PWMseq[9]) PWMcheck++;
}
if (PWM > 1050 && PWM < 2000 && PWMcheck > 8)
{
FREEZE = true;
digitalWrite(5, HIGH); // LED
}
else
{
FREEZE = false;
}
if (TimeOut > 30 )
{
TimeTone = TimeTone + 100;
if (TimeTone > 2000) TimeTone = 750;
TimeOut = 45;
DutyCycle = 0;
digitalWrite(3, LOW); // sets the digital pin 13 on
digitalWrite(4 , LOW); // sets the digital pin 13 on
digitalWrite(5, HIGH); // LED
digitalWrite(6, LOW); // LED
tone(7, TimeTone); // Send 1KHz sound signal...
}
else
{
if (DutyCycle < 0.05 && DemDutyCycle > 0.05)
{
DutyCycle = DutyCycle + 0.005;
}
else
{
DutyCycle = DemDutyCycle;
}
digitalWrite(3, HIGH); // sets the digital pin 13 on
digitalWrite(4, HIGH); // sets the digital pin 13 on
digitalWrite(5, LOW); // LED
digitalWrite(6, HIGH); // LED
noTone(7); // Stop sound...
}
TimeOut++;
delay(50);
TEST = !TEST;
if (TEST)
{
digitalWrite(10, HIGH); // sets the digital pin 13 on
}
else
{
digitalWrite(10, LOW); // sets the digital pin 13 on
}
// while(Htx_LockResource(&SerialASC.PortInUse) == Htx_RESOURCE_BUSY) { ; }
// SerialASC.print(PWM);
// SerialASC.print(" ");
// SerialASC.println(PWMcheck);
// Htx_UnlockResource(&SerialASC.PortInUse);
}