TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: mmX en 20 de Abril de 2009, 19:23:43

Título: scanf y printf en C30 USART
Publicado por: mmX en 20 de Abril de 2009, 19:23:43
Hola a todos, tal cual como lo dice el titulo de mi post, me gustaría saber como implementar las funcionalidades de SCANF y PRINTF de caracteres y cadenas de caracteres en el compilador C30. 

Ejemplo :

printf("Un mensaje largo sin variable");

printf("Un mensaje largo con una cadena: %s", Cadena);

estoy intentando por aqui, espero alguien por alla pueda ayudarme....
Gracias
Título: Re: scanf y printf en C30 USART
Publicado por: Nocturno en 21 de Abril de 2009, 01:27:52
¿Qué problema tienes?, yo he usado el printf y me ha funcionado bien.
Título: Re: scanf y printf en C30 USART
Publicado por: mmX en 21 de Abril de 2009, 11:46:27
\mplab c30\bin\bin\pic30-coff-ld.exe Error: A heap is required, but has not been specified
link step failed...

El codigo es el siguiente, funciona el putUSART1(char C), asi que asumo que la configuracion es correcta.

Código: C++
  1. #include <P33FJ32MC204.h>
  2. #define __33FJ32MC20_H
  3. #include <libpic30.h>
  4. #include <stdio.h>
  5.  
  6. _FOSCSEL(1);                                            //Oscilador FRC interno con PLL
  7. _FOSC (195);                                            //Osc primario desabilitado, Cambio reloj desabilitado
  8.  
  9. #define FCY                     40000000    //Instruction Cycle Frequency
  10. #define BAUDRATE          9600            //Baudios        
  11. #define BRGVAL              ((FCY/BAUDRATE)/16)-1
  12.  
  13. /***************************FuncionTx******************************/
  14. void putUART1( char c){
  15.         while ( U1STAbits.UTXBF);               // wait while Tx buffer full
  16.         U1TXREG = c;
  17. }
  18.  
  19. /**********************Interrupcion_Rx*****************************/
  20. void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void){
  21.         TRISA = 0x0000;
  22.         PORTA = 0xfff;
  23.         putUART1('K');
  24. }      
  25.  
  26. /***************Inicializar_UART********************************/
  27.  
  28. void InitUART1(){
  29.         TRISBbits.TRISB5=1;
  30. TRISBbits.TRISB0=0;
  31. RPOR0=3;                                               
  32. RPINR18bits.U1RXR0 = 0x05;
  33.  
  34.                        
  35.     U1MODEbits.STSEL = 0;                       // 1-stop bit
  36.     U1MODEbits.PDSEL = 0;                       // No Parity, 8-data bits
  37.     U1MODEbits.ABAUD = 0;                       // Auto-Baud Disabled
  38.     U1MODEbits.BRGH = 0;                        // Low Speed mode
  39.     U1BRG = BRGVAL;                             // BAUD Rate Setting
  40.     U1STAbits.UTXISEL0 = 0;             // Interrupt after one Tx character is transmitted
  41.     U1STAbits.UTXISEL1 = 0;
  42.     IEC0bits.U1TXIE = 0;                        // Disenable UART Tx interrupt
  43.     IFS0bits.U1RXIF    = 0;                     //-Clear the Recieve Interrupt Flag
  44.         IEC0bits.U1RXIE    = 1;                 //-Enable Recieve Interrupts
  45.         U1MODEbits.UARTEN = 1;                  // Enable UART
  46.     U1STAbits.UTXEN = 1;                        // Enable UART Tx  
  47.         U1STAbits.URXISEL1 = 0;             //-Enable UART Rx                                  
  48.         IPC2bits.U1RXIP=7;                              //Interrupt Rx Mayor prioridad
  49. }
  50.  
  51.  
  52. int main (void){
  53.  
  54.    CLKDIVbits.PLLPRE=4;                         //Divisor PLL_1 por 6
  55.    CLKDIVbits.PLLPOST=0;                        //Divisor PLL_2 por 2
  56.    PLLFBD=128;                                          //Multiplicador PLL por 130
  57.    OSCTUN=0;                                            //Frecuencia del FRC 7.37 MHz
  58.  
  59.         TRISA = 0x0000;
  60.         PORTA = 0;
  61.  
  62. InitUART1();
  63.  
  64.  while(1){
  65.  
  66. printf("hola");
  67.  
  68. }
  69. }
Título: Re: scanf y printf en C30 USART
Publicado por: Nocturno en 21 de Abril de 2009, 11:58:39
Tienes que ajustar el tamaño del "heap" en las opciones del compilador: Build Options -> MPLAB LINK30

Con ponerle 256 o 512 será suficiente según tu aplicación.
Título: Re: scanf y printf en C30 USART
Publicado por: mmX en 21 de Abril de 2009, 13:18:37
Gracias!! Que son estos heaps  y que efecto tienen sobre la compilacion?
Título: Re: scanf y printf en C30 USART
Publicado por: Nocturno en 21 de Abril de 2009, 13:24:48
NPI (ni puñetera idea)
Título: Re: scanf y printf en C30 USART
Publicado por: reiniertl en 21 de Abril de 2009, 14:04:49
Normlamente un heap es un espacio de memoria que reserva para uso del sistema, digamos que viene siendo algo así como un espacio de memoria compartida, la cual se utiliza para una cosa u otra en dependencia de las necesidades del programa

Saludos
Reinier
Título: Re: scanf y printf en C30 USART
Publicado por: blackcat en 21 de Abril de 2009, 15:51:01
Yo creo que es un area de memoria reservada que contiene toda la información del área de la memoria dinámica.
Título: Re: scanf y printf en C30 USART
Publicado por: mmX en 21 de Abril de 2009, 17:08:47
 y que me puedes decir del Scanf();?aun no logro hacerlo funcionar, el programa me compila pero simplemente ignora esa instruccion y muesttra infinitamente la cadena inicial....
Título: Re: scanf y printf en C30 USART
Publicado por: pajaro en 21 de Abril de 2009, 21:44:33
hola amigo

verifica de no dejar espacios como el de la linea 14,el programa que has colgado te funciona?

si te funciono printf("hola");
tambien te debe de funcionar el scanf("%x",&a);
x depende del tipo de dato.


un saludo
Título: Re: scanf y printf en C30 USART
Publicado por: mmX en 22 de Abril de 2009, 00:37:07
el programa en si, funciona,

Código: [Seleccionar]
printf("introduzca un numero:");
scanf(%d,&i);

debería solicitar número y esperar que lo ingrese, pero muestra "introduzca un numero:introduzca un numero: .................. " repetidamente.... como si el scanf no estuviese ahi..
Título: Re: scanf y printf en C30 USART
Publicado por: pajaro en 23 de Abril de 2009, 19:27:01
Hola amigo

Ponle las comillas " " al scanf

scanf("%d",&i);

el scan es una senteccia un poco especial, dependiendo del compilador o del entorno, te puede dar muchos quebraderos de cabeza, nada de espacios,entre "", --> "%d".

Tambien hay otras formas de capturar numeros o caracteres de teclado.

un saludo