TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Chaly29 en 30 de Junio de 2017, 19:21:36

Título: Consejos de como iniciarme en el C
Publicado por: Chaly29 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.

 
Título: Re:Consejos de como iniciarme en el C
Publicado por: KILLERJC 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.

Título: Re:Consejos de como iniciarme en el C
Publicado por: AngelGris en 30 de Junio de 2017, 21:51:23
 ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) Excelente sinopsis
Título: Re:Consejos de como iniciarme en el C
Publicado por: planeta9999 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.


(https://images-na.ssl-images-amazon.com/images/I/41FNAJSE4SL._SX311_BO1,204,203,200_.jpg)



Título: Re:Consejos de como iniciarme en el C
Publicado por: KILLERJC 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.
Título: Re:Consejos de como iniciarme en el C
Publicado por: Geo 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.
Título: Re:Consejos de como iniciarme en el C
Publicado por: planeta9999 en 01 de Julio de 2017, 03:39:38
.

Otro tutorial online, este de Mikroe, bastante completo.
https://learn.mikroe.com/ebooks/piccprogramming/chapter/introduction-to-the-world-of-microcontrollers/


(https://cdn.mikroe.com/ebooks/sites/3/2016/02/21151552/pic-microcontrollers-programming-in-c-opt1.jpg)
Título: Re:Consejos de como iniciarme en el C
Publicado por: planeta9999 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

Título: Re:Consejos de como iniciarme en el C
Publicado por: manwenwe 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.

Título: Re:Consejos de como iniciarme en el C
Publicado por: Picuino 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.
Título: Re:Consejos de como iniciarme en el C
Publicado por: Picuino 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.
Título: Re:Consejos de como iniciarme en el C
Publicado por: elgarbe 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!
Título: Re:Consejos de como iniciarme en el C
Publicado por: Chaly29 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.

Título: Re:Consejos de como iniciarme en el C
Publicado por: KILLERJC 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
Título: Re:Consejos de como iniciarme en el C
Publicado por: tsk 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.
Título: Re:Consejos de como iniciarme en el C
Publicado por: AngelGris en 01 de Julio de 2017, 18:08:45
  Hola Carlos. Aquí en el foro de C tienes un "Mini curso programación en XC8".
  Si bien el libro que te recomienda planeta está en ingles, es bastante sencillo de entender. Incluso te diría que más fácil que muchas traducciones que andan dando vueltas.
Título: Re:Consejos de como iniciarme en el C
Publicado por: EdoNork en 02 de Julio de 2017, 03:11:38
Nunca he encontrado un libro decente de programación de microcontroladores en C++. Y eso sí que me atrae.
Título: Re:Consejos de como iniciarme en el C
Publicado por: Picuino en 02 de Julio de 2017, 05:55:03
La biblia para aprender C sigue siendo el libro que escribieron sus creadores:
El Lenguaje de Programación C, de Kernighan y Ritchie

Si buscas por internet puedes encontrarlo con facilidad.

Saludos.
Título: Re:Consejos de como iniciarme en el C
Publicado por: EdoNork en 02 de Julio de 2017, 05:57:34
El C moderno, y sobre todo la forma de utilizarlo, ha evolucionado bastante desde ese libro.
Título: Re:Consejos de como iniciarme en el C
Publicado por: manwenwe en 02 de Julio de 2017, 06:34:22
La biblia para aprender C sigue siendo el libro que escribieron sus creadores:
El Lenguaje de Programación C, de Kernighan y Ritchie

Si buscas por internet puedes encontrarlo con facilidad.

Saludos.

+1.

Lo puse más arriba. Lo vuelvo a poner:

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

Saludos.
Título: Re:Consejos de como iniciarme en el C
Publicado por: Chaly29 en 08 de Julio de 2017, 06:45:18
Hola colegas, pues acá estoy para agradecerles, y sencillamente porque gracias a su ayuda, e logrado hacer un a par de programas por mis propios medios, por supuesto estos programas son básicos, pero por fin puedo decir que e programado "algo" en C, y sobre todo, e conseguido entender la idea básica de como configurar un PIC, iniciar un programa y por ahora algunos comandos sencillos. Cosa que antes no podía entender.

Pues ahora que entiendo por lo menos lo mínimo, no pareciera que el C fuera tan complejo, antes me parecía una cosa imposible.

Muchas gracias a todos, y de seguro, más adelante estaré molestando con nuevas dudas.

Un saludo.

Atte. CARLOS.

Título: Re:Consejos de como iniciarme en el C
Publicado por: manwenwe en 08 de Julio de 2017, 07:07:54
Grande!!! ((:-))

Mira que te lo decíamos que no era complejo para nada :lol:. Y además es universal. Me refiero a que aunque a 90% de los informáticos de carrera les de grima usar C porque les parece de muy bajo nivel, para los electrónicos es perfecto ya que no es tan lento de programar como ensamblador (más bajo nivel) ni tan abstracto como los lenguajes modernos de alto nivel con lo que nunca pierdes de vista el hardware. 45 años después estará casi obsoleto en PC y web pero vive su mejor época en electrónica: miles de millones de dispositivos programados en C (o C++): la mayoría de dispositivos basados en micrcontroladores y los que llevan linux (moviles, tablets, cuadros de mando de coches, cartelería, etc.)

Como eres una persona metódica seguro que en poco programas fenomenal!

Saludos.
Título: Re:Consejos de como iniciarme en el C
Publicado por: Chaly29 en 08 de Julio de 2017, 07:46:43
Gracias Manuel, todo esto por culpa tuya  :D :D :D :D

Un saludo.

Atte. CARLOS.

Título: Re:Consejos de como iniciarme en el C
Publicado por: manwenwe en 08 de Julio de 2017, 08:18:40
todo esto por culpa tuya  :D :D :D :D

Si me dieran 1$ por cada vez que me dicen eso no tendría que levantarme para ir a trabajar... :D
Título: Re:Consejos de como iniciarme en el C
Publicado por: Picuino en 09 de Julio de 2017, 19:50:42
También a los informáticos les gusta bastante eso del C:
Sistemas operativos como Windows, Linux, OSX, aplicaciones de escritorio como Word o Excel, lenguajes de programación como Python, PHP, Ruby, lectores de documentos como Adobe Acrobat Reader, tratamiento gráfico como Photoshop, navegadores como Firefox o Chrome, todos ellos son programas escritos en C.

Saludos.
Título: Re:Consejos de como iniciarme en el C
Publicado por: manwenwe en 10 de Julio de 2017, 04:51:40
Perdón por generalizar. Es lo que he visto en mi entorno, estoy rodeado de muchos y la mayoría se dedican a web con lo que el dia  a dia es PHP, html5, javascript, CCS, angular, etc.

Igual es sólo mi impresión pero tengo la idea preconcebida que en España hay mucha más gente desarrollando web y apps para dispositivos móviles que software para PC/MAC.

Ya digo que es solo mi impresión y quizá esté equivocado....
Título: Re:Consejos de como iniciarme en el C
Publicado por: tsk en 10 de Julio de 2017, 11:51:01
Perdón por generalizar. Es lo que he visto en mi entorno, estoy rodeado de muchos y la mayoría se dedican a web con lo que el dia  a dia es PHP, html5, javascript, CCS, angular, etc.

Igual es sólo mi impresión pero tengo la idea preconcebida que en España hay mucha más gente desarrollando web y apps para dispositivos móviles que software para PC/MAC.

Ya digo que es solo mi impresión y quizá esté equivocado....

Según el indice TIOBE primero esta Java, después C y enseguida C++, entre los más usados. Entre los tres cubren el 26.67%

https://www.tiobe.com/tiobe-index/

Aunque a partir del 2016 su uso se ha reducido según ese índice. Probablemente porque todo se esta moviendo a "la nube" y con la potencia de los ordenadores actuales, hay muchas aplicaciones que no justifican el desarrollarlas en estos lenguajes.

Si nos vamos a las estadísticas de github, el primero es Javascript, dejando a java en el segundo puesto y a C++ y C en los puestos 7 y 8 respectivamente.

http://githut.info/

Tanto C con C++ se esta quedando en el lado oculto del servidor donde se requiere desempeño. Si buscas el código fuente
 de sistemas que se usan en "la nube" y bases de datos, están hechos en C o C++. Por ejemplo mongodb,  redis, memcached, php, nodejs,  o el mismo sistema operativo donde se ejecutan todas esas herramientas están hecho en C o C++.
Título: Re:Consejos de como iniciarme en el C
Publicado por: KILLERJC en 10 de Julio de 2017, 12:18:49
De todas formas pienso que C/C++ va a tener mucho tiempo en el mundo de los microcontroladores.

Como dicen el mundo de la PC varia y bastante, sale un nuevo lenguaje cada poco tiempo. Y el mayor consumo es la Web, tanto Front-End ( JS, CCS) como Back-End ( SQL, Java, etc).

Pero para la parte de Electronica. No hay reemplazante inmediato de C/C++, provee una buena potencia de lenguaje respecto a la potencia que poseen los microcontroladores.

Lo que si me sorprende en TIOBE es que ASM se encuentre tan alto. Ya que no veo donde se encuentra la aplicacion para esto. Todo de la PC sinceramente minimo es C no creo que ni se gasten en usar ASM por ejemplo para la UEFI ahora. Lo unico que queda son los microcontroladores, y que a no ser las familias mas chicas se programan en C sin problemas. No se en que aplicaran ASM. Y desde el 2015 en adelante incremento. Lo cual aun es mas insensato.
Cuando busque , dicen que es por los dispositivos IoT, pero no creo que nadie use ASM para hacer el stack TCP/IP

PD: El otro dia desarme un microondas realtivamente actual whirpool y me encontre con un micro de 4bits :P
Título: Re:Consejos de como iniciarme en el C
Publicado por: Chaly29 en 16 de Julio de 2017, 14:55:50
Hola Gente, acá nuevamente con una nueva consulta. Comento que estoy intentando hacer un programita, que consta de lo siguiente:

Tomo el valor capturado (1 byte) por un conversor A/D
Con el valor anterior ir a una tabla y retornar con un valor XXX (1 byte)
Con el valor de retorno introducirlo en el TMR para generar el duty de un PWM.

Hasta ahora casi todo perfecto, estoy trabajando con un PIC16F88, logre configurarlo con éxito, el A/D funciona perfecto y el PWM también, esto lo e comprobado ya que tomando el valor del A/D y colocándolo en el TMR el duty varia como debe.

El problema se presenta con la bendita tabla, no logro tomar el valor del A/D para con este ir a la tabla y retornar con el valor adecuado para introducirlo al TMR.

Serían tan amables de indicarme como debo de hacer esto?

Desde ya muchas gracias.

Un saludo.

Atte. CARLOS.
Título: Re:Consejos de como iniciarme en el C
Publicado por: KILLERJC en 16 de Julio de 2017, 16:18:34
De hacerlo con una tabla ( realizado con un array en C, deberia quedarte asi), voy a suponer que son 8 bits, porque decis 1 byte, lo que entrega el ADC

Código: C
  1. const uint8_t tabla[256] = { xx,xxx,xx,xx,xx,xx,xx,x,xx,xx, etc}; // Esto lo pones bien arriba, que sea global
  2.  
  3. //Lo que sigue dentro de tu programa.
  4.  
  5. // Aca conversion del ADC
  6. PR2 = tabla[ADRESL];  //<- Utiliza el valor del ADC como indice de la tabla, el valor resultado va al PR2

El const de tabla es para ponerlo en la FLASH (Program Memory), sino estarias intentando reservar el lugar para la tabla en la RAM (Data Memory).
el uint8_t es lo mismo que unsigned char ( La nomclatura que use es de unsigned integer 8 bit )

Consejo sobre los arrays
Lo unico que tenes que asegurarte es que SI o SI lo que pongas de indice, exista en el array. Si tenes un array de 10 elementos, y usas un indice de 20, el compilador C no te va a decir que te pasaste, Y seguramente tengas error en lo que pienses hacer, asi que siempre asegurate de que los indices se cumplen, e implementar limites si es que se necesita. En este ejemplo si detecto un indice mayor a 9 ( los 10 elementos van de 0 a 9 ) o aviso que hay un error o uso un valor de indice definido ejemplo 9.

Aclaracion sobre el tamaño maximo de los arrays en FLASH:
Estos tamaños son impuestos por el compilador.

En los PICs de instrucciones de 12-bit ( baseline ) y que usabas RETLW para guardar algo en la FLASH el tamaño esta limitado a 255 elementos. Pero podes tener varias variables, lo cual no te acomplejaria en nada.
En los demas PICs no hay limitaciones, solo las impuestas por el tamaño de la FLASH obviamente
Título: Re:Consejos de como iniciarme en el C
Publicado por: EdoNork en 16 de Julio de 2017, 16:47:42
Lo suyo es comprobar antes de leer el array que el índice cae dentro de sus límites.
Título: Re:Consejos de como iniciarme en el C
Publicado por: Chaly29 en 18 de Julio de 2017, 23:14:46
Hola KILLERJC, muchas gracias por la explicación, ya hice las modificaciones necesarias el programa y por lo menos compilo correctamente. Ahora faltaría probar si en la realidad funciona como debe. Ya estaré comentando.

Muchas gracias y un saludo.

Atte. CARLOS.