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

Temas similares

26/01/2010 #1


Interrupcion RS232 en CCS
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
28/01/2010 #2


Respuesta: Interrupcion RS232 en CCS
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!!!
07/07/2010 #3


Respuesta: Interrupcion RS232 en CCS
decoymech dijo: Ver Mensaje
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
08/07/2010 #4

Avatar de ByAxel

Respuesta: Interrupcion RS232 en CCS
Prueba la versión 4.104 del CCS que han corregido varios de los ya conocidos y fastidiosos bugs del CCS.

Saludos.
25/10/2013 #5


Interrupcion RS232 en CCS
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
Archivos Adjuntos
Tipo de Archivo: zip Ejercicio Libro.zip (96,3 KB (Kilobytes), 67 visitas)
26/10/2013 #6
Moderador

Avatar de D@rkbytes

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.
Archivos Adjuntos
Tipo de Archivo: rar 16F877A RS-232 7Segmentos Multiplex.rar (68,5 KB (Kilobytes), 242 visitas)
26/03/2014 #7

Avatar de luis1234567890

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);
}
}
}
27/03/2014 #8

Avatar de Saint_

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.
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (143,1 KB (Kilobytes), 48 visitas)
27/03/2014 #9

Avatar de luis1234567890

bueno gracias muchas gracias me sirvió para entender mucho mas
25/07/2014 #10


Interrupcion RS232 en CCS
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){

}    
}
26/07/2014 #11
Moderador

Avatar de D@rkbytes

juaann dijo: Ver Mensaje
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.
26/07/2014 #12


la idea de la interrupcion RDA es que la ejecute, dsp veo que hago. y bajando la velocidad no funcionó!
26/07/2014 #13
Moderador

Avatar de D@rkbytes

juaann dijo: Ver Mensaje
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.
27/07/2014 #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
27/07/2014 #15
Moderador

Avatar de D@rkbytes

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.
Archivos Adjuntos
Tipo de Archivo: rar 16F628A USART LED'S PORTA.rar (52,9 KB (Kilobytes), 261 visitas)
28/07/2014 #16


gracias, tu ejemplo si funciona.
Voy a comparar para ver que hago mal!
05/09/2014 #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
05/09/2014 #18
Moderador

Avatar de D@rkbytes

gatito11 dijo: Ver Mensaje
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.
05/09/2014 #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
05/09/2014 #20
Moderador

Avatar de D@rkbytes

gatito11 dijo: Ver Mensaje
¿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.
gatito11 dijo: Ver Mensaje
¿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.
¿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.