Interrupción RS-232 en PIC C de CCS

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
 

Adjuntos

  • AVANCE CONTADOR DUPLEX + DETALLE.rar
    175 KB · Visitas: 11
Última edición:
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?
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);
      }
       }
   }
}
 
Última edición por un moderador:
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.
 
D@rkbytes
entonces quedaría así, como el código que te envié,

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.


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


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); 
            
       } 
   } 
}
 
2- consulta como puedo hacer que un led sea intermitente mediante una interrupción
, el led que muestra que el micro esta con vida

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.

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

    }
 
gracias por responder



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


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.......
 
Última edición:
gracias por responder



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


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);  
   }
}
 
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!
 

Adjuntos

  • AVANCE CONTADOR DUPLEX + DETALLE.rar
    207.4 KB · Visitas: 16
Ú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.
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. :rolleyes:
Te adjunto un ejemplo completo incluyendo la activación del LED por medio del Timer 1.

Suerte.
 

Adjuntos

  • Contador Duplex RS-232.rar
    117.9 KB · Visitas: 17
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!
 
Hola amigo tengo una pregunta, ya que tengo dos pic comunicado por rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=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.
 
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 ?.
 
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.
 
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 ?.
 
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.
 
Hola.
¿Alguien podría ayudarme?
Estoy haciendo un letrero led, pero deseo que cuando reciba un carácter por el Rx, cambie automáticamente el mensaje.
Este el programa que estoy utilizando:
1531924779010.png1531924779010.png
C:
#include <16F887.h>

 

#use delay(clock=20000000)         

#fuses NOWDT, hs, PUT, NOPROTECT

#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)

//#use standard_io(d)


char valor;

char valor1;

const char TEXT []={"..."};

const char TEXT1 []={"..."};


int i,j,k,d,n,m,s,DATA;

int1 z=0;

//------------------------------------------------------------------

const char FONT1[32][7] ={

   0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,   //        Space

   0xFB,0xFB,0xFB,0xFB,0xFB,0xFF,0xFB,   //        !

   0xF5,0xF5,0xF5,0xFF,0xFF,0xFF,0xFF,   //        "

   0xF5,0xF5,0xE0,0xF5,0xE0,0xF5,0xF5,   //        #

   0xFB,0xF0,0xEB,0xF1,0xFA,0xE1,0xFB,   //        $

   0xE3,0xEA,0xE5,0xFB,0xF4,0xEA,0xF8,   //        %

   0xF7,0xEB,0xEB,0xF7,0xEA,0xED,0xF2,   //        &

   0xF9,0xF9,0xFD,0xFB,0xFF,0xFF,0xFF,   //        '

   0xFD,0xFB,0xF7,0xF7,0xF7,0xFB,0xFD,   //        (

   0xF7,0xFB,0xFD,0xFD,0xFD,0xFB,0xF7,   //        )

   0xFB,0xEA,0xF1,0xFB,0xF1,0xEA,0xFB,   //        *

   0xFF,0xFB,0xFB,0xE0,0xFB,0xFB,0xFF,   //        +

   0xFF,0xFF,0xFF,0xF3,0xF3,0xFB,0xF7,   //        ,

   0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,   //        -

   0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xF3,   //        .

   0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xFF,   //        /

   0xF1,0xEE,0xEC,0xEA,0xE6,0xEE,0xF1,   //        0

   0xFB,0xF3,0xFB,0xFB,0xFB,0xFB,0xF1,   //        1

   0xF1,0xEE,0xFE,0xF1,0xEF,0xEF,0xE0,   //        2

   0xF1,0xEE,0xFE,0xF9,0xFE,0xEE,0xF1,   //        3

   0xFD,0xF9,0xF5,0xED,0xE0,0xFD,0xFD,   //        4

   0xE0,0xEF,0xE1,0xFE,0xFE,0xFE,0xE1,   //        5

   0xF9,0xF7,0xEF,0xE1,0xEE,0xEE,0xF1,   //        6

   0xE0,0xFE,0xFD,0xFB,0xF7,0xF7,0xF7,   //        7

   0xF1,0xEE,0xEE,0xF1,0xEE,0xEE,0xF1,   //        8

   0xF1,0xEE,0xEE,0xF0,0xFE,0xFD,0xF3,   //        9

   0xFF,0xF3,0xF3,0xFF,0xF3,0xF3,0xFF,   //        :

   0xF3,0xFB,0xF3,0xF3,0xFF,0xF3,0xF3,   //        ;       

   0xFD,0xFB,0xF7,0xEF,0xF7,0xFB,0xFD,   //        <

   0xFF,0xFF,0xF1,0xFF,0xF1,0xFF,0xFF,   //        =

   0xF7,0xFB,0xFD,0xFE,0xFD,0xFB,0xF7,   //        >

   0xF1,0xEE,0xFE,0xFD,0xFB,0xFF,0xFB};  //        ?


const char FONT2[32][7] ={

   0xF1,0xEE,0xFE,0xF2,0xEA,0xEA,0xF1,   //        @

   0xFB,0xF5,0xEE,0xEE,0xE0,0xEE,0xEE,   //        A

   0xE1,0xF6,0xF6,0xF1,0xF6,0xF6,0xE1,   //        B

   0xF1,0xEE,0xEF,0xEF,0xEF,0xEE,0xF1,   //        C

   0xE1,0xF6,0xF6,0xF6,0xF6,0xF6,0xE1,   //        D

   0xE0,0xEF,0xEF,0xE3,0xEF,0xEF,0xE0,   //        E

   0xE0,0xEF,0xEF,0xE3,0xEF,0xEF,0xEF,   //        F

   0xF1,0xEE,0xEF,0xE8,0xEE,0xEE,0xF1,   //        G

   0xEE,0xEE,0xEE,0xE0,0xEE,0xEE,0xEE,   //        H

   0xF1,0xFB,0xFB,0xFB,0xFB,0xFB,0xF1,   //        I

   0xF8,0xFD,0xFD,0xFD,0xFD,0xFD,0xF3,   //        J

   0xEE,0xED,0xEB,0xE7,0xEB,0xED,0xEE,   //        K

   0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,   //        L

   0xEE,0xE4,0xEA,0xEA,0xEE,0xEE,0xEE,   //        M

   0xEE,0xE6,0xEA,0xEC,0xEE,0xEE,0xEE,   //        N

   0xF1,0xEE,0xEE,0xEE,0xEE,0xEE,0xF1,   //        O

   0xE1,0xEE,0xEE,0xE1,0xEF,0xEF,0xEF,   //        P

   0xF1,0xEE,0xEE,0xEE,0xEA,0xED,0xF2,   //        Q

   0xE1,0xEE,0xEE,0xE1,0xEB,0xED,0xEE,   //        R

   0xF1,0xEE,0xEF,0xF1,0xFE,0xEE,0xF1,   //        S

   0xE0,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,   //        T

   0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xF1,   //        U

   0xEE,0xEE,0xEE,0xF5,0xF5,0xFB,0xFB,   //        V

   0xEE,0xEE,0xEE,0xEA,0xEA,0xE4,0xEE,   //        W

   0xEE,0xEE,0xF5,0xFB,0xF5,0xEE,0xEE,   //        X

   0xEE,0xEE,0xF5,0xFB,0xFB,0xFB,0xFB,   //        Y

   0xE0,0xFE,0xFD,0xFB,0xF7,0xEF,0xE0,   //        Z

   0xF1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF1,   //        [

   0xFF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,   //        \

   0xF1,0xFD,0xFD,0xFD,0xFD,0xFD,0xF1,   //        [

   0xFB,0xF5,0xEE,0xFF,0xFF,0xFF,0xFF,   //        ^

   0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0};  //        _


const char FONT3[32][7] ={

   0xF3,0xF3,0xF7,0xFB,0xFF,0xFF,0xFF,   //        `

   0xFF,0xFF,0xF1,0xFE,0xF0,0xEE,0xF1,   //        a

   0xEF,0xEF,0xE9,0xE6,0xEE,0xE6,0xE9,   //        b

   0xFF,0xFF,0xF8,0xF7,0xF7,0xF7,0xF8,   //        c

   0xFE,0xFE,0xF2,0xEC,0xEE,0xEC,0xF2,   //        d

   0xFF,0xFF,0xF1,0xEE,0xE0,0xEF,0xF1,   //        e

   0xF9,0xF6,0xF7,0xE1,0xF7,0xF7,0xF7,   //        f

   0xFF,0xFF,0xF0,0xEE,0xF0,0xFE,0xF1,   //        g

   0xEF,0xEF,0xE9,0xE6,0xEE,0xEE,0xEE,   //        h

   0xFB,0xFF,0xF3,0xFB,0xFB,0xFB,0xF1,   //        i

   0xFD,0xFF,0xF9,0xFD,0xFD,0xFD,0xF3,   //        j

   0xF7,0xF7,0xF6,0xF5,0xF3,0xF5,0xF6,   //        k

   0xF3,0xFB,0xFB,0xFB,0xFB,0xFB,0xF1,   //        l

   0xFF,0xFF,0xE5,0xEA,0xEA,0xEA,0xEA,   //        m

   0xFF,0xFF,0xE9,0xE6,0xEE,0xEE,0xEE,   //        n

   0xFF,0xFF,0xF1,0xEE,0xEE,0xEE,0xF1,   //        o

   0xFF,0xFF,0xE1,0xEE,0xE1,0xEF,0xEF,   //        p

   0xFF,0xFF,0xF0,0xEE,0xF0,0xFE,0xFE,   //        q

   0xFF,0xFF,0xE9,0xE6,0xEF,0xEF,0xEF,   //        r

   0xFF,0xFF,0xF0,0xEF,0xF1,0xFE,0xE1,   //        s

   0xFB,0xFB,0xF0,0xFB,0xFB,0xFB,0xFC,   //        t

   0xFF,0xFF,0xEE,0xEE,0xEE,0xEC,0xF2,   //        u

   0xFF,0xFF,0xEE,0xEE,0xEE,0xF5,0xFB,   //        v

   0xFF,0xFF,0xEE,0xEE,0xEA,0xEA,0xF4,   //        w

   0xFF,0xFF,0xEE,0xF5,0xFB,0xF5,0xEE,   //        x

   0xFF,0xFF,0xEE,0xF5,0xFB,0xFB,0xF3,   //        y

   0xFF,0xFF,0xE0,0xFD,0xFB,0xF7,0xE0,   //        z

   0xF9,0xF7,0xF7,0xE7,0xF7,0xF7,0xF9,   //        {

   0xFB,0xFB,0xFB,0xFF,0xFB,0xFB,0xFB,   //        |

   0xF3,0xFD,0xFD,0xFC,0xFD,0xFD,0xF3,   //        }

   0xF5,0xEA,0xFF,0xFF,0xFF,0xFF,0xFF};  //        ~

//------------------------------------------------------------------


//------------------------------------------------------------------

#INT_RDA

void LETRERO(){

salida:

valor=getc();//recibe el dato del pc y lo guarda en valor

valor1=valor;

/////////////////////codigo del pc

}


void main(){

enable_interrupts(global);

enable_interrupts(int_rda);

//LETRERO();

//////////////////////////////////////////////////////////////////////////////////

switch (valor){

//------------------------------------------------------------------RUTA 1

    case 'a':

     char TEXT []={"         RUTA 1               "};

     while(true){

     valor=getc();

     for(j=0;j<8;){

       for(i=d;i<d+8;i++){

         if (TEXT <='?')DATA=~FONT1[TEXT -' '][j];

         else

         if (TEXT <='_')DATA=~FONT2[TEXT -'@'][j];

         else

         if (TEXT <='~')DATA=~FONT3[TEXT -'`'][j];

         if(j==7)DATA=0x00;

         for(k=0;k<8;k++){

           OUTPUT_BIT(PIN_A1,shift_left(&DATA,1,0));

           if(k>=2){

           OUTPUT_HIGH(PIN_A0);

           OUTPUT_LOW (PIN_A0);

           OUTPUT_HIGH(PIN_A0);

           OUTPUT_LOW (PIN_A0);

           }

          }

         }

       //demo

       if(s&8)

       OUTPUT_HIGH(PIN_A3);

       else

       OUTPUT_HIGH(PIN_A2);

       delay_ms(2);

       OUTPUT_LOW (PIN_A2);OUTPUT_LOW (PIN_A3);

       OUTPUT_B(s+=1);

       if(z)j++;   

       z=!z;

       }

       m+=1;

       if(m==2){m=0;n+=1;};

       if(n==12){n=0;d+=1;}

       if(d==20)d=0;

      }

      

      break;

      

      //------------------------------------------------------------------RUTA 2

     case 'b':

      char TEXT1 []={"         RUTA 2               "};

      while(true){

      for(j=0;j<8;){

       for(i=d;i<d+8;i++){

         if (TEXT1 <='?')DATA=~FONT1[TEXT1 -' '][j];

         else

         if (TEXT1 <='_')DATA=~FONT2[TEXT1 -'@'][j];

         else

         if (TEXT1 <='~')DATA=~FONT3[TEXT1 -'`'][j];

         if(j==7)DATA=0x00;

         for(k=0;k<8;k++){

           OUTPUT_BIT(PIN_A1,shift_left(&DATA,1,0));

           if(k>=2){

           OUTPUT_HIGH(PIN_A0);

           OUTPUT_LOW (PIN_A0);

           OUTPUT_HIGH(PIN_A0);

           OUTPUT_LOW (PIN_A0);

           }

          }

         }

       //demo

       if(s&8)

       OUTPUT_HIGH(PIN_A3);

       else

       OUTPUT_HIGH(PIN_A2);

       delay_ms(2);

       OUTPUT_LOW (PIN_A2);OUTPUT_LOW (PIN_A3);

       OUTPUT_B(s+=1);

       if(z)j++;   

       z=!z;

       }

       m+=1;

       if(m==2){m=0;n+=1;};

       if(n==12){n=0;d+=1;}

       if(d==20)d=0;

       valor=getc();

      }

      break;

   }


}
 
Estoy haciendo un letrero led, pero deseo que cuando reciba un carácter por el Rx, cambie automáticamente el mensaje.
¿Y cuál es el problema?
Te recomiendo que subas tu proyecto dentro de un archivo comprimido, incluyendo el de simulación, ya que nadie se va a poner a realizar tu esquema en proteus.
 
Atrás
Arriba