-
Notifications
You must be signed in to change notification settings - Fork 0
/
DropperDriver.h
148 lines (107 loc) · 4.2 KB
/
DropperDriver.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*### INCREMENTAL-ENCODED GEARMOTOR DROPPER DRIVER ###
Contacto: [email protected]
Desarrollador: Gabriel I. Vázquez
Creación: 12/08/19
Licencia:
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
**/
/* Traducciones del compilador */
// Estados lógicos
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define INPUT 1
#define OUTPUT 0
// Tiempos de retraso
#define TLCD 1000
#define TGEN 500
#define TWAIT 5
/* Variables globales */
unsigned char prevCountVal = 0;
unsigned char countStart = 235;
unsigned char slotNumber = 1;
unsigned short int runningInfo = 0;
// Subrutina de reestablecimiento del contador
void Dropper_ResetCount(){
// Asignar valores de inicio
TMR0L = countStart;
prevCountVal = countStart;
// Limpiar indicador de desborde de TMR0
INTCON.B2 = FALSE;
}
// Subrutina de configuración inicial del dispensador
void Dropper_Init(){
/* ### Establecer la dirección de I/O de los puetos ### */
// Puerto A:
TRISA.B4 = INPUT; // Entrada en RA4 (T0CKI)
// Puerto B:
TRISB = TRISB & 0b11000000; // Salidas en RB0 - RB5 (Activadores)
// Puerto C:
TRISC.B2 = OUTPUT; // Salida en RC2 (CCP1/PWM1)
/* ### Establecer configuraciones de lectores análogos ### */
// Apagado del módulo A/D
ADCON0.B0 = FALSE;
// Establecer todo el módulo A/D como D
ADCON1 = ADCON1 | 0b00001111;
/* ### Establecer configuraciones del moduo PWM ### */
// Inicializar PWM1 a 10KHz
PWM1_Init(10000);
// Establecer ciclo de trabajo en 75%
PWM1_Set_Duty(192);
// Mantener el PWM apagado
PWM1_Stop();
/* ### Establecer configuraciones de la interrupción ### */
// Activación de Timer 0 como contador en RA4, con flanco de caida, modo 8bit y sin preescalador
T0CON = T0CON | 0b11111000;
// Limpieza de memoria para el Timer1
Dropper_ResetCount();
}
// Subrutina para establecer el valor inicial del contador en 255-N para usar N cuentas al desborde de interrupción
void Dropper_SetRevLimit(unsigned char MaxCount){
countStart = 255 - MaxCount;
Dropper_ResetCount();
} // 20 cuentas por default (1 revolucion para encoders con 20 divisiones).
// Subrutina para disparar el funcionamiento de determinado motor en la matriz
void Dropper_Activate(unsigned char ColumnX, unsigned char RowY){
// Activar GIE, PEIE y TMR0E
INTCON = INTCON | 0b11100000;
// Determinar posición por habilitar mediante función "3(y-1)+x"
slotNumber = (( (3*(RowY-1)) ) + ColumnX);
// Apagar habilitaciones previas
LATB = 0x00;
// Determinar la salida digital a habilitar
switch (slotNumber){
case 1: LATB.B0 = HIGH; break; // Slot 11
case 2: LATB.B1 = HIGH; break; // Slot 12
case 3: LATB.B2 = HIGH; break; // Slot 13
case 4: LATB.B3 = HIGH; break; // Slot 21
case 5: LATB.B4 = HIGH; break; // Slot 22
case 6: LATB.B5 = HIGH; break; // Slot 23
default : LATB = 0x00 break; // Sin activación
}
// Arranque del motor con amortiguación de cambios
Delay_ms(TWAIT);
PWM1_Start();
}
// Subrutina de acción en interrupción de Timer1
void interrupt (void){
// Apagado de GIE y Timer1 en espera de una nueva instrucción de habilitación
INTCON = INTCON & 0b00011011;
// Salva de estado de memoria volatil en memoria local
runningInfo = STATUS;
// Apagado de motor activo y habilitaciones
PWM1_Stop(); LATB = 0x00;
// Reestablecimiento de estado de memoria volatil y cuenta de revoluciones
STATUS = runningInfo;
Dropper_ResetCount();
}