Estoy tratando de hacer un código propio en C++(CCS) que permita comunicar dos pics cuando se de un evento determinado. Pero no la estoy logrando hacer funcionar y por ello recurro a su ayuda.
La idea es hacer un código que pueda usarse con cualquier pic aun cuando no tengan periféricos propios para I2C, USART, etc. Los pics que elegí para la prueba son dos chiquitines: 12F675.
Ambos pics están conectados de modo que la patita destinada a transmitir es un pin de salida del Pic1 conectado a la patita que controla la interrupción externa del pic2.
Por ahora intento hacer una transmisión unidireccional del pic maestro, al esclavo. Cuando el master prende TX(pin de transmisión), y lo apaga, justo después, el pic esclavo debería empezar a transmitir los datos.
Archivo:
Comunicacion_PICMaestro.c:
#include "Comunicacion_PICMaestro.h"
// Ponemos nombres mas faciles a las funciones que prenden y apagan las patitas del PIC.
#define ON output_high
#define OFF output_low
#define TX PIN_A4
#define RX PIN_A3
#define Led1 PIN_A0
#define Led2 PIN_A1
#define Led3 PIN_A2
#define Led4 PIN_A5
int16 i; // Uso generico.
int16 DuracionCeroUS = 200;
int16 DuracionUnoUS = 400;
int16 Bit; int16 Demora;
int16 _Byte[8];
void PedirDatos(){
// Pedimos que compense a mandarnos datos.
ON(TX); Delay_us(100); OFF(TX);
for(i=0; i>=7; i++){
while(!input(RX)); // Esperamos envio de un bit.
set_timer1(0); // Seteamos el timer a cero.
while(input(RX)); // Esperamos a que se apague el bit.
Demora = get_timer1(); // Calculamos cuanto estuvo prendido.
if(Demora<DuracionCeroUS+20){ // En caso que haya estado prendido menos de DuracionCero.
Bit=0;
}else if(Demora<DuracionUnoUS+20){ // Si estuvo mas que DuracionCero pero menos que DuracionUno.
Bit=1;
}
_Byte[i] = Bit;
}
}
/*
#int_EXT
void EXT_isr(){
}
*/
void main(){
OFF(TX);
Delay_ms(20); // Esperamos a que se estabilize la corriente.
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_comparator(NC_NC);
setup_vref(FALSE);
enable_interrupts(GLOBAL);
set_tris_a(0b00001000); // PIN_A3 seteado como entrada y las demas patitas seteadas como salidas.
// GPIO --543210
while(1){
PedirDatos();
for(i=0; i>=7; i++){
if(_Byte[i]==1){
ON(Led1); Delay_ms(400); OFF(Led1); Delay_ms(100);
}else{
ON(Led1); Delay_ms(100); OFF(Led1); Delay_ms(400);
}
}
Delay_ms(3000);
}
}
Archivo:
Comunicacion_PICEsclavo.c:
#include "Comunicacion_PICEsclavo.h"
// Ponemos nombres mas faciles a las funciones que prenden y apagan las patitas del PIC.
#define ON output_high
#define OFF output_low
#define TX PIN_A4
#define RX PIN_A3
int16 i; // Uso generico.
int16 DuracionCeroUS = 200;
int16 DuracionUnoUS = 400;
int16 Bit;
int16 _Byte[8]={0,1,0,1,0,0,1,1};
void EnviarDatos(){
while(input(RX));// Cuando baje la senal, empezamos a transimitir.
for(i=0; i>=7; i++){
Bit = _Byte[i];
if(Bit==1){
ON(TX); delay_us(DuracionUnoUS); OFF(TX);
}else{
ON(TX); delay_us(DuracionCeroUS); OFF(TX);
}
delay_us(100); // Espacio entre bits.
}
}
#int_EXT
void EXT_isr(){ // Si entra aca es que nos pidieron Datos.
EnviarDatos();
}
void main(){
OFF(TX);
Delay_ms(20); // Esperamos a que se estabilize la corriente.
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_comparator(NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_tris_a(0b00001000); // PIN_A3 seteado como entrada y las demas patitas seteadas como salidas.
// GPIO --543210
while(1){ // Nos quedamos dando vueltas sin hacer nada, a la espera de una interrupción.
delay_us(100);
}
}
Lo estoy emulando en el proteus, pero no me funciona, puesto que la variable _Bits del maestro nunca reciben los datos.. Me podrían dar una mano para encontrar el problema?