bueno ya he hecho mi primer codigo para etpu, me ha costado porque no me funcionaba bien hasta que he descubierto porque xD, es simple, un simple pwm de 4khz a 50% era simplemente para probar.
Pongo el codigo:
void FUNC(int24 var) {
if(hsr==FUNC_HSR_INIT) { //HOST pide inicializar
SetPinLow();
SetChannelMode(em_nb_dt); //non blocking + double
SetupMatch_A(tcr1+10000,Mtcr1_Ctcr1_ge,low_high);
SetupMatch_B(erta+5000,Mtcr1_Ctcr1_ge,high_low);
} else if(MatchB) { //interrupcion para el matchB = poner en low
SetupMatch_B(ertb+10000,Mtcr1_Ctcr1_ge,high_low);
Clear(MatchBLatch);
} else if(MatchA) { //interrupcion para el matchA = poner en high
SetupMatch_A(erta+10000,Mtcr1_Ctcr1_ge,low_high);
Clear(MatchALatch);
} else { //por defecto
ClearAllLatches();
}
}
Aunque a simple vista parezca "simple" es mas complejo de lo que aparenta, el etpu trabaja por codificacion en las funciones, si os fijais los "else if" a esto se les indica una serie de registros, cuando esos registros coinciden entonces hace determinada "tarea" lo que esta en los parentesis, el caso es que directamente llega a la parte del codigo necesaria, no se pone a testear, testear y encontrar, simplemente crea una tabla donde los datos estan codificados segun los registros por ejemplo: x01xxx y salta directamente al codigo. Otra cosa a añadir es que como anteriormente decia el etpu va paralelo a la CPU por lo cual aunque yo ponga en pause el debug en la cpu el etpu sigue funcionando, desconozco la forma de debugear el etpu, se que en el codewarrior etpu me deja simularlo pero no he conseguido debugearlo directamente del micro.
Todas las funciones que veis son macros, al final se traducen en unas pocas instrucciones en asm, como por ejemplo:
SetupMatch_A(val/reg,x,attribute);
movei ert_a, <ert_val\reg>
tbs_b.ge.c2.m1
opac_a.<opac_attribute>
erw_a clr mrl_a mtd.ena
Las funciones en asm para microcode no tienen nada que ver con las de la CPU, en este caso las del microcode hacen mas operaciones en una instruccion.