TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Gekido en 27 de Mayo de 2013, 12:10:48
-
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?
-
te falta añadir en el codigo del maestro
enable_interrupts(INT_EXT);
yo te recomendaria usar #use rs232 por software se utiliza igual como si tuvieras usart solo que en vez de #int_rda seria la recepcion en #int_ext pero esta bien la iniciativa, espero sea de ayuda, por cierto ya hay dispositivos de ese tamaño que tienen eusart como PIC12F1822 si lo pudieras comprar estaría bien.
Espero sea de ayuda
-
te falta añadir en el codigo del maestro
enable_interrupts(INT_EXT);
yo te recomendaría usar #use rs232 por software se utiliza igual como si tuvieras usart solo que en vez de #int_rda seria la recepción en #int_ext pero esta bien la iniciativa, espero sea de ayuda, por cierto ya hay dispositivos de ese tamaño que tienen eusart como PIC12F1822 si lo pudieras comprar estaría bien.
Espero sea de ayuda
Gracias por tu respuesta, gab163!!
En verdad no agregue esa linea, porque el Master aun no usa la interrupción externa, sino que funciona como una patita de entrada común, aunque mas adelante cuando logre hacer la comunicación bidireccional si se usara. Así que imagino que el problema debe ser otro...
Me intereso muchísimo eso de usar rs232 entre pics! Se puede usar sin necesidad de un MAX232?
Igual me gustaría lograr hacer funcionar este código como aprendizaje, y para otras personas que les pueda resultar útil un protocolo independiente.
-
si la comunicación por la uart seria sin max232 únicamente si es punto-punto y es una corta distancia si requieres mas de 2 dispositivos comunicados tienes que hacerlo por rs-485 y si ocuparias un max485 para poder hacer la comunicación esta si no mal recuerdo te permite tener una longitud de red de mas de 1000m teóricamente no recuerdo bien seria cuestión de checarlo
-
si la comunicación por la uart seria sin max232 únicamente si es punto-punto y es una corta distancia si requieres mas de 2 dispositivos comunicados tienes que hacerlo por rs-485 y si ocuparias un max485 para poder hacer la comunicación esta si no mal recuerdo te permite tener una longitud de red de mas de 1000m teóricamente no recuerdo bien seria cuestión de checarlo
Muchas gracias! Voy a intentarlo con ese método. Ahora que se que se puede usar comunicación rs232 sin necesidad del MAX232, entonces no tiene sentido seguir con mi desarrollo. Si tengo novedades las pongo aquí por si le es de ayuda a alguien mas.