TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: RiBerZerO en 13 de Octubre de 2006, 16:54:55

Título: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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 :-/
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo 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.  :)
               
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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

 :-/
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo 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   :-/
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo 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:
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo 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)

Título: Re: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo 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    :-)
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo 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.  :-/
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: RiBerZerO 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
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo en 31 de Octubre de 2006, 19:46:48
 
 :-/
   :-/
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: xjulenx 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!


Título: Re: Comunicacion por hiperterminal con UART
Publicado por: maunix en 19 de Abril de 2007, 20:03:28
Fijate si en el header del archivo .h tienes algo asi como


#ifndef MYHEADER_H
#define MYHEADER_H

; codigo


#endif
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: xjulenx en 20 de Abril de 2007, 04:43:38
Asi es, tengo eso mismo.


#ifndef __UART_H
#define __UART_H

//todo el código y para terminar...

#endif /*__UART_H */

esto es bueno o es malo??  :D

agradezco las molestias!

Título: Re: Comunicacion por hiperterminal con UART
Publicado por: maunix en 20 de Abril de 2007, 15:01:54

esto es bueno o es malo??  :D

Es bueno, evitará que se ejecuten de nuevo los defines que tengas en el archivo .h

Título: Re: Comunicacion por hiperterminal con UART
Publicado por: PIPE09 en 10 de Marzo de 2009, 14:58:22
tenemos los mismos errores de librerias al compilar

bla.c: In function 'main':
bla.c:26: error: conflicting types for 'CloseUART1'
c:/archivos de programa/microchip/mplab c30/bin/bin/../../support/peripheral_30F_24H_33F/uart.h:299: error: previous declaration of 'CloseUART1' was here
bla.c:40: error: 'UART_RX_TX' undeclared (first use in this function)
bla.c:40: error: (Each undeclared identifier is reported only once
bla.c:40: error: for each function it appears in.)




el codigo completo que tenemos es el siguiente...



/* Archivos cabecera para las funciones y definiciones */

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

#define FCY 30000000


/* 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 =30000000/(16*BaudRate)-1;
   baudvalue =390;
   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;
}




muchas gracias por cualquier ayuda q nos puedan brindar
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: PIPE09 en 10 de Marzo de 2009, 17:07:20
falto decir q ya incluimos en el proyecto todos los library files q se mensionan arriba (obviamente para el 30f4011)
Título: Re: Comunicacion por hiperterminal con UART
Publicado por: Rulo en 11 de Marzo de 2009, 01:10:48


    Ve Aqui!!! (http://www.todopic.com.ar/foros/index.php?topic=25135.msg205517#msg205517)



                un Saludo.