Autor Tema: Comunicación Serie en CCS por software  (Leído 2941 veces)

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

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 230
Comunicación Serie en CCS por software
« en: 06 de Enero de 2014, 10:15:51 »
Buenas, realmente no soy como REDPIC para los tutoriales o ejemplos, pero creo que puede llegar a servir este ejemplo:

En un proyecto ya funcionando, tengo que hacer algo para ver el estado de algunas variables, y escribir valores al programa
como las entradas de la USART ya las tengo usadas, implemente por soft la comunicación, con resultados buenos, asi que
comparto para que sea de utilidad, o mejoremos.

Para detectar el inicio de la comunicación, uso la interrupción por cambio del pin RB6, ahi hago el Getc(), luego deshabilito
la interrupción por RB6, y proceso el dato fuera de la interrupción, luego, preparo para la sig interrupción.

Código: CSS
  1. #INT_RB
  2. void RB6_isr(void){
  3. int RX =0;
  4.    output_toggle(pStatusLed);
  5.    disable_interrupts(INT_RB6);
  6.    rx=GETC();
  7.    rx_char=RX;
  8.    fCommand=1;
  9. }

fCommand lo uso para en el main ver el byte que llego y ir armando la acción que queremos hacer:

Código: CSS
  1. if (fCommand){
  2. /*estructura de comandos
  3. 1 byte= comando: R:leer, W:escribir
  4. 2 byte= decimal parametro: 0 a 9
  5. 3 byte= unidad parametro: 0 a 9
  6. 4 byte= caracter fin comando 0x0A si es lectura
  7.         caracter = si es escritura
  8. 5 byte= centena valor parametro;
  9. 6 byte= decena  valor parametro;
  10. 7 byte= unidad valor parametro;
  11. 8 byte= caracter fin de comando 0x0A
  12. */
  13.  
  14.    fCommand=0;
  15.    switch (rx_index){
  16.       case 0://primer byte recibido (COMANDO)
  17.             if (rx_char == 'R') fLeer =1;
  18.             else if (rx_char == 'W')fEsc=1;
  19.             else if (rx_char == 'M')fMon=1;
  20.             parNro=0;
  21.             break;
  22.       case 1://segundo byte (DECIMAL PARAMETRO)
  23.             parNro = (rx_char - 0x30)*10;
  24.             break;
  25.       case 2://segundo byte (UNIDAD PARAMETRO)
  26.             parNro = (rx_Char-0x30)+parNro;
  27.             BREAK;
  28.       case 3://caracter "=" si es escritura
  29.             break;
  30.       case 4://centena de valor a setear
  31.             ParVal= (rx_char - 0x30)*100;
  32.             break;
  33.       case 5://decena de valor a setear
  34.             ParVal= (rx_char - 0x30)*10 + ParVal;
  35.             break;
  36.       case 6://centena de valor a setear
  37.             ParVal= (rx_char - 0x30)+ ParVal;
  38.             break;
  39.    }
  40.    rx_index++;
  41.    
  42.    
  43.    if (rx_char == 0x0A){
  44.       if (fLeer) printf("Parametro Nro: %u\r\n",ParNro);
  45.       if (fEsc)  printf("Par/Val: %u, %u\r\n",ParNro,ParVal);
  46.       parNro=0;
  47.       rx_index=0;
  48.       fLeer=0;
  49.       fEsc=0;
  50.    }
  51.    enable_interrupts(INT_RB6);
  52. }

Las pruebas las estoy haciendo habilitando la interrupción por RB6 después de revisar el byte que llego,
se podría probar a habilitar la interrupción, dentro de la rutina de interrupción, después del GETC, pero
todavía no lo hice.

Espero que sea de utilidad para alguien.

Saludos.
Alejandro.

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: Comunicación Serie en CCS por software
« Respuesta #1 en: 14 de Enero de 2014, 14:42:20 »
Tengo un problema en una comunicacion serie que estoy haciendo entre un pic 16f887 y la pc, me envia cualquier verdura el pic, por ejemplo, probé una template de redPic en la cual tiene que aparecer en la pantalla "Listen on RS232 (Int)" y aparece "ÉóôÅÎ@ÏÎ@²³rsr@H‰ÎôI"

el código es:

#include <16f887.h>
#fuses  NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP, INTRC
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #use delay(clock=8000000)
 #use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N)
 #BYTE TRISA=0x85
 #BYTE PORTA=0x05
 #BYTE TRISB=0x86
 #BYTE PORTB=0x06
 #BYTE TRISE=0x89
 #BYTE PORTE=0x09
#BYTE ANSEL=0x188
#define LED PIN_C0
#define SW1 PIN_B0
#define SW2 PIN_B1
#define LED1 PIN_C1
char Keypress=' ';

#int_rda
void serial_isr() {

  Keypress=0x00;
  if(kbhit()){
    Keypress=getc();
    if(Keypress!=0x00){
      putchar(keypress);
      keypress=0x00;
    }
  }
}


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

  printf("\r\n\Listen on RS232 (Int)\r\n");

  do {


  } while (TRUE);
}

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: Comunicación Serie en CCS por software
« Respuesta #2 en: 14 de Enero de 2014, 14:42:49 »
alguna ayuda?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Comunicación Serie en CCS por software
« Respuesta #3 en: 14 de Enero de 2014, 22:20:22 »
Que cristal usas en el circuito??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: Comunicación Serie en CCS por software
« Respuesta #4 en: 14 de Enero de 2014, 23:05:37 »
el cristal interno

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Comunicación Serie en CCS por software
« Respuesta #5 en: 14 de Enero de 2014, 23:15:41 »
Entonces esta mal la declaración, deberías escribirla así:

Código: C
  1. #use delay(internal=8000000)

Con Clock estas diciéndole al compilador que debe funcionar con cristal externo, por eso no temporiza bien y menos aun transmite como corresponde, ya que no puede calcular el timing correcto.

La declaración del tipo de reloj se hace antes de llamar a Use Rs232() , ya que luego el calculo de velocidad se hace por esa declaración, no te olvides que la frecuencia de reloj se divide por 2 o por 4 según el PIC usado.
La velocidad del oscilador interno no se divide, por lo tanto debes estar al doble o cuadruple de la velocidad declarada en use rs232(), de 9600, estaras a 1920 o 38400 realmente.
Prueba esas dos velocidades antes de cambiar nada, solo por curiosidad... ;-)
« Última modificación: 14 de Enero de 2014, 23:21:41 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: Comunicación Serie en CCS por software
« Respuesta #6 en: 21 de Enero de 2014, 00:11:26 »
probando!!!!!!!!!!!!!, igual arme otra placa con cristal externo y pasa lo mismo, por las dudas todo est configurado a 9600 bd, re contra verificado eso