Autor Tema: Consejos de como iniciarme en el C  (Leído 7013 veces)

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

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Consejos de como iniciarme en el C
« en: 30 de Junio de 2017, 19:21:36 »
Hola gente, pues bueno, como que estoy obligado de una ves por todas, aprender C. Y mi interés es hacerlo en XC8, pero no se si será este el "C" más fácil para empezar.

Por otro lado, todo lo que encuentro explicativo con respecto a este lenguaje, lo veo muy complicado de entender, por lo que mi duda es si existirá "algo" así como se hace con el asembler, que para cada instrucción, existe su definición, sintaxis, etc. Al venir desde el .asm creo que esta manera me resultaría más sencilla de aprender.

Por otro lado, se aceptan consejos, o cualquier tipo de recomendación.

Un saludo y desde ya muchas gracias por la ayuda.

Atte. CARLOS.

 
« Última modificación: 30 de Junio de 2017, 19:27:10 por Chaly29 »
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Consejos de como iniciarme en el C
« Respuesta #1 en: 30 de Junio de 2017, 21:07:41 »
Mi consejo es que si venis del ASM, uses XC8, los demas compiladores vas a encontrar muchas inconsistencias y/o funciones que tenes que tener un manual al lado y la perdida de control va a ser mayor.
Lo bueno que con el MPLABX vas a poder simular el codigo tal cual lo haces en ASM, por lo cual vas a poder ver en accion paso a paso tu codigo.

Ahora para comenzar con C, te diria que busques cualquier tutorial de C que hay por internet, pero seguramente incluyan demasiadas cosas de PC y eso luego te puede confundir.

Los temas a tocar serian:
- Operadores
- Tipos de variables y tamaños.
- Control de flujo
- Directivas de preprocesamiento ( como el define )
- Funciones, paso de variables hacia la funcion y valores de retorno
- Arrays
- Scope ( alcance de la variable y visibilidad de las variables )
- Diferencia entre .h y .c , para que se usan cada uno
- Punteros es lo ultimo de lo ultimo. Pero viniendo del ASM es simple entender.

Si pudieras poner exactamente cual es tu problema o duda con respecto a esos tutoriales se te podria resolver.

Ejemplo el programa MAS pequeño que podes tener y el cual vas a poder compilar con XC8 es este:

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

Que su equivalente en ASM seria:

Código: ASM
  1. ORG 0x00
  2.    GOTO SETUP
  3.    ORG 0x04
  4.    RETURN
  5.  
  6. INICIALIZACION:
  7.   ; Aca codigo
  8.  
  9. MAIN:
  10.  
  11. LOOP:
  12.    GOTO LOOP

Tu main es una funcion, nomas que en C es obligatorio.
En donde dice INCIALIZACION en ASM, va el codigo de inicio de C, esto es algo que no va a importar casi nunca a no ser que entres demasiado en el mundo de C.
en MAIN pondrias la configuracion de tus perifericos y luego tenes el loop infinito.

Otro ejemplo para que veas que es lo mismo

Código: C
  1. #include <xc.h>
  2.  
  3. void main(void)
  4. {
  5.     //Aca configuro todos los modulos del PIC y se ejecuta una ves
  6.  
  7.     while(1)
  8.     {
  9.         //Este es el loop infinito, ya que siempre se cumple la condicion al ser distinta de 0
  10.         //Aca se ejecuta continuamente.
  11.     }
  12. }

El flujo del programa en ASM es el mismo, inicia el micro, configuro los modulos y luego entro a mi loop principal, Si observas aca tenes lo mismo.
------------------------

Luego tenes los operadores, algunos son de comparacion ( mayor o igual, igual, distinto ) otros son funciones logicas como las AND, OR y XOR, rotacion , el de asignacion ( = ) y mezcla de estos que son asignacion y AND juntas. De esta tabla:

https://es.wikipedia.org/wiki/Anexo:Operadores_de_C_y_C%2B%2B

Solo te interesarian por ahora aquellos que no estan dentro de "Otros operadores" sino  los de operaciones a nivel bit y de comparacion.

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

Luego tenes el control de flujo, en ASM tenes:

BTFSS
BTFSC
GOTO
CALL/RETURN

en C tendrias

Usando una combinacion de BTFSS/C y GOTO:
- if ( Lo usarias en caso de que necesitas entrar cuando se cumpla una condicion, se ejecuta una sola ves)
- while ( Lo usarias en caso de tengas que repetir un codigo hasta que se cumpla una condicion, este primero revisa la condicion y si se cumple ejecuta el codigo)
- do..while ( Lo mismo que el while, nomas que primero hace una pasada sobre el codigo y luego revisa la condicion para ver si lo repite o no)
- for  ( Ideal para repetir cierta cantidad de veces, ejemplo tengo que repetir un codigo 8 veces, esto es lo ideal a pesar que se puede realizar con while por ejemplo)
- switch..case ( Util para elegir casos, ejemplo si una variable es 0 ejecuto un codigo, si es 1 ejecuto otro codigo y asi.)

Y el CALL/RETURN es lo mismo que llamar a una funcion.

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

En XC8 vas a poder modificar registros al igual que haces en ASM. Suponete que queres poner el valor 0x01 en TRISA, en ASM deberias:

Código: ASM
  1. BANKSEL TRISA    ; Cambiar de banco
  2.    MOVLW 0x01        ; Poner el valor en W
  3.    MOVWF TRISA      ; Mover el valor al registro TRISA

En C es mas simple, no te preocupas por los bancos, solo del registro y el valor:

Código: C
  1. TRISA = 0x01;  // RA0 como entrada nomas

Ahora lo que cambia un poco es como modificar los bits del registro, es obvio que podemos hacer una OR, pero suponete que quisieramos poner el pin RB0 en 1.

En ASM:
Código: ASM
  1. BSF  PORB, 0

En XC8 para modificar solo un bit, se forma con el nombre del registro + bits, y luego usas un punto el cual te deberia aparecer un cuadrito con todas las opciones, elegis RB0 o PORTB0 o lo escribis

Código: C
  1. PORTBbits.RB0 = 1;

Los nombres de los registros son iguales que el datasheet, los nombres de los bits son igual que el datasheet. Asi de la misma forma que vos tenes un .inc que te trae todo eso, en XC8 al incluir el archivo xc.h te adjunta solo el archivo correcto , asi que basta de estar buscando el nombre correcto del archivo, y ademas trae otras funciones.
En si el tema es LARGO, pero creo que con esto serias capas al menos de modificar registros como lo hacias en ASM.

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

Pequeño ejemplo para encender un led

Código: C
  1. #include <xc.h>
  2.  
  3. #define _XTAL_FREQ 4000000
  4.  
  5. void main(void)
  6. {
  7.     //Aca configuro todos los modulos del PIC y se ejecuta una ves
  8.     TRISB = 0;
  9.  
  10.     while(1)
  11.     {
  12.         //Este es el loop infinito, ya que siempre se cumple la condicion al ser distinta de 0
  13.         //Aca se ejecuta continuamente.
  14.         PORTBbits.RB0 = 1;
  15.         _delay_ms(250);
  16.         PORTBbits.RB0 = 0;
  17.         _delay_ms(250);
  18.     }
  19. }

Aca hay 2 cosas nuevas, el #define y la funcion _delay_ms a la cual le pasamos como parametro 500.

El #define ese es medio especial, en realidad lo que es especial es el nombre "_XTAL_FREQ" que es usado por el compilador internamente, ese nombre le indica al compilador la frecuencia del oscilador, en realidad usa ese valor para calcular la cantidad de ciclos que necesita en los _delay_ms
La funcion _delay_ms es una funcion interna del compilador, una de las pocas que tenes que aprenderte, Luego el compilador calcula la cantidad de ciclos y crea un delay que cumpla esa cantidad de ciclos. Otras funciones son: _delay, este se le pasa la cantidad de ciclos nomas, y _delay_us , para pasarle microsegundos y no milisegundos o cantidad de ciclos.
Y luego solo ponemos el pin RB0 en 1 y luego en 0, cada 250ms.

« Última modificación: 01 de Julio de 2017, 12:09:34 por KILLERJC »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re:Consejos de como iniciarme en el C
« Respuesta #2 en: 30 de Junio de 2017, 21:51:23 »
 ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) Excelente sinopsis
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Consejos de como iniciarme en el C
« Respuesta #3 en: 30 de Junio de 2017, 22:30:23 »
.

Consejo, empieza por un libro sencillo, que te de los conceptos básicos del C, a ser posible orientado a microcontroladores, aunque no necesariamente. Luego, ya puedes buscar información más profunda y algún manual de uso del IDE de Microchip y de las particularidades que pueda tener XC8, que no son muchas con respecto al C estandard.

Yo empecé con los PIC y C, con este libro, muy básico, pero muy completo, de Nigel Gardner, ya hace un carro de años. Y lo sigo recomendando a cualquiera que vaya a empezar a programar en C para microcontroladores PIC, sobre todo si ni siquiera conoce el lenguaje C.

Y un consejo, ya muy personal, mucho mejor los ARM que los PIC, y dentro de los ARM, los STM32 de lo mejor. Con PIC, el compilador es de pago, con ARM todo gratis y puedes saltar entre fabricantes sin apenas cambios.






« Última modificación: 30 de Junio de 2017, 22:32:58 por planeta9999 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Consejos de como iniciarme en el C
« Respuesta #4 en: 30 de Junio de 2017, 22:42:05 »
Y un consejo, ya muy personal, mucho mejor los ARM que los PIC, y dentro de los ARM, los STM32 de lo mejor. Con PIC, el compilador es de pago, con ARM todo gratis y puedes saltar entre fabricantes sin apenas cambios.

Tambien apoyo el consejo este, aunque ARM es todo otro cantar, Y querer encarar ARM + C todo junto pienso que seria mucho mas complejo. Por lo cual pienso que para comenzar con C ir al PIC el cual conoces a fondo. Luego cuando estes comodo con C, procedas a pasar a ARM.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:Consejos de como iniciarme en el C
« Respuesta #5 en: 01 de Julio de 2017, 02:06:38 »
Te recomiendo los tutoriales de Gooligum: http://www.gooligum.com.au/, son en específico para PICs y usan XC8.
Los de la línea "baseline" son gratuitos, de los otros hay una parte disponible como "free sample", pero yo considero que son lo suficiente para tener buena idea de cómo trabajar con C (además, también tienen tutoriales de ensamblador, y en los de C en muchas partes hacen comparación con ensamblador, facilitando mucho la relación).

Sobre adquirir los tutoriales completos "mid-range", no me fío del sitio pues lamentablemente no tiene https.
« Última modificación: 01 de Julio de 2017, 02:13:49 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Consejos de como iniciarme en el C
« Respuesta #6 en: 01 de Julio de 2017, 03:39:38 »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Consejos de como iniciarme en el C
« Respuesta #7 en: 01 de Julio de 2017, 03:52:34 »
.

Otro grupo de tutoriales de C, y aunque este es para micros PIC32, está en español y es bastante bueno. Se compone de 12 ficheros PDF, cada uno dedicado a un tema

https://mega.nz/#!RE1UFDQJ!PVALgP9IOkKk2CgFr_wpQAu7NPCfvh05ADFKjEcspCM

Otro consejo, mejor si entras directamente a los 32 bits. Hoy en día las diferencias de precio con otra familias menores, son pequeñas, y las posibilidades de desarrollo muy superiores, en todos los sentidos, a los 8 bits, que prácticamente son juguetes.

Temario:
------------------------
1.-  Introducción.
2.-  Primer Programa
3.-  Circuito de Reloj
4.-  Puertos IO
5.-  Interrupciones.
6.-  Estudio: calculadora científica avanzada
7.-  Timers
8.-  ADC
9.-  LCD Gráfico
10.- PWM
11.- UART
12.- Bibliografía

« Última modificación: 01 de Julio de 2017, 03:57:28 por planeta9999 »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Consejos de como iniciarme en el C
« Respuesta #8 en: 01 de Julio de 2017, 04:37:10 »
Carlos,

KILLERJC te ha hecho una explicación muy buena (como de costumbre :-) ). Si escoges XC8 (yo no iría a CCS) verás que lo único que tienes que tener en cuenta es como acceder a los registros y a sus bits (ya te explicó KILLERJC) lo demás es 95% ANSI C. Con esto te quiero decir que si te vas a estudiar algún libro yo me iría a la biblia del C :P :

https://docs.google.com/file/d/0B4FF12HzhOl4OGdLc0FYVEpqNzQ/edit

Y haría pruebas en un compilador para PC ya que va a ser mucho más rápido. Luego pasar a PIC es preguntar dudas al vuelo.

Vamos que no existe un C para PIC y uno para ARM Linux o PC: hay un sólo C con pocas variaciones para cada caso (bueno en CCS para PIC hay muchas jeje por eso no me gusta). Es por eso que normalmente los estudiantes en las esculas y universidad estudian C para PC y más adelante ya lo aplican a la plataforma específica.

Saludos.

Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Consejos de como iniciarme en el C
« Respuesta #9 en: 01 de Julio de 2017, 07:38:03 »
Mi consejo para que empieces es que lo hagas con Arduino.

Si por alguna razón no quieres tocar Arduino y sigues empeñado con PIC, te recomiendo que comiences con los compiladores cc5x:
http://www.bknd.com/cc5x/

Hay para PIC16 y para PIC18. No cubren toda la gama, no tienen muchas librerías y no tienen muchas opciones, pero tienen muchas ventajas, como unas librerías básicas (punto flotante, printf, etc) con todo lo que necesitas para empezar y sobre todo una compilación a ASM muy directa, en la que puedes ver cómo se traduce cada instrucción C a muy pocas instrucciones en ensamblador. Viniendo del ensamblador te va a encantar.

Un saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Consejos de como iniciarme en el C
« Respuesta #10 en: 01 de Julio de 2017, 07:52:13 »
Te pongo un ejemplo de programa para el PIC16F88 que sirve para hacer parpadear todas las salidas del micro:

Fichero: blink.c
Código: C
  1. /*
  2.   ENCIENDE Y APAGA TODAS LAS SALIDAS MENOS RB6 Y RB8 CADA  300.000 CICLOS
  3. */
  4. #include "16F88.H"
  5. #include "int16CXX.H"
  6. #include "Lib\Config.h"
  7.  
  8. #pragma config = 0x3F10   // Set config
  9.  
  10. /*
  11.   INITIALIZE PROCESSOR
  12. */
  13. void init_cpu() {
  14.    OSCCON = 0b01100110;  // 0, 110=4MHZ, 0=RUNNING FROM INTRC CLOCK, 1=STABLE FREQ, 10=INTRC CLOCK
  15.    CMCON = 0b00000111;   // TURN OFF COMPARATORS
  16.    
  17.    PORTA = 0;
  18.    PORTB = 0;
  19.    ADCON0 = 0;           // DISABLE A/D CONVERTER
  20.    ANSEL = 0;            // RA7..RA0    0=DIGITAL  1=ANALOG A/D
  21.    TRISA = 0b00000000;   // RA7..RA0    0=OUTPUT   1=INPUT
  22.    TRISB = 0b11110000;   // RB7..RB0    0=OUTPUT   1=INPUT
  23. }
  24.  
  25.  
  26. /*
  27.    Funcion de retardo
  28. */
  29. void pause_ms(unsigned i) {
  30.    do {
  31.       W = 199;
  32.       do {
  33.          nop();
  34.       } while (--W != 0);  // 1000 ciclos
  35.    } while (--i != 0);
  36. }
  37.  
  38.  
  39.  
  40. /*
  41.   FUNCION PRINCIPAL. AQUI COMIENZA EL PROGRAMA
  42. */
  43. void main(void)
  44. {
  45.  
  46.    init_cpu();
  47.  
  48.    while(1) {
  49.       PORTB = 0xFF;
  50.       PORTA = 0xFF;
  51.       pause_ms(250);
  52.       PORTB = 0;
  53.       PORTA = 0;
  54.       pause_ms(250);
  55.    }
  56. }

Fichero Config.h:
Código: C
  1. /*
  2.    DEFINE CONFIGURATION WORD 1 AND 2  FOR PIC16F88
  3. */
  4.  
  5.  
  6. /* definitions */
  7. #define  true   1
  8. #define  false  0
  9.  
  10. /* Pragma declarations */
  11. #pragma library 1           // this will delete all unused functions
  12.  
  13.  
  14. /*
  15.   CONFIGURATION WORD 1 and 2 REGISTER (ADDRESS 2007h and 2008h)
  16. */
  17. /* Configuration Byte 1 Options */
  18. #define _CONFIG1            0x2007
  19. #define _CP_ALL             0x1FFF
  20. #define _CP_OFF             0x3FFF
  21. #define _CCP1_RB0           0x3FFF
  22. #define _CCP1_RB3           0x2FFF
  23. #define _DEBUG_OFF          0x3FFF
  24. #define _DEBUG_ON           0x37FF
  25. #define _WRT_PROTECT_OFF    0x3FFF    /* No program memory write protection     */
  26. #define _WRT_PROTECT_256    0x3DFF    /* First 256 program memory protected     */
  27. #define _WRT_PROTECT_2048   0x3BFF    /* First 2048 program memory protected    */
  28. #define _WRT_PROTECT_ALL    0x39FF    /* All of program memory protected        */
  29. #define _CPD_ON             0x3EFF
  30. #define _CPD_OFF            0x3FFF
  31. #define _LVP_ON             0x3FFF
  32. #define _LVP_OFF            0x3F7F
  33. #define _BODEN_ON           0x3FFF
  34. #define _BODEN_OFF          0x3FBF
  35. #define _MCLR_ON            0x3FFF
  36. #define _MCLR_OFF           0x3FDF
  37. #define _PWRTE_OFF          0x3FFF
  38. #define _PWRTE_ON           0x3FF7
  39. #define _WDT_ON             0x3FFF
  40. #define _WDT_OFF            0x3FFB
  41. #define _EXTRC_CLKOUT       0x3FFF    /* EXTRC oscillator; CLKO function on RA6/OSC2/CLKO      */
  42. #define _EXTRC_IO           0x3FFE    /* EXTRC oscillator; Port I/O function on RA6/OSC2/CLKO  */
  43. #define _INTRC_CLKOUT       0x3FFD    /* INTRC oscillator; CLKO function on RA6/OSC2/CLKO      */
  44. #define _INTRC_IO           0x3FFC    /* INTRC oscillator; Port I/O function on RA6/OSC2/CLKO  */
  45. #define _EXTCLK             0x3FEF    /* EXTCLK; Port I/O function on RA6/OSC2/CLKO            */
  46. #define _HS_OSC             0x3FEE    /* HS oscillator                                         */
  47. #define _XT_OSC             0x3FED    /* XT oscillator                                         */
  48. #define _LP_OSC             0x3FEC    /* LP oscillator                                         */
  49.  
  50. /* Configuration Byte 2 Options */
  51. #define _CONFIG2            0x2008
  52. #define _IESO_ON            0x3FFF
  53. #define _IESO_OFF           0x3FFD
  54. #define _FCMEN_ON           0x3FFF
  55. #define _FCMEN_OFF          0x3FFE
  56.  
  57.  
  58.  
  59. /*
  60.    Configuration Word 1
  61.    (_CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF  & _PWRTE_ON & _WDT_OFF & _INTRC_IO)
  62. */
  63. #pragma config_reg  _CONFIG1
  64. #pragma config = 0x3F10        // Configuration word 1
  65.  
  66.  
  67. /*
  68.    Configuration Word 2
  69.    (_IESO_OFF & _FCMEN_OFF)
  70. */
  71. #pragma config_reg2  _CONFIG2



Después de compilar:

  cc5x.exe -dc -I"Include"  -a  blink.c

el resultado es un fichero *.HEX para programar y este fichero en ensamblador en el que puedes ver cómo se ha traducido todo:
Código: ASM
  1. ; CC5X Version 3.4B, Copyright (c) B Knudsen Data
  2. ; C compiler for the PICmicro family
  3. ; ************   1. Jul 2017  12:44  *************
  4.  
  5.         processor  16F88
  6.         radix  DEC
  7.  
  8.         __config 0x2007, 0x3F10
  9.  
  10. PORTA       EQU   0x05
  11. TRISA       EQU   0x85
  12. PORTB       EQU   0x06
  13. TRISB       EQU   0x86
  14. Zero_       EQU   2
  15. RP0         EQU   5
  16. RP1         EQU   6
  17. ADCON0      EQU   0x1F
  18. OSCCON      EQU   0x8F
  19. ANSEL       EQU   0x9B
  20. CMCON       EQU   0x9C
  21. i           EQU   0x20
  22.  
  23.         GOTO main
  24.  
  25.   ; FILE Lib\init_cpu.c
  26.                         ;/*
  27.                         ;  INITIALIZE PROCESSOR
  28.                         ;*/
  29.                         ;void init_cpu() {
  30. init_cpu
  31.                         ;   OSCCON = 0b01100110;  // 0, 110=4MHZ, 0=RUNNING FROM INTRC CLOCK, 1=STABLE FREQ, 10=INTRC CLOCK
  32.         MOVLW 102
  33.         BSF   0x03,RP0
  34.         BCF   0x03,RP1
  35.         MOVWF OSCCON
  36.                         ;   CMCON = 0b00000111;   // TURN OFF COMPARATORS
  37.         MOVLW 7
  38.         MOVWF CMCON
  39.                         ;  
  40.                         ;   PORTA = 0;
  41.         BCF   0x03,RP0
  42.         CLRF  PORTA
  43.                         ;   PORTB = 0;
  44.         CLRF  PORTB
  45.                         ;   ADCON0 = 0;           // DISABLE A/D CONVERTER
  46.         CLRF  ADCON0
  47.                         ;   ANSEL = 0;            // RA7..RA0    0=DIGITAL  1=ANALOG A/D
  48.         BSF   0x03,RP0
  49.         CLRF  ANSEL
  50.                         ;   TRISA = 0b00000000;   // RA7..RA0    0=OUTPUT   1=INPUT
  51.         CLRF  TRISA
  52.                         ;   TRISB = 0b11110000;   // RB7..RB0    0=OUTPUT   1=INPUT
  53.         MOVLW 240
  54.         MOVWF TRISB
  55.  
  56.   ; FILE 01_Blink.c
  57.                         ;/*
  58.                         ;  ENCIENDE Y APAGA TODAS LAS SALIDAS MENOS RB6 Y RB8 CADA  300.000 CICLOS
  59.                         ;*/
  60.                         ;#include "16F88.H"
  61.                         ;#include "int16CXX.H"
  62.                         ;#include "Lib\Config.h"
  63.                         ;#include "Lib\init_cpu.c"
  64.         RETURN
  65.                         ;
  66.                         ;#pragma config = 0x3F10   // Set config
  67.                         ;
  68.                         ;
  69.                         ;/*
  70.                         ;   Funcion de retardo
  71.                         ;*/
  72.                         ;void pause_ms(unsigned i) {
  73. pause_ms
  74.         BCF   0x03,RP0
  75.         BCF   0x03,RP1
  76.         MOVWF i
  77.                         ;   do {
  78.                         ;      W = 199;
  79. m001    MOVLW 199
  80.                         ;      do {
  81.                         ;         nop();
  82. m002    NOP  
  83.                         ;      } while (--W != 0);  // 1000 ciclos
  84.         ADDLW 255
  85.         BTFSS 0x03,Zero_
  86.         GOTO  m002
  87.                         ;   } while (--i != 0);
  88.         BCF   0x03,RP0
  89.         BCF   0x03,RP1
  90.         DECFSZ i,1
  91.         GOTO  m001
  92.                         ;}
  93.         RETURN
  94.                         ;
  95.                         ;
  96.                         ;
  97.                         ;/*
  98.                         ;  FUNCION PRINCIPAL. AQUI COMIENZA EL PROGRAMA
  99.                         ;*/
  100.                         ;void main(void)
  101.                         ;{
  102. main
  103.                         ;
  104.                         ;   init_cpu();
  105.         CALL  init_cpu
  106.                         ;
  107.                         ;   while(1) {
  108.                         ;      PORTB = 0xFF;
  109. m003    MOVLW 255
  110.         BCF   0x03,RP0
  111.         BCF   0x03,RP1
  112.         MOVWF PORTB
  113.                         ;      PORTA = 0xFF;
  114.         MOVLW 255
  115.         MOVWF PORTA
  116.                         ;      pause_ms(250);
  117.         MOVLW 250
  118.         CALL  pause_ms
  119.                         ;      PORTB = 0;
  120.         BCF   0x03,RP0
  121.         BCF   0x03,RP1
  122.         CLRF  PORTB
  123.                         ;      PORTA = 0;
  124.         CLRF  PORTA
  125.                         ;      pause_ms(250);
  126.         MOVLW 250
  127.         CALL  pause_ms
  128.                         ;   }
  129.         GOTO  m003
  130.  
  131.         END
  132.  
  133.  
  134. ; *** KEY INFO ***
  135.  
  136. ; 0x0001 P0   16 word(s)  0 % : init_cpu
  137. ; 0x0011 P0   13 word(s)  0 % : pause_ms
  138. ; 0x001E P0   16 word(s)  0 % : main
  139.  
  140. ; RAM usage: 1 bytes (1 local), 367 bytes free
  141. ; Maximum call level: 1
  142. ;  Codepage 0 has   46 word(s) :   2 %
  143. ;  Codepage 1 has    0 word(s) :   0 %
  144. ; Total of 46 code words (1 %)

Un saludo.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Consejos de como iniciarme en el C
« Respuesta #11 en: 01 de Julio de 2017, 08:41:19 »
La explicacion de KILLER es fantástica, lo unico que le agregaría es el lugar donde estan definidas todas las estructuras/macros/defines, con eso podrá ver que la hoja de datos coincide con esas definiciones y usarlas le resultará muy sencillo.

Saludos!
-
Leonardo Garberoglio

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re:Consejos de como iniciarme en el C
« Respuesta #12 en: 01 de Julio de 2017, 13:02:35 »
Hola a todos, gracias por los consejos, definitivamente me decantaré por XC8

KILLERJC, muy buena explicación, en un rato ya me pondré a estudiarla detenidamente y hacer (intentar) programar en el compilador

planeta9999, el libro tiene pinta de bueno, el problema es que está en ingles, y como mi ingles no es para nada bueno, pues tratando de aprender C y haciendo una mala traducción de ingles, imagina lo que puedo aprender....
Y es buen consejo el migrar a ARM, pero en esta Argentina que tenemos, pues conseguirlos es casi misión imposible. Ya es difícil conseguir los modelos básicos de PIC16 y 18

Geo, sin dudas le echaré una mirada a esos tutoriales.

planeta9999 Este parece buen libro, y google me hace una buena traducción, sin dudas lo tendré en cuenta para cuando tenga un poco más afianzados los conocimientos, no quiero mezclar XC8 con Mikroc, si no voy a tener un lío espectacular....

planeta9999, descargado de MEGA, sin dudas los PIC32 tienen ventajas con respecto a la gama baja/media, pero primero empecemos por lo más sencillo JAJAJA, con programar un 12F estoy feliz!!

manwenwe, ya e intentado con el CCS y no lo e logrado, lo vi muy complicado de entender, por eso me decanto por XC8. Descargué el libro que me indicaste, lo bueno es que está en castellano, lo leeré a ver que saco o aprendo. Buen consejo aprender el C de PC, y luego migrar, sin dudas estudiaré la posibilidad de hacerlo.

Picuino, no me gusta el CCS, por ahí es porque no se usarlo, pero e intentado y lo e visto muy complejo, y Arduino, pues en realidad a mi me gusta construir mis propias PCB's, por lo que no me gusta mucho la idea de usar arduino, aparte e recibido de regalo como 63 micros PIC de toda la gama, los cuales pretendo usar.

elgarbe, Y donde están definidas todas las estructuras/macros/defines? Seguro me sería de utilidad.

Nuevamente muchas gracias a todos, ahora me pondré a estudiar un poco y veré que dudas "saltan" y de seguro les estaré consultando.

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Consejos de como iniciarme en el C
« Respuesta #13 en: 01 de Julio de 2017, 14:01:57 »
elgarbe, Y donde están definidas todas las estructuras/macros/defines? Seguro me sería de utilidad.

Estan en los archivos .h que provee microchip, como te decia antes. En ASM uno acostumbra a buscar el archivo con el nombre del pic y usarlo, pero en XC8 tenes ese archivo xc.h que incluis al comienzo que hace que solo te incluya el microcontrolador que vos elegiste al momento de crear el proyecto. Ejemplo mas visual, buscando un archivo del pic16f887:

en ASM tenias algo asi:

p16f887.inc
Código: ASM
  1. ;==========================================================================
  2. ;
  3. ;       Register Definitions
  4. ;
  5. ;==========================================================================
  6.  
  7. W                EQU  H'0000'
  8. F                EQU  H'0001'
  9.  
  10. ;----- Register Files -----------------------------------------------------
  11.  
  12. ;-----Bank0------------------
  13. INDF             EQU  H'0000'
  14. TMR0             EQU  H'0001'
  15. PCL              EQU  H'0002'
  16. STATUS           EQU  H'0003'
  17. FSR              EQU  H'0004'
  18. PORTA            EQU  H'0005'
  19. PORTB            EQU  H'0006'
  20. PORTC            EQU  H'0007'
  21. PORTD            EQU  H'0008'
  22. PORTE            EQU  H'0009'
  23. PCLATH           EQU  H'000A'
  24. INTCON           EQU  H'000B'
  25. PIR1             EQU  H'000C'
  26. PIR2             EQU  H'000D'
  27. TMR1             EQU  H'000E'
  28. TMR1L            EQU  H'000E'
  29. TMR1H            EQU  H'000F'
  30. T1CON            EQU  H'0010'
  31. TMR2             EQU  H'0011'
  32. T2CON            EQU  H'0012'
  33. SSPBUF           EQU  H'0013'
  34. SSPCON           EQU  H'0014'

Para que tengas una idea de C, el EQU de ASM es lo mismo que el #define de C, me refiero que hace que si el compilador encuentra ese valor lo reemplaze por el numero, ejemplo

#define T1CON 0x0010

Si yo hago luego en el codigo T1CON + 1, el resultado de esa operacion es como si hubiera puesto 0x0010 + 1

XC8 utiliza por ahi algunas cosas un poco fuera de lugar, en cambio por ejemplo la mayoria de los ARMs crean archivos casi equivalentes de lo que ves en el de ASM pero realizado con #define, y estructuras a lo cual no me queria meter por ahora. Pero si buscas en la carpeta de xc8 vas a tener el archivo p16f887.h, el cual ya esta incluido gracias al xc.h

p16f887.h
Código: C
  1. // Register: PORTA
  2. extern volatile unsigned char           PORTA               @ 0x005;
  3. #ifndef _LIB_BUILD
  4. asm("PORTA equ 05h");
  5. #endif
  6. // bitfield definitions
  7. typedef union {
  8.     struct {
  9.         unsigned RA0                    :1;
  10.         unsigned RA1                    :1;
  11.         unsigned RA2                    :1;
  12.         unsigned RA3                    :1;
  13.         unsigned RA4                    :1;
  14.         unsigned RA5                    :1;
  15.         unsigned RA6                    :1;
  16.         unsigned RA7                    :1;
  17.     };
  18. } PORTAbits_t;
  19. extern volatile PORTAbits_t PORTAbits @ 0x005;

Esa parte es la unicamente lo del PORTA y la definicion de todos sus bits. Como ves se aleja mucho de lo que es la igualdad con ASM

Asi que creo que la idea es que no te metas por ahora con esto, ya que requiere que sepas sobre: Linkeado (Linkage) , Alcance (Scope), tiempo de vida de las variables (LifeTime), estructuras (struct), y encima sintaxis especial del compilador XC8 que no respeta el ANSI C, que si observas es ese arroba y la direccion.

Distinto de como te decia en algunos ARMs que solo utilizan estructuras y defines:

Código: C
  1. /******************************************************************************/
  2. /*                         Peripheral Registers Bits Definition               */
  3. /******************************************************************************/
  4. /******************************************************************************/
  5. /*                                                                            */
  6. /*                      Analog to Digital Converter (ADC)                     */
  7. /*                                                                            */
  8. /******************************************************************************/
  9. /********************  Bits definition for ADC_ISR register  ******************/
  10. #define ADC_ISR_AWD                          ((uint32_t)0x00000080)        /*!< Analog watchdog flag */
  11. #define ADC_ISR_OVR                          ((uint32_t)0x00000010)        /*!< Overrun flag */
  12. #define ADC_ISR_EOSEQ                        ((uint32_t)0x00000008)        /*!< End of Sequence flag */
  13. #define ADC_ISR_EOC                          ((uint32_t)0x00000004)        /*!< End of Conversion */
  14. #define ADC_ISR_EOSMP                        ((uint32_t)0x00000002)        /*!< End of sampling flag */
  15. #define ADC_ISR_ADRDY                        ((uint32_t)0x00000001)        /*!< ADC Ready */

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

Ademas de comenzar, lo mas importante y duro va a ser recordar que TODA instruccion termina con un punto y coma, a excepcion de los controles de flujo, Y vas a tenes que acostumbrarte a las llaves.
Las llaves indica que encierra cada operacion de control de flujo o lo que encierra la funcion, como para indicar el comienzo y el fin.

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

PD:

Tambien tenes:
http://www.todopic.com.ar/foros/index.php?topic=40649.0

Aunque no explica mucho da algunos codigos de ejemplo
« Última modificación: 01 de Julio de 2017, 14:51:50 por KILLERJC »

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Consejos de como iniciarme en el C
« Respuesta #14 en: 01 de Julio de 2017, 16:16:42 »
Lo que agregaría es que a veces es mejor comenzar en la PC para moverte a los PICs, AVR,ARM o el que quieras. Hay conceptos que puedes agarrar más rápido y aprendes técnicas que después puedes usar en los microcontroladores.

También por el hecho de que es xc8 está más de lado del ANSI C, cuanto te sientas cómodo te recomendaría dejar esa comodidad para que le des un vistazo a Make, ya que hay cosas que podrías probar directamente en la PC y después compilar para el PIC con tan sólo un comando:

Código: [Seleccionar]
make

o
Código: [Seleccionar]
make target

donde target es el nombre del PIC

O incluso también puedes ir mas lejos con make al realizar un make test y con asserts o con algún framework para realizar unit tests, de esta forma podrías eliminar bugs que te pudieran aparecer más adelante o verificar que los cambios que realices no rompan el sistema.

https://stackoverflow.com/questions/65820/unit-testing-c-code

Esto trae a colación también el uso de los tipos de datos, ya que su tamaño no es fijo y depende mucho de la plataforma, así que te vendría bien usar tipos como int8_t , uint8_t, int16_t , uint16_t,int32_t , uint32_t, para asegurar que siempre tengan el mismo tamaño independientemente de la plataforma.


 

anything