Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
18/03/2015 #1


PIC12F675 y módulo de R.F, no recibe datos
Hola amigos, estoy tratando de hacer un circuito que controle la bomba de agua de mi tanque y quiero hacerlo por radiocontrol con un modulo rf FS1000A (TX) y un MY-MK-5V (RX) y dos pics 12f675, mi problema es que no logro hacer que funcionen entre si, alguien me dice si mi codigo está mal? Según mi entender y basandome en ejemplos de la web y el manual de PIC CCS debería funcionar, pero no! Ya probe conectando directamente pin a pin pero tampoco lo logro hacer...

Estos son mis códigos...

TX:
Código:
#include <12F675.h>
#fuses INTRC_IO
#fuses NOWDT
#fuses NOPUT
#fuses NOPROTECT
#fuses NOCPD
#fuses NOMCLR
#rom 0x03FF = {0x342C}
#use delay(clock=4000000)
#use rs232(baud=1200, xmit=PIN_A2, parity=N, bits=8)

void main()
{
   byte s=0;
   
   while (true)
   {
      s=0x00;
      putc(s);
      delay_ms(100);
   }
}
RX
Código:
#include <12F675.h>
#fuses INTRC_IO
#fuses NOWDT
#fuses NOPUT
#fuses NOPROTECT
#fuses NOCPD
#fuses NOMCLR
#rom 0x03FF = {0x344C}
#use delay(clock=4000000)
#use rs232(baud=1200, rcv=PIN_A2, parity=N, bits=8)

void main()
{
   byte c;
   output_low(PIN_A5);
   
   while (true)
   {
      c = getc();
      if (c)
      {
         output_high(PIN_A5);
      }  
      else
      {
         output_low(PIN_A5);
      }
   }
}
Espero alguien me pueda ayudar y orientar, es la primera vez que trato de hacer un desarrollo asi...

Saludos, AlanB!
18/03/2015 #2

Avatar de papirrin

reviza/define los registros CMCON de ambos pic
18/03/2015 #3
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
Revisa/define los registros CMCON de ambos PICs
No, por eso no están fallando sus programas.
Por tratarse de un PIC12F675 el registro involucrado para Digital/IO es el registro ANSEL.
Y tanto el registro CMCON como el registro ANSEL son configurados automáticamente por el PIC C Compiler para que el PIC funcione en modo digital si no se configuran las opciones del ADC.
AlanB dijo: Ver Mensaje
Estoy tratando de hacer un circuito que controle la bomba de agua de mi tanque y quiero hacerlo por radiocontrol con un modulo rf FS1000A (TX) y un MY-MK-5V (RX) y dos PICs 12F675.
Mi problema es que no logro hacer que funcionen entre si.
¿Alguien me dice si mi codigo está mal? Según mi entender y basándome en ejemplos de la web y el manual de PIC CCS debería funcionar, pero no!
Ya probé conectando directamente pin a pin pero tampoco lo logro hacer.
Por tratarse de RS-232 por software, debes usar KBHIT() para determinar cuando se reciben datos.

Mira ahora cual es tu problema:
En el programa del receptor estás realizando una mala comparación.
Si escribes...
if(c)
{
// Código

}
else
{
// Código
}

Se está esperando que c tenga cualquier valor que no sea 0.
Entonces si en el programa transmisor mandas un 0, jamás se cumplirá la primer parte de la sentencia.

Tampoco es necesario que uses #rom 0x03FF = {Valor de OSCCAL}
Esto ya lo hace también el PIC C Compiler por defecto, pero estableciendo el valor que tiene el PIC.
El hacer eso limita el código a un solo PIC y no servirá para otros.
Lo mejor es que apuntes el valor de calibración de fábrica del oscilador.
Lo puedes hacer pintando la parte de arriba de cada pin con el valor binario de los 8 bits de OSCCAL.

Así es como debe funcionar el programa del receptor:
Código PHP:
#include <12F675.h>
#fuses   NOMCLR
#use     delay(internal = 4MHz)
#use     rs232(baud=1200, rcv=PIN_A2)

void main()
{
   
byte c;
   
output_low(PIN_A5);
   
   while (
true)
   {
      if(
kbhit())
      {
         
getc();
         if (
== 0)
         {
            
output_high(PIN_A5);
         }  
         else
         {
            
output_low(PIN_A5);
         }
      }
   }

Si requieres comparar varios datos, puedes hacer uso de una selección con Switch()
19/03/2015 #4


Hola, amigo. Antes que nada, gracias por la respuesta.
Te comento que de esa forma ya la probé y tampoco obtengo resultados.
Lo que si no modifiqué fueron los fuses como en tu código de ejemplo. ¿La configuración de los míos está mal?
Porque veo que sólo declaras en tu ejemplo NOMCLR.

Lo de KBHIT() lo había probado sin resultados, pero leí que es necesario su uso si se hace un RS-232 por software, como me mencionas en tu ejemplo.
¿Dónde puede estar el error? Al encender el circuito y conectar directamente el pin rcv y el xmit de ambos PICs, mi LED ni siquiera enciende.
Ahora, si desconecto el cable que los une, éste empieza a parpadear sin frenos.
¿Dónde está mi error?

Saludos y gracias de nuevo!
AlanB!
19/03/2015 #5
Moderador

Avatar de D@rkbytes

Esa forma de configurar el PIC es simplificada y de esa manera el compilador usa la palabra de configuración adecuada para usar el oscilador interno.
En los PIC12 y 16 es una forma fácil de configurar los fuses y funciona correctamente.
Como MCLR es un fuse que por defecto se encuentra activo y se requiere desactivado, únicamente declaré ese fuse como inactivo.
Los fuses que el compilador agrega por defecto de esa forma, son los fuses necesarios para una correcta operación.

El programa debe funcionar pues es muy sencillo y funciona físicamente.

Para que salgas de dudas, adjunto los programa de ejemplo con el agregado de la selección con SWITCH().
Los programas funcionan correctamente y al momento de escribir este post están funcionando los dos PIC en un protoboard.

Si al probar los programas adjuntos continúas con problemas, seguramente alguno de los PICs perdió el valor de calibración de fábrica para OSCCAL o no tiene el valor original.

Por la conexión no creo que tengas problemas porque es muy sencilla, así como se muestra en la foto adjunta.

Notas:
Los programas fueron probados con PIC12F675 y PIC12F629.
También se incluye la simulación funcionando y el esquema.

Suerte.
Imágenes Adjuntas
Tipo de Archivo: jpg Esquema Tx y Rx PIC12F675 RS-232.jpg (48,9 KB (Kilobytes), 46 visitas)
Archivos Adjuntos
Tipo de Archivo: rar 12F675 RS-232 Tx y Rx.rar (21,9 KB (Kilobytes), 94 visitas)
19/03/2015 #6


Amigo D@rkbytes, sos un genio.

Configuré los fuses a tu manera y además corregí un par de cosas mirando tu código como ejemplo, y funcionó. Gracias!
Mis errores creo que eran en principio que tenía mal iniciado mi RS-232 y además que pasaba mal los datos con los PUTC y PUTS.
Al final mi código quedo así y funcionando, gracias a la gran mano que me diste.

Dejo mis códigos por si a alguien también le sirve o le pasa algo parecido.

TX
Código PHP:
#include <12F675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, xmit=PIN_A2)

void main()
{
   
putc(0x00);
   
   while (
true)
   {
      
puts("s");
      
delay_ms(1000);
   }

RX
Código PHP:
#include <12F675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, rcv=PIN_A2)

void main()
{
   
byte c;
   
output_low(PIN_A5);
   
   while (
true)
   {
      if (
kbhit())
      {
         
getc();
         if (
== "s")
         {
            
output_high(PIN_A5);
         }  
         else
         {
            
output_low(PIN_A5);
         }
      }
   }

Otra consulta. ¿Siempre se inicializa así (putc=0x00) el rs232? Una nueva duda a tener en cuenta para futuros proyectos mediante el RS-232

Saludos y gracias, GENIO!
19/03/2015 #7
Moderador

Avatar de D@rkbytes

AlanB dijo: Ver Mensaje
Otra consulta. ¿Siempre se inicializa así (putc=0x00) el rs232? Una nueva duda a tener en cuenta para futuros proyectos mediante el RS-232
Si. Es conveniente inicializar el bus RS-232 enviando un 0 antes del envío de información, porque cuando se realiza el primer envío suele ser erróneo.
Con esto el bus ya queda preparado para "enviar información sin errores".
Y lo digo entre comillas, porque algunas veces puede ser que el dato enviado no sea correcto.

Los datos posteriores al primer envío ya suelen ser correctos, pero el primero casi siempre falla si no se inicializa el bus.
20/03/2015 #8


Hola amigo de nuevo! Antes que nada, como siempre, gracias por tu ayuda e información me sirve mucho de prendizaje

Queria comentarte que tengo de nuevo el mismo problema, no recibe datos RX... Modifique un poco TX...

TX
Código PHP:
#include <12F675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, xmit=PIN_A2)

void main(void)
{
   
putc(0x00);
   
int contador 0;
   
   while (
input(PIN_A3)) 
   {
      
contador++;
      
delay_ms(1000);
   }
   
   if (
contador 5)
   {
      
output_high(PIN_A5);
      
puts("s");
      
delay_ms(100);
      
output_low(PIN_A5);
   }

RX
Código PHP:
#include <12F675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, rcv=PIN_A2)

void main()
{
   
byte c;
   
output_low(PIN_A5);
   
   while (
true)
   {
      if (
kbhit())
      {
         
getc();
         if (
== "s")
         {
            
output_toggle(PIN_A5);
         }  
      }
   }

Lo que hice fue agregar una función para el botón que va a comandar el encendido y apagado de mi bomba de agua, esta además tiene high/low de un led piloto que indica cuando se envia/termina el dato... En cuanto al "while" creo que no hace falta que te lo explique como funciona ya que la tenés mas que clara pero de todas formas lo digo porque a lo mejor estoy equivicado, el bucle lo que hace es incrementar "contador" mientras se presiona el botón y el "if" se encarga de enviar o no el dato de acuerdo al valor incrementado... A simple vista debería funcionar ya que sin la función del botón lo hace, cual es mi error en la función creada?

Saludos y gracias!
AlanB!
21/03/2015 #9
Moderador

Avatar de D@rkbytes

Al programa del transmisor le falta lo siguiente:
  1. Debes envolver dentro de un bucle infinito las instrucciones.
  2. Envolver dentro del mismo bucle la sentencia IF del contador.
  3. Regresar a 0 el contador para que no se siga incrementando.
Sobre el caso No. 1:
Si no usas un bucle para ingresar las instrucciones el programa será ejecutado una sola vez y se detendrá.

Caso No. 2:
Si realizas un bucle para el conteo mientras se encuentre presionado el pulsador, éste se seguirá incrementando hasta que se desborde.
Esto ocasionará que la sentencia siempre se cumpla cuando la variable contador sea superior a 5.

Caso No. 3:
Se debe regresar la variable contador a 0 una vez que se cumpla el valor requerido, para que cuando ocurra una nueva pulsación se inicie siempre el conteo desde 0.


De esta forma es como debe funcionar el programa del transmisor añadiendo lo que te mencioné:
Código PHP:
void main (void)
{
   
int8 contador 0;
   
   
output_low(PIN_A5);              // Estado inicial de GP5
   
   
putc(0x00);                      // Inicializar el bus.
   
delay_ms(100);                   // Esperar 100 ms para una mejor estabilización.
   
   
while (true)
   {
   
      while (
input(PIN_A3))         // Mientras GP3 = 1...
      
{
         
contador++;                // Incrementar contador.
         
delay_ms(1000);            // Retardo de 1 segundo.
   
         
if (contador 5)          // Si contador es mayor a 5...
         
{  
            
contador 0;           // Regresar contador a 0
            
output_high(PIN_A5);    // GP5 = 1
            
puts("s");              // Se envía el dato.
            
delay_ms(100);          // Retardo de 100 ms.
            
output_low(PIN_A5);     // GP5 = 0
         
}
      }
      
// Mantener contador en 0 en caso de no completar el conteo.
      
contador 0;
   }

Otra mejora que puedes agregar, es que el receptor envíe un indicador del estado del pin de control.
De esa forma se puede saber cuando el dispositivo a controlar está encendido o apagado.

Te menciono esto porque estás usando una instrucción de cambio de estado en el receptor (Output_Toggle) y se usa un único dato para realizar el cambio.
24/03/2015 #10


D@rkbytes como va!

No entendí mucho el tema de un indicador de estado... De todas formas estoy tratando de agregar una función más al proyecto que trata de lo siguiente...

#F1. Activar/desactivar la bomba, presionando el botón (TX) entre 5 y 10 segs, esto lo modifique con lo siguiente:

TX
Código PHP:
if (contador && contador <= 10//MODIFICADO
{
 
contador 0;          
 
output_high(PIN_A5);
 
puts("s");              
 
delay_ms(100);       
 
output_low(PIN_A5);

#F2. Probar conectividad entre TX y RX (función que quiero agregar)...

TX
Código PHP:
if (contador 10//AGREGADO
{
 
contador 0;          
 
output_high(PIN_A5);
 
puts("prueba_conexion");              
 
delay_ms(100);       
 
output_low(PIN_A5);

RX
Código PHP:
if (== "prueba_conexion"//AGREGADO
{
 
int i;

 for (
i=0i<10i++)
 {
  
output_high(PIN_A5);
  
delay_ms(100);
  
output_low(PIN_A5);
  
delay_ms(100);
  
output_high(PIN_A5);
  
delay_ms(100);
  
output_low(PIN_A5);
  
delay_ms(100);
 }

De esta forma la idea es que al presionar o no se active la bomba de agua, pero si lo presiono mas de 10segs el led solo encienda/apague por diez veces pero sin exito y a simple vista deberia funcionar... Cual es mi error en este caso? Se puede meter un for dentro de un if?

Saludos y gracias
AlanB!
24/03/2015 #11
Moderador

Avatar de D@rkbytes

Lo del indicador de estado no es complicado. Se trata de que el receptor envíe al transmisor el estado del pin de control.
El transmisor debe estar monitoreando los datos que llegan del receptor y activar o desactivar un LED para indicar en que estado se encuentra el pin de control.

Sobre las condiciones:
Si declaras if (contador > 5), entonces la sentencia se cumple cuando contador sea 6 porque ya es superior a 5.
Y si requieres 5 segundos con un retardo de 100 ms, entonces el conteo tienen que ser superior a 49.
Así el contador llegará a 50 y serán 5000 ms. 50 x 100 = 5000

Ahora sobre esta sentencia: if (contador > 5 && contador <= 100)
Lo primero que se cumplirá será cuando contador llegue a 6 y la segunda parte no se cumplirá.
Esto es porque cuando contador supere 5 ya se está cumpliendo la sentencia.
La segunda parte sólo se cumpliría si el valor de la variable "contador" viniera de otra rutina y no precedente de un incremento consecutivo.
Es decir, si la variable contador se va incrementando desde 0 y a continuación se le compara, lógicamente al llegar a 6, en la sentencia IF se dará por cumplida la sentencia.

Y sí, si se pueden incluir bucles FOR dentro de sentencias IF y viceversa.
24/03/2015 #12


Hola amigo de nuevo, quería comentarte que logré el funcionamiento correcto (aunque solo entre pics conectando pin a pin, ya que creo que ahora el error está en los modulos), me sirvio de mucho tu ayuda, gracias por brindarme tus conocimientos Utilizando en RX la sentencia SWITCH me funcionó a la perfección, aun no logro entender porque no lo hizo con los IF... De todas formas dejo los códigos por si a alguien le sirve de ayuda, ambos están un poco modificados...

TX
Código PHP:
#include <12F675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, xmit=PIN_A2)

void menu()
{
   
int contador 0;  
   
   while (
input(PIN_A3))
   {
      
contador++;
      
delay_ms(50);
   }  
    
   if (
contador >= && contador <= 10)
   {
      
contador 0//Reseteo contador a 0
      
output_high(PIN_A5);
      
puts("e");
      
delay_ms(100);
      
output_low(PIN_A5);
   }  
   
   if (
contador 10)
   {
      
contador 0//Reseteo contador a 0
      
output_high(PIN_A5);
      
puts("p");
      
delay_ms(100);
      
output_low(PIN_A5);
   }   
}

void main (void)
{
   
output_low(PIN_A5);
   
   while (
true)
   {
      
putc(0x00);
      
delay_ms(100); 
      
menu();
   }

RX
Código PHP:
#include <12F675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, rcv=PIN_A2)

void main()
{
   
byte c;
   
output_low(PIN_A5);
   
int i 0;
   
   while (
true)
   {
      if (
kbhit())
      {
         
getc();      
         switch (
c)
         {
            case 
'e':
            
output_toggle(PIN_A5);
            break;
            case 
'p':
            for (
i=0i<10i++)
            {
               
output_high(PIN_A5);
               
delay_ms(100);
               
output_low(PIN_A5);
               
delay_ms(100);
            }           
         }         
      }
   }

Consulta y esto si no lo logré entender... Porque cuando coloco en "case 'encender':" me genera un error de compilación y no así cuando coloco 'e' por ejemplo?

Saludos y como siempre gracias
AlanB!
24/03/2015 #13
Moderador

Avatar de D@rkbytes

AlanB dijo: Ver Mensaje
¿Por qué cuando coloco en "case 'encender':" me genera un error de compilación y no así cuando coloco 'e', por ejemplo?
Porque no se pueden usar cadenas. Solo puedes usar valores numéricos o una sola letra.

Para comparar cadenas tienes que hacer uso de éstas instrucciones:
GETS para recibir la cadena.
STRCPY para copiar la cadena a un arreglo. (Array)
STRCMP para realizar la comparación.

Mira este ejemplo para que lo comprendas mejor: Recibir y comparar cadenas

Saludos.
25/03/2015 #14


D@rkbytes como va!

No logro implementar el ejemplo mencionado en el link que me posteaste, me mencionaste que para trabajar con el RS232 por soft era necesario hacer una llamada a KBHIT(), siguiendo esto trate de codear lo siguiente sin resultados... Es más o menos como tendria que hacerlo? En TX modifique los PUTS por PRINTF... Tambien agregue las librerias stdio.h y string.h...

RX
Código PHP:
#include <12F675.h>
#include <stdio.h>
#include <string.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, rcv=PIN_A2)

void main()
{      
   
char rcv_datos[8];
   
char cmp_dato1[8];
   
char cmp_dato2[8];
   
int i 0;
   
   
output_low(PIN_A5);
   
strcpy(cmp_dato1"encender");
   
strcpy(cmp_dato2"testcon");
   
   while (
true)
   {
      if (
kbhit())
      {                  
         
gets(rcv_datos);
         
         if (!
strcmp(rcv_datoscmp_dato1))
         {
            
output_toggle(PIN_A5);            
         }
         
         if (!
strcmp(rcv_datoscmp_dato2))
         {
            for (
i=0i<10i++)
            {
               
output_high(PIN_A5);
               
delay_ms(100);
               
output_low(PIN_A5);
               
delay_ms(100);
            }        
         }
      }
   }

Con esto entiendo lo siguiente, si KBHIT() detecta algun dato enviado, GETS lo guarda en la variable "rcv_datos" y bueno despues hago la comparación con la sentencia mencionada, pero sin resultados!

Saludos y gracias
AlanB!
25/03/2015 #15
Moderador

Avatar de D@rkbytes

Espero que en el transmisor no estés omitiendo el envío del ASCII número 13 (Retorno de carro o CR)
Esto se hace escribiendo "\r" al final de la cadena a enviar.
Si no lo haces, la instrucción GETS permanecerá en un bucle esperando esa condición.

Como ya estás usando GETS (); ya puedes eliminar el IF (KBHIT () )
Y algo importante. Debes tener en cuenta el tamaño de la cadena.
Si la cadena "encender" tiene 8 caracteres, (8 bytes) el buffer siempre debe ser mayor.
O sea que debes aumentar a 9 el tamaño de los buffers, al menos el que recibirá 8 letras u 8 bytes.

PD:
Como el PIC12F675 no tiene módulo USART, puedes usar la interrupción externa por GP2 para la recepción de datos.
26/03/2015 #16


D@rkbytes!

Te comento como lo tengo en mis códigos por partes, como dijo jack!

1.- Desde TX hago el envío del string con printf("encender\r");
2.- En RX elimine KBHIT(); y tomando como ejemplo tu código, modifique lo siguiente... Te pego el mismo para que se entienda mejor...

RX
Código PHP:
#include <12F675.h>
#include <stdio.h>
#include <string.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use rs232(baud=1200, rcv=PIN_A2)

char rcv_datos[10]; // Modificado tomando tu ejemplo, ademas agregue bytes a 10.
#INT_EXT  
void INT_EXTERNA()  
{
    
gets(rcv_datos);
}

void main()
{      
   
char cmp_dato1[10]; // bytes a 10.
   
char cmp_dato2[10]; // bytes a 10.
   
int i 0;
   
   
output_low(PIN_A5);
   
strcpy(cmp_dato1"encender");
   
strcpy(cmp_dato2"testcon");
   
   
enable_interrupts(INT_EXT); //agregado
   
enable_interrupts(GLOBAL); //agregado

   
while (true)
   {
        
         if (!
strcmp(rcv_datoscmp_dato1))
         {
            
output_toggle(PIN_A5);            
         }
         
         if (!
strcmp(rcv_datoscmp_dato2))
         {
            for (
i=0i<10i++)
            {
               
output_high(PIN_A5);
               
delay_ms(100);
               
output_low(PIN_A5);
               
delay_ms(100);
            }        
         }
   }

Básicamente es igual al tuyo reemplazando el INT utilizado en tu code con INT_EXT, según ejemplos de uso de esta instrucción debería de funcionar pero aún nada, y se me generó la duda aquí, puede que el error esté en que estoy usando el mismo pin de la interrupción para recibir los datos por el RS232 por soft?

Saludos y gracias!
AlanB!
26/03/2015 #17
Moderador

Avatar de D@rkbytes

Te faltó agregar que la interrupción se produzca por flanco descendente.
Agrega esto: INT_EXT_EDGE (H_TO_L);
AlanB dijo: Ver Mensaje
Se me generó la duda aquí: ¿Puede que el error esté en que estoy usando el mismo pin de la interrupción para recibir los datos por el RS-232 por software?
No. De hecho ese es el objetivo.
Cuando llega un dato el pin GP2 pasa de alto a bajo y entonces se produce la interrupción.
Ese cambio de estado se tomará como inicio de recepción y a continuación entra la función GETS() para recibir la información.

PD:
Seguramente cuando se ejecute la comparación que tiene el bucle "FOR()" se ejecute permanentemente, porque la cadena a comparar permanecerá sin cambios.
27/03/2015 #18


D@rkbytes!

Sigo sin tener exito con mi proyecto, agregue la linea "ext_int_edge(H_TO_L);" que es como figura en el archivo de configuracion PIC CCS 5 del 12F675... También probé agregando en vez de la mencionada "enable_interrupts(INT_EXT_H2L);" pero sin resultados exitosos... Probe con ambas lineas arriba, abajo, en el medio y nada aún... De momento quedó con la modificación que me dijiste de esta forma (sin exito)...

RX
Código PHP:
#include <12F675.h> 
#include <stdio.h> 
#include <string.h> 
#fuses NOMCLR 
#use delay(internal = 4MHz) 
#use rs232(baud=1200, rcv=PIN_A2) 

char rcv_datos[10]; // Modificado tomando tu ejemplo, ademas agregue bytes a 10. 
#INT_EXT   
void INT_EXTERNA()   

    
gets(rcv_datos); 


void main() 
{       
   
char cmp_dato1[10]; // bytes a 10. 
   
char cmp_dato2[10]; // bytes a 10. 
   
int i 0
    
   
output_low(PIN_A5); 
   
strcpy(cmp_dato1"encender"); 
   
strcpy(cmp_dato2"testcon"); 
  
   
ext_int_edge(H_TO_L); //agregado recientemente, sin exito!  
   
enable_interrupts(INT_EXT); //agregado 
   
enable_interrupts(GLOBAL); //agregado 

   
while (true
   { 
         
         if (!
strcmp(rcv_datoscmp_dato1)) 
         { 
            
output_toggle(PIN_A5);             
         } 
          
         if (!
strcmp(rcv_datoscmp_dato2)) 
         { 
            for (
i=0i<10i++) 
            { 
               
output_high(PIN_A5); 
               
delay_ms(100); 
               
output_low(PIN_A5); 
               
delay_ms(100); 
            }         
         } 
   } 

Que puede estar fallando en el código?

Saludos y gracias como siempre!
AlanB!
27/03/2015 #19
Moderador

Avatar de D@rkbytes

Por algún extraño motivo se genera un error cuando se usan 1200 Bps con la interrupción externa.

¿Es necesario que uses esa velocidad?
Porque con el oscilador interno a 4 MHz, puedes usar 2400 o 4800 Bps sin problemas.
Con 2400 Bps o más, ya no se genera ese problema.
28/03/2015 #20


D@rkbytes como va!

Te comento que modifique los baudios a 2400 como me dijiste y la comunicación funciona, al menos el led piloto de pruebas funciona... Pero tengo un nuevo problema, el led se apaga al pasar unos segundos y la segunda función directamente no funciona XD, esto empezó como un simple proyecto para practicar pero ya es un reto jajaja

Existe forma de utilizar "GETS();" sin la interrupción externa, o de pasar strings y utilizar la función "KBHIT();" como ya lo estaba haciendo en los primeros codes?

Según el manual de CCS también podría utilizar la función "bit_test(var, bit);" de 0:15 bits para pasar palabras (strings), como sería esto? Tenés algún ejemplo?

Saludos, AlanB!
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.