Hoi!
Ik heb wat C-code welke 1 voor 1 spanning zet op een infrarood reflectiemodule, de uitgang meet en de spanning er weer af haalt.
Dit doet hij voor 4 sensoren. 1 keer per seconde, en elke module is telkens 1ms aan.
Nu lijkt het mij dat deze code nog veel eenvoudiger kan, maar hoe doe ik dit?
Ik roep de functie checkSensors op die er voor zorgt dat flags.sensors gezet wordt als er minimaal 1 sensor actief is.
Maar ik kom er nog niet onder uit om met een switch case te werken omdat ik 4 verschillende uitgangen en 4 verschillende ingangen moet aansturen/uitlezen.
Dus het gaat er niet om, om de functie checkSensors() korter te maken, maar vooral de functie checkSensor().
Puur uit intresse, de functionaliteit voldoet namelijk al.
#define SENS1 PORTAbits.RA3
#define SENS2 PORTAbits.RA1
#define SENS3 PORTBbits.RB5
#define SENS4 PORTBbits.RB3
#define GNDS1 LATAbits.LATA2
#define GNDS2 LATAbits.LATA0
#define GNDS3 LATBbits.LATB4
#define GNDS4 LATBbits.LATB2
void checkSensors(void)
{
static unsigned char zeroCount = 0;
flags.sensors = 0;
for (unsigned char i = 1; i <= 4; i++)
flags.sensors |= !checkSensor(i);
if (!flags.sensors)
{
if (zeroCount < 2)
zeroCount++;
if (zeroCount < 2)
flags.sensors = true;
}
else
zeroCount = 0;
}
unsigned char checkSensor(unsigned char s)
{
unsigned char r = false;
switch(s)
{
case 1:
GNDS1 = 1;
break;
case 2:
GNDS2 = 1;
break;
case 3:
GNDS3 = 1;
break;
case 4:
GNDS4 = 1;
break;
}
__delay_ms(1);
switch(s)
{
case 1:
r = SENS1;
break;
case 2:
r = SENS2;
break;
case 3:
r = SENS3;
break;
case 4:
r = SENS4;
break;
}
GNDS1 = GNDS2 = GNDS3 = GNDS4 = 0;
return r;
}