Saludos amigos técnicos:
Estoy un poco desalentado. Pero igual tiro la pregunta haber si alguien se copa!!!!!!
El proyecto es un robot con dos motores (uno de cada lado), ambos tienen avance y retroceso, por lo que con cuatro bit controlaria los 4 movimientos posibles (derecha, izquierda, adelante y atras). Por ejemplo el robot avanza si pongo un alto en el motor izquierdo y uno en el derecho.
Ahora lo dificil: La idea es hacerlo programable. Osea guarda hasta 32 movimientos en una lista tipo FIFO y cuando recibe el "enter" publica en los 4 bits del port A.
El código en C hecho por mi:
#include <16F84A.h>
#fuses XT, NOWDT, NOPUT, NOPROTECT
#use delay(clock=4000000)
#use standard_io(a)
#use standard_io(b)
#byte port_a = 0x05 //posicion de memoria en los registros especiales del portA
#byte port_b = 0x06 //posicion de memoria en los registros especiales del portB
void main()
{
int c ;
int lc;
int vec_men[32];
int left_up = 0b0001;
int up = 0b0101;
int right_up = 0b0100;
int stop = 0b0000;
int left_back = 0b0010;
int back = 0b1010;
int right_back= 0b1000;
set_tris_a(0b00000); //port_a como salida
set_tris_b(0xff); //port_b como entrada
port_a=0;
while(true)
{
do
{output_high(pin_a4);
if(input(PIN_B1)) //A0 A1 A2 A3
{vec_men[c] = left_up; //1
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B2)) //A0 A1 A2 A3
{vec_men[c] = up; //1 1
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B3)) //A0 A1 A2 A3
{vec_men[c] = right_up; // 1
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B4))
{vec_men[c] = stop;
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B5)) //A0 A1 A2 A3
{vec_men[c] = left_back; // 1
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B6)) //A0 A1 A2 A3
{vec_men[c] = back; // 1 1
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B7)) //A0 A1 A2 A3
{vec_men[c] = right_back; // 1
c++;
output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
}
if(input(PIN_B0))
{output_low(pin_a4);
delay_ms(200);
output_high(pin_a4);
break;
}
}while(TRUE);
lc = c;
for (c=0; c <= lc; c++)
{
if(vec_men[c] == left_up)
{ output_a(left_up);
delay_ms(500);
port_a=0;
}
if(vec_men[c] == up)
{ output_a(up);
delay_ms(1000);
port_a=0;
}
if(vec_men[c] == right_up)
{ output_a(right_up);
delay_ms(500);
port_a=0;
}
if(vec_men[c] == stop)
{ output_a(stop);
delay_ms(1000);
port_a=0;
}
if(vec_men[c] == left_back)
{ output_a(left_back);
delay_ms(500);
port_a=0;
}
if(vec_men[c] == back)
{ output_a(back);
delay_ms(1000);
port_a=0;
}
if(vec_men[c] == right_back)
{ output_a(right_back);
delay_ms(500);
port_a=0;
}
}
c=0;
output_high(PIN_A4);
}
}
Es un bucle que espera altos en B0,B1,B2,B3,B4,B5,B6 Y B7 (Uno para cada acción posible, incluyendo un "STOP" y el "enter"), los guarda en el puntero int vec_men[32] , y cuando recibe el "Enter", lo vuelve a recorrer prendiendo salidas segun cada entrada.
El programa se compila sin errores y responde a la perfección y sin errores en Proteus y MLAB.
Lo quiero programar con un programador JDM con ICPROG o WINPIC800, pero el micro no responde como en la simulación, sino que tira altos en sus salidas de forma aleatoria.
La polarización es con 5v para VDD y 5v para el reset. Tiene un cristal de 4MHZ entre las patas clock.
Que estoy haciendo mal???????