Autor Tema: Problema al cargar programa a PIC17F777  (Leído 1643 veces)

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

Desconectado JAVO_K

  • PIC10
  • *
  • Mensajes: 1
Problema al cargar programa a PIC17F777
« en: 02 de Marzo de 2012, 13:45:58 »
Código: [Seleccionar]
Hola a todos, la verdad estoy aprendiendo a golpes en el mundo de los microcontroladores, me dejaron unas tarjetas que diseño otro ingeniero, el cual me dejo el programa en C, logre compilarlo y cargarlo al PIC con mplab, sin embargo cuando lo pongo en la tarjeta en la que debería de funcionar no se activan las entradas que disparan ciertas salidas, ¿Alguna idea a que se puede deber?, podrían explicarme de manera simple como cargar un programa al pic y como comprobar si se cargo correctamente y si es el programa correcto, existe alguna manera de bajar el programa de un pic en uso y colocarlo a uno nuevo?, les anexo el programa, por si me pueden ayudar, es muy urgente y agradecería mucho su ayuda.
He utilizado el mplab, compilo (Build all) y programo y al parecer todo bien, sin embargo no pasa nada en el pic respecto a las entradas.
También he utilizado el pcw, compilo y cargo al pic y no marca ningún error, sin embargo obtengo el mismo resultado, mi duda es ya que en algún momento se cargo bien el programa y funcionó, sin embargo al querer programar otro pic ya no ha funcionado, la tarjeta no es el problema, ya que he probado con 3 diferentes y el resultado es el mismo.
De antemano muchas gracias por su ayuda y pronta respuesta.
Este es el codigo programado, igual si hay algún error es bienvenido cualquier comentario:
/* Esta version reliza el control de la Continuous Sealer segun el resultado de la inspeccion.

sensor de paquete PAQUETE_IN
marcador de paquetes MARKER
Se tiene tambien un codificador Hexadecimal para seleccionar numero de mensaje a grabar, con las siguientes entradas
HEX_A, HEX_B, HEX_C, HEX_D
Hay un pushbutton para grabar los mensajes ("GRABAR")
4 bits para direccion de mensajes en el circuito de voz A0, A1, A2, A3
LED de salida para indicar memoria llena de circuito de voz LED_OVF
Entradas provenientes del circuito de voz -OVF, -EOM
Salidas hacia el circuito de voz PD, P/-R, -CE

Ver. 26Jun09: se reduce el tiempo de espera desde que el paquete esta estable hasta que se emite el pulso a la camara 1
(de 3 segundos a 0.1 segundo) ademas de que se adiciona un pedal con contacto normalmente cerrado (puerto RB5, pin38)
el cual dispara la inspeccion. Se elimina el segundo mensaje cuando hay falla (retirar, presionar reset e inspeccionar)
para acortar el tiempo total de ciclo del equipo.

Ver. 6Dec09: Se cambian algunos puertos de I/O, como sigue:
MARKER cambia de E0 a C0, CS_Permisive de E2 a A7, CS_Cycle de B3 a A6, PEDAL de B5 a A4.
Se adiciona la salida LMP_CTRL para gobernar un transistor MOSFET que controlara al controlador de lampara. Funciona con
un timer de 5 segundos para activar al transistor despues del encendido de la tarjeta. Falta adicionar el mensaje de voz
"SISTEMA LISTO" a los 60 segundos para esperar que inicialicen las camaras. Esta version solo sera funcional
en el nuevo disenio de PCB que incluye los cambios indicados "Wally - 31Dic09".

Ver 23Apr10: En esta versión se hace que todos los paquetes inspeccionados sean marcados, a diferencia de versiones ante
riores que solamente los aceptados se marcaban. Esta versión se usará por primera vez en las tarjetas "Wally - 31Dic09"

ver 24Sep10: Esta versión invierte todos los estados de la variable PAQUETE_IN con respecto a las versiones anteriores en
las 4 líneas que interviene. De igual forma se cambió el estado de la salida de este sensor a la posición "LO"
*/

#include <16F777.H>

#fuses INTRC_IO, NOWDT, PROTECT, PUT, NOBROWNOUT, MCLR, NOFCMEN, NOIESO, NOBORSEN
#use delay(clock = 8000000) // Velocidad de reloj del sistema

#DEFINE PERMISO_SELLAR PIN_A7 // out hacia termoselladora
#DEFINE CICLO_SELLADO PIN_A6 // in Viene de termoselladora, ciclo de sellado iniciado
#DEFINE CAM2MSB PIN_A5 // in viene de camara 2 (MSB)
#DEFINE PEDAL PIN_A4 // switch de pedal que dispara la inspeccion
//#DEFINE PIN_A3 //
//#DEFINE PIN_A2 //
#DEFINE MONITOR PIN_A1 //
#DEFINE TIMER200MS PIN_A0 //


#DEFINE CAM1LSB PIN_B7 // in viene de camara 1 (LSB)
#DEFINE CAM2LSB PIN_B6 // in viene de camara 2 (LSB)
//#DEFINE PIN_B5 //
#DEFINE LMP_CTRL PIN_B4 // out a Gate transistor de control de lampara
//#DEFINE PIN_B3 //
#DEFINE GRABAR PIN_B2 // in Push Button Grabar
#DEFINE OVF PIN_B1 // in Viene de ISD2590
#DEFINE PAQUETE_IN PIN_B0 // in sensor retroreflectivo salida npn

//#DEFINE PIN_C7 //
//#DEFINE PIN_C6 //
#DEFINE CE PIN_C5 // out hacia ISD2590 Activo Bajo
#DEFINE PD PIN_C4 // out hacia ISD2590 Activo Bajo
#DEFINE A2 PIN_C3 // out hacia ISD2590 (address bit)
#DEFINE A3 PIN_C2 // out hacia ISD2590 (address bit)
#DEFINE LED PIN_C1 // out hacia LED
#DEFINE MARKER PIN_C0 // out hacia control de marcador de inspeccion realizada

#DEFINE HEX_D PIN_D7 // in de switch HEX
#DEFINE HEX_C PIN_D6 // in de switch HEX
#DEFINE HEX_B PIN_D5 // in de switch HEX
#DEFINE HEX_A PIN_D4 // in de switch HEX
#DEFINE EOM PIN_D3 // in Viene de ISD2590
#DEFINE PR PIN_D2 // out hacia ISD2590 Play/-Record
#DEFINE A0 PIN_D1 // out hacia ISD2590 (address bit)
#DEFINE A1 PIN_D0 // out hacia ISD2590 (address bit)

//#DEFINE PIN_E3 //
//#DEFINE PIN_E2 //
#DEFINE CAMTRIG PIN_E1 // out hacia sistema de vision
//#DEFINE PIN_E0 //

// DEFINICION DE VARIABLES INT (INT8), INT1 (SHORT), 1NT16, VOID, INT32, FLOAT, CHAR

// INT boletos = 0; // contador de oportunidades para termosellar en base a paquetes inspeccionados con exito
// INT boletos_max = 1; // Este valor es igual al numero maximo de ciclos de inspeccion a acumular para termosellar
INT num_msg; // numero del mensaje a emitir
INT msg_sec; // numero de mensaje secundario
INT contador = 0; // cuenta el numero de pulsos que traen la codificacion del error de la entrada C2MSB
INT num_segmento;
INT tiempo1 = 0; // Timer para disparar inspeccion cuando el paquete se ha depositado sobre el sensor
INT tiempo2 = 0; // Timer para generar periodicamente el mensaje "sellar para continuar" mientras hay paquete colocado
INT tiempo3 = 0; // Timer para emitir segundo mensaje al termino del primero en los casos que se emiten 2
INT tiempo4 = 0; // Timer de duracion del pulso para el marcador de paquetes

BOOLEAN sellado_ant = TRUE; // estado anterior de la entrada proveniente de la CS
BOOLEAN CAM2MSB_ant = TRUE; // valor anterior de la entrada CAM2MSB para detectar y contar pulsos
BOOLEAN perm_tiempo1 = FALSE;
BOOLEAN falla_codigo = FALSE;
BOOLEAN falla_comms = FALSE;
BOOLEAN codigo_aceptado = FALSE;
BOOLEAN resultado = FALSE;
BOOLEAN boleto = FALSE;
BOOLEAN msg_instrucciones = FALSE; // Bandera que indica que se debe emitir el mensaje de instrucciones (2o. mensaje)
BOOLEAN msg_done = FALSE; // Bandera que indica que ya se termino de emitir un mensaje
BOOLEAN eom_ant = TRUE; // Estado en el scan anterior de la entrada EOM
BOOLEAN enable_marcar = FALSE;
BOOLEAN message_on = FALSE;
BOOLEAN hexzero;


// Area de funciones +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void CHECK_EOM()
{
if (input(EOM) == TRUE)
if( eom_ant == FALSE)
{
if (msg_instrucciones == TRUE)
msg_done = TRUE;
eom_ant = TRUE;
tiempo3 = 0;
message_on = FALSE;
}
else goto final_EOM;
else eom_ant = FALSE;

final_EOM: delay_cycles(1);

}

void MARCAR()
{
if (tiempo4 >= 3)
{
output_low(MARKER);
enable_marcar = FALSE;
}
}


void MESSAGES()
{
OUTPUT_BIT(A3, bit_test(num_msg , 3)); // Estas cuatro lineas ajustan la direccion al circuito de voz
OUTPUT_BIT(A2, bit_test(num_msg , 2));
OUTPUT_BIT(A1, bit_test(num_msg , 1));
OUTPUT_BIT(A0, bit_test(num_msg , 0));

delay_ms(1);
OUTPUT_LOW(PD); // Enciende circuito de voz
delay_ms(1); // Retardo para asegurar condiciones estables del circuito de voz
OUTPUT_LOW(CE); // Habilita circuito de voz mediante un pulso bajo de 5 ms.
delay_ms(1);
OUTPUT_HIGH(CE);

message_on = TRUE;
}


void MSG_SECUENCIAL()
{
enable_marcar = TRUE;

switch (msg_sec) // Aqui se determina la secuencia de mensajes que se emitiran segun el resultado de las camaras
{
case 0:{
boleto = TRUE; //Paquete Ok; este es el unico caso en que se otorga boleto para sellar
output_high(PERMISO_SELLAR);
num_msg = 5; // Mensaje "Ok"
//enable_marcar = TRUE;
output_high(MARKER);
tiempo4 = 0;
tiempo2 = 0;
MESSAGES(); // Emite mensaje 5
}
break;

case 1: {
num_msg = 3; // "Problema con Muesca"
MESSAGES();
msg_instrucciones = TRUE;
}
break;

case 2:{
num_msg = 2; // "Problema de Esquinas"
MESSAGES();
msg_instrucciones = TRUE;
}
break;

default:{ //No detecto media luna
num_msg = 4; // "Paquete Volteado"
MESSAGES();

msg_instrucciones = TRUE;
}

}
}


void INTERPRETACION() // Detecta el codigo de pulsos que recibe por el bit CAM2MSB y lo guarda en "contador"
{
delay_ms(75);
for (num_segmento=1; num_segmento<=6; ++num_segmento)
{
delay_ms(50);
if (input(CAM2MSB) == FALSE) // Deteccion de cambios en senal CAM2MSB
if (CAM2MSB_ant == TRUE)
{
contador = contador+1;
CAM2MSB_ant = FALSE;
}
else CAM2MSB_ant = FALSE;
else (CAM2MSB_ant = TRUE);
}

num_msg = contador;
msg_sec = contador; // Copia valor del codigo para usar al emitir 2 mensajes continuos
contador = 0;
resultado = TRUE;
}


void TEST_BARCODE()
{
delay_ms(40);

if ((input(CAM1LSB) == TRUE)&& (input(CAM2LSB) == TRUE)) // Determina si se recibio el pulso que indica problema con codigo de barras (30 mS)
{
falla_codigo = TRUE;
goto salida;
}

delay_ms(30);

if ((input(CAM1LSB) == TRUE) && (input(CAM2LSB) == TRUE)) // Determina si se recibio el pulso que indica Aceptacion del codigo de barras (60 mS)
{
codigo_aceptado = TRUE;
goto salida;
}

delay_ms(30);

if ((input(CAM1LSB) == TRUE) && (input(CAM2LSB) == TRUE)) // Determina si se recibio el pulso que indica Aceptacion del codigo de barras (60 mS)
falla_comms = TRUE;

salida: delay_cycles(1);

}


#INT_TIMER1
void interrupt_tmr1()
{
SET_TIMER1(15535);
tiempo1++;
tiempo2++;
tiempo3++;
tiempo4++;
output_toggle(TIMER200MS);
if (tiempo2 >100)
tiempo2 = 0;
}

#INT_EXT // Esta rutina detecta la entrada de paquete al equipo y genera un retardo para indicar a la camara 1 que puede iniciar
void intext_routine()
{
tiempo1 = 0;
perm_tiempo1 = TRUE; // Habilita retardo para emitir pulso a la camara 1 una vez que el sensor ha visto el paquete

if (input(PAQUETE_IN) == FALSE && boleto == TRUE && message_on == FALSE)
{
tiempo2 = 0;
num_msg = 7; // "Sellar para continuar"
messages();
}
}


#INT_RB
void int_rb_routine() // Rutina de servicio a interrupcion por cambio de estado en salida 1 de camara 1. Inicia ciclo.
{
if (input(CAM1LSB) == FALSE)
TEST_BARCODE();

if ((input(PAQUETE_IN) == 0) && (input(CAM2LSB) == 0))
INTERPRETACION();
}



void SECUENCIA_GRABAR() // Secuencia para grabar mensajes. Inicia y se mantiene mientras se presiona el boton GRABAR
{
output_bit( A0, !input( HEX_A )); // Transfiere direccion del switch BCD al bus de direcciones del ISD2590
output_bit( A1, !input( HEX_B ));
output_bit( A2, !input( HEX_C ));
output_bit( A3, !input( HEX_D ));

output_low(PR); // Manejo de senales de control del ISD2590 para grabar
output_low(PD);
delay_ms(20);
output_high (LED); // El LED enciende mientras se presiona el boton de GRABAR
output_low(CE);
delay_ms(2);
output_high(PR);

while (input(GRABAR) == 0);
{}

delay_ms(1);
output_high (CE); // Fin de grabacion.
delay_ms(1);
output_high (PD);
output_low(LED);

}


void INICIA_INSPECCION()
{
output_high(CAMTRIG);
delay_ms(250); // Duracion del pulso de arranque para la camara en modo operacion.
output_low(CAMTRIG);
perm_tiempo1 = FALSE;
}


void CHECA_SELLADO()
{
if (input(CICLO_SELLADO) == TRUE) // Deteccion de cambios en senal CAM2MSB
if (sellado_ant == FALSE)
{
boleto = FALSE;
sellado_ant = TRUE;
}


 

anything