TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Diego E. 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.
-
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.
-
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:
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.
....
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.
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
-
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
-
Hola.
Para hacer el debug en proteus, debes cargar al micro el archivo de extension .cof.
Saludos
-
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
-
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;
}
-
Hola.
coloca el else y dentro de el return:
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
-
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
-
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
-
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
-
Hola.
Mira este link http://www.todopic.com.ar/foros/index.php?topic=12184.0 (http://www.todopic.com.ar/foros/index.php?topic=12184.0)
-
MLO, si en ese link hay unos manuales del proteus los voy a revisar.
muchas gracias
-
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.