Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola, estoy realizando un proyecto y antes de realizar el envio de datos en serie para ello, realice un sencillo programa entre dos pic´s 16f628a utilizando el compilador CCS, se envian una serie de numeros que mas tarde en el pic esclavo se representan por sus salidas, solo quiero comprobar que el envio de datos por protocolo i2c es correcto y lo he realizado satisfactoriamente.
El error viene cuando voy a compilar y me dice ''invalid pre-processor directive'' justo en #int_ssp, por lo que no la reconoce no? que es lo que pasa?, sin mas dilación les transcribo el codigo del master y el slave, muchas gracias 🙂
MASTER
#include <16f628a.h>
#use standard_io(a,b)
#fuses intrc_io, NOWDT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock = 4000000)
#use I2C( master, sda=PIN_B1, scl=PIN_B2, FORCE_HW, SLOW )
int8 A,B,C; //variables para frecuencias principales
int8 f=0;
int8 Direccion, Dato;
void Bus_I2c (void);
void Envio (void);
void Prueba (void);
void Bus_I2c (void){
i2c_start();
i2c_write(Direccion); //escribo dirección dispositivo
i2c_write(Dato); //escribo el dato
i2c_stop();
}
void Envio (void){
Dato=A;
Direccion=0x02;
Bus_I2c();
delay_ms(2);
Dato=B;
Direccion=0x02;
Bus_I2c();
delay_ms(2);
Dato=C;
Direccion=0x02;
Bus_I2c();
delay_ms(2);
}
void Prueba (void){
if ( f==0 ){
A=1;
B=2;
C=3;
}
else if ( f==1 ){
A=4;
B=5;
C=6;
}
else if ( f==2 ){
A=7;
B=8;
C=9;
}
else if ( f==3 ) {
A=10;
B=11;
C=12;
}
else {
A=13;
B=14;
C=15;
}
}
#INT_EXT
void interrup () {
f++;
if ( f==5 ){
f==0;
}
}
void main (void) {
disable_interrupts(global);
enable_interrupts(INT_EXT);
enable_interrupts(global);
do {
Prueba();
Envio();
}
while(true);
}
SLAVE
#include <16f628a.h>
#use standard_io(a,b)
#fuses intrc_io, NOWDT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock = 4000000)
#use i2c(SLAVE, SDA=PIN_B1, SCL=PIN_B2, ADDRESS=0X02,slow,force_hw)
int8 estado,dato=0,f=0; //para la interrupcion I2C
int8 A=0, B=0, C=0;
void Funcion_A(void);
void Funcion_B(void);
void Funcion_C(void);
void Funcion_A(void){
if ( A==1 ){
output_high(PIN_A2);
output_low(PIN_A3);
output_low(PIN_A4);
output_low(PIN_A5);
}
else if ( A==4 ){
output_low(PIN_A2);
output_low(PIN_A3);
output_high(PIN_A4);
output_low(PIN_A5);
}
else if ( A==7 ){
output_high(PIN_A2);
output_high(PIN_A3);
output_high(PIN_A4);
output_low(PIN_A5);
}
else if ( A==10 ){
output_low(PIN_A2);
output_high(PIN_A3);
output_low(PIN_A4);
output_high(PIN_A5);
}
else if ( A==13 ){
output_high(PIN_A2);
output_low(PIN_A3);
output_high(PIN_A4);
output_high(PIN_A5);
}
}
void Funcion_B(void){
if ( B==2 ){
output_low(PIN_A1);
output_high(PIN_A0);
output_low(PIN_A7);
output_low(PIN_A6);
}
else if ( B==5 ){
output_high(PIN_A1);
output_low(PIN_A0);
output_high(PIN_A7);
output_low(PIN_A6);
}
else if ( B==8 ){
output_low(PIN_A1);
output_low(PIN_A0);
output_low(PIN_A7);
output_high(PIN_A6);
}
else if ( B==11 ){
output_high(PIN_A1);
output_high(PIN_A0);
output_low(PIN_A7);
output_high(PIN_A6);
}
else if ( B==14 ){
output_low(PIN_A1);
output_high(PIN_A0);
output_high(PIN_A7);
output_high(PIN_A6);
}
}
void Funcion_C(void){
if ( C==3 ){
output_high(PIN_B7);
output_high(PIN_B6);
output_low(PIN_B5);
output_low(PIN_B4);
}
else if ( C==6 ){
output_low(PIN_B7);
output_high(PIN_B6);
output_high(PIN_B5);
output_low(PIN_B4);
}
else if ( C==9 ){
output_high(PIN_B7);
output_low(PIN_B6);
output_low(PIN_B5);
output_high(PIN_B4);
}
else if ( C==12 ){
output_low(PIN_B7);
output_low(PIN_B6);
output_high(PIN_B5);
output_high(PIN_B4);
}
else if ( C==15 ){
output_high(PIN_B7);
output_high(PIN_B6);
output_high(PIN_B5);
output_high(PIN_B4);
}
}
#int_SSP
void i2c()
{
estado=i2c_isr_state();
if((estado>0)&&(estado<0x80))
{
dato=i2c_read();
// Indica que se ha recibido un dato de parte del master.
f++;
}
if ( f==1 ){
A=dato;
}
else if ( f==2 ){
B=dato;
}
else if ( f==3 ){
C=dato;
f=0;
}
}
void main (void) {
disable_interrupts(global); //desabilitamos todas las interrupciones
enable_interrupts(INT_SSP);
enable_interrupts(global);
do {
Funcion_A();
Funcion_B();
Funcion_C();
}
while(true);
}
Cabe señalar, que hay una interrupcion por teclado, para enviar cada vez que se pulse una serie de numeros diferente, la interrupcion por i2c no esta presente en el ccs por lo que he visto, pero tambien he leido que cualquier pic puede hacerla...asi que nose que es exactamente lo que pasa.