Reporte del sensor hcsr 04 implementado con un pic 16f84a y monitoreado con Labview. Lo subi porque este sensor ya es común en MÉXICO y pueden ocupar esta información para proyectos escolares...
1. DISEÑO E IMPLEMENTACIÓN DE UN
SENSOR DE NIVEL ULTRASÓNICO
(HC-SR04)
65
985
986
987
988
989
990
991
992
993
994
129
130
UATX
2. OBJETIVOS
1. Diseñar e implementar un sensor de nivel, para medir el nivel de agua
de un tanque.
2. Monitorear dicho sensor con el software LABVIEW.
Figura C.: Sensor de nivel monitoreado por LabView.
66
995
996
997
998
999
1000
1001
1002
131
132
UATX
3. MATERIAL
El material que se utilizó se enlista a continuación:
1. Un microcontrolador PIC16F84A.
Figura C.: PIC16F84A
2. Un push-boton.
Figura C.: Push-botton.
3. Una resistencia de 10k ohms y una de 100 ohms, ¼ WATT.
Figura C.: Resistencias.
4. Un cristal de 4Mhz.
Figura C.: Cristal de 4Mhz.
5. 2 capacitores de 33pF.
67
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
133
134
UATX
4. Figura C.: Capacitores de 33pF.
6. Un circuito integrado MAX232.
Figura C.: CI MAX232
7. 5 capacitores de 1uF y uno de 10uF.
Figura C.: Capacitor de 1uF.
8. Un regulador de voltaje L7805CV.
Figura C.: Regulador de voltaje.
9. Tres borneras para PCB dobles.
68
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
135
136
UATX
5. Figura C.: Borneras para PCB.
10. Un cable USB-SERIAL.
Figura C.: Cable USB-Serial marca STEREN.
11. Una conexión DB9 hembra.
Figura C.: Conexión DB9 HEMBRA
12. Una placa fenólica de 5cmx5cm.
Figura C.: Placa fenólica de 5cmX5cm.
13. Un módulo ultrasónico HC-SR04.
69
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
137
138
UATX
6. Figura C.: Módulo Ultrasónico HC-SR04.
14. Un cargador para celular de 5V.
Figura C.: Cardador para celular.
15. Una computadora con LABVIEW 2010.
Figura C.: Computadora con LABVIEW 2010.
70
1044
1045
1046
1047
1048
1049
1050
1051
1052
139
140
UATX
7. DESARROLLO
DISEÑO, SIMULACIÓN E IMPLEMENTACIÓN DE UNA INTERFAZ
ELECTRÓNICA: SENSOR-COMPUTADORA.
Figura 0.: Bloques del diseño electrónico.
En la figura 17 se muestran los bloques que componen la interfaz
electrónica de los cuales la computadora y el cable USB-serial solo se
tienen que conectar, el diseño de demás bloques se describen a
continuación:
SENSOR ULTRASÓNICO
71
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
141
142
UATX
8. Figura 0.: Sensor ultrasónico HC-SR04
Como sensor ultrasónico se utilizó un Módulo Ultrasónico modelo
HC-SR04 el cual permite medir distancias de 2cm a 450cm sin hacer
contacto con ellos. Su funcionamiento consiste disparar una ráfaga de
ultrasonidos de 40 khz y capturando el eco que estas producen dicho módulo
produce una señal proporcional a la distancia.
Las características del Módulo Ultrasónico son:
1. Voltaje de trabajo (VCC): 5V.
2. Consumo de corriente: menor a 2mA.
3. Señal de salida TTL.
4. Angulo de medición: menor a 15°.
5. Resolución: 0.3 cm.
6. Señal de entrada para activación (TRIG): un pulso de por lo menos
10us.
7. Señal de salida (ECHO): TTL.
Pines de conexión:
1. VCC
2. TRIGGER
3. ECHO
4. GND
72
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
143
144
UATX
9. Figura 0.: Pines de conexión
Figura 0.: Diagrama de tiempo
Para hacer funcionar este sensor primero se debe alimentar a 5V,
después se ingresa a través del pin TRIG un pulso no menor de 10us, el
módulo enviará 8 pulsos TTL a una frecuencia de 40 khz, si encuentra un
obstáculo el pin de salida ECHO mostrará un pulso en alto proporcional a la
distancia. La fórmula para calcular la distancia es:
73
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
145
146
UATX
10. Ecuación : Calcular la distancia en centímetros.
distancia (cm)=
tiempoenaltoenus( pin ECHO)
58.82us
Para evitar medidas erróneas el objeto debe tener una superficie lisa
y no debe ser menor a 0.5 m2
, pero en este caso el agua prácticamente
rebota las ondas ultrasónicas.
MICROCONTROLADOR PIC16F84A
El microcontrolador PIC16f84A de la marca Microchip tiene las siguientes
características:
• Frecuencia de oscilación de 4Mhz.
• Alimentación de 5V DC.
• Tiene 18 pines.
• Un puerto A con 5 lineas de entrada/saida.
• Un puerto B con 8 lineas de entrada/saida.
• Cada pin puede proporcionar hasta 20mA.
• Las instrucciones se ejecutan en 1 ciclo.
• Conjunto de instrucciones reducido, RISC (35 instrucciones).
• Incluye también un módulo de memoria para programa y una
memoria auxiliar para datos del tipo EEPROM, por si falla la
alimentación.
• Entradas multiplexadas para interrupciones y el
contador/temporizador.
Figura 0.: PIC16F84A.
74
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
147
148
UATX
11. PROGRAMACIÓN DEL MICROCONTROLADOR
Para detectar el ancho de pulso proveniente del módulo ultrasónico,
se utilizó la interrupción por cambio de flanco del PIN B0. Esto quiere decir
que cuando ocurra un cambio de flanco ya sea de cero volts a cinco volts o
de cinco volts a cero volts por el PIN B0, el microcontrolador suspenderá
cualquier operación que esté realizando para ejecutar la rutina previamente
programada cada vez que ocurra una interrupción.
Para medir el tiempo en alto del PIN B0 se utilizó el único TIMER del
microcontrolador. El TIMER de este microcontrolador es de 8 bits (00h a FFh)
y puede contar hasta 255 (28
=256); si se configura el TIMER con oscilación
interna, el TIMER incrementará cada 1us esto da como resultado un contador
de 255us.
Pero 255us no es suficiente ya que el ancho de pulso a medir llega
hasta 26,469 us aproximadamente (Ecuación 2 y 3), por lo que se configuró
el TIMER_0 con una escala de 1:256, entonces el TIMER_0 se incrementará
cada 255 us dando un valor máximo de 65,535 us que es un valor aceptable
para este proyecto.
Ecuación : Calcular el tiempo en alto proporcional a la distancia.
distancia (cm)∗58.82us=tiempo enaltoenus( pin ECHO)
Ecuación : Cálculo del tiempo en alto proporcional a 4.5m
450cm∗58.82us=26,469us
Según el párrafo anterior si se tuviera un TIMER de 16 bits (65,536 us)
configurado con una escala de 1:1 sería suficiente para medir una distancia
4.5m (26,469 us). Pero como el PIC16F84A solo tiene un TIMER de 8bits se
configuró con una escala de 1:256, esto permitió medir unidades de 4.33cm
(Ecuación 4) pero no se puede medir distancias menores a 4.33cm por eso
se volvió a configurar el TIMER_0 con una escala de 1:1 para medir unidades
milimétricas (1us); por último se sumaron las mediciones obtenidas con las
escalas de 1:256 y 1:1 para así obtener una medición exacta.
75
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
149
150
UATX
12. Ecuación : Cálculo de unidades en distancia con escala de TIMER_0 a 1:256.
distancia (cm)=
tiempoenaltoenus( pin ECHO)
58.82us
=
255us
58.82us
=4.33cm
Por ejemplo una distancia de 10cm equivale a 588.2us (Ecuación 2),
el TIMER_0 a una escala de 1:256 devolverá un 2; el TIMER_0 a una escala de
1:1 devolverá un valor de 78; ahora si sumamos los valores del TIMER_0 a
escalas de 1:255 y 1:1 nos devolverá el microcontrolador un valor de 588us
(Ecuación 5) que es una medición correcta.
Ecuación : Calculo de microsegundos a 10cm.
78us+(2∗255us)=78us+510us=588us
Cuando el PIC16F84A envía un pulso de aproximadamente 10us al
MÓDULO ULTRASÓNICO, este módulo produce 8 pulsos a una velocidad de
40 kHz, si encuentra un obstáculo produce una salida en alto proporcional a
la distancia (PIN ECHO), esta señal es capturada y procesada por el
PIC16F84A
El diagrama de flujo de la figura 22 contiene la secuencia que se
siguió para programar el PIC16F84A. El Anexo 1 contiene el programa en C,
el cual se compiló con el software PIC C Compiler versión 4.068.
76
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
151
152
UATX
13. Figura 0.: Diagrama de flujo correspondiente a la programación del PIC16F84A.
77
1176
1177
153
154
UATX
14. INTERFÁZ TTL-RS232
El circuito integrado MAX232 convierte los niveles de las líneas de un
puerto serie RS232 a niveles TTL y viceversa. Lo interesante es que sólo
necesita una alimentación de 5V, ya que genera internamente algunas
tensiones que son necesarias para el estándar RS232. Otros integrados que
manejan las líneas RS232 requieren dos voltajes, +12V y -12V.
Figura 0.: Configuración del CI MAX232.
En la figura anterior se puede observar la forma más usual para
conectar el circuito MAX232, en donde a todos los capacitores se les asignó
un valor de 1uF. Se conectaron los pines 17 y 18 del PIC con los pines 11 y 12
del MAX232, y los pines 14 y 13 del MAX232 con los pines 2 y 3 del conector
DB9 como se observa en la figura 24.
78
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
155
156
UATX
16. Figura 0.: Cable USB-SERIAL
SIMULACIÓN DEL CIRCUITO
La simulación de la circuitería se realizó con el software Proteus 7.7.
En dicha simulación no se incluyó el módulo ultrasónico ya que no está
incluido en las librerías de Proteus, pero en su lugar se utilizó un generador
de funciones para simular la salida ECHO del módulo ultrasónico.
En la figura 27 se representa la simulación de la circuitería, la cual se
describe a continuación:
1. Para el oscilador se utilizó un cristal de 4Mhz y 2 capacitores
de 33pF. Para evitar confusión con el cableado en la simulación,
se utilizaron 2 nodos (OSC1 Y OSC2) conectados a los pines 15 y
16 del microcontrolador.
2. Para el reset, se utilizó una resistencia de 10k ohms y un
push-boton. Mientras el push-boton esté abierto el
microcontrolador trabajará normalmente. El nodo que se utlilizó
es el RST conectado al pin 4 del microcontrolador.
3. Se utilizaron 2 instrumentos virtuales, un generador de onda
y un osciloscopio. Con el generador de onda se genera un
pulso en similar al que genera el módulo ultrasónico y con el
osciloscopio se visualizan 2 señales, una correspondiente al
generador de onda y la otra corresponde a los pulsos de 10us
que genera el microcontrolador por el pin B1.
4. También se simuló el circuito MAX232 con sus capacitores de
1uF, el cual está conectado al PIC16F84 y a un conector DB9
hembra. Por el pin 11 recibe una señal TTL la convierte a RS232
por el pin 14, igualmente por el pin 13 recibe una señal RS232 y
la convierta a TTL por el pin 12.
5. Para conector DB9 hembra, el pin 5 está conectado a tierra, el
pin 2 es para recepción de datos y el pin 3 es para transmisión
80
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
159
160
UATX
17. de datos. Los puentes son opcionales, mientras que los demás
pines no se utilizan.
6. En la parte inferior aparecen 2 terminales virtuales, una
terminal es para enviar datos al PIC (simulando a la
computadora) y la otra terminal es para visualizar los datos
provenientes del PIC.
A
B
C
D
R_BUTOON
100
OSC1/CLKIN
16
RB0/INT
6
RB1
7
RB2
8
RB3
9
RB4
10
RB5
11
RB6
12
RB7
13
RA0
17
RA1
18
RA2
1
RA3
2
RA4/T0CKI
3
OSC2/CLKOUT
15
MCLR
4
16F84A
PIC16F84A
XTAL_4M
CRYSTAL
33PF_2
33pF
33PF_1
33pF
OSC1
OSC2
OSC1
OSC2
OSCILADOR
RST
RST
RESET
B6
MAX232
RXD
RTS
TXD
CTS
RXD
RTS
TXD
CTS
OSCILOSCOPIO
SIMULA LA TRANSMISIÓN DE DATOS DE LA COMPUTADORA
SIMULA LA RECEPCIÓN DE DATOS DE LA COMPUTADORA
OUT_PIC
OUT_PIC
IN_PIC
IN_PIC
ECHO
ECHO
TRIG
TRIG
LED
LED
R_LED
100
LED
LED-BLUE
AM FM
+
-
GENERADOR DE ONDA
ECHO
T1IN
11
R1OUT
12
T2IN
10
R2OUT
9
T1OUT
14
R1IN
13
T2OUT
7
R2IN
8
C2+
4
C2-
5
C1+
1
C1-
3
VS+
2
VS-
6
MAX232
MAX232
C1
1uF
C2
1uF
C3
1uF
C4
1uF
ERROR
TXD
3
RXD
2
CTS
8
RTS
7
DSR
6
DTR
4
DCD
1
RI
9
COM_HEMBRA
COMPIM
CONECTOR DB9 HEMBRA
OUT_PIC
IN_PIC
OUT_MAX
OUT_MAX
IN_MAX
IN_MAX
Figura 0.: Diagrama de simulación.
Al simular el circuito anterior aparecen 4 ventanas (figura 28):
81
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
161
162
UATX
18. Figura 0.: Simulación en Proteus 7.7.
Los puntos que se comprobaron con esta simulación fueron los siguientes:
1. El microcontrolador produce los pulsos de 10us sin ningún problema
cuando se ingresa un dato en modo USART por el pin A1 del
microcontrolador.
2. Al procesar el ancho de pulso entrante en el pin B0 del PIC, dicho
microcontrolador envía el valor de la variable DISTANCIA por el pin A0
en modo USART. En pocas palabras la comunicación USART del
microcontrolador funciona correctamente.
3. El generador de onda no fue de mucha ayuda ya que no se puede
emular el tiempo de respuesta como el Módulo Ultrasónico, pero en
confiando en las especificaciones del Módulo Ultrasónico se hicieron
pruebas en un protoboard y el resultado fue satisfactorio.
PRUEBAS
82
Hiperterminal Virtual.- Aquí se
escribe un carácter, emulando
la información que entra al PIC.
Hiperterminal Virtual.-
Aquí aparece la
información que sale del
PIC.
Pulso del generador de onda,
emulando la respuesta del
Módulo Ultrasónico
Pulso TRIGGER
proveniente del
PIC.
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
163
164
UATX
19. El circuito se armó de acuerdo a la simulación en Proteus (Fig. 27) en un
protoboard. (Figura 29)
Figura 0.: Circuito armado en un protoboard.
La primera prueba que se realizó fue medir la distancia que hay entre
el sensor ultrasónico y la pared (Figura 30). En esta prueba hubo un error de
aproximadamente 0.4cm.
Al realizar mediadas de hasta 4.5m, se comprobó que hay un error de
0.4cm a 2cm. Esto se debe a que la superficie donde rebotan las ondas
ultrasónicas no es la adecuada, según las especificaciones del módulo
ultrasónico la superficie debe ser lisa y de un mínimo de 0.5m2
. Los mismos
errores se obtuvieron al colocar diferentes objetos pequeños.
83
MICFROCONTROLADOR
PIC16F84A
FUENTE DE
5VDC
CIRCUITO
INTEGRADO
MAX232
CONEXIÓN
RS-232
Módulo
Ultrasónico
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
165
166
UATX
20. Figura 0.: Medición entre el Sensor Ultrasónico una pared.
También se realizaron pruebas en un bote con agua. (Figuras 31 y32)
Figura 0.: Pruebas con en un bote con agua.
84
1282
1283
1284
1285
1286
1287
1288
1289
167
168
UATX
21. Los resultados de las mediciones y comparaciones se presentan en la
siguiente tabla:
Tabla : Resultados con agua.
TABLA DE RESULTADOS CON AGUA
Medida real (cm) Medida en labview (cm) Diferencia (cm)
2.7 2.8 0.1
7.9 8 0.1
15.8 15.7 0.1
24.2 24.3 0.1
33 33 0
De acuerdo a la tabla anterior se comprobó que el funcionamiento del
módulo ultrasónico es correcto, también se concluye que el margen de error
es aceptable siendo de aproximadamente de 1 milímetro.
Figura 0.: Marcas en el bote.
DISEÑO DE PCB
85
Marcas con
plumón
negro.
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
169
170
UATX
22. Primero utilizó el software ISIS de Proteus 7.7 para agregar los
componentes necesarios (Fig. 33), después se utilizó el software ARES de
Proteus 7.7 para diseñar la PCB (Figuras 34, 35 y 36).
En la figura 33 aparecen los componentes necesarios para elaborar la
PCB destacando que no se utilizaron las conexiones para simulación ya que
generaría un error, simplemente se utilizó ISIS como una herramienta de
dibujo. Para la fuente de poder se agregó una bornera doble donde se
conectará una fuente igual o mayor a 5VDC y se agregó una bornera
cuádruple para conectar el Módulo Ultrasónico.
D
R_BUTOON
10K
T1IN
11
R1OUT
12
T2IN
10
R2OUT
9
T1OUT
14
R1IN
13
T2OUT
7
R2IN
8
C2+
4
C2-
5
C1+
1
C1-
3
VS+
2
VS-
6
MAX232
MAX232
C1
1uF
C2
1uF
C3
1uF
C4
1uF
OSC1/CLKIN
16
RB0/INT
6
RB1
7
RB2
8
RB3
9
RB4
10
RB5
11
RB6
12
RB7
13
RA0
17
RA1
18
RA2
1
RA3
2
RA4/T0CKI
3
OSC2/CLKOUT
15
MCLR
4
16F84A
PIC16F84A
XTAL_4M
CRYSTAL
33PF_2
33pF
33PF_1
33pF
ERROR
TXD
3
RXD
2
CTS
8
RTS
7
DSR
6
DTR
4
DCD
1
RI
9
COM_HEMBRA
COMPIM
OSC1
OSC2
OSC1
OSC2
OSCILADOR
RST
RST
RESET
CONECTOR DB9 HEMBRA
VI
1
VO
3
GND
2
REGULADOR
7805
1
2
POWER 5VDC-12VDC
1
2
3
4
ULTRASONICO
TBLOCK-I4
C_10U
10uF
C_1U
1uF
OUT_PIC
IN_PIC
OUT_PIC
IN_PIC
ECHO
TRIG
TRIG
ECHO
OUT_MAX OUT_MAX
IN_MAX
IN_MAX
LED
LED
R_LED
100
LED
LED-BLUE
Figura 0.: Componentes para la PCB.
86
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
171
172
UATX
23. Figura 0.: Vista superior de la PCB.
Figura 0.: Vista inferior de la PCB.
Figura 0.: Vista 3D de la PCB.
87
1315
1316
1317
1318
1319
1320
1321
173
174
UATX
24. Después de tener el diseño en ARES se procedió a construir el circuito
impreso en ARES (Fig. 37), acoplarlo a una estructura de acrílico (Fig. 38) y
colocar el prototipo en un tanque de agua (Fig. 39).
Figura 0.: Vista superior real de la PCB.
Figura 0.: Vista inferior real de la PCB acoplada a una estructura de acrílico.
88
5VDC-12VDC
Terminal
positiva.
Trigger
GND
5VDC
1322
1323
1324
1325
1326
1327
1328
1329
1330
175
176
UATX
25. Figura 0.: PCB acoplada a un tanque de agua.
INTERFAZ DE LABVIEW
Labview es un entorno de programación gráfica usado por miles de
ingenieros e investigadores para desarrollar sistemas sofisticados de medida,
pruebas y control usando íconos gráficos e intuitivos y cables que parecen un
diagrama de flujo.
Para este trabajo se utilizó la versión Labview 2010, el cual trae
algunos ejemplos para la comunicación RS-232. El ejemplo que se utilizó fue
el de comunicación serial básico, dicho ejemplo modificó suprimiendo la
mayoría de las instrucciones para hacerlo más simple.
El diagrama de flujo de la figura 40 representa la programación en
LabView 2010.
89
Prototipo
acoplado a
un tanque1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
177
178
UATX
27. Las siguientes figuras contienen la programación (Diagrama a
Bloques) en LabView según el Diagrama de Flujo (Fig 40), en las cuales se
indica con comentarios amarillos para que sirve cada instrucción.
Figura 0.: Frame 0 y Case False.
Figura 0.: Frame 0 y Case True.
91
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
181
182
UATX
29. Figura 0.: Frame 3.
Por último la figura 46 contiene el Panel Frontal del programa en LabView.
Figura 0.: Panel Frontal.
PUESTA EN MARCHA
93
1365
1366
1367
1368
1369
1370
1371
1372
1373
185
186
UATX
30. Para poner en marcha este prototipo se necesitan seguir los siguientes pasos:
1. Conectar el cable USB-SERIAL a la computadora e instalar el driver su driver.
2. Una vez instalado el driver de cable USB-SERIAL se tiene que habilitar el puerto serial
en Measurement & Automation Explorer de NI. Esto es para LabView 2010, si se
omite este paso al correr cualquier VI para RS232 generará un error.
Figura 0.: Icono de Measurement & Automation.
Figura 0.: Interfaz de Measurement % Automation.
3. Conectar una fuente entre 6VCD y 12VCD al prototipo; puede ser una pila de 9VCD o
en este caso un cargador para celular.
94
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
187
188
UATX
31. 4. Conectar la punta DB9 macho del cable USB-SERIAL a la conexión DB9 hembra del
prototipo.
Figura 0.: Conexión del cable USB-SERIAL a el prototipo.
5. Abrir y correr el VI que se describió en el bloque anterior, en este ejemplo se llama
sensor ultrasónico.vi.
95
6VCD a
12VCD
Terminal
positiva.
1387
1388
1389
1390
1391
1392
1393
1394
189
190
UATX
32. Figura 0.: Programa “sensor ultrasónico.vi”.
Figura 0.: Monitoreo del módulo ultrasónico con LabView.
96
1395
1396
1397
1398
1399
1400
1401
191
192
UATX
33. ANEXO 1
El programa de este anexo se programó en el software PIC C
COMPILER, dicho software genera 10 archivos diferentes, entre los cuales
está uno con extensión “.HEX”, este archivo sirve para simular el
microcontrolador en Proteus de acuerdo a las instrucciones programadas en
lenguaje C y también sirve para programar físicamente el microcontrolador
con cualquier grabador de PICs.
El siguiente programa contiene comentarios después de doble
diagonal “//” donde se trata de indicar para que sirven la mayoría de
instrucciones:
#include <16f84A.h> //modelo del pic
#use delay (clock = 4000000) //se utilizará un oscilador de 4Mhz
#fuses XT,NOWDT,PUT,NOPROTECT //configuración para programar el pic
#use RS232 (BAUD = 9600, BITS = 8, PARITY=N,XMIT=PIN_A0,RCV=PIN_A1)
//configuración de la comunicación RS232
//velocidad de 9600 bd
//8 bits por palabra
//paridad: ninguna
//pin de transmición: A0
//pin de recepción: A1
#use fast_io(B) //función predefinida para trabajar
//fácilmente con el puerto B
//------------------------------VARIABLES A USAR---------------------
int16 U_SEG=0; //GUARDA LOS MICROSEGUNDOS EN ALTO DEL PIN B0
INT16 L_TMR0=0; //GUARDA EL VALOR DEL REGISTRO TIMER_0
INT16 LOAD_256=0; //valor de TMR0 con preesaler de 256
INT16 LOAD_1=0; //valor de TMR0 con preesdaler de 1
int32 DISTANCIA=0; //DISTANCIA EN CENTIMETROS * 10
int1 nuevopulso=0; //control de lectura de pulso
//cuando es uno, la lectura terminó
int1 cambio=0; //control de cambio de flanco
//si es cero se espera un flanco de subida
//si es uno se espera un flanco de bajada
97
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
193
194
UATX
34. int1 valor=0; //DETECTA SI LA COMPUTADORA A ENVIADO ALGO
//--------------------------INTERRUPCION POR EL PIN B0----------------
#int_ext //aquí inicia la interrupción por B0
void funcion_ext_int(){ //función de interrupción
if (cambio == 0){
set_TIMER0(0); //iniclaliza el timer0 a 0
ext_int_edge(H_TO_L); //CAMBIA A DETECCIÓN POR FLANCO DE BAJADA
cambio=1;
}
else{
L_TMR0 = get_timer0(); //CARGA EL VALOR DE TMR0 EN EL REGISTRO L_TMR0
ext_int_edge(L_TO_H); //CAMBIA A DETECCIÓN POR FLANCO DE SUBIDA
cambio=0;
nuevopulso=1;
}
}
//------------------------FUNCIÓN PRINCIPAL-----------------------------
void main(){
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); //configuración del timer0
//OSCILACIÓN INTERNA
//PREESCALER DE 1
ext_int_edge(L_TO_H); //configurar INTERRUPCIÓN POR PIN B0
//para flanco de suida
set_tris_B(0x81); //CONFIGURA LOS PINES B0 y B7 COMO ENTRADA
//LOS DEMÁS PINES COMO SALIDA
output_low(PIN_B1); //PIN B1 A CERO
enable_interrupts (int_ext); //habilitación de interrupción por el pin B0
enable_interrupts (global); //habilitación de interrupciones globales
//buble while infinito
while(true){
//se inicializan todas las variables a cero
U_SEG=0;
L_TMR0=0;
LOAD_256=0;
LOAD_1=0;
DISTANCIA=0;
nuevopulso=0;
cambio=0;
valor=0;
98
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
195
196
UATX
35. //Como la comunicación está gestionada por software,
//la función kbhit() devuelve TRUE si se ha detectado un bit
//de START en el pin de recepción.
valor = kbhit();
while(valor==0){
valor = kbhit();}
//en la siguiente instrucción se complementa el valor del pin b3
//con esto el pin b3 cambia de estado cada procesa la
//recepción y transmición serial
output_toggle(PIN_B3);
RUTINA_1:
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); //configuración del timer0
//con preescaler de 256
output_high(PIN_B1); //pone el pin B1 en alto
delay_us(9); //espera 15 microsegundos
output_low(PIN_B1); //pone el pin B1 en bajo
while(nuevopulso == 0){ //espera hasta que nuveopulso sea 1
}
LOAD_256=L_TMR0; //se guarda el valor de TMR0 con preescaler
//de 256
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); //configuración del timer0
//con preescaler de 1
delay_ms(30);
RUTINA_2:
nuevopulso=0; //control de lectura de pulso
output_high(PIN_B1); //pone el pin B1 en alto
delay_us(9); //espera 15 microsegundos
output_low(PIN_B1); //pone el pin B1 en bajo
while(nuevopulso == 0){ //espera hasta que nuveopulso sea 1
}
LOAD_1=L_TMR0; //se guarda el valor de TMR0 con preescaler
//de 1
U_SEG=(LOAD_256*255)+(LOAD_1); //U_SEG almacena el total del
//tiempo en alto en microsegundos
99
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
197
198
UATX
36. //del pin B0
DISTANCIA = (U_SEG*10)/58; //DISTANCIA almacena
//la distancia en centimetros
//multiplicada por 10
printf("%Lun",DISTANCIA); //envía el valor de DISTANCIA
//en formato RS-232
}
}
100
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
199
200
UATX