Hola que tal a todos tengo una duda sobre un programa que he estado haciendo en sí el problema no está en el algoritmo PID si no en un array que declaro para leer el valor de los ocho sensores que estoy usando por medio del puerto B, no sé si lo que estoy haciendo está bien o mal la verdad no he trabajado mucho con arrays en CCS realmente no marca ningún error pero no hace lo que debería. Por ahora no hace el algoritmo Pid, lo que trataba de hacer es a un determinado valor del puerto B encontrado en el array declarado por medio de la función switch y su condición de igualdad asiganar un valor en la variable llamada v que luego podría manejar fácilmente en el algoritmo, pero ahora solo probaba si realmente se asignaba el valor a v, pero tal parece que no, y pienso que es desde los arrays, en las igualdades de los switch
Saludos y espero que alguien me pueda ayudar
#include <16f877a.h> //archivo para control del pic 16f876a
#fuses HS,NOWDT,NOPROTECT,NOLVP //protecciones
#use delay(clock=12000000)
#byte trisb=0x86
#byte portb=0x06
int16 sensor[]= {PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7}; // declaro el vector de ocho valores con los bits del puerto B
signed int v, anterior;
float integral=0, derivative, previous_error = 0, output, Kp = 0.8 , Ki = 0.5, Kd = 0.9, dt = 0.1, error;
void main()
{
set_tris_b(0b11111111);
set_tris_c(0b00000000);
while(true)
{
switch(sensor[1]==0b00000011) //igualdades para que se de un valor a v //es correcto hacer esto? el array sensor[1] está bien no debería poner 8 en vez de 1? //pero //me dice fuera de rango
{
case 0: v=3; <-------------------------------------------------- se supone se debería dar el valor a v
break;
}
switch(sensor[1]==0b00000110) //los valores con los que se iguala son las posibles combinaciones de los sensores al ir siguiendo la línea ya que dos sensores siempre leen
{
case 1: v=2;
break;
}
switch(sensor[1]==0b00001100)
{
case 2: v=1;
break;
}
switch(sensor[1]==0b00011000)
{
case 3: v=0;
break;
}
switch(sensor[1]==0b00110000)
{
case 4: v=-1;
break;
}
switch(sensor[1]==0b01100000)
{
case 5: v=-2;
break;
}
switch(sensor[1]==0b11000000)
{
case 6: v=-3;
break;
}
switch(sensor[1]==0b00000000)
{
case 7: v=anterior;
break;
}
if(v==3){
output_high(pin_c0); // solo para saber si las asignaciones a v estaban funcionando
}
}
}