Autor Tema: Ayuda con Programación de PIC16f84A en C  (Leído 2291 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Morgo

  • PIC10
  • *
  • Mensajes: 3
Ayuda con Programación de PIC16f84A en C
« en: 01 de Junio de 2011, 20:04:06 »
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???????

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con Programación de PIC16f84A en C
« Respuesta #1 en: 01 de Junio de 2011, 22:16:15 »
Y el esquema que estas utilizando? Se podría estructurar y comentar más el programa para que lo entendamos  :tongue:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Morgo

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda con Programación de PIC16f84A en C
« Respuesta #2 en: 01 de Junio de 2011, 22:48:32 »
VDD: 5v
Reset:5v
Pin 16 - 15: Cristal 4mhz

Un pulsador conectado a V+ (5v) y  cada PIN Port_B (8 en total):
left_up = B1
up = B2
right_up = B3
stop =B4
left_back =B5
back =B6
right_back=B7
B0 es "Enter"

Port_a (salida):

A0: Left_up
A1: Left_Back
A2: Right_up
A3: Left_Back

A4: se mantiene encendido y se apaga cuando se ingresa un dato en la pila y cuando el programa está ejecutando las salidas despues del "enter"

Las salidas van conectadas a dos placas tipo "puente" que controlan dos motores, en función del disparo por TTL, es decir:
A0 (con retardo de 0,5 seg) permite un giro completo a la izquierda.
A1 y A3 (con retardo 1 seg) hacen retroceder el robot un metro.
Etc.

Toda la eléctronica funciona perfectamente. El problema es el PIC que no responde como en el simulador. El pic enciende aleatoriamente las salidas no respetando la lógica del programa.

He probado grabar programas más sencillos, como parpadeos de Leds o llaves que activan salidas, no teniendo difilcutad ni con el software o el programador.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con Programación de PIC16f84A en C
« Respuesta #3 en: 01 de Junio de 2011, 22:54:02 »
El cristal tiene sus respectivos capacitores? Los pulsadores sus resistencias pull-down? Tuviste en cuenta que RA4 es colector abierto? Resistencia de 10k entre MCLR y Vdd?

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Morgo

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda con Programación de PIC16f84A en C
« Respuesta #4 en: 02 de Junio de 2011, 20:00:43 »
Amigo!!! Era esoo!!!
Las resistencias a maza en los pulsadores de entrada!

Coloque una resistencia de 10k a maza de un lado del pulsador conectado a cada  PIN del Portb y una de 1K a V+ en el otro extremo del pulsador.

Una pregunta más:

Luego de realizar una secuencia, suele tirar un error (como un "alto" no deseado en un bit cualquiera del puerto de salida).

Esto porque puede pasar?