Interrupcion RS232 en CCS

#1
Hola soy nuevo aqui y estoy aprendiendo a usar el compilador CCS para programar PIC's.
Mi duda es acerca de la interrupción INT_RDA la cual no me funciona ya que intento enviar un caracter por la terminal virtual en Proteus y me debe de regresar ese mismo caracter en un LCD, pero nada, creo ni siquiera entra a la interrupción. Ojalá puedan ayudarme. No tengo ningun problema en lenguaje ensamblador pero al intentarlo hacer en C no puedo.
Este es el codigo de programa:
----------------------------------------------------------------------------------
Código:
#include <16F887.h>
#fuses HS, NOWDT, NOPUT, MCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, LVP, BORV40, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_c7, bits=8, parity=N)
#use fast_io(B)
#use fast_io(C)
#include <LCD.c>

char ch;
#INT_RDA                            //SERVICIO DE INTERRUPCIÓN POR RS232
void rda_isr()
{
ch = getchar();			    //Lee dato recibido
puts("Recibido");                      //Desplega recibido en el LCD
}

void main()			    //Principal
{
   set_tris_C(0x10111111);	    //C6->Salida; C7->Entrada
   lcd_init();
   enable_interrupts(INT_RDA);      //Habilita interrupción por recepción RS232
   enable_interrupts(GLOBAL);       //Habilita interrupcion global
   for( ; ; )
   {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\n\r Valor %c",ch);
   }
}
-----------------------------------------------------------------------------------
Gracias
 
Última edición:
#2
Bueno aunque no respondieron ya solucione el problema ja.
La versión de CCS que tenia era la 4.023 y tiene un error para la interrupción ya que la cambie a la 4.093 y funciono perfectamente.

De cualquier forma Gracias!!!
 
#3
Bueno aunque no respondieron ya solucione el problema ja.
La versión de CCS que tenia era la 4.023 y tiene un error para la interrupción ya que la cambie a la 4.093 y funciono perfectamente.

De cualquier forma Gracias!!!

Yo tengo un problema parecido, ya que lo tengo con un pic 18f4550 la transmision del pic-pc funciona pero la del PC-PIC no. modifique mi rutina para que hiciera eco es decir que me devuelva lo que recibe pero me devuele caracteres en blanco o "raros". Y como todo jejej simulado en proteus y puertos seriaes virutales funciona OK. nose que pueda ser.. si me pueden ayudar o decirme donde conseguiste la verison completa dela version 4.93 de CCS. para probar a ver si es eso. gracias
 
#5
Necesito ayuda es que tengo un proyecto el cual necesita que en un pic contenga un programa el cual sea un contador ascendente de 0 a 99 y cuando use un switch o pulsador lo que haga sea enviar a otro pic que comience un contador de 99 a 0 pero el programa debe estar en el pic master lo e intentado pero no se como hacer para que el envio de datos sea recibido por el pic esclavo se que tiene que ser con los pines tx y rx estoy usando un pic 16f877a coloco el esquema el cual ya tengo los contadores el problema es que no como hacer para que el pic esclavo comience cumplir su funcion e buscado pero todos son con pantallas LCD lo necesito es con 2 7 segmentos uno para las unidades y otro las decenas
 

Adjuntos

#6
Te daré una ayuda sobre como hacer la recepción de datos usando interrupción por USART y luego mostrar el valor en dos displays de 7 segmentos.
El circuito trabaja en modo multiplex para controlar los dos displays.

En la simulación no usé resistencias limitadoras ni transistores de conmutación para hacerla sencilla.
Eso lo debes tener en cuenta al montar el circuito físicamente.

Suerte.
 

Adjuntos

#7
Hola. Viendo el datasheet hice este pequeño programa para enviar datos de la pc al pic y quisiera usar la librería del ccs para que se entienda más, pero no se como utilizarla muy bien por que a la hora de recibir el dato solo lo transmite repetidas veces el mismo dato y no espera el otro dato a transmitir.
Código:
void main()
{
trisb=0b00000100;//configurar pin de transmisor y de receptor
trisa=0;//puerto digital
porta=0;
osccon=0b01101100;//oscilador interno
ansel=0b00000000;//pines digitales
txsta=0b00100100;//8bits modo asincrono
rcsta=0b10010000;// 8bits modo asincrono
spbrg=25;//9600baudios
while (true)
{
if (bit_test(pir1,5)==1)//lleaga de informacion
{    bit_clear(pir1,5);
       porta^=255;
      txreg=rcreg; //transmitir informacion
 while(bit_test(txsta,1)==0);
}
}
}
 
Última edición por un moderador:
#8
Hola @luis1234567890, por lo que veo en tu probra mas tratas de decivir un dato por le puerto serie par aluego reenviarlo, si es asi, este el el codigo que hace la misma tarea.
Código:
   #include <16f877a.h>
   #fuses   xt,nowdt
   #use     delay(clock=4000000)
   #use     rs232(baud=9600, xmit=PIN_c6,rcv=PIN_c7) //configura el puerto serie
   unsigned int8  dato_rx,estado_puerto=255;
   void main()
   {
      while(true)
      {
         if(kbhit()==1)          //pegunta si llego dato al puerto serie y esta
         {                       //listo para su lectura
            dato_rx=getc();      //recupera el llegado al puerto serie
            output_a(estado_puerto);
            estado_puerto^=255;
            putc(dato_rx);     //envia el mismo dato llegado por el puerto serie
         }
      }
   }
Esta informacion se encuentra en el help del CCS.
 

Adjuntos

Última edición:
#10
Hola estoy usando ccs v5 y quiero realizar una cominicacion serie entre dos PIC16F628A. nose que estoy haciendo mal, pero no logro hacerlo funcionar. dejo el codigo del receptor y transmisor:

Transmisor:
Código:
#include <16F628A.H>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=4000000)   
#use RS232(uart1,BAUD=9600,BITS=8,PARITY=N)
#byte PORTB=0x06
 
#INT_RB
void envio(){
   while (!bit_test(PORTB,5));
   putc(0xff);
}
void main() {
   enable_interrupts(INT_RB);      // Habilita la interrupcion del puerto B ( RB4 - RB7).
   enable_interrupts(GLOBAL);      // Habilita las interrupciones globales.
   
 set_tris_b( 0xF0 ); 
 while(true){ 
 } 
 
 }
Receptor:

Código:
#include <16F628A.H>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=4000000)   
#use RS232(uart1,BAUD=9600,BITS=8,PARITY=N)
 #use fast_io(a)
 #use fast_io(b)
char dato;
#INT_RDA
void interrupt_serie(){
      dato=getc();
}
void main (){
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_RB);      // Habilita la interrupcion del puerto B ( RB4 - RB7).
   enable_interrupts(GLOBAL);      // Habilita las interrupciones globales.
   
   set_tris_b(0xf0);
   
while(true){

}    
}
 
#11
Hola, estoy usando ccs v5 y quiero realizar una comunicación serie entre dos PIC16F628A.
No sé que estoy haciendo mal, pero no logro hacerlo funcionar.
Suponiendo que se ejecutara la interrupción en el receptor, ¿qué está haciendo la variable dato?
Por lo que veo, sólo está almacenando el dato recibido pero no estás haciendo nada con ella.

Como recomendación; si vas a trabajar con el oscilador interno (4MHz.) baja la velocidad a 4800 o 2400 Bps.
 
#13
la idea de la interrupción RDA es que la ejecute, dsp veo que hago. y bajando la velocidad no funcionó!
El código en sí, está bien y si se tiene que ejecutar la interrupción pero como no estás haciendo nada con la variable, es obvio que no veas nada.

Así como está el código del receptor únicamente bajo depuración podrás ver que si se ejecuta la interrupción.

Has algo durante el evento de interrupción RDA o usa la variable dato, por ejemplo; reenvía el dato como eco, enciende un LED o lo que se te ocurra.
 
#14
lo estoy viendo en proteus paso a paso y no entra nunca en la interrupcion. y si le digo que encienda un led tampoco funciona.
directamente no entra en la interrupcion
 
#15
Pues quién sabe que estés haciendo mal.
Tienes que poner un breakpoint en dato=getc();, si no el programa sigue corriendo dentro del bucle while.

Para que aclares tus dudas te paso un ejemplo usando interrupción por USART con comunicación PIC a PIC.

Suerte.
 

Adjuntos

#17
hola, una pregunta compañeros, se puede hacer uso de varias interrupciones en un solo código?
si es así no tendrán un ejemplo que me puedan proporcionar, o no se si alguien me pueda direccionar a algún tema que trate o detalle mas a fondo las interrupciones
 
#18
Hola. Una pregunta compañeros. ¿Se puede hacer uso de varias interrupciones en un solo código?
Si es así, ¿tendrán un ejemplo que me puedan proporcionar?
O no se si alguien me pueda direccionar a algún tema que trate o detalle mas a fondo las interrupciones.
Claro que se puede y con PICC Compiler es muy sencillo, pues cada interrupción se realiza con código independiente.

Los ejemplos los puedes encontrar mirando los códigos adjuntos que existen por el Foro.

Suerte.
 
#19
y, hay jerarquias en las interrupciones o que puede pasar en caso de que se encuentren dos interrupciones al mismo tiempo?, por que en mi caso, haré uso de varias interrupciones (B0, b4-b7, rs232, i2c) y quisiera saber mas al respecto no se si me podrian recomendar alguno de los topicos del foro, o como lo encuentro, para poder leerlo gracias
 
#20
¿Y hay jerarquías en las interrupciones o que puede pasar en caso de que se encuentren dos interrupciones al mismo tiempo?
Porque en mi caso haré uso de varias interrupciones (B0, b4-b7, rs232, i2c) y quisiera saber más al respecto.
Cuando se ejecutan dos interrupciones, digamos casi al mismo tiempo, porque alguna debe tener prioridad por algunos microsegundos, entonces se ejecutará la primera y la otra estará en espera.
Por este motivo no es recomendable el uso de retardos cuando se usan interrupciones.
Los retardos congelan la continua ejecución del programa y hacen que no se atiendan las interrupciones al momento de ocurrir.
¿No sé si me podrían recomendar alguno de los tópicos del foro, o cómo lo encuentro, para poder leerlo?
Eso depende del tipo de interrupción que quieras usar, porque en un solo tema no podrás encontrar explicación o uso de todas.

Lo que si te recomiendo leer, es la hoja de datos del PIC que quieras usar, ahí si vienen explicadas todas.

Suerte.
 
Arriba