Autor Tema: Problema con codigo, funciones y punteros  (Leído 1765 veces)

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

Desconectado Rodricity

  • PIC10
  • *
  • Mensajes: 43
Problema con codigo, funciones y punteros
« en: 14 de Enero de 2009, 13:41:15 »
 A ver, tratare de explicarme lo mejor posible, por que me enredo con facilidad cuando se trabaja con punteros y direccionamiento indirecto, pero hare lo mejor posible.

 Tengo un problema, yo solía programar en C (hi-tech PICC) y es bastante bueno, facil de lograr, me acostumbre a nunca usar una librería, simplemente utilizaba funciones que hacia yo mismo, y si las necesitaba usar en otro programa las copiaba y pegaba (nunca me anime a hacerme mi propia libreria)

 El punto es, yo podia escribir el siguiente codigo

 
Código: [Seleccionar]

#include <pic.h> //Compilaba desde MPLAB, reconocia el dispositivo ahí, y le asignaba la libreria que
//correspondiera, asi yo solo me referia a los registros y bits tal como se nombran en el datasheet


void escribir_str(char *letra)
{
while(*letra != 0)
{
while(!TXIF);
TXREG = *letra++;
}
}

void main(void)
{
setup(); //Supongamos que seteaba todo y estaba bien
escribir_string("Hola mundo");
while(1);
}

 EDIT: Con esto lo que hacia basicamente era enviar cadenas de caracteres por puerto serial (TXREG) obviamente esperando que se enviara el caracter antes de enviar el siguiente (TXIF indica eso), es decir, recorriamos con un puntero la cadena de caracteres hasta encontrarnos el caracter nulo (while *letra != 0).


 Y ahora ultimamente he empezado a programar en C18, aunque en realidad solo se manejarme mas bien poco, quiero hacer la misma funcion (ya sé que existe la libreria stdio.h e incluye una funcion printf) pero si utilizo librerias estoy seguro que no oy aprender mucho, en especial un tema tan útil como es el direccionamiento indirecto.

 Por lo tanto me animé a tratar de pasar dicha funcion a C18 en MPLAB, y mis resultados fueron los siguientes:

 El codigo se muestra a continuacion

Código: [Seleccionar]
#include "p18f2550.h"
#pragma config WDT = OFF

void setup(void);
void escribir_string(char *letra);

char mensaje[] = "Prueba";

void main(void)
{
setup();
while(1)
{
escribir_string("hola"); //Esto NO funciona
escribir_string(&mensaje); //Esto SI funciona, pero estoy utilizando memoria de datos, no de programa
}
}

void setup(void)
{
TRISC = 0b10000000;
TXSTA = 0b00100110;
RCSTA = 0b10010000;
BAUDCON = 0x0;
SPBRG = 64;
}

void escribir_string(char *letra)
{
while(*letra != 0)
{
while(!PIR1bits.TXIF);
TXREG = *letra++;
}
while(!PIR1bits.TXIF);
TXREG = 10;
while(!PIR1bits.TXIF);
TXREG = 13;
}

 Entonces basicamente lo que quiero, es que yo a la funcion le diga el "string" que quiero enviar, y el programa la ubique automaticamente en la memoria de PROGRAMA, no sé si se podrá lograr esto, o tendre que en cierta forma "definir" los mensajes, todos y cada uno en la memoria de programa yo mismo...

 No sé si algun entendido me pudiera ubicar un poco, o será que no sé bien ni lo que estoy haciendo  :D
« Última modificación: 14 de Enero de 2009, 13:44:15 por Rodricity »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Problema con codigo, funciones y punteros
« Respuesta #1 en: 14 de Enero de 2009, 22:17:43 »
es cierto que el printf es muy gorreon de codigo en c18, sinembargo existe una funcion dada por el compilador que maneja la usart, puedes ver una explicacion aca:

usart c18

derepente si verificas el codigo fuente de la funcion puedas encontrar el error en tu codigo.

saludos  :-/

pd: una recomendacion amigo, no vayas a caer en el error de querer inventar denuevo la rueda.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Rodricity

  • PIC10
  • *
  • Mensajes: 43
Re: Problema con codigo, funciones y punteros
« Respuesta #2 en: 15 de Enero de 2009, 11:34:55 »
 Huy, no pudiste ser mas cierto cadaver, era tan simple como echarle una mirada a esa libreria, te debo una; de hecho en la libreria aparece esto:

Código: [Seleccionar]
void putrsUSART (PARAM_SCLASS const MEM_MODEL rom char *data);

 Fue tan simple como colocar en mi funcion la designacion "rom" y la funcion porfin, valga la reduncacia, funcionó, jaja, mira:



 Ahora me entro la duda por que "const" la funcion, si alguien se maneja y me lo explica, se lo agradezco harto.

 Entonces finalmente quedo así:

Código: [Seleccionar]
void escribir_string(rom char *letra)
{
while(*letra != 0)
{
while(!PIR1bits.TXIF);
TXREG = *letra++;
}
while(!PIR1bits.TXIF);
TXREG = 10;
while(!PIR1bits.TXIF);
TXREG = 13;
}
 

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Problema con codigo, funciones y punteros
« Respuesta #3 en: 15 de Enero de 2009, 11:42:00 »
esa parte del C mas crudo tampoco he visto con profundidad, derepente otros foreros si, esperemos un comentario.

saludos  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado joseto

  • PIC10
  • *
  • Mensajes: 11
Re: Problema con codigo, funciones y punteros
« Respuesta #4 en: 14 de Marzo de 2009, 11:41:45 »

Hola Rodricity una consulta respecto a tu código

Te funciono de esta manera    escribir_string("hola");   ........????


 

anything