Transmisión RS232 con CCS

#1
Estoy intentando transmitir desde mi PIC16F877A a mi PC por el puerto serial pero no consigo que en el hyperterminal se vea nada. El programa del PIC sigue los siguientes pasos:

#USE DELAY (clock = 20000000)
#USE rs232 (BAUD=4800,XMIT=PIN_C6,RCV=PIN_C7,BITS=8 )

Luego defino RC7 como entrada y RC6 como salida.

y por último

while(true)
{
putc(0x34);
delay_ms(1000);
}


Tengo un led conectado en RC6 y cuando no tengo el puerto serie conectado parpadea pero al conectarlo y poner en el hyperterminal que conecte este deja de parpadear. El puerto funciona correctamente porque el PIC lo programo utilizando el bootloader a través del mismo puerto.
 
#2
Bueno creo que el problema esta en que cuando conecta con el PC el PIC parece que se keda a la espera de recibir algun tipo de confirmación para realizar la transmisión porque en el momento que le doy a conectar en el HYPERTERMINAL se queda como bloqueado y cuando pulso desconectar continua intentando enviar los datos. Alguien sabe algo al respecto. Si hay que darle algun tipo de confirmación desde el PC de que ha recivido datos o algo asi?
 
#3
Bueno dos cositas, doy por hecho que has configurado correctamente el hiper terminal no? a 4800 baudios 8n1 etc.

Por otro lado cuando lo conectas atraves del hiperteminal que driver usas (MAX)......... no sé puedes publicar el circuito..................

Porque sin más pistas poco se te puede ayudar.
 
#4
QUE ondas. bien ok

la hiperterminal que tengas del lado del ordenador debe estal a los mismos baudios que es el numero de transiciones que hacen , es como decir a que velocidad van a hablar y transmitir los dos( no confundir con transmision sincrona).

que version de compilador estas usando ?, yo no defino entradas y salidas en el puerto que voy a usar como comunicacionn, cuando declaro usar #define rs232 con esa linea
es suficiente,

dale una checadita a la ayuda f1 , :)
 
#5
Hola hawk360, por ahi este codigo te puede servir, esta probado andando en proteus setea la velocidad del puerto a 2400, espero te sirva, cualquier cosa avisas paso el codigo :

Código:
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=2400, xmit=PIN_C4, rcv=PIN_C5,INVERT)
#endif
#include <input.c>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
char lee(void);
char dato;
char pregunto;
int ascii;
void main() {
   SET_TRIS_A(0x00);
   SET_TRIS_B(0x00);
   SET_TRIS_D(0x00);
   SET_TRIS_C(0xFF);
   pregunto = 's';
   ascii=0x73;
   do {
#use delay(clock=1000000)
#use rs232(baud=2400, xmit=PIN_C4, rcv=PIN_C5,INVERT)
      while(!kbhit())
           delay_us(42);
          dato = getc();
            delay_us(42);
          putc(dato);
       if(dato == pregunto){
            OUTPUT_HIGH(PIN_A0);
         }else{
            OUTPUT_HIGH(PIN_A2);
         }
   delay_ms(1000);
   OUTPUT_LOW(PIN_A0);
   OUTPUT_LOW(PIN_A2);
   } while (TRUE);

}
char lee(){
   long timeout;
   short timeout_error;
   timeout_error=FALSE;
   timeout=0;
     while(!kbhit()&&(++timeout<50000))
       delay_us(42);
      if(kbhit()){
         return(getc());
         }
      else {
         timeout_error=TRUE;
         return(0);
      }
}
 
#6
Hola:

A mi me gustaría poder enviar valores flotantes (leídos de un ADC), pero putc(), solo recibe carácters individuales, y puts(); cadenas de caracteres, pero como le haría para enviar datos de coma flotante por esta interfaz, espero alguien me pueda ayudar.

Saludos
 
#7
hola antonio,

lo que tendrias que hacer es como una especia de ftoa(), no me acuerdo si esa funcion esta incluida en ccs, pero si no, pues diseñala! no es tan dificil! si logras convertir el numero de coma flotante en cadena, pues, la tendras hecha, cuidate, y me comentas cualquier cosa...

pd: aqui hay un ejemplo pero en c++, mira a ver si te sirve como guia, cuidate
 
#8
lo que tiene que hacer es postear como tiene configurado el hyperterminal y si desconecta el bootloader (queda el puerto libre)
no es muy lógico cargar el boot loades a cuatro mil y pico baudios
Revisa las configuraciones.
 
#10
me imagino que no tienes conectado directo con tu pc el pic....
ya que necesitas por ejemplo un MAX232 antes de que las señales lleguen a tu pic,
esto es por un problema con la rs232 del pc, porque el pic solo lee datos en 0 vols y en 5 volt, y el computador trabaja con voltajes distintos.
para eso se usa el MAX232.

saludos
 
#11
hola a todos:
tengo un problema que no he podido solucionar aun, el proyecto que estoy realizando es bastante simple tengo dos microcontroladores, uno hace de control remoto adquiriendo los datos por medio de pulsadores y el otro activa motore la informacion es enviada via rs-232, en el segundo micro tengo 3 motores cuando activo los dos primeros giran corecctamente en ambos sentido cuando tengo presionado el pulsador en el primer micro y cuando suelto el pulsador se detienen es de esta manera como deben funcionar, pero con el tercer motor cuando presiono el pulsador se activa correctamente y cuando lo suelto queda activo, pongo mis codigos a ver si pudiesen prestarme alguna ayuda.


control remoto

Código:
#include <16f877a.h>
#fuses xt,nowdt,noput
#use delay(clock=4000000)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7)
char d='x';
void main(){
while(true){
if(input(pin_b0)){
d='1';
fputc(d);
}
if(input(pin_b1)){  
d='2';
fputc(d);
}
if(input(pin_b2)){  
d='3';
fputc(d);
}
if(input(pin_b3)){  
d='4';
fputc(d);
}
if(input(pin_b4)){  
d='5';
fputc(d);
}
if(input(pin_b5)){  
d='6';
fputc(d);
}
if(input(pin_b0)==0 && input(pin_b1)==0 && input(pin_b2)==0 && input(pin_b3)==0 && input(pin_b4)==0 && input(pin_b5)==0){
d='0';
fputc(d);
}
}
}
contol de motores

Código:
#include <16f877a.h>
#fuses xt,nowdt,noput
#use delay(clock=4000000)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7)
char  d='x';
#int_rda
void inter_serie(){
d='x';
if(kbhit()){
  d=getc();
}
}
void main(){
enable_interrupts(global);
enable_interrupts(int_rda);
while(true){
if(d=='1'){
   output_high(pin_d0);
   output_high(pin_d2);
   output_low(pin_d1);
   output_low(pin_d3);
}
else if (d=='2'){  
   output_high(pin_d1);
   output_high(pin_d3);
   output_low(pin_d0);
   output_low(pin_d2); 
}
else if (d=='3'){  
   output_high(pin_d2);
   output_high(pin_d1);
   output_low(pin_d3);
   output_low(pin_d0);
}
else if (d=='4'){  
   output_high(pin_d0);
   output_high(pin_d3);
   output_low(pin_d1);
   output_low(pin_d2);
}
else if (d=='5'){  
   output_high(pin_d4);
   output_low(pin_d5);  
}
else if (d=='6'){  
   output_high(pin_d5);
   output_low(pin_d4);  
}
 else if(d=='0'){
   output_low(pin_d0);
   output_low(pin_d1);
   output_low(pin_d2);
   output_low(pin_d3);
}
}
}
 
Última edición por un moderador:
#13
hola que tal

apenas empiezo a programar pic en CCS y deseo cambiar los pines de transmisión de un pic16f877a ya que el pin C6 en el tx del pic y el C7 es el rx del pic pero cuando quiero utilizar otros pines como rx y tx no hace ninguna acción cuando lo simulo en proteus,el programa lo que hace es recibir un 1 para encender un led y un 0 todo va bien cuando pongo los pin que el Pic marca como rx y tx pero cuando los cambio ya no realiza nada, por ejemplo si quiero que los datos se reciban y se transmitan por el puerto D declarando xmit=pin_d0 y rcv=pin_d1, dejo el código del programa para ver si me pueden ayudar y ver que se necesita modificar en el codigo, gracias saludos. =)

#include <16F877A.h>
#device adc=10
#fuses XT,WDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NOCPD,NODEBUG,NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_d0, rcv=pin_d1, bits=8, parity=N)
#use standard_io(B)

char valor;

#int_rda

void serial_isr()
{
valor=getchar();
}

void main()
{
enable_interrupts(global);
enable_interrupts(int_rda);

for( ;; ) //bucle sin fin
{
if(valor=='1')
output_high(pin_b0);

else
output_low(pin_b0);
}
}
 

Temas similares

Arriba