Autor Tema: Comunicacion por hiperterminal con UART  (Leído 9136 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Comunicacion por hiperterminal con UART
« en: 13 de Octubre de 2006, 16:54:55 »
Buen queria consultar la forma de comunicar un dsPIC con la conexion de puerto serial atravez del UART, ya e realizado la conexion con PICs pero utilizando la libreria USART.h, el programa para PIC es el siguiente:

#include <stdio.h>
#include <usart.h>

#pragma config WDT = OFF
#pragma config OSC = XT
#pragma config LVP = OFF

void main (void)
{
   int a,b,c,d;

   OpenUSART( USART_TX_INT_OFF&
          USART_RX_INT_OFF&
          USART_ASYNCH_MODE&
          USART_EIGHT_BIT&
          USART_CONT_RX&
          USART_BRGH_HIGH,25);
   while (1){
      a=16;
      b=5;
      c=2;
      d=a*b*c;
      printf("a=%d\n\r",a);
      printf("b=%d\n\r",b);
      printf("c=%d\n\r",c);
      printf("a*b*c=%d\n\r",d);
      d=a*b+c;
      printf("a*b+c=%d\n\r",d);
      d=a+b*c;
      printf("a+b*c=%d\n\r",d);}}


Pero no tengo idea de como hacer lo mismo en dsPIC y con la UART
Se aceptan ideas a ver quien puede ayudarme :-/
No SUEÑES tu vida, VIVE tu sueño

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #1 en: 13 de Octubre de 2006, 21:03:52 »

   RiBerZerO   Pues puedes bajarte el archivo "dsPIC30F Language Tool Libraries.pdf" de la paguina de Microchip, ahi viene la forma de configurar la UART.


             de cualquier forma te pongo un ejemplo pequeño de como la implemente en un dsPIC30F3012

Código: C
  1. ///////////////////////////Fuses
  2.   _FOSC( CSW_FSCM_OFF  & FRC_PLL16);  ////// 117.92 Mhz = 29.48 MIPS
  3.   _FWDT(WDT_OFF);
  4.   _FBORPOR(PBOR_ON  & PWRT_OFF & MCLR_EN);
  5.  
  6. /////////////////////////////////////////////////////////////Variables
  7. unsigned int U1MODEvalue;
  8. unsigned int U1STAvalue;
  9. /////////////////////////////////////////////////////////////configuracion UART
  10. ConfigIntUART1(UART_RX_INT_DIS & UART_RX_INT_PR0 & UART_TX_INT_DIS & UART_TX_INT_PR0);
  11. U1MODEvalue = UART_EN & UART_IDLE_CON & UART_DIS_WAKE & UART_DIS_LOOPBACK &
  12. UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT & UART_RX_TX;
  13. U1STAvalue  = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE &
  14. UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
  15.  
  16. baud = 95;  //////9600baud =191      19200baud =95      38400baud =47      57600baud =31      115200baud =15
  17.        
  18. OpenUART1(U1MODEvalue, U1STAvalue, baud);

Despues de esto ya puedes utilizar:
                    WriteUART1();  o  printf ("Hi");

           Ojo, el valor que tiene baud es para 117.92 Mhz, para otra frecuencia deberas calcularlo.

        espero te sirva.  :)
               

Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Re: Comunicacion por hiperterminal con UART
« Respuesta #2 en: 13 de Octubre de 2006, 21:21:02 »
Gracias voy a intentar implementarlo, tambien me checo el pdf y luego les aviso que pasa

 :-/
No SUEÑES tu vida, VIVE tu sueño

Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Re: Comunicacion por hiperterminal con UART
« Respuesta #3 en: 14 de Octubre de 2006, 18:26:06 »
baud = 95;  //////9600baud =191      19200baud =95      38400baud =47      57600baud =31      115200baud

podrias indicarme como conseguir los valores para los baud y tambien como lo calculo de acuerdo al cristal

 :mrgreen: si no es mucho pedir

gracias
No SUEÑES tu vida, VIVE tu sueño

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #4 en: 14 de Octubre de 2006, 18:51:13 »
Hola RiBerZerO
              Mucho pedir?, Noooooo para nada  :D

       Pues aqui va...

   tienes que hacer lo sig:

                   baud =  MIPS / (16*(Bauds deseados + 1 ))        en el ejemplo utilizaba 29.48 MIPS y la uart a 19200

  por lo que quedaria   baud = 29480000 / (16*( 19200 + 1) ) = 95.958     redondeando =95

                MIPS = Xtal /4  =  117.92Mhz / 4 = 29.48 MIPS

         Pero Cuidado

  para que funcione correctamente no debe tener mas del +1 o -1    o   +2 o -2 % de error, o algo asi (que alguien me corrija), si te pasas de ese porcentaje de error, lo mas seguro es que recibas pura basura, o incluso no recibas nada.
 
   Para calcular el porcentaje de error puedes consultar el archivo "dsPIC30F Family Reference Manual.pdf" tambien disponible en la paguina de microchip.


            Pues creo que es todo.
                       Saludos   :-/

Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Re: Comunicacion por hiperterminal con UART
« Respuesta #5 en: 14 de Octubre de 2006, 20:10:30 »
Que bien gracias por la ayuda lo metere a mi memoria electronica :D (un archivo en la compu) por que a mi se me olvida

Parece que ya casi todo va quedando solo tengo otro pequeño problema cuando intento compilar con C30 me da el siguiente error:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F6014 -c -x c  -I"C:\Archivos de programa\Microchip\MPLAB C30\support\h" "temp_6014.c" -o"temp_6014.o" -g -msmall-code

Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -Wl,"C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.o",-L"C:\Archivos de programa\Microchip\MPLAB C30\lib",--script="C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\p30f6014.gld",--heap=512,-Map="UART1.map",-o"UART1.cof"


C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.o(.text+0x2): In function `main':
C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.c:13: undefined reference to `CloseUART1'
C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.o(.text+0x6):C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.c:15: undefined reference to `ConfigIntUART1'
C:\Documents and Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.o(.text+0x1a):C:\Documents and


Settings\Cesar\Mis documentos\MPLAB\UART1\temp_6014.c:37: undefined reference to `OpenUART1'
BUILD FAILED: Sat Oct 14 18:01:12 2006


y no entiendo por que ya que tengo el #include<uart.h< y como podran ver si pasa el primer paso

Gracias de antemano Nos Escribimos Luego
No SUEÑES tu vida, VIVE tu sueño

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #6 en: 14 de Octubre de 2006, 20:18:49 »

Hola RiBerZerO

       Pues realmente no se que pase.

                Por que no mejor pegas el codigo, creo que sera mas facil identificar el error, y si no lo encuentro pues trataria de compilarlo.

      ya veremos.


         Saludos:!:    :mrgreen:

Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Re: Comunicacion por hiperterminal con UART
« Respuesta #7 en: 14 de Octubre de 2006, 23:09:17 »
Bueno pues aqui pego el codigo a ver si me puedes ayudar

#include <p30f6014.h>
#include <uart.h>

int main ( void ){            
   
/* Variables para configuracion de la UART */

   unsigned int U1MODEValue;
   unsigned int U1STAValue;
   unsigned int baud;
   unsigned int a,b,c,d;

   CloseUART1();

   ConfigIntUART1(   UART_RX_INT_DIS &
               UART_RX_INT_PR5 &
               UART_TX_INT_DIS &
               UART_TX_INT_PR5);

   baud = 191;

   U1MODEValue = UART_EN &
            UART_IDLE_CON & 
            UART_DIS_WAKE &
            UART_DIS_LOOPBACK &   
            UART_DIS_ABAUD &
            UART_NO_PAR_8BIT &   
            UART_1STOPBIT;

   U1STAValue = UART_INT_TX_BUF_EMPTY &
            UART_TX_PIN_NORMAL &
            UART_TX_ENABLE &
            UART_INT_RX_CHAR &
            UART_ADR_DETECT_DIS &
            UART_RX_OVERRUN_CLEAR;

   OpenUART1(U1MODEValue,U1STAValue,baud);
   
   a=16;
   b=5;
   c=2;
   d=a*b*c;
   printf("a=%d\n\r",a);
   printf("b=%d\n\r",b);
   printf("c=%d\n\r",c);
   printf("a*b*c=%d\n\r",d);
   d=a*b+c;
   printf("a*b+c=%d\n\r",d);
   d=a+b*c;
   printf("a+b*c=%d\n\r",d);
   
   while(1);      
}

a ver que va mal
No SUEÑES tu vida, VIVE tu sueño

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #8 en: 15 de Octubre de 2006, 15:41:51 »


         Pues tal cual pegaste el codigo, no tube problemas para compilarlo. No lo probe, ni simule, ni nada por el estilo pero compila.

             Asegurate de incluir los siguientes archivos

      En Source Files ----> Archivo_codigo.C   "Obvio"
      En Library Files ----> libc-coff.a
                             ----> libp30F6014-coff.a
                             ----> libpic30-coff.a
      En Linker Sripts ----> p30f6014.gld

  Todos estan en la carpeta C30/lib  o en C30/support/gld, excepto el Archivo_codigo.C que tu sabras donde lo guardas,   :mrgreen:

            Suerte  8)


Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Re: Comunicacion por hiperterminal con UART
« Respuesta #9 en: 16 de Octubre de 2006, 02:47:28 »
Bueno al parecer me faltaba agregar los archivos de library files agregando estos todo corrio perfectamente... :-/

Gracias

Bueno ahora la pregunta del millon siempre se tienen que agregar estos archivos que no se supone que con el wizard deberia generarlos, estoy confindido :? cuando debo usarlos

Muchas gracias por tu tiempo amigo
No SUEÑES tu vida, VIVE tu sueño

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #10 en: 16 de Octubre de 2006, 19:26:28 »

      :) Me alegra que ya te funcione  :)

   
Citar
que no se supone que con el wizard deberia generarlos

       No lo creo, incluso en el wizard se tienen que ir agregando manualmente, ya que si no lo hago no me agrega ni un solo archivo.

           y nada que agradecer, para eso estamos, para ayudarnos.


    Saludos    :-)

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #11 en: 16 de Octubre de 2006, 19:29:13 »
      Se me paso.

             
Citar
estoy confindido  :? cuando debo usarlos

   
   Pues yo siempre los agrego, sea el programa que sea.


                Hasta pronto.  :-/

Desconectado RiBerZerO

  • PIC12
  • **
  • Mensajes: 52
Re: Comunicacion por hiperterminal con UART
« Respuesta #12 en: 30 de Octubre de 2006, 04:26:21 »
Bueno para dejar terminado este tema publicare aqui el programa que se utiliza para comunicacion de un DSPIC con la PC atravez del modulo de la UART,
Muchas gracias al amigo Rulo por toda la ayuda prestada :-/ para que este programa fuera posible.

Bueno sin mas aqui esta el programa, esta diseñado para cambiar el BAUD rate con una macro pero la condicion es usar un cristal externo de 7.3725.

/**********************************************************************
 *                                                                     *
 *    Author:       Montes De Oca Ortega Cesar
 *                                        *
 *    Company:        IPN                                              *
 *    Filename:       temp_6010.c                                      *
 *    Date:           27/10/2006                                       *
 *    File Version:   1.30                                             *
 *    Other Files Required: p30f6010.gld, libpic30.a                   *
 *    Tools Used: MPLAB GL  -> 6.60                                    *
 *                Compiler  -> 1.30                                    *
 *                Assembler -> 1.30                                    *
 *                Linker    -> 1.30                                    *
 *                                                                     *
 **********************************************************************/
                   
/* Archivos cabecera para las funciones y definiciones */

#include <p30f4012.h>
#include <uart.h>
/*Macros para valores constantes*/

#define BaudRate 38400

/*FUSES para configuracion del dsPIC*/

_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);

/* Prototipos de funciones*/

void tiempo(void);

/************* START OF MAIN FUNCTION ***************/

int main ( void ){
         
   unsigned int baudvalue;
   unsigned int U1MODEvalue;
   unsigned int U1STAvalue;
   char    TEXTO[] = {'H','e','l','l','o',' ','U','A','R','T','\n','\r','\0'},
         
   CloseUART1();

   ConfigIntUART1(   UART_RX_INT_DIS &
                UART_RX_INT_PR6 &
               UART_TX_INT_DIS &
               UART_TX_INT_PR2);

   U1MODEvalue =    UART_EN &
               UART_IDLE_CON &
               UART_DIS_WAKE &
               UART_DIS_LOOPBACK &
               UART_DIS_ABAUD &
               UART_NO_PAR_8BIT &
               UART_1STOPBIT &
               UART_RX_TX;
   
   U1STAvalue =    UART_INT_TX_BUF_EMPTY &
               UART_TX_PIN_NORMAL &
               UART_TX_ENABLE &
               UART_INT_RX_CHAR &
               UART_ADR_DETECT_DIS &
               UART_RX_OVERRUN_CLEAR;

   baudvalue =1843200/((BaudRate)-1);//Con cristal 7.3728 y PLL16
   OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
   TRISDbits.TRISD0=0;

   while(1){
      LATDbits.LATD0=1;
      putsUART1 ((unsigned int *)TEXTO);
      while(BusyUART1());
      tiempo();
      LATDbits.LATD0=0;
      tiempo();
   }
}

/*Funcion delay paraq tiempo*/

void tiempo(void){
   int unsigned contador;
   int unsigned cont;
   for(cont=1;cont<20;cont++)
      for(contador=1;contador<0xFFFF;contador++);
   return;
}



El led en el puerto 0 es solo para ver la sincronizacion con el envio ya que puedes ver como al momento que el led parpadea la pc escribe el dato.

Bueno muchas gracias a todos y espero esto les sirva
No SUEÑES tu vida, VIVE tu sueño

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Comunicacion por hiperterminal con UART
« Respuesta #13 en: 31 de Octubre de 2006, 19:46:48 »
 
 :-/
   :-/

Desconectado xjulenx

  • PIC10
  • *
  • Mensajes: 4
Re: Comunicacion por hiperterminal con UART
« Respuesta #14 en: 19 de Abril de 2007, 19:51:40 »
estoy intentando compilar el código final que habíais colgado.. tengo incluidas estas librerias:

Source Files  ----> codigo.C 
Library Files  ----> libc-coff.a
                   ----> libp30F6014-coff.a
                   ----> libpic30-coff.a
Linker Sripts ----> p30f6014.gld

y el caso esque al compilar me da el siguiente error.. :

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4013 -c -x c "COM_UART.C" -o"COM_UART.o" -g
COM_UART.C: In function 'main':
COM_UART.C:45: error: conflicting types for 'CloseUART1'
c:/archivos de programa/microchip/mplab c30/bin/../support/h/peripheral_30F_24H_33F/uart.h:295: error: previous declaration of 'CloseUART1' was here

Halting build on first failure as requested.
BUILD FAILED: Fri Apr 20 00:40:25 2007



no entiendo cual es el problema, casca con todas las llamadas a los metodos de uart.h en el main. Si pongo el método "CloseUART1" en comentario, automaticamente casca la siguiente llamada..

será algún fallo tonto seguro.. a ver si alguien me puede dar una pista.. gracias!