Marcelo
Primero darte las gracias, porque me estas ayudando mucho
He seguido tus recomendaciones, no se si lo he hecho bien
pero ahora el CCS me da un error al compilar
"Unknown device type -Try PCM"
y no me deja ver si hay errores en el codigo o no. Yo tengo un CCS original con licencia y todo en orden; no hay ningún software pirata en mi ordenador ya que es una empresa de investigación subcontratada por la universidad.
Tampoco se si estoy llamando bién a las funciones, ya que el CCS se parece poco al borland C que yo habia programado. Y a lo mejor estoy usando algunas funciones o llamando a algúna parte del programa que no toca.
Este es el codigo que tengo ahora pero que no me deja compilar.
#include <16F876.h> //libreria que carga el pic a utilizar
#device adc=8 //resolución 8 bits para el comversor ADC
#FUSES HS,NOWDT // Fusibles, El Contador Watch Dog esta desabilitado
#include <string.h> //libreria necesaria para trabajar con caracters
#include <stdio.h> //libreria necesaria para trabajar con la UART
#use delay(clock=20000000) //Velocidad del cristal
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//Prepara la UART para trabajar con el protocolo rs232
///////////////////// ENTRADAS ////////////////////////////////////////////////
#define odometro_A PIN_B0 //la entrada del encoder en el pin RB0
#define odometro_B PIN_B1 //(entrada de interrupción externa)
//////////////////// SALIDAS /////////////////////////////////////////////////
#define salida PIN_B2
//////////////////// VARIABLES GLOBALES y CONSTANTES /////////////////////////
#define freq 50 // resetea el contador cada 50ms 20 veces por segundo
//int16 Cuenta=0;
static signed int16 cuenta;
int sentido=0;
//////////////////// FUNCIONES Y RUTINAS //////////////////////////////////////
#INT_EXT
void ext_isr()
{
if(input(odometro_B)) //la otra entrada del encoder está en RB1
{ cuenta += 1;
sentido = 1; //de acuerdo a su estado se considera la rotación en un sentido
}else{
cuenta += 1;
sentido = 2; //u otro
}
}
#int_TBE
TBE_isr()
{signed int16 numero;
int direccion;
char num[8],ascii;
ascii="A"; //letra que concadenar en la trama
numero=direccion=0; //inicializamos los valores de las variables.
numero=cuenta; //copiamos el valor del contador
direccion=sentido; //almacenamos el sentido de la rueda
cuenta=sentido=0; //inicializamos el contador
if(sentido==1)
{sprintf(num,"%u",numero};
num=strcat (num, "1"); //introducimos el sentido en la trama
num=strcat (ascii, num);
num=strcat (num, ascii);}
else
{if(sentido==2)
{sprintf(num,"%u",numero};
num=strcat (num, "2"); //introducimos el sentido en la trama
num=strcat (ascii, num);
num=strcat (num, ascii);}
}
}
///////////////////// PROGRAMA PRINCIPAL ///////////////////////////////////////
void main()
{
setup_adc_ports(NO_ANALOGS); //Puertos desconectados
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //timers 0 conectado
setup_timer_1(T1_EXTERNAL);
setup_timer_2(T2_DISABLED,0,1); //Timer 2 desconectado
enable_interrupts(INT_RTCC); //se activan las interrupciones
enable_interrupts(INT_TBE);
enable_interrupts(INT_TIMER0);
ext_int_edge(L_TO_H); //definir el flanco de interrupción
enable_interrupts(INT_EXT);//encender la interrupción
enable_interrupts(GLOBAL);
ext_isr();
TBE_isr();
}
También tengo otras dudas
.
Una vez generado el archivo que quiero enviar por la UART, como le indico que me lo envie?
Y otra cosa necesito que me reinicie el contador y me envie por la UART 20 veces por segundo, cada 50us, eso como se lo indico en el codigo?
Yo creia que se le havia de indicar de esta forma
set_timer0(50);
Pero lo he de incluir en el mail? o en el void ext_isr() ?
Saludos
Cris
P.D: te debo una birra por la ayuda jeje