Autor Tema: Programacion en C  (Leído 3894 veces)

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

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Programacion en C
« en: 22 de Septiembre de 2008, 11:34:00 »
Hola grupo, acabo de iniciarme en la programación en C ya he elaborado mis primeros programas,  pero tengo algunas inquietudes puntuales, a ver si me pueden ayudar:

1- Como puedo convertor un binario de 16 bit a decimal, y al la vez pasar unidades, decenas, centenas, millares a un entero de 16 bit ?
2-Las subrutinas void xxx(), deben quedar siempres en las primeras líneas ?
3-Donde puedo ver en que dirección quedó definida una variable, ejemplo int contador, que posición de RAM le asignó el compilador ?
4-El stak o pilas funciona igual que en assembler , se incrementa a medida que llamo una subrutina, los delay ocupan posición en el stak ?
5-Ocurre algún problema con los bancos de la ROM, en assembler hay que tener en cuenta cuando se pasa de la posición h'1000' para cambiar de banco pclath ?
6-Si quiero salir o finalizar una subrutina(void) algo así como en basic exit sub se puede utilizar un end, exit o return ?
6-Como puedo depurar paso a paso el programa realizado ?

gracias.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Programacion en C
« Respuesta #1 en: 22 de Septiembre de 2008, 12:39:30 »
saludos Diego, debiste colocar este mensaje en el subforo de Lenguaje C. Pero bueno ya seguramente algun Mod te lo moverá.

Te respondo lo que yo usualmente hago, supongo que quieres utilizar CCS:

1. para ello necesitarás rutinas de conversion que tu mismo debes construir (o reutilizar algunas qeu puedas encontrar por el foro quizá), por ejemplo para obtener las unidades, decenas, centenas, etc. deberás hacer divisiones sucesivas primeramente extrayendo el módulo 10 (creo que así se llama, es la operación %, "el residuo de una división"), por ejemplo para obtener las unidades de 15678:
int a=15678;
x=a%10;   // x=8   x son las unidades
a=a/10;    // a=1567
y=a%10;   // y=7  y son las decenas
a=a/10;    // a=156
y así sucesivamente...
Para el proceso inverso pues tendras que hacer multiplicaciones y sumas:
int a=1,b=2,c=3; //queremos formar un solo número 123 en x
x=x+a;    //x=1
x=x*10;  //x=10
x=x+b;   //x=12
x=x*10;  //x=120
x=x+c;   //x=123
es solo un ejemplo para hacerlo con 16bits es similar, solo tener cuidado con algunas operaciones de multiplicación, en ccs para mezclar 8bits con 16bits se usa la funcion _mul(x,y). Seguramente puedes encontrar algunas rutinas en el foro, o desarrollarlas de mejor manera utilizando ciclos for u otra cosa que mejor domines.

2. Si deben estar por lo menos definidas en la parte inicial, por ejemplo:
cabecera
...
void x1(){
   ... tu funcion
}
void x2();

void main(){
... tu programa
}


void x2(){  // puede ser desarrollada despues pero siempre debe ser definida arriba
   ... tu otra funcion
}

3. Nosé si será necesario saber exactamente el número que le ha asignado. Pero si es impresindible saber la dirección, puedes utilizar un puntero a esa variable y tienes la dirección exacta de esa variable almacenada en la variable puntero, y puedes acceder al valor de la dirección que está apuntando. Para ello se utilizan los operadores * (contenido) y & (dirección)

4. esta no me la se muy bien, pero yo creo que si.

5. No, ningún problema, en C no tienes que preocuparte de utilizar los bancos, el compilador lo hace por ti

6. generalmente un return viene bien, talvez un break, pero de este ultimo no estoy seguro, tendrás que manejarlo con cuidado.

6. esto yo lo hago con Proteus, con el .cof que genera el compilador, pero si no me equivoco puedes integrar el CCS con el MPLAB y depurarlo ahí. Otra forma no la conozco.

Un saludo, espero te sirva.
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Programacion en C
« Respuesta #2 en: 22 de Septiembre de 2008, 12:59:48 »
Hola.

Pues me ha salido el mensajesillo de BAD GAT...#$%$@ asi que ya has contestado amigo Cryn, sin embargo dejo aqui mi respuesta (esperemos que no se caiga el servidor)

No te entiendo el primer punto amigo, normalmente el

tipo de variable se asigna al inicio, por ejemplo int16

value;
con lo cual se trabaja con decimales enteros

de 16 bits. Para pasar de BCD a entero es sencillo, es

por suma de productos:
Código: [Seleccionar]
value = 1000*millares + 100*centenas + 10*decenas +

unidades

Las funciones pueden ir al inicio o al final. Si las defines

al final debes declarar el prototipo de la funcion al inicio

del programa.
Código: [Seleccionar]
....
void configurar(void);
...
void main (void)//Programa principal
{
 ....
}

void configurar(void)
{
 ...
}

Para la asignacion de la memoria, eso depende del

compilador que usas.

Para salir de la subrutina no hay necesidad de

comandos, solo hay que tener en cuenta que hace la

subrutina y si retorna algun valor se indica en la

declaracion de la subrutina.

Código: [Seleccionar]
void configurar (void);//No retorna un valor, solo se sigue

un proceso determinado
int16 valor (int8 value);//Funcion que retorna un int16 y

hay que enviarle como parametro un int8

Para la depuracion del codigo se usa o bien el mismo

MPLAB u otras herramientas como el Proteus, el cual

permite hacer debug.

Saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Programacion en C
« Respuesta #3 en: 22 de Septiembre de 2008, 14:35:57 »
Cryn, MLO, gracias por responderme, me ha quedado claro, para las operaciones entero a BCD y BCD a entero ustedes me ratifican algo que había hecho pero tenía dudas, respecto finalizar una subrutina había utilizado return. lo que no logro es depurar paso a paso en proteus, tengo la versión 7.1 y a pesar de que he seguido algunas indicaciones bajadas de la web no aparece el código, creo que es la versión del proteus.

nuevamente mil gacias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Programacion en C
« Respuesta #4 en: 22 de Septiembre de 2008, 14:37:20 »
Hola.

Para hacer el debug en proteus, debes cargar al micro el archivo de extension .cof.

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Programacion en C
« Respuesta #5 en: 22 de Septiembre de 2008, 15:19:57 »
sobre el final de una rutina, nose si quedó claro, te lo explico MLO_

osea que si tu rutina debe devolver algun valor lo haces con el tipo de variable que devolverá al inicio, y en esta estas obligado a usar el return, si no tu funcion no devuelve nada, no hace falta colocar el return, por ejemplo:

int suma(int x,int y){  // y hasta puedes recibir parametros en la función:
   int z=0;  // esta es una variable local

   z=x+y;
   return(z);
}

o tb puedes:
int z1; // esta es una variable global
void suma2(int x,int y){
   z1=0;
   z1=x+y;
}

y en el main puedes hacer:
void main(){
   int resultado;

   resultado=suma(2,5);  //resultado=7
   suma2(3,9);              //z1=12
}

ya se usa como mejor te convenga
.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Programacion en C
« Respuesta #6 en: 22 de Septiembre de 2008, 17:04:45 »
Cryn, el codigo que utilicé es el siguiente: neceito que si no se cumple la primera condicion aborte la rutina

void decremente()
{
if(uni>0)
   {
   uni--;
   return;
   }
uni=9;

if(dec>0)
   {
   dec--;
   return;
   }
dec=9;

if(cen>0)
   {
   cen--;
   return;
   }

cen=9;
if(u_mil>0)
   {
   u_mil--;
   return;
   }
u_mil=9;
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Programacion en C
« Respuesta #7 en: 22 de Septiembre de 2008, 17:08:33 »
Hola.

coloca el else y dentro de el return:

Código: [Seleccionar]
if(uni>0)
{
 uni--;
 return;
}
else
{
 return;
}

O de otra forma podria ser que lo primero que evalues sea si es mayor que cero y ya luego haces el resto, mira: if(comp1), else if (comp2) ...

Saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Programacion en C
« Respuesta #8 en: 22 de Septiembre de 2008, 18:51:14 »
MLO, respecto a lo que me indicaste un poco más atrás acerca de cargarle al pic en proteus el archivo.cod o tambien el archivo.cof, no me funciona, creo que es por la version del proteus (7.1), sólo funciona si cargo el archivo.hex. Ahora depronto sabes algo sobre como simular el archivo de c en mplab ?, he leído en la web y hablan de un plugin, este ya lo descargue y lo instalé pero no se como proseguir.

gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Programacion en C
« Respuesta #9 en: 22 de Septiembre de 2008, 22:07:47 »
Hola.

Me parece muy extraño que no te funcione el debug de proteus.

Para hacer el debug en proteus, debes escoger en el menu la herramienta MPLAB SIM y te aparecen los iconos para que hagas el debug. Para simular las entradas ve a Debugger/Stimulus y asignas los valores de los pines ( eso a grandes rasgos, ya que yo uso mas el  Proteus)

Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Programacion en C
« Respuesta #10 en: 22 de Septiembre de 2008, 22:14:50 »
Hola.

Me parece muy extraño que no te funcione el debug de proteus.

Para hacer el debug en proteus, debes escoger en el menu la herramienta MPLAB SIM y te aparecen los iconos para que hagas el debug. Para simular las entradas ve a Debugger/Stimulus y asignas los valores de los pines ( eso a grandes rasgos, ya que yo uso mas el  Proteus)

Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Programacion en C
« Respuesta #11 en: 22 de Septiembre de 2008, 22:16:26 »
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Programacion en C
« Respuesta #12 en: 23 de Septiembre de 2008, 13:42:07 »
MLO, si en ese link hay unos manuales del proteus los voy a revisar.

muchas gracias

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Programacion en C
« Respuesta #13 en: 23 de Septiembre de 2008, 14:48:13 »
muy raro, pues desde una versión 6.algo de proteus ya viene integrado con CCS y no hace falta hacer nada, ojala puedas solucionarlo con el link, no te olvides colocar el .cof y el archivo de proteus en la misma carpeta.

un saludo.
.