estamos pasando a la estructura encoder1 el dato del puerto y pin a trabajar por separado, ósea le decimos PORTB por el pin 0.
encoder1 es simplemente un puntero. Al usar IniciarEncoder le estamos dando la direccion de una estructura, en esa estructura va a tener guardado lo que le pasamos (es decir la informacion PORTB y el pin 0 ). encoder2 va a apuntar a otra estructura con los mismos campos pero con valores distintos de puerto y pin.
Pero, las funciones van a ser generales sea el pin que tengan.
Donde me estoy trabando ahora es en cómo puedo unir esos dos datos para que sea PORTBbits.RB0.
Eso lo definis en:
encoder1 = vIniciarEncoder(
&PORTB,0);
En ves de usar un #define, lo haces ahí... si queres cambiarlo solo tenes que modificar ese único lugar. Así como también lo harías con un #define, si quisiera modificar el pin deberías hacer algo así:
void vActivarSalida(myEncoder_t pEncoder)
{
*pEncoder->puerto |= pEncoder->mask;
}
void vToggleSalida(myEncoder_t pEncoder)
{
*pEncoder->puerto ^= pEncoder->mask;
}
void vApagarSalida(myEncoder_t pEncoder)
{
*pEncoder->puerto &= ~pEncoder->mask;
}
uint8_t uValorEntrada(myEncoder_t pEncoder)
{
return (*pEncoder->puerto & pEncoder->mask);
}
Recorda que lo que pasamos es un puntero a la estructura, por lo tanto por eso tenemos el "->" para poder acceder a la estructura.
En la estructura tenemos 2 cosas... un PUNTERO al puerto y la mascara que la generamos sabiendo el numero del pin cuando lo inicializamos.
Entonces:
pEncoder->puerto = puntero del puerto, en caso de los PIC16 el PORTB es 0x06 (su dirección)
*(pEncoder->puerto) = contenido del puerto , el operador "->" posee una mayor precedencia que el "*", por eso puedo escribirlo sin paréntesis.
La mascara es un valor de 8bits, que generamos antes, si pusimos que nuestro pin era el 3, mask queda con el valor: 0000 1000
Por lo tanto, si hacemos:
- una OR, lo ponemos a 1 a ese pin nomas
- una XOR, hacemos un toggle de ese pin
- una AND con su negado, apagamos el pin
Y deje ahi una funcion por si tu idea es leerlo.
----------------------------------------------------
si la idea es generar un driver para el encoder, cuando lo "inciializas" tambien podrias modificar los TRIS
Tambien podrias agregar otros campos mas a la estructura en caso de querer agregar los pines A,B, y el 3er pin que es el switch.
Infinitas posibilidades..
----------------------------------------------------
PD: Me acabo de dar cuenta que al simulador del MPLAB no le gusta nada esta forma de programar jeje, no te reconoce ningun valor.