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

Temas similares

06/02/2016 #41


D@rkbytes

Gracias por responder , te adjunto un archivo con la incorporación de los ejemplos que me mandaste, me sirvió pero igual tengo problema por que no se muestra los números en los Display de 7 segmentos

te mande toda la información disponible, para ver si me puedes ayudar a corregir los errores

nota: también están las instrucciones de los programas

saludos
Muchas Gracias
06/02/2016 #42


Pude mejorar bastante el programa, sólo me falta sacar la lectura de un bucle.
El programa está leyendo sólo una vez, no se va actualizando.
¿Cuál puede ser el error?
Código PHP:
while (true)
   {
    
      if(
flag_rx)                // Si hay datos en el buffer...
      
{
       
flag_rx 0;            // Se limpia la variable. (Bandera de recepción)
       
Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
       
Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);   
       
//printf("%d%d&%d%d\r",Num_1,Num_2,Num_3,Num_4);
       
while(true)
       {
       
output_b(0x12);
       
output_a(Numeros[Num_1]);
       
delay_ms(tiempo);
       
output_b(0x22);
       
output_a(Numeros[Num_2]);
       
delay_ms(tiempo);
       
output_b(0x42);
       
output_a(Numeros[Num_3]);
       
delay_ms(tiempo);
       
output_b(0x82);
       
output_a(Numeros[Num_4]);
       
delay_ms(tiempo);
      }
       }
   }

08/02/2016 #43
Moderador

Avatar de D@rkbytes

Es que así no saldrá del segundo bucle, y esa no es la idea.
Debes cerrar la sentencia IF y continuar, para que el código subsecuente se siga ejecutando dentro del bucle principal.
08/02/2016 #44


D@rkbytes
entonces quedaría así, como el código que te envié,

Código PHP:
while (true)
   {
    
      if(
flag_rx)                // Si hay datos en el buffer...
      
{
       
flag_rx 0;            // Se limpia la variable. (Bandera de recepción)
       
Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
       
Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);   
       
//printf("%d%d&%d%d\r",Num_1,Num_2,Num_3,Num_4);
       
while(true)
       }
       
output_b(0x12);
       
output_a(Numeros[Num_1]);
       
delay_ms(tiempo);
       
output_b(0x22);
       
output_a(Numeros[Num_2]);
       
delay_ms(tiempo);
       
output_b(0x42);
       
output_a(Numeros[Num_3]);
       
delay_ms(tiempo);
       
output_b(0x82);
       
output_a(Numeros[Num_4]);
       
delay_ms(tiempo);
           
       }
   }

ultimas consultas :

1- como puedo estructurar la interrupción RDA, para que se asegure de recibir la trama completa.


Código PHP:
  #INT_RDA
    
void RECEPCION_RS232(void)
     
    {
       
gets(trama_serial);                  // Se recibe la cadena de datos.
       
flag_rx 1;                  // Se indica recepción completa.
    

2- consulta como puedo hacer que un led sea intermitente mediante una interrupción
, el led que muestra que el micro esta con vida

disculpa, este es la corrección, le quite el while


Código PHP:
while (true
   { 
     
      if(
flag_rx)                // Si hay datos en el buffer... 
      

       
flag_rx 0;            // Se limpia la variable. (Bandera de recepción) 
       
Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48); 
       
Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);    
       
//printf("%d%d&%d%d\r",Num_1,Num_2,Num_3,Num_4); 
      
       

       
output_b(0x12); 
       
output_a(Numeros[Num_1]); 
       
delay_ms(tiempo); 
       
output_b(0x22); 
       
output_a(Numeros[Num_2]); 
       
delay_ms(tiempo); 
       
output_b(0x42); 
       
output_a(Numeros[Num_3]); 
       
delay_ms(tiempo); 
       
output_b(0x82); 
       
output_a(Numeros[Num_4]); 
       
delay_ms(tiempo); 
            
       } 
   } 

08/02/2016 #45


2- consulta como puedo hacer que un led sea intermitente mediante una interrupción
, el led que muestra que el micro esta con vida

Código PHP:
  #INT_RDA
    
void RECEPCION_RS232(void)
     
    {
       
gets(trama_serial);                  // Se recibe la cadena de datos.
       
flag_rx 1;                  // Se indica recepción completa.
    

puedes declarar un pin como salida ponerlo en estado bajo, y con output_toggle(pinx);
cambias su estado.

Código PHP:
  #INT_RDA
    
void RECEPCION_RS232(void)
     
    {
       
gets(trama_serial);                  // Se recibe la cadena de datos.
       
flag_rx 1;                  // Se indica recepción completa.
       
output_toggle(led);        //cada que entra en la interrupcion cambia de estado el led si es 1 a 0 e inverso

    

08/02/2016 #46


gracias por responder

---------- Actualizado después de 4 minutos ----------

Amigo

creo que me exprese mal, pero lo que quiero lograr que la interrupción se asegure que lleguen los 5 datos de la trama,,por ahora esta configuración es básica...como se podría hacer eso


Código PHP:
 #INT_RDA
    
void RECEPCION_RS232(void)
     
    {
       
gets(trama_serial);                  // Se recibe la cadena de datos.
       
flag_rx 1;                  // Se indica recepción completa.
    


y con respecto al led intermitente que se enciende ya paga a un ritmo distinto del programa principal...eso quiero lograr hacer...por que si lo coloco dentro de la interrupcion RDA, SEGUIRA al tiempo de la lectura de datos.......
08/02/2016 #47


ciberick dijo: Ver Mensaje
gracias por responder

---------- Actualizado después de 4 minutos ----------

Amigo

creo que me exprese mal, pero lo que quiero lograr que la interrupción se asegure que lleguen los 5 datos de la trama,,por ahora esta configuración es básica...como se podría hacer eso


Código PHP:
 #INT_RDA
    
void RECEPCION_RS232(void)
     
    {
       
gets(trama_serial);                  // Se recibe la cadena de datos.
       
flag_rx 1;                  // Se indica recepción completa.
    


y con respecto al led intermitente que se enciende ya paga a un ritmo distinto del programa principal...eso quiero lograr hacer...por que si lo coloco dentro de la interrupcion RDA, SEGUIRA al tiempo de la lectura de datos.......
no tengo mucha chance ahorita pero deberia ser algo asi, le hice cambios por que no me funciono la interrupcion.

Código:
#include <16f628a.h>
#fuses NOMCLR
#fuses INTRC_IO
#FUSES NOWDT                    //No Watch Dog Timer
//#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
//#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay (clock=4000000)
#use rs232(baud=9600,xmit=PIN_B2,rcv=PIN_B1,errors)
#define DISPLAY_1     PIN_B4
#define DISPLAY_2     PIN_B5
#define LED_SERIAL    PIN_B6
#use fast_io(a)
#use fast_io(b)
// NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
int8 datos[4];                   // Arreglo para recibir los datos.
int1 flag_rx = 0;                // Variable bandera de recepción.
int i;


// Servicio de interrupción por recepción de datos RS-232
#INT_RDA
void int_ISR(void)

{
   datos[i]=getc();
   if(i>=5){
   flag_rx=1;
   i=0;
   }
   i++;
}
   
void main (void)
{
   
   int8 unidades,decenas;
   int tiempo = 10;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   set_tris_a(0x00);
   set_tris_b(0b00000110);
  
   
   while (true)
   {
      if(flag_rx==1)                // Si hay datos en el buffer...
      {
         flag_rx = 0;            // Se limpia la variable. (Bandera de recepción)
         
         unidades = (datos[0],datos[1] % 10);         // Se extraen las unidades.
         decenas  = (datos[3],datos[4] % 100)/10;     // Se extraen las decenas.
         printf("%c%c%C%c%c\r",datos[0],datos[1],datos[2],datos[3],datos[4]);
      }
         output_low(Display_2);
         output_high(Display_1);
         output_a(Numeros[unidades]);        
         delay_ms(tiempo);  
         output_low(Display_1);
         output_high(Display_2);                             
         output_a(Numeros[decenas]);          
         delay_ms(tiempo);  
   }
}
08/02/2016 #48


gracias , lo probare, una consulta sabes si puede hacer esta coneccion:
PC - MAX232 - MAX 485 - MAX 485 - MAX 232 - PIC
08/02/2016 #49


ciberick dijo: Ver Mensaje
gracias , lo probare, una consulta sabes si puede hacer esta coneccion:
PC - MAX232 - MAX 485 - MAX 485 - MAX 232 - PIC
no se si tengas el circuito funcionando armado?, aqui hice cambios a tu codigo, en una oportunidad que tuve, lo que no pude fue simularlo, pero al parecer funciona, creo que estoy multiplexando mal o mi pc es muy lenta, si desactivas las display_1 osea pruebas 7seg separados funciona pero todos a la vez mi pc no lo simula bien. checalo.

PD; el tipo de conexion no sabria asegurarte, pero yo supongo que si deberia funcionar.
saludos!
Archivos Adjuntos
Tipo de Archivo: rar AVANCE CONTADOR DUPLEX + DETALLE.rar (207,4 KB (Kilobytes), 11 visitas)
08/02/2016 #50
Moderador

Avatar de D@rkbytes

ciberick dijo: Ver Mensaje
Últimas consultas:
1- ¿Cómo puedo estructurar la interrupción RDA, para que se asegure de recibir la trama completa?
Utilizando una verificación del checksum de los datos. (Sumar los bytes y hacer un And con 0xFF)
Pero por experiencia te garantizo que la recepción de datos usando "gets()" es buena y completa.
Tiene el problema de que si recibe el número 13, lo toma como fin de la cadena.
Para evitar ese inconveniente se pueden enviar los datos numéricos como ASCII.
ciberick dijo: Ver Mensaje
2- ¿Cómo puedo hacer que un led sea intermitente mediante una interrupción?
Por medio de la interrupción por desborde del Timer 1.
Por ser de 16 bits, puedes obtener más tiempo para que ocurra el desborde.

Sobre tu programa, aún sigue mal.
Te adjunto un ejemplo completo incluyendo la activación del LED por medio del Timer 1.

Suerte.
Archivos Adjuntos
Tipo de Archivo: rar Contador Duplex RS-232.rar (117,9 KB (Kilobytes), 12 visitas)
13/02/2016 #51


Hola, chicos, estoy haciendo una comunicación entre PIC16F628A y SIM900A(ya la he flasheado, asi que ya esta funcionando).
Pero en cuanto me pongo con la interrupción #INT_RDA, parece que no se entra en la interrupción. Y el código que he hecho es muy simple, para ver si funciona.
Código:
#include <16f628a.h>
#include <string.h>

#fuses NOWDT   

#fuses NOPROTECT,NOPUT,XT
#fuses MCLR,NOBROWNOUT
#fuses INTRC_IO             // Internal RC Osc, no CLKOUT

#use delay(INTERNAL=4000000)     
#use RS232(BAUD=9600,BITS=8,PARITY=N, XMIT=PIN_B2,RCV=PIN_B1,STOP=1)   


#byte TRISB=0x86 //indicar si es entrada o salida
#byte PORTB=0x06  //indica si esta en nivel alto o bajo 

char movil;
char sms_in;


#INT_RDA      //esta interrupcion despertara el PIC y hara una busqueda de ubicacion y enviar la ubicacion por SMS al numero de movil correspondiente
void RDA_isr(void)
{
   
    movil=getc();
     
    
}

void main(){  

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2 );//usamos un reloj interno, division 2
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
  

TRISB=0b0010011;
PORTB=0x00;

enable_interrupts(INT_RDA); 
enable_interrupts(GLOBAL);


while(true){
   
    strcpy(sms_in,"A");
   if((strcmp(movil,sms_in))=0) //strcmp(s1,s2)==0 significa que s1 es igual que s2
    { printf("ATD0034618354363;\r\n");}  
  }
}
El objetivo es cuando recibe el mensaje "A", que me hace una llamada, pero veo que no funciona.
Y también estaba pensando que, en AT commands, si le envio una "A", la respuesta es el siguiente
Código:
+CMT: "+34618354363","","16/02/13,16:02:28+04"
A
Entonces digamOs los caracteres que recibe no es tan simplemente una A, alguna forma para leer solo la parte del mensaje? Y lo más importante es lo de INT_RDA, que no entiendo muy bien.

Gracias por cualquier sugerencia!
13/02/2016 #52


Hola amigo tengo una pregunta, ya que tengo dos pic comunicado por rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8) me gustaría saber si yo puedo reiniciar el pic 2 por medio de una instrucción enviada del pic1. Y como aria esto de poderse hacer.
gracias de ante manos por su tiempo dedicado.
13/02/2016 #53
Moderador

Avatar de D@rkbytes

nelsonr dijo: Ver Mensaje
Me gustaría saber si yo puedo reiniciar el pic 2 por medio de una instrucción enviada del pic1.
Y cómo haría esto, de poderse hacer.
Con la instrucción: reset_cpu();
17/02/2016 #54


Hola D@rkbytes con un poco de vergüenza te hago esta pregunta: como yo aplicaría esta instrucción reset_cpu();.
Para que el pic 1 haga llegar al pic 2 la información de reset, Ej.: creo una función en el pic 2 que contenga esta instrucción de reset y por medio de un parámetro enviado por putc() del pic 1 lo ejecuto ?.
Como se ordenaría este envió entre pic ?.
17/02/2016 #55
Moderador

Avatar de D@rkbytes

Es sencillo. Como cualquier comunicación entre microcontroladores.

El maestro envía un comando bajo cierto protocolo o hasta con una simple letra o número que el esclavo interpretará como una orden.

La selección de comandos depende del tipo de envío, cuando son comandos sencillos se pueden identificar y separar con "switch"

En realidad lo que pretendes es muy sencillo y no tiene la menor complicación.
18/02/2016 #56


Ok creo haber comprendido voy a probar, y te cuento como me fue.
26/02/2016 #57


Listo me funciono bien el dato. Solo me queda una duda porque mi proyecto que es un panel de botones que dar permiso para entrar o no por una puerta, dependiendo de la clave que insertes. Tiene el problema de que funciona bien 3 o 4 días 24 horas y de repente tiene comportamiento errados y debo reiniciarlo, luego funciona nuevamente bien 3,4 y hasta 5 días y se repite este caso nuevamente.
Por donde debería comenzar a revisar ?.
26/02/2016 #58
Moderador

Avatar de D@rkbytes

Tanto el programa del microcontrolador, como el diseño de la tarjeta, tienen mucho que ver.
Un microcontrolador con un programa bien estructurado, montado en una tarjeta bien diseñada, puede estar trabajando continuamente por muchos años.

El programa puede tomar caminos erráticos cuando la estructura no está bien definida.
Y un mal diseño de la tarjeta, puede afectar el comportamiento del microcontrolador.
Respuesta
¿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.