Autor Tema: Ignorante en C, ayuda  (Leído 3909 veces)

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

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Ignorante en C, ayuda
« en: 13 de Mayo de 2016, 08:07:23 »
Buenas,

Resulta que ahora me dicen que me tengo que preparar para un mes el lenguaje en C, y la verdad, no tengo ni puñetera idea, yo solo conozco .asm , he visto algo ayer, y no parece dificil, pero claro , 1 mes. Bueno por lo menos me dejan utilizar el MPBLab que si conozco, vamos que entre el Proteus y el C estoy apañaito. :roll: :-)

Si utilizo para mis practicas el PIC 12F617,   solo puedo utilizar el compilador CCS  ? porque entiendo que cuando indica C compiler 18, o C compiler 32, p.ej., solo vale para los PICs de la serie 18F , serie 32 respectivamente, es así ?

Es para ir sobre seguro desde un principio.

Y si el XC8 también es C ?  entiendo que si, pero que diferencias hay con el clasico C .

Gracias de antemano,

un saludo
« Última modificación: 13 de Mayo de 2016, 08:11:33 por JoseLuis2801 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ignorante en C, ayuda
« Respuesta #1 en: 13 de Mayo de 2016, 08:13:20 »
Citar
solo puedo utilizar el compilador CCS  ?

Microchip provee los compiladores XC8, XC16 y XC32 ( para 8, 16 y 32 bits respectivamente ), es decir para PIC12/16/18 necesitas el XC8, dsPIC/24F XC16, PIC32 XC32.

Creo que exige MPLAB X, realmente no sabria decirte con certeza esto.

Si estas acostumbrado con ASM, yo iria por XC8, que la configuracion de los modulos la podes hacer de forma muy parecida.
Solo deberias estudiar como es una funcion, crearla, los loops ( for, while, do..while ) , el if, los operandos ( busca "C operators" ) tanto logicos como condicionales. Y con eso ya estarias en camino de hacer algo en C. Teniendo idea de que estas haciendo.

Elegir entre CCS y XC8 es cuestion de gusto nomas.
CCS tiene algunas cosas muy buenas, pero para alguien que viene del ASM vas a encontrar tal ves cosas bastante rebuscadas o tal ves demasiado simples, en cambio XC8 es como un ASM ( configuras registro a registro ) pero aprovechas las caracteristicas de C

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re:Ignorante en C, ayuda
« Respuesta #2 en: 13 de Mayo de 2016, 10:16:38 »
Si quieres aprender C, usa el XC*, el CCS aunque sea C no te enseña a manejar el micro tan a fondo como el XC. El C es mas facil que el asm asi que con 1 mes tienes de sobra, mirate un tutorial de C normal y luego aplicale el uso al pic.

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re:Ignorante en C, ayuda
« Respuesta #3 en: 13 de Mayo de 2016, 10:33:38 »
Entendido, para el examen, el CCS , es decir , el C " de toda la vida", que será mas que suficiente, y si en un futuro migro de ASM a otro, esta muy claro, al XC8.

Durante el dia copio un programa en ámbos , y ya veo si el MPLab incorpora el XC8 y os digo.

Un saludo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:Ignorante en C, ayuda
« Respuesta #4 en: 13 de Mayo de 2016, 13:20:15 »
Jose Luis, consejo ... Si no tienes la menor idea de lenguaje C antes que nada bajaría un compilador gratuito para PC ( gcc, mingw, Visual Studio, etc ) Con eso vas a aprender la estructuras de control, flujos, uso del lenguaje, etc, etc. Cuando domines eso recién iría a uno de los compiladores que te indicaron mas arriba.

Saludos !

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ignorante en C, ayuda
« Respuesta #5 en: 13 de Mayo de 2016, 14:25:53 »
Jose Luis, consejo ... Si no tienes la menor idea de lenguaje C antes que nada bajaría un compilador gratuito para PC ( gcc, mingw, Visual Studio, etc ) Con eso vas a aprender la estructuras de control, flujos, uso del lenguaje, etc, etc. Cuando domines eso recién iría a uno de los compiladores que te indicaron mas arriba.

Saludos !

Siempre me parecio mucho mas complejo asi. Por que tiene que aprender sobre la PC, incluir archivos que no necesita, manejarse de otra forma totalmente distinta a lo que es con los compiladores, y ni hablar de instalar el compilador y que te funcione.

en XC8 necesitas incluir xc.h y listo, comenzas.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:Ignorante en C, ayuda
« Respuesta #6 en: 13 de Mayo de 2016, 14:32:19 »
Jose Luis, consejo ... Si no tienes la menor idea de lenguaje C antes que nada bajaría un compilador gratuito para PC ( gcc, mingw, Visual Studio, etc ) Con eso vas a aprender la estructuras de control, flujos, uso del lenguaje, etc, etc. Cuando domines eso recién iría a uno de los compiladores que te indicaron mas arriba.

Saludos !

Siempre me parecio mucho mas complejo asi. Por que tiene que aprender sobre la PC, incluir archivos que no necesita, manejarse de otra forma totalmente distinta a lo que es con los compiladores, y ni hablar de instalar el compilador y que te funcione.

en XC8 necesitas incluir xc.h y listo, comenzas.

No coincido, instalar un compilador es como instalar cualquier aplicación. Con respecto a los headers necesarios, para una etapa de aprendizaje del lenguaje solo necesitas

  • stdio.h
  • string.h

Ademas podes usar el debugger integrado que normalmente tiene ...

Saludos !


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:Ignorante en C, ayuda
« Respuesta #7 en: 13 de Mayo de 2016, 14:34:03 »
¿ Killer no entendí esto ?
Citar
manejarse de otra forma totalmente distinta a lo que es con los compiladores

Saludos !

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ignorante en C, ayuda
« Respuesta #8 en: 13 de Mayo de 2016, 14:59:14 »
Es que realmente yo tuve problemas con un compilador C, Me costo bastante y fue bastante engorroso tratar de hacerlo funcionar, a pesar que sea un simple instalador que le das siguiente, a mi no me funciono (mingw). Al menos en Windows. En Linux ya tenia GCC y fue bastante mas facil arrancar, solo le puse un IDE como Eclipse y sali para adelante.

XC8 posee un simulador el cual puede ver los registros del PIC y ver como cambian. Podes ir paso a paso para debuggearlo.

A mi me resulto mas dificil, por eso dije que me parecio mas complejo de esa forma, tal ves para vos fue mas facil de esa forma.

-----------------------------

Lo que me referia RICHI sobre eso, es que todos los tutoriales vas y tenes tu "printf" la solucion es incluir la libreria y adelante. Algo distinto de lo que haces en XC8 ( a no ser que tengas ya tu libreria preparada ), el que viene del ASM sabe que debe poner un char detras de otro en la UART por ejemplo, y en XC8 lo vas a hacer asi. En cambio con la idea del tutorial de PC tal ves termine buscando un printf para la UART o para lo que sea.

A pesar que son identicos los const en ambos lados, cuando programas en el microcontrolador estos van en la flash, distinto a la PC que es otra arquitectura y que solo significa para el compilador que no debe alterarse su valor,
Otra cosa es tratar con estructuras en un micro de 8 bits, y distinto en una PC.

Pienso que cambian mas cosas ademas de esto. Creo que viendolo desde el micro y conociendo como funciona internamente el micro ( por el conocimiento de ASM ) puede imaginarselo mas rapidamente que si lo hace en la PC y luego trata de transportarlo al micro.

Estoy de acuerdo que por el tema de control de flujo entre otras cosas ( loops condicional, funciones, cabeceras ) le puede ser util.
Pero ahora vamos al tema... Por que aprenderlo sobre el otro compilador cuando lo podes aprender sobre el XC8 ? SI es lo mismo, podes hacerlo paso a paso, ni siquiera tenes que modificar ni 1 registro para poder correr el "simular".

Lo unico que no tenes es una salida. Pero que tranquilamente puede crear una variable de 8 bits y usarla como "salida". Ya que puede ver el contenido ahi mismo mientras se esta ejecutando. Lo minimo que necesita en XC8 y para simular y comenzar es:

Código: C
  1. #include "xc.h"
  2.  
  3. void main(void)
  4. {
  5.     while(1)
  6.     {
  7.  
  8.     }
  9. }

Ni siquiera necesita un "return", distinto a la PC.
Ademas se va familiarizando con el entorno. Y asi luego no tiene cambiar a otro entorno totalmente nuevo como seria pasar de un IDE (en caso que lo use) a otro.

Son diferentes puntos de vista. Que tal ves por una experiencia u otra terminamos mirandolo de distintos puntos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:Ignorante en C, ayuda
« Respuesta #9 en: 13 de Mayo de 2016, 15:17:29 »
Son puntos de vista .... Mi opinión es que antes de como leer los datos de una UART o de lo que es un loop infinito, debe saber las estructuras de control ( if, while, do-while, for ) saber inicializar y usar arrays, punteros, etc, etc. Una vez sabido eso se puede meter con las cosas específicas de los micros ...


Saludos !

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re:Ignorante en C, ayuda
« Respuesta #10 en: 13 de Mayo de 2016, 16:10:43 »
Os agradezco mucho vuestros enfoques sobre el tema, me sirve de gran ayuda para orientarme, pero la verdad que no me quiero meter con mas cosas, me explico, yo quiero ir directo a lo que pueda utilizar con el MPLab 8.92 que es el que conozco. 

Es obvio que conociendo ASM, me seduce la idea de monitorizar  los registros tal y como hago con el MPLab Sim, posiciones de memo y más.

Entonces, mi pregunta es muy concreta ahora, con el XC8, ademas de lo comentado que no es posible hacer con CCS, ¿ voy a poder utilizar las mismas instrucciones que utilizaría en CCS ? , es decir, si yo tengo un programa en CCS , puedo pasarlo a XC8, sin apenas modificar la estructura principal del mismo ? con esto no me refiero a que sean compatibles, que seguro que no.

Porque si todas las instrucciones, etc, que utiliza CCS, están en XC8, voy directo a éste último.

Un saludo


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ignorante en C, ayuda
« Respuesta #11 en: 13 de Mayo de 2016, 17:11:44 »
La diferencia entre CCS y XC8 radica que a pesar que XC8 posee funciones para el manejo de los modulos, lo mas seguro es que termines modificando directamente lso registros. Te muestro unos ejemplos:

Ejemplo 1 - ASM
Código: ASM
  1. BANKSEL TRISA
  2.         CLRF    TRISA
  3.         MOVLW   0x10
  4.         MOVWF   TRISB
  5.        
  6.         BANKSEL PORTB
  7. LOOP:
  8.         BSF     PORTB, 1
  9.         BTFSS   PORTB, 1
  10.         BCF     PORTB, 1
  11.         GOTO    LOOP

Ejemplo 1 - XC8
Código: C
  1. TRISA = 0x00;
  2.         TRISB = 0x10
  3.         while(true)
  4.         {
  5.                 PORTBbits.RB0 = 1;
  6.                 if ( PORTBbits.RB0 == 1 )
  7.                 {
  8.                         PORTBbits.RB0 = 1;
  9.                 }
  10.         }

Observaras que lo unico que cambio de ASM a XC8 es que deje de preocuparme por que hay en W, ni bancos ni nada, simplemente asigne los valores y listo. Y cambiaron la forma de los condicionales y loops.

CCS - Ejemplo 1:
Código: C
  1. set_tris_a(0x00);
  2.         set_tris_b(0x10);
  3.         while(true)
  4.         {
  5.                 output_high(PIN_B0);
  6.                 if ( input(PIN_B0) == 1 )
  7.                 {
  8.                         output_low(PIN_B0);
  9.                 }
  10.         }

Veras que los loops y condicionales es igual, solo que ahora en ves de escribir al registro se usan funciones que ya vienen predefinidas.
Asi nomas el codigo no te va a funcionar. Por que CCS provee una funcionalidad para aquellos que recien comienzan. intentar leer el estado de un pin ( como es el caso del input(PIN_B0) ) hace que el compilador agregue lineas para modificar el TRIS y volverlo entrada, algo que no sucede con los 2 casos anteriores, de todas formas podes decirle que no lo haga usando una directiva que es #USE FAST_IO(B). ¿Podes modificar los registros directamente? SI pero tenes que definirlos todos!

Pero veamos otro ejemplo en que CCS es mejor ( cuando no se tiene ninguna libreria obviamente) Supongamos el caso de una UART, con 9no bit y paridad. y tambien para enviar


ASM - Ejemplo 2:
Código: ASM
  1. BANKSEL RCSTA           ; Registros tal ves no reales
  2.         MOVLW   0x00
  3.         MOVWF   RCSTA
  4.         MOVLW   0x00
  5.         MOVWF   TXSTA
  6.         MOVLW   0x00
  7.         MOVWF   RCCON
  8.         ;Aca tmb el baud rate, etc
  9.  
  10.         BSF     PIE1, RCIE
  11.         BCF     PIE1, RCIF
  12.         .....
  13.         ...
  14.  
  15.  
  16.  
  17. INTERRUPCION
  18.  
  19.         MOVWF   W_TEMP  ; Ya ni me acuerdo como es
  20.         MOVF    STATUS
  21.         MOVWF   STATUS_TEMP
  22.  
  23.         BTFSS   PIR1, RCIF
  24.         CALL    INTERRUPCION_RX                 ; Aca dentro limpio flag
  25.         BTFSS   PIR1, TMR1IF
  26.         CALL    INTERRUPCION_TMR1
  27.  
  28.         MOVF    STATUS_TEMP
  29.         MOVWF   STATUS
  30.         SWAPF   W_TEMP, W
  31.         RETFIE
  32.  
  33. INTERRUPCION_RX:
  34.         ;Aca verifico paridad, limpio flag
  35.         RETURN
  36.  
  37. INTERRUPCION_TMR1:
  38.         ;Recargo timer, limpio flag
  39.         RETURN

XC8 - Ejemplo 2:
Código: C
  1. void main(void)
  2. {
  3.         RCSTA = 0x00;
  4.         TXSTA = 0x00;
  5.         RCCON = 0x00;
  6.         //Aca demas asignaciones a registros
  7.  
  8.         PIR1bits.RCIF = 0;
  9.         PIE1bits.RCIE = 1;
  10.         // ....
  11. }
  12.  
  13.  
  14.  
  15. void interrupt Funcion_Interrupcion(void)
  16. {
  17.         if(PIR1bits.RCIF == 1)
  18.         {
  19.                 Interrupcion_Rx();
  20.         }
  21.         if(PIR1bits.TMR1IF == 1)
  22.         {
  23.                 Interrupcion_TMR1();
  24.         }
  25. }
  26.  
  27. void Interrupcion_Rx(void)
  28. {
  29.         // Aca limpio flag
  30.         // Tengo que hacer el codigo para revisar la paridad
  31.         // Etc
  32. }
  33.  
  34. void Interrupcion_TMR1(void)
  35. {
  36.         // Aca limpio flag
  37.         // Cargo timer, Etc
  38. }

Observaras que la estructura es la misma, Pero omito el tema de salvar el contexto en la interrupcion. Pero debo preguntar por cada flag en esa funcion de interrupcion ( el compilador sabe que es esa por el "interrupt" )

Ahora veamos CCS:
Código: C
  1. #USE RS232(UART1, BAUD=9600,PARITY=E, BITS= 8,STREAM=modem)
  2.  
  3. void main(void)
  4. {
  5.         //Aca configurar el timer
  6.  
  7. }
  8.  
  9. #INT_RDA
  10. void Interupcion_RX(void)
  11. {
  12.         // NO hace falta limpiar el flag
  13.         // NO hace falta verificar la paridad, ya lo hace antes
  14.         // Simplemente tomo el dato y lo uso
  15. }
  16.  
  17. #INT_TMR1
  18. void Interrupcion_TMR1(void)
  19. {
  20.         // Recargo el timer nomas
  21. }

Observaras que con una linea y en forma sencilla se pudo configurar enteramente la UART, tambien cada interrupcion posee su funcion aunque internamente se haga lo mismo que hicimos con XC8 o ASM. Tambien podes crear UART por software especificando los pines y sin ninguna complejidad:

Código: C
  1. #USE RS232(UART1, BAUD=9600,PARITY=E, BITS= 8, RCV=PIN_A6, XMIT=PIN_B0,STREAM=modem)

Tambien para enviar. En XC8 podes crearte una funcion "printf" que te envie un texto. Pero CCS permite una manejo mas facil. Y mas si tenes varias UART ( sean por software o hardware )

Código: C
  1. #USE RS232(UART1, BAUD=9600,PARITY=E, BITS= 8,STREAM=modem)
  2. #USE RS232(UART2, BAUD=9600,BITS=8,STREAM=gps)
  3.  
  4. void main(void)
  5. {
  6.         fprintf(modem,"Enviar esto %d por modem",12);
  7.         fprintf(gps,"Esto es enviado por GPS o UART2");
  8. }

Lo principal que tenes que tener en cuenta es que no tenes acceso al codigo de las funciones de CCS, distinto a XC8 la cual tenes el codigo a mano y podes ver que esta haciendo realmente. Tambien hay librerias o podes crearlas vos mismo por ejemplo una que sea:

Código: C
  1. OpenUART1(UART_NO_INVERTIDA & UART_RX_ACTIVADA,UART_TX_ACTIVADO & BGRH_ACTIVADO, 25);
(Codigo de ejemplo, no funciona)

Pero todo en codigo que se puede realmente ver el contenido del mismo. Asi como la UART, tenes I2C, SPI con CCS y se hacen todos de forma muy facil.

----------

La principal cuestion es:

Que tanto control necesitas de tu microcontrolador ? Observaras que ambos son C, y poseen las mismas cosas, nomas que CCS tiene funciones ya predefinidas y vas a necesitar un manual que leer para cada funcion, aun asi tiene formas de simplificarte la vida enormemente. Por otro lado XC8 es lo mas parecido a ASM que tenes pero podes aprovechar las capacidades de C. Incluso con el tiempo te podes crear funciones que hagan masomenos algo parecido a lo que tenes en CCS.

PD: Es hora de cambiar el MPLAB, hace rato que dejo de usarse el 8.92, realmente no se si tiene soporte con XC8.
« Última modificación: 13 de Mayo de 2016, 17:15:12 por KILLERJC »

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re:Ignorante en C, ayuda
« Respuesta #12 en: 13 de Mayo de 2016, 20:09:51 »
Si, para mis cosas si necesito buen control, p.ej. en XC8 hay breakpoints , y un stopwatch del mismo modo que hay en el ASM ?

Luego utilizo el modulo ADC para testear constantemente la tension de una Lipo y cortar el suministro a las cargas cuando llegue a una tension minima de arox 2,85V por celda; un puerto esta leyendo la señal PWM de un canal RC de un Rx. Meter en flash unos datos en el Optoswitch programable, cosas así.

Aún asi por lo que veo y respecto del ASM, XC8 me parece muy bien, se podrá hacer todo, y bien, me olvido de lo que has comentado, bancos de memo, W,  pero, una vez compilado, podré ver lo que tarda de tal a tal linea ?

De todas formas, mi prioridad ahora mismo es el examen, mañana lo veo todo mejor...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ignorante en C, ayuda
« Respuesta #13 en: 13 de Mayo de 2016, 22:57:28 »
Citar
Si, para mis cosas si necesito buen control, p.ej. en XC8 hay breakpoints , y un stopwatch del mismo modo que hay en el ASM ?

Eso lo provee el IDE, y si podes setear breakpoints, usar el stopwatch y tambien podes ver el disassembly del codigo C que estas simulando.

Citar
Luego utilizo el modulo ADC para testear constantemente la tension de una Lipo y cortar el suministro a las cargas cuando llegue a una tension minima de arox 2,85V por celda; un puerto esta leyendo la señal PWM de un canal RC de un Rx. Meter en flash unos datos en el Optoswitch programable, cosas así

La simulacion del ADC se peude hacer con el Stimulus creo, pero yo jamas lo hice, normalmente cuando tengo que "simular" algun modulo como esos, suelo crear un array o directamente le doy un valor y veo como se comporta. Sino tambien podes cambiarle el valor a los registros o flag de interrupcion, de esa forma forzar a que entre a una interrupcion por ejemplo.

Citar
Aún asi por lo que veo y respecto del ASM, XC8 me parece muy bien, se podrá hacer todo, y bien, me olvido de lo que has comentado, bancos de memo, W,  pero, una vez compilado, podré ver lo que tarda de tal a tal linea ?

Si, solo tener en cuenta que tenes que setear bien la frecuencia de instruccion en las propiedades de proyecto ( al menos ahi esta en MPLAB X) en MPLAB 8.92 creo que se encuentra en el mismo stopwatch.

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re:Ignorante en C, ayuda
« Respuesta #14 en: 14 de Mayo de 2016, 11:07:02 »
Citar
Si, para mis cosas si necesito buen control, p.ej. en XC8 hay breakpoints , y un stopwatch del mismo modo que hay en el ASM ?

Eso lo provee el IDE, y si podes setear breakpoints, usar el stopwatch y tambien podes ver el disassembly del codigo C que estas simulando.

Citar
Luego utilizo el modulo ADC para testear constantemente la tension de una Lipo y cortar el suministro a las cargas cuando llegue a una tension minima de arox 2,85V por celda; un puerto esta leyendo la señal PWM de un canal RC de un Rx. Meter en flash unos datos en el Optoswitch programable, cosas así

La simulacion del ADC se peude hacer con el Stimulus creo, pero yo jamas lo hice, normalmente cuando tengo que "simular" algun modulo como esos, suelo crear un array o directamente le doy un valor y veo como se comporta. Sino tambien podes cambiarle el valor a los registros o flag de interrupcion, de esa forma forzar a que entre a una interrupcion por ejemplo.

Citar
Aún asi por lo que veo y respecto del ASM, XC8 me parece muy bien, se podrá hacer todo, y bien, me olvido de lo que has comentado, bancos de memo, W,  pero, una vez compilado, podré ver lo que tarda de tal a tal linea ?

Si, solo tener en cuenta que tenes que setear bien la frecuencia de instruccion en las propiedades de proyecto ( al menos ahi esta en MPLAB X) en MPLAB 8.92 creo que se encuentra en el mismo stopwatch.

Ok, lo 1º, cosa del MPLab, mas que de estar utilizando uno u otro lenguaje.

2º) yo directamente lo pruebo en el PIC a ver si corta cuando debe o no, me sale perfecto a la 1ª, XQ conozco bien y aprovecho la lógica del subnneting de las redes , las mascaras de 64 bits en 64 bits, y ya luego con el AND mascara, voy cortando hasta que llego a la tension de corte que quiero, ya lo postearé en este foro como lo he hecho., es facil. Así qué no me he puesto a simular esto del ADC nunca, directo al PIC y a verificar.  2,85V niquelaitos. 8)

3º) Si, y a traves del setting del simulador que utilizes, sin problema alguno.

Aclarado todo entonces, infinitas gracias a todos, a partir del lunes me pongo...os cuento...
« Última modificación: 14 de Mayo de 2016, 11:09:38 por JoseLuis2801 »


 

anything