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:
#include <xc.h>
void main(void)
{
while(1)
{
}
}
Que su equivalente en ASM seria:
ORG 0x00
GOTO SETUP
ORG 0x04
RETURN
INICIALIZACION:
; Aca codigo
MAIN:
LOOP:
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
#include <xc.h>
void main(void)
{
//Aca configuro todos los modulos del PIC y se ejecuta una ves
while(1)
{
//Este es el loop infinito, ya que siempre se cumple la condicion al ser distinta de 0
//Aca se ejecuta continuamente.
}
}
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%2BSolo 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:
BANKSEL TRISA ; Cambiar de banco
MOVLW 0x01 ; Poner el valor en W
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:
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:
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
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
#include <xc.h>
#define _XTAL_FREQ 4000000
void main(void)
{
//Aca configuro todos los modulos del PIC y se ejecuta una ves
TRISB = 0;
while(1)
{
//Este es el loop infinito, ya que siempre se cumple la condicion al ser distinta de 0
//Aca se ejecuta continuamente.
PORTBbits.RB0 = 1;
_delay_ms(250);
PORTBbits.RB0 = 0;
_delay_ms(250);
}
}
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.