Autor Tema: 2 entradas seriales al pic 16f873A  (Leído 3815 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
2 entradas seriales al pic 16f873A
« en: 08 de Febrero de 2011, 11:55:38 »
hola, como bien dice el hilo, estoy teniendo problemas con el codigo a la hora de poder tener acciones en el pic cuando en alguno de los dos puertos seriales le llega una instruccion. me explico, tengo un pic en el cual tengo 2 entradas seriales una por la uardt y la otra por RB0, en ambas con sus respectivas interrupciones. este pic se conecta a otros dos dispositivos, el cual ifual son seriales, pero el punto es que el "maestro" no hace nada cuando le llegan los comando para que haga algo, y no se por que. bueno a todo esto es primera vez que intento hacer esto y estoy experimentando en esto algo nada complejo, pero aun asi no logro ver por que no me hace nada este "maestro". les dejo el codigo para que vean en que me equivoque.

saludos y gracias por lacomprencion de antemano.
:
"maestro"
Código: [Seleccionar]
#include <16f873a.h>            //pic a utilizar
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=20000000)         //clock=20Mhz
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, stream=Modem)
#use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B0, stream=Modulo)
#include <stdio.h>

char Cad,Cad2;

#int_rda
void serial_isr() {
 if(kbhit()) {   //Esto es para que no se te cuelgue el pic
Cad=fgetc(modem);
 fputc(fgetc(),modem);
 }
}

#int_EXT
void ext_isr() {
 if(kbhit()) {   //Esto es para que no se te cuelgue el pic
Cad2=fgetc(Modulo);
 fputc(fgetc(),modulo);
 }
}

void main()
{
ext_int_edge(H_TO_L);
enable_interrupts(int_ext);
enable_interrupts(int_rda);
enable_interrupts(global);
port_b_pullups(TRUE);

output_low(PIN_C0);
output_low(PIN_C1);

while(TRUE){
fprintf (modem,"hola a uno");
fprintf (modulo,"hola a uno");

if(cad==0x03){
output_high(PIN_C0);
}
else if(cad==0x04){
output_low(PIN_C0);
}

if(cad2==0x01){
output_high(PIN_C1);
}
else if(cad2==0x02){
output_low(PIN_C1);
}
}}
« Última modificación: 08 de Febrero de 2011, 11:58:13 por japifer_22 »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 2 entradas seriales al pic 16f873A
« Respuesta #1 en: 08 de Febrero de 2011, 14:15:54 »
La que va en el pin RB0 y RB1 debes colocarle que es por software, y ésta comunicación serial no dispone de la función kbhit(). Otra cosa, si ocurre una interrupción por recepción de datos seriales, ya se sabe que llego un dato y no es necesario usar kbhit().

Además el stream que le colocas a cada uno debes usarlo!  :shock: O sea, kbhit(Modem), fputc(Modem) o fputc(Modulo)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: 2 entradas seriales al pic 16f873A
« Respuesta #2 en: 08 de Febrero de 2011, 15:08:22 »
hola suky, antes de todo, gracias por estar siempre aclarando las dudas.

te comento que no te entiendo la parte que dices:
suky
Citar
La que va en el pin RB0 y RB1 debes colocarle que es por software
te refieres que tengo que ponerle  al #USE el  FORCE_SW ??

lo otro donde dices:
suky:
Citar
ésta comunicación serial no dispone de la función kbhit()
esta es solo a la generada por soft osea la de #int_EXT o te refieres a ambas comunicaciones ??

eso gracias de antemano


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 2 entradas seriales al pic 16f873A
« Respuesta #3 en: 08 de Febrero de 2011, 18:52:48 »
hola suky, antes de todo, gracias por estar siempre aclarando las dudas.

te comento que no te entiendo la parte que dices:
suky
Citar
La que va en el pin RB0 y RB1 debes colocarle que es por software
te refieres que tengo que ponerle  al #USE el  FORCE_SW ??

lo otro donde dices:
suky:
Citar
ésta comunicación serial no dispone de la función kbhit()
esta es solo a la generada por soft osea la de #int_EXT o te refieres a ambas comunicaciones ??

eso gracias de antemano



1. Si, debes poner force_sw

2. La implementada por software no dispone de la función kbhit()


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: 2 entradas seriales al pic 16f873A
« Respuesta #4 en: 08 de Febrero de 2011, 21:47:10 »
Hola.

La funcion kbhit() si se puede usar con la USART por software, lo que hay que colocar es el STREAM obligatoriamente para que el compilador recurra a la USART correcta.
Citar
stream is the stream id assigned to an available RS232 port. If the stream parameter is not included, the function uses the primary stream used by getc().

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 2 entradas seriales al pic 16f873A
« Respuesta #5 en: 08 de Febrero de 2011, 23:09:44 »
Hola.

La funcion kbhit() si se puede usar con la USART por software, lo que hay que colocar es el STREAM obligatoriamente para que el compilador recurra a la USART correcta.
Citar
stream is the stream id assigned to an available RS232 port. If the stream parameter is not included, the function uses the primary stream used by getc().

Saludos

¿Seguro? kbhit() es cuando ya hay disponible un dato en TXREG, si se usa por software hay que estar haciendo constantemente polling para saber si hay un dato o el artilugio de usar la interrupción externa por flanco descendente. Entonces como se implementaria esa función?
 :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: 2 entradas seriales al pic 16f873A
« Respuesta #6 en: 09 de Febrero de 2011, 08:11:21 »
buenos dias a todos, les comento que que me he desidido mejor haces esta comunicacion con un pic de la gama de los 18f, el cual concretamente es el 18f26j50, el cual trae 2 puertos uart. es por esto que voy a empezar a ha revisar el foro para ver como hacerlo con las dos uart y asi tener la comunicacion por hardw, en ambas. cual quier sugerencia que os pedeis  darme sera bienvenida, ya que es mi primera comunicacion de este tipo y no quiero que se me pase nada en alto  :oops: :-/.

saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 2 entradas seriales al pic 16f873A
« Respuesta #7 en: 09 de Febrero de 2011, 09:04:18 »
Nada en particular, solo usar el valor cargado a stream para direccionar cada puerto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: 2 entradas seriales al pic 16f873A
« Respuesta #8 en: 09 de Febrero de 2011, 11:16:02 »
gracias suky me lo imagine de igualforma, cualquier cosa estare en este hilo preguntando las dudas.
saludos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: 2 entradas seriales al pic 16f873A
« Respuesta #9 en: 10 de Febrero de 2011, 00:13:02 »
Hola.

Pues, se usa normalmente como si fuera la interrupción RDA, pero con el STREAM.

Mira que para un PIC12F en el cual implemento una USART por software, tengo el siguiente código y va muy bien:
Código: C#
  1. #int_EXT
  2. void Serial_isr(void)
  3. {
  4.         RS232.DatoRx=0;
  5.         if(kbhit())
  6.         {
  7.                 RS232.DatoRx=getc();
  8.                 RS232_Process(RS232.DatoRx);
  9.         }
  10. }

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 2 entradas seriales al pic 16f873A
« Respuesta #10 en: 10 de Febrero de 2011, 09:16:39 »
Será que por software detecta el flanco descendente? Porque de indicar que ya hay un dato, imposible!!


Saludos!
No contesto mensajes privados, las consultas en el foro