Hola, tengo problema con el CCS ya que no estoy muy familiarizado con él, necesito leer los registros de una tarjeta por medio de I2C; desde la PC tengo que enviar un caracter y dependiendo del caracter es el registro que debo leer.
Lo que quiero hacer es por ejemplo, envío una "a" y debo leer el registro con la direccion "0" de la tarjeta I2C, estoy usando la interrupción INT_RDA recibo el caracter y hago un "if", si es "a" debo leer el registro "0", como lo único que tengo que cambiar es la direccion de lectura dependiendo del caracter y todo lo demas es lo mismo quiero llamar a una subrutina algo así como un "GO TO" en ensamblador pero no sé como hacerlo en CCS.
Le agradezco su ayuda de antemano.
PD: Espero me hayan entendido y anexo codigo.
Lo que quiero hacer es por ejemplo, envío una "a" y debo leer el registro con la direccion "0" de la tarjeta I2C, estoy usando la interrupción INT_RDA recibo el caracter y hago un "if", si es "a" debo leer el registro "0", como lo único que tengo que cambiar es la direccion de lectura dependiendo del caracter y todo lo demas es lo mismo quiero llamar a una subrutina algo así como un "GO TO" en ensamblador pero no sé como hacerlo en CCS.
Le agradezco su ayuda de antemano.
PD: Espero me hayan entendido y anexo codigo.
Código:
#include <16F887.h>
#fuses HS, NOWDT, NOPUT, MCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, LVP, BORV40, NOWRT
#use delay(clock=20000000)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3) //Configuración de I2C
#use RS232(baud=9600, xmit=pin_C6, rcv=pin_C7, bits=8, PARITY=N) //Configuración RS232
//Definición de variables//
char ch;
int dato;
long int registro;
#int_rda
rda_service() //Servicio de interrupcion por RS232
{
ch = getchar();
if(ch=='a') //Leer velocidad motor 1
{
registro=0;
dato=read_md23(registro); AQUI ME APARECE EL ERROR 12 UNDEFINED IDENTIFIER -- read_md23
}
if(ch=='b') //Leer velocidad motor 2
{
registro=1;
//goto
}
if(ch=='i') //Leer corriente motor 1
{
registro=11;
//goto
}
if(ch=='y') //Leer corriente motor 2
{
registro=12;
//goto
}
if(ch=='s') //Leer aceleración
{
registro=14;
//goto
}
if(ch=='m') //Leer modo tarjeta
{
registro=15;
//goto
}
if(ch=='c') //Leer dirección de la tarjeta
{
registro=16;
//goto
}
if(ch=='A') //Escribir velocidad motor 1
{
registro=0;
//goto
}
if(ch=='B') //Escribir velocidad motor 2
{
registro=1;
//goto
}
if(ch=='S') //Escribir aceleración
{
registro=14;
//goto
}
if(ch=='M') //Escribir modo tarjeta
{
registro=15;
//goto
}
if(ch=='C') //Escribir dirección tarjeta
{
registro=16;
//goto
}
}
void write_md23(long int registro, BYTE data) //Instrucción para escribir en la tarjeta MD23
{
short int status; //Variable status
i2c_start(); //Inicializa la transmisión
i2c_write(0xB0); //Escrie la palabra de control
//(dirección 0h + 0 para escritura)
i2c_write(registro>>16); //Parte alta del registro a escribir en la MD23
i2c_write(registro); //Parte baja del registro a escribir en la MD23
i2c_write(data); //Dato a escribir
i2c_stop(); //Finaliza la transmision
i2c_start(); //Reinicio
status=i2c_write(0xB0); //Lectura del bit ACK, para evitar escrituras incorrectas
while (status==1) //Espera a que el slave responda
{
i2c_start();
status=i2c_write(0xB0);
}
}
BYTE read_md23(long int registro) //Instrucción para leer la tarjeta MD23
{
BYTE data; //Variable (dato a leer)
i2c_start(); //Inicializa la transmision
i2c_write(0xB0); //Escribe la palabra de control
//(dirección 0h + 0 para escritura)
i2c_write(registro>>8); //Parte alta del registro a escribir en la MD23
i2c_write(registro); //Parte baja del registro a escribir en la MD23
i2c_start(); //Reinicio
i2c_write(0xB1); //Escribe la palabra de control
//(direccion 0h + 1 para lectura)
data=i2c_read(0); //Lectura del dato
i2c_stop(); //Finalizacion de la transmision
return(data);
}
void main() //PROGRAMA PRINCIPAL
{
enable_interrupts(int_rda); //Habilita interrupción por recepción RS232
enable_interrupts(global); //Habilita interrupcion global
while(1)
{
delay_ms(500);
registro = 0;
dato=read_md23(registro);
registro = 1;
dato=read_md23(registro);
}
}
Última edición: