Autor Tema: Comienzo en C  (Leído 17354 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Comienzo en C
« en: 25 de Mayo de 2012, 21:32:14 »
  :D Hola gente, les escribo para que me puedan ayudar en la transición de lenguajes de programación, yo programo en ASM y quiero pasarme al C, mas especifico C18, y tengo muchas dudas, he leído y visto programas y cada vez que lo hago me surgen mas dudas ya que veo los ejemplos y mayormente tienen algo cambiado que no se encuentra en algún ejemplo para aclarártelo,
Bueno empiezo con algunas preguntas:

1_ Siempre tengo que generar un archivo que sea main.c, o puede ser otro como test.c el que tenga el cuerpo principal del programa?

2_ Los archivos con extensiones .c serian como la parte principal del programa o periférico y los archivos .h como pedazos del programa que contengan rutinas especificas, yo los
igualo con los archivos .asm y .inc respectivamente.

3_ La declaración #Pragma se puede usar de estas dos formas:
A:
Código: C
  1. #pragma config WDTEN = OFF, LVP = OFF
ó
Código: C
  1. #pragma config WDTEN = OFF
  2. #pragma config  LVP = OFF
B: También la vi en esta instrucción:
Código: C
  1. #pragma code high_vector=0x08
  2. void InterruptTimerHigh (void)
  3. {  _asm    goto Timer1ISRHigh  _endasm
  4. }
#pragma code
Se que es una interrupcion de halta prioridad pero el "code" no lo vi en ningun ejemplo hay mas quw utilice pragma?
C: Y este VOID esta en una  linea diferente de la función:
Código: C
  1. #pragma interrupt Timer1ISRHigh
  2. void
  3. Timer1ISRHigh(void)

no deberia ser:
Código: C
  1. void Timer1ISRHigh(void)

4_A
 A raíz del ejemplo anterior las etiquetas de las funciones son asi:
Código: C
  1. void mi ejemplo (void)

El (void) indica que es un LABEL, y las que terminan así
Código: C
  1. void mi ejemplo ()

B_Tambien vi esta que empieza con una declaracion de enteros

Código: C
  1. int check_bat_sense(void)

que significan?

Bueno son muchas preguntas que tengo pero se las dire mientras vaya creando mi programa.
Les paso una pagina de programacion en C++ que me saca de algunas dudas.
http://www.zator.com/Cpp/E_Ce.htm

Saludos y gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comienzo en C
« Respuesta #1 en: 25 de Mayo de 2012, 22:22:15 »
1. Puede tener cualquier nombre, lo único debe existir uno principal que tenga la función void main(void)

2. Los archivos .c contienen el código fuente, ya sea de una librería o del proyecto. Y los archivos .h contienes las declaraciones de las funciones que son utilizadas en otros módulos, definiciones, etc.

3. Es una palabra reservada para indicarle al compilador que el trozo de código que sigue corresponde a algo "especial", bits de configuración, cierta dirección dentro de la memoria de programa, etc.

4. Hay que leer los fundamentos de C. Una función puede devolver o no valores, y también pueden recibir o no parámetros. Te recomiendo leer algún libro de C como para tener por lo menos el mínimo de conocimiento de C.


Saludos!


No contesto mensajes privados, las consultas en el foro

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #2 en: 28 de Mayo de 2012, 14:26:17 »
Gracias Suky, estuve leyendo y me di cuenta de que las funciones se escriben asi:

Código: C
  1. int mi_ejemplo (void)

el primer "int" indica que la función devolverá un dato del tipo int, o sea el primero indica la devolucion de un dato, y el "(void)" corresponde a que no tendrá parámetros.

2_ Las expresiones INT y CHAR son iguales?, ya que int representa a enteros y char a caracteres, según he leído, pero he visto a char servir para números enteros, puede ser?

3_ en tu ejemplo de "c18 desde 0" esta expresion en while:

Código: C
  1. while (1) {
  2.              if (PORTA....sigue

Ese (1) que significa, me desconcerta el if que sigue a la instruccion, el while verifica si es un 1 el if?, me perdi aca.
Saludos

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Comienzo en C
« Respuesta #3 en: 28 de Mayo de 2012, 14:54:12 »
Te respondo a esto ultimo como buenamente pueda (yo uso mikroc para programar)
-1º Lo que has puesto sobre la función es correcto.
-2º Int y char no son lo mismo,
           INT representa un nº de 16bits (signed -32768 a 32767 / unsigned 0 a 65535)
 
           CHAR representa un nº de 8bits (signed -128 a 127 / unsigned 0 a 255)          
           * esto puede varía entre compiladores, en la tabla que adjunto puedes ver los de mikroC

-3º Ese "1" del while hace que el bucle siempre se repita. El bucle while simpre se repite mientras el valor entre parentesis no sea 0 (false), podrías colocar una variable y controlar cuando salir de ese bucle.
     Por lo tanto se irá repitiendo ese if, cuando ese if sea verdadero (true)(valor de la variable distinto a 0) se ejecutarán las lineas que contenga ese if

Esto ultimo es puro C, te recomendaría hicieras caso a Suky y te leyeras algún manual/libro de C, que no tiene porque estar orientado a la programación de pics. Yo todo esto lo aprendí cuando estudié C# para pc y cuando empece con el C para los pic vi que el funcionamiento era el mismo.

Un saludo

Edit punto 2. * con ccs si es lo mismo. gracias bigluis.

Otro saludo
« Última modificación: 30 de Mayo de 2012, 06:33:19 por tannke »

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Comienzo en C
« Respuesta #4 en: 28 de Mayo de 2012, 18:57:45 »
En lo que respecta a los tipos de variables, hay ciertas variaciones entre cada Compilador. Por ejemplo, un int en CCS es de 8 bits mientras que en MikroC es de 16bits. Por otro lado, un short en CCS es de 1 bit mientras que en MikroC es de 8 bits.

Para estar seguro lo mejor es buscar en la ayuda de cada IDE.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #5 en: 28 de Mayo de 2012, 19:14:47 »
Hola, entendí por que se usa char, en el ejemplo que vi este va de 0 a 255 como me lo dijeron así también van los caracteres, si no uso números mas grandes  puedo usar unsigned char tranquilamente.
estoy leyendo algunos apuntes y viendo libros pero este es mi segundo día y siempre encuentro diferencias en los ejemplos o no se explican,
otra pregunta también vi: while (thru), es lo mismo que while (1)
Saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comienzo en C
« Respuesta #6 en: 28 de Mayo de 2012, 20:11:48 »
Es while(TRUE)... TRUE es una definición (Macro) correspondiente a 1

O sea, es lo mismo.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #7 en: 30 de Mayo de 2012, 12:50:50 »
Gracias voy a seguir leyendo.
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #8 en: 30 de Mayo de 2012, 21:02:10 »
Hola mi primer pregunta es sobre prototipos: el prototipo se define en el archivo header del principal para que se lo creo, o sea por ejemplo test.c el header sera test.h, y debe ser exacto a la funcion que representa:
Código: C
  1. int test_led (void);

La funcion seria
Código: C
  1. int test_led (void) {
  2. .....
  3. }

siempre debe terminar con un ";" y el header debe de incluirse en el archivo principal antes de llamar a esta función?
por lo que entendí  son para verificar que la función este correctamente escrita?
Son necesarios? ya que vi que el compilador muestra un mensaje de advertencia cuando no estan pero compila todo bien.

Segunda pregunta sobre arreglos.
Estube leyendo un ejemplo
Código: C
  1. int getline(char s[], int lim)
Donde s es el arreglo, por lo que entiendo al colocar [] se establece que es un arreglo y que se debe de guardar memoria consecutiva para el mismo pero donde se define el tamaño del mismo y para que casos se usan, este es uno para caracteres
este otro:
Código: C
  1. unsigned char TestMMC_e[]={"MMC error\0"};

TestMMC_e es el arreglo y que contiene los caracteres MMC error para mostrar, en este caso, en un display?

Gracias

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Comienzo en C
« Respuesta #9 en: 31 de Mayo de 2012, 02:45:20 »
1. El Header no es 100% necesario, es realmente una forma de ayudar al compilador y a las personas con quien compartas el código.

Es decir, es mucho más fácil leer solamente la forma en que debes declarar las funciones y las variables que estas necesitan en vez de leer todo el código y buscar cada función dentro de un archivo grande.

2. Los arreglos son sumamente útiles cuando trabajas con listas, cadena de caracteres, matrices, etc... Por ejemplo, si deseas almacenar información sobre cierta variable (Por ejemplo un Dataloger) y luego procesar estos datos. La manera más eficaz de hacer esto es utilizando arreglos.

Imagina que deseas almacenar 100 valores, en vez de declarar 100 variables distintas es más fácil declarar una sola variable con un tamaño definido.

Los arreglos son muchas veces utilizados en conjunto con los ciclos o Bucles, principalmente el For ya que esto permite trabajarlos de manera rápida y sin utilizar mucha memoria.

Por ejemplo
Código: [Seleccionar]
char a[100]; //Declaras un arreglo de 100 datos tipo char
for(i=0;i<100;i++){   //Para i desde 0 hasta i menor a 100, incrementando en 1
   a[i]=Read_ADC();   //Almacena el i-esimo valor del ADC en el i-esimo posición de a
}

Si desearás realizar la sumatoria de esos 100 valores sería algo así
Código: [Seleccionar]
for(i=0,sum=0;i<100;i++){   //Para i desde 0 hasta 100, incrementando en 1.
   sum+=a[i];   //Sum será igual al valor anterior de Sum + el valor del i-esimo termino de a
}

O talvés el promedio de esos 100 valores una vez obtenida la suma de los mismos
Código: [Seleccionar]
prom=sum/100;  //El promedio es la sumatoria de todos los valores entre la cantidad de valores.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comienzo en C
« Respuesta #10 en: 31 de Mayo de 2012, 12:19:36 »
Código: C
  1. int getline(char s[], int lim)

En ese caso es un puntero a un arreglo. El tamaño del arreglo, el cual los pasas como dirección en la función, es el de la declaración. O sea:

Código: C
  1. // Declaración de buffers
  2. char Buffer1[11]="Hola Mundo" ;
  3. char Buffer2[20]="Hola ...." ;
  4. // Declaración de la función
  5. int getline(char s[], int lim);
  6.  
  7.  
  8. // Llamado a la función en cualquier sector del código
  9. getline(Buffer1,val);
  10. getline(Buffer2,val2);

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #11 en: 31 de Mayo de 2012, 14:41:35 »
Gracias muy buena explicación, deberían escribir un libro ya que en los que lei no explican de esta forma.
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #12 en: 31 de Mayo de 2012, 19:50:24 »
Hola me sale este error y siempre es con la función sprintf
Warning [2054] suspicious pointer conversion
Warning [2066] type qualifier mismatch in assignment

Código: C
  1. sprintf(ext_test_state,"TEST EXT 1 OK");
  2. sprintf(ext_test_state2,"TEST EXT 2 OK");

y las declaraciones en main son:
Código: C
  1. extern unsigned char ext_test_state[20];       // usado en la seccion TEST Extesion Port y en test.c por sprintf
  2. extern unsigned char ext_test_state2[20];      // usado en la seccion TEST Extesion Port y en test.c por sprintf

No se a que se refieren.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #13 en: 01 de Junio de 2012, 00:00:38 »
Macedo:
Warning [2054] suspicious pointer conversion te dice que sprintf está esperando un tipo de dato diferente.

Si ves el prototipo de la función vas a ver que espera un char y no un unsigned char. Cambiá las definiciones de los arrays así:

     extern char ext_test_state[20];       // usado en la seccion TEST Extesion Port y en test.c por sprintf
     extern char ext_test_state2[20];      // usado en la seccion TEST Extesion Port y en test.c por sprintf
     
sinó tenés que hacer casting para convertir el tipo de dato al tipo que espera la función.

este otro Warning [2066] type qualifier mismatch in assignment te lo debe estar dando porque tenés seleccionado el small code model y la libreria standard stdio.h de c18 está precompilada para el large memory mode.

Andá a Project, build option..., project, luego en la solapa MPLAB c18, elegí en Categories en el menucito desplegable, buscá memory model y te ba a dejar seleccionar las opciones de large code model.

fuente: (página 41 del manual MPLAB_C18_Getting_Started_51295f. En esa página vas a ver la foto de lo que te digo más arriba)
"When using the standard libraries by including stdio.h, the large code model should
be selected for the project"

     Animo que vas bien!
            Saludos.
                    Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #14 en: 01 de Junio de 2012, 14:55:56 »
Hola jukinch, tiene tres opciones el menú desplegable:
code model
data model
stack model

solo se selecciona en code model o en los otros también el modo large? ya que solo seleccione en code model y el error se fue pero me queda la duda.

con lo de Warning [2054] suspicious pointer conversion , no se fue el error y me genero otros, voy a ver como se hace lo del casting y te comento como me fue.
Saludos


 

anything