PROTON IDE GRENELECTRONIC DESARROLLO CON MICROCONTROLADORES PIC Índice 1.Introducción 2.Código de programación Basic 3.Códigos Binario, hex., Decimal, ASCII 4. Programación I Laso abierto, secuencia Actividades de programación I 5. Programación II Laso cerrado, compuertas lógicas Secuencia de control y carga Actividades de programación II 6. Programación III Display de 7 segmentos Actividades de programación III 7. Programación IV LCD, lm35, instrumentación Actividades de programación IV 8. Programación V Motores, Servos y PAP Actividades de programación V 9. Programación VI Robótica sensorial Actividades de programación VI 10. Programación VII Visual Basic Comunicación serial rx tx Actividades de Programación VII
¿Qué es un microcontrolador? Es un circuito integrado programable que acepta un listado de instrucciones y contiene todos los componentes de un computador. Se utilizan para realizar determinadas tareas o para gobernar dispositivos, debido a su reducido tamaño, suele ir incorporado en el propio dispositivo que gobierna. El microcontrolador es un dispositivo dedicado. En su memoria solo reside un programa destinado a gobernar una aplicación determinada, sus líneas de entradas y salidas (I/O) permiten la conexión de sensores y relay. Una vez programado y configurado el microcontrolador solamente sirve para gobernar la tarea asignada Los microcontroladores en general, y los de la empresa Microchip en particular, necesitan de un circuito electrónico auxiliar que nos permita transferirles desde el ordenador el programa que hemos escrito para ellos. Hay muchas maneras de encarar este problema, y en general se suele utilizar alguno de los puertos disponibles en cualquier ordenador para este fin. Así es que en el mercado es posible conseguir “quemadores” de PICs con conexión para puerto USB, paralelo o serie (RS232). Los microcontroladores de Microchip (PICs) se programan mediante un protocolo tipo serie. Se necesitan dos tensiones de alimentación para poder llevar a cabo la programación: una de 4.5v a 5.5v (VDD) y otra comprendida entre 12v y 14v (VPP), que es la que indica al PIC que va a ser programado, para que el cambie la función que realizan los pines I/O implicados en la programación. Los pines implicados en la programación varían de un microcontrolador a otro, pero en general, los de un mismo numero de pines (8, 18, etc.) tienen las mismas patitas asignadas a la programación, lo que nos permite construir programadores que sirvan para mas de un PIC. Es muy recomendable leer la hoja de datos de Microchip sobre este tema dado que es conveniente conocer el mecanismo implicado en la programación (tiempos, señales, etc). El documento se refiere específicamente a la familia 16F8x, pero los demás no difieren demasiado de lo allí expuesto. El programador, será el encargado de transferir el programa que escribamos en la PC a la memoria FLASH del PIC. Esta es una memoria no volátil, de bajo consumo, que se puede escribir y borrar en el circuito integrado (al igual que las EEPROM). Microchip comercializa dos microcontroladores prácticamente iguales que sólo se diferencian en que la memoria de programa de uno de ellos es tipo EEPROM y la del otro tipo Flash. Se trata del PIC16C84 y el PIC16F84, respectivamente. Además de esta memoria, casi todos los PICs también disponen de una memoria de datos de lectura y escritura no volátil, (esta del tipo EEPROM). De esta forma, un corte en el suministro de la alimentación no ocasiona la pérdida de la información, que está disponible al reiniciarse el programa. Por ejemplo, el 16F84 dispone de 64 bytes de memoria EEPROM para contener datos, y los programas que creemos pueden leer y escribir en ella. BOOTLOADER Un bootloader («cargador de arranque» ) es un programa sencillo que no tiene la totalidad de las funcionalidades de un sistema operativo, diseñado exclusivamente para preparar todo lo que necesita el sistema operativo para funcionar. Normalmente se utilizan los cargadores de arranque multietapas, en los que varios programas pequeños se suman los unos a los otros, hasta que el último de ellos carga el sistema operativo. En los ordenadores modernos, el proceso de arranque comienza con la CPU ejecutando los programas contenidos en la memoria ROM en una dirección predefinida y se configura la CPU para ejecutar este programa, sin ayuda externa, al encender el ordenador. Bootloader es un pequeño programa de arranque, residente en las primeras 0x800 bytes de la memoria de programa de un Microcontroladores PIC. El bootloader funciona en el momento del cargado de programa (justo cuando el PIC es reseteado) y es capaz de cargar un completo programa de aplicación en la memoria de programa del PIC. Microchip ofrece, de tamaño compacto, versátil, autónomo, que ha sido diseñado pensando en la necesidad de contar con un modulo que fácilmente pueda ser montado sobre un Protoboard y la ves se pueda tener un potente microcontrolador de la gama serie 18 equipado con puerto de comunicaciones USB, Serie, I2C, Paralelo, Conversores A/D, múltiples puerto I/O, los cuales están disponibles para ser conectados a diferentes circuitos y configuraciones sin necesidad de retirar el PIC del Protoboard para programarlo cada ves que sea necesario, modificar el programa grabado el PIC o para una fácil depuración del programa en proceso de desarrollo. Estructura del programa en Pic Basic Un programa básico consta de: • Programa de cabecera • Declaraciones • Explicación de los signos e identificadores • Declaraciones y comandos Además de estas estructuras de base, algunos compiladores también permiten programación orientada a objetos, así como procedimientos y funciones. Sin embargo
Protón IDE no permite los procedimientos y funciones en el verdadero sentido, así como no es compatible con los objetos. Tiene enfoque orientado hacia el simple y sencillo llamado de instrucciones. La programación comienza en la parte superior, y la continúa hacia abajo. Sin embargo permite las repeticiones. Las primeras líneas del programa BASIC, difieren en la memoria de los microcontroladores, EEPROM, número de puertos y registros, etc., es necesario informar al compilador sobre el microcontrolador que se utilizará. En segundo lugar la velocidad de procesamiento depende de la frecuencia del cristal. Por lo tanto, a fin de calcular con precisión el calendario de funciones de retraso también es necesario informar al compilador de la frecuencia del cristal Los programas de lenguaje BASIC usualmente comienzan así: Device = 16F877A XTAL = 4 La primera línea indica el procesador y la segunda línea dice que el hardware utiliza 20MHz de cristal. Declaraciones Son instrucciones especiales sobre los diversos dispositivos a utilizar, esto ayuda al compilador a generar instrucciones específicas. Por ejemplo, si estamos usando una pantalla LCD y se conecta en PORTD, entonces tenemos que informar las conexiones de nuestro LCD. Vamos a declarar este tipo de configuración generalmente después de la sección de encabezado utilizando los comandos: Declare LCD_DTPIN PORTD.0 Hay un número de declaraciones, sin embargo, sólo las necesarias en el proyecto actual se fijan normalmente.... Identificadores Los identificadores son símbolos de texto especial que se utiliza para representar algo. Pueden ser utilizados como etiquetas para marcar ciertos lugares en el programa, de modo que el programa se puede hacer para ir a las etiquetas y luego continuar con el programa a partir de entonces. Del mismo modo los identificadores pueden usarse para nombrar algunas ubicaciones de memoria. Estos son por lo general variables llamadas, y son los identificadores más importantes en la programación. Los identificadores también se pueden utilizar como alias en cierto texto, de modo que en lugar de escribir el texto concerniente del identificador, el compilador inserta el texto pertinente en su lugar. Las declaraciones y comandos Hay tres tipos de declaraciones: • Comparación y declaraciones condicionales • Repetición y declaraciones de bucle • Biblioteca de comandos Comparación y sentencias condicionales nos permiten comparar dos o más variables, los puertos, los pines del puerto o registros de funciones especiales y luego tomar la decisión de ejecutar un conjunto de instrucciones o de otro conjunto. Considerando la importancia de estas declaraciones, el lenguaje BASIC prevé diferentes construcciones de esto. Vamos a explorar estas a continuación. La repetición y de bucle es una de las mayores ventajas de los microprocesadores. Podemos encargar al microcontrolador repetir continuamente ciertas instrucciones, ya sea indefinidamente, o hasta que una determinada condición existe. Por ejemplo, para mantener un LED, hasta que la temperatura es alta desde un punto de ajuste. Biblioteca de Comandos, no son propiamente los comandos del lenguaje BASIC, pero son proporcionados por el fabricante del compilador para hacer las tareas comunes. Por ejemplo, un comando de biblioteca para mostrar algunos datos sobre la LCD o para leer los datos analógicos de un pin de entrada. Etiquetas Para marcar las declaraciones que el programa podría hacer referencia con los comandos Goto, Call o Gosub, PROTON utiliza las etiquetas de línea. A diferencia de los antiguos BASICS, PROTON no permite o exige a los números de línea y no requiere que se etiquete cada línea. En cambio, cualquier línea puede comenzar con una etiqueta de línea, que es simplemente un identificador seguido de dos puntos (:). LAB: PRINT "Hola Mundo" GOTO LAB Los nombres de etiqueta pueden ser de hasta 32 caracteres de longitud y puede contener cualquier carácter alfanumérico, pero no debe comenzar con un valor numérico. Por ejemplo: Label1: Es perfectamente válido, sin embargo: 1LABEL: Se producirá un error de sintaxis porque las etiquetas se inician con el valor 1. Una etiqueta que contenga más de 32 caracteres producirá un error de sintaxis señalando la etiqueta de reincidencia. También se permite caracteres como parte de la etiqueta. Esto ayuda a crear más nombres de etiqueta descriptiva. Por ejemplo: THISISALABEL: No tiene la misma claridad de significado como: THIS_IS_A_LABEL: Variables: Las variables se utilizan para almacenar datos temporalmente o para mantener números que se utilizarán en los cálculos. El número de variables que pueden ser utilizados
en un programa depende de la memoria RAM del microcontrolador, la Microcontrolador, la parte de la memoria RAM, la memoria del programa.
arquitectura
del
Símbolos y gráficos Un diagrama de flujo se construye con unos símbolos gráficos especiales que representan acciones, funciones, y equipamiento usado para lograr un resultado específico.
PROGRAMACION CON PROTON IDE CONFIGURAR MICROCONTROLADOR Device 16F870 Device 16F873A Device 16F877A Device 18F225 CONFIGURAR VELOCIDAD DEL MICRO EN Mhz Xtal 4 Xtal 10 Xtal 20 Xtal 40 CONFIGURAR PINES DIGITALES All_Digital= true ‘PARA PUERTOS A Y E CONFIGURAR MEMORIA BUS I2C ------SCL_Pin = PORTA.7 SDA_Pin = PORTA.6 CONFIGURAR
VARIABLES
Tecla var Dim tecla Dim cont2 Dim cont1 CONFIGURAR LCD Declare Declare Declare Declare Declare Declare
Byte ' no se recomienda As Byte As WORD As DWORD
LCD_Type = 0 LCD_DTPin = PORTD.0 LCD_ENPin = PORTD.5 LCD_RSPin = PORTD.4 LCD_Interface = 4 LCD_Lines = 2
CONFIGURAR LCD GRAFICO LCD_DTPort = PORTD LCD_RSPin = PORTC.1 LCD_ENPin = PORTE.0 LCD_RWPin = PORTC.0 LCD_CS1Pin = PORTE.1 LCD_CS2Pin = PORTE.2 LCD_Type = GRAPHIC Internal_Font = OFF Font_Addr = 0 CONFIGURAR TECLADO Keypad_Port = PORTB CONFIGURAR COMUNICACIÓN SERIAL Serial_Baud = 9600 Rsout_Pin = PORTC.6 Rsout_Mode = TRUE Rsout_Pace = 1 Rsin_Pin = PORTC.7 Rsin_Mode = TRUE Hserial_Baud = 9600 ' velocidad baudios 9600 Hserial_RCSTA = %10010000 ' Enable serial port and continuous receive Hserial_TXSTA = %00100100 ' Enable transmit and asynchronous mode Hserial_Clear = On ' Enable Error clearing on received characters CONFIGURAR UNA ENTRADA Input PORTC.3 'declaro TRISA=1 'declaro TRISA.0=1 'declaro TRISA=%11111111 'declaro TRISA=$FF 'declaro TRISA=255 'declaro CONFIGURAR UNA SALIDA
que que que que que que
el el el el el el
puerto puerto puerto puerto puerto puerto
C A A A A A
pin.3 es entrada es entrada pero solo el pin.0 es entrada pero solo el pin.0 es entrada es entrada es entrada
Output PORTC.7 TRISA=0 TRISA.0=0 TRISA=%00000000 TRISA=$0
que que que que que
el el el el el
puerto puerto puerto puerto puerto
C A A A A
pin.7 es salida es salida es salida pero solo el pin.0 es salida es salida
'declaro 'declaro 'declaro 'declaro 'declaro
CONFIGURACION COMBINADA TRISA=%00001111 'declaro que el puerto A será: entrada los pines TRISA=$F 'declaro que el puerto A será: entrada los pines TRISA=15 'declaro que el puerto A será: entrada los pines
0,1,2,3 0,1,2,3 0,1,2,3
ACTIVAR PUERTO High xx8 Low xx8 Low PORTB High PORTB PORTB=0 PORTB.0=0 PORTB=%00000000 PORTB=1 PORTB.0=1 PORTB=7 PORTB=3 PORTB=$F PORTB=$3F PORTB=%11111111
'el 'el 'el 'el 'el 'el 'el 'el 'el 'el 'el 'el
puerto puerto puerto puerto puerto puerto puerto puerto puerto puerto puerto puerto
b b b b b b b b b b b b
esta en nivel bajo (apagado) esta en nivel ALTO (ACTIVO) esta en nivel bajo (apagado) solo el pin.0 con nivel bajo esta con nivel bajo solo el pin.0 con nivel alto (activado) solo el pin.0 con nivel alto reproduce el dato 00000111 dec reproduce el dato 00000011 dec reproduce el dato 00001111 hex reproduce el dato 00111111 hex esta con nivel alto bin
ALIAS PARA PERIFERICOS Symbol MOTOR = PORTA.1 ‘existe un motor conectado en el puerto A pin.1 Symbol SW = PORTA.2‘existe un pulsador conectado en el puerto A pin.2 ACTIVAR POR CONDICION
y salida 4,5,6,7 y salida 4,5,6,7 y salida 4,5,6,7
If s1=0 Then If s1=1 Then If s1=1 And s2=0 And s3=0 Then PROG EndIf
' el micro espera un ' el micro espera un 'debe cumplir e ir a ' antes de concluir
0 para activar una rutina 1 para activar una rutina una sub rutina una rutina al usar IF sin bucle
ACTIVAR SOFT.WERE POR etiquetas GoSub GIRA ‘activar una rutina llamada GIRA GIRA: Return ‘retornar al punto de inicio RETARDOS DelayMS 1000 ' RETARDO DEL ESTADO 1000 ES 1SEG DelayMS 500 ' RETARDO DEL ESTADO 500 ES 1/2SEG DelayUS 1000 ' RETARDO DEL ESTADO 1000 ES 1mseg pause 1000 ' RETARDO DEL ESTADO 1000 ES 1SEG no se recomienda ACTIVAR TEXTO EN UN LCD Print At 1,1, " DelayMS 5000
ACTIVAR ESTACION
"'ESCRIBE EN LA LINEA 1 POSICION 1
RESCATAR UN VALOR EN DECIMAL Dim cc As Word Print At 1,1, "f = ", Dec cc' imprimir el dato en el LCD desde cc CONTAR LOS PULSOS QUE ENTRAN EN UN PIN WRD = Counter Pin , 1000 ' LA VARIABLE
WRD
CONTIENE EL VALOR DE ENTRADA EN 1seg
CONTADOR DE EVENTOS CON OPERATORIA If IRIS =1 Then DelayMS 500 cont1 = cont1 + 1 'se ejecuta una suma en memoria EndIf Organizador de instrucciones (branch,on goto,on gosub) IF VAR1 = 0 THEN GOTO LAB_0 IF VAR1 = 1 THEN GOTO Lab_1 IF VAR1 = 2 THEN GOTO Lab_2
por
BRANCH VAR1, [Lab_0, Lab_1, Lab_2] ON VAR1 GOTO LABEL_0, LABEL_1, LABEL_2 ON VAR1 GOSUB LABEL_0, LABEL_1, LABEL_2
Quiebre de bucle o rutina IF VAR1 = 10 THEN BREAK DELAYMS 200
' BREAK ROMPE EL BUCLE CUANDO LLEGUE A 10
Ejecutar un bloque de instrucciones hasta que una condición es verdadera VAR1 = 1 REPEAT PRINT AT 1, 1, DEC VAR1 DELAYMS 200 INC VAR1 UNTIL VAR1 > 10
O
REPEAT HIGH LED: UNTIL PORTA.0 = 1
Configurar una entrada analógica Declare ADIN_RES Declare ADIN_TAD Declare ADIN_STIME
10 2 100
'resolución 'CLK options are 0, 1, 2, 3 (0-2 are based on internal cycles) 'tiempo de muestreo
ADCON1 = %10000000 ' Setup Del registro ADCON1, AN1 / RA1 es análogo Mueva la posición del cursor en la pantalla LCD para una línea y posición determinada. DIM Line as BYTE DIM Xpos as BYTE Line = 2 Xpos = 1 CLS
PRINT "HELLO" ' Display LCD CURSOR Line , Xpos ' line 2, position 1 ACTIVAR POR BUCLE gg: ' etiqueta princial, ejecuta una rutina PORTD.2=1 DelayMS 200 PORTD.2=0 DelayMS 200 GoTo gg ' termina la rutina y regresa a la etiqueta `````````````````````````````````````````````````````````````````` LOOP: LED = 1 ' First LED on DelayMS 300 ' Delay for .3 seconds For SCAN = 1 To 7 ' Go through For..Next loop 7 times LED = LED << 1 ' Shift on LED, one to left DelayMS 300 ' Delay for .3 seconds Next ' Close the SCAN loop GoTo LOOP ' Go back to loop and blink LED forever ```````````````````````````````````````````````````````````````````` m3: For n=1 To 50 Step 2 PulsOut PORTD.0,2500 DelayMS 10 Next End ACTIVAR TEXTO EN UN LCD Print At 1,1, " DelayMS 5000
ACTIVAR ESTACION
"
RESCATAR UN VALOR EN DECIMAL Dim RPM As Word Print At 1,1, "f = ", Dec RPM' imprimir el dato en el LCD CONTAR LOS PULSOS QUE ENTRAN EN UN PIN WRD = Counter Pin , 1000 ' LA VARIABLE WRD CONTIENE EL VALOR DE ENTRADA EN 1seg CONTADOR DE EVENTOS CON OPERATORIA If IRIS =1 Then DelayMS 500 cont1 = cont1 + 1 'se ejecuta una suma en memoria EndIf ```````````````````````````````````````````````````````````````````` If IRIS =1 Then DelayMS 500 cont1 = cont1 * 2 'se ejecuta una multiplicacion en memoria Mostrar en decimal, todos los valores de WRD dentro de un bucle hacia arriba DIM WRD as WORD FOR WRD = 0 TO 2000 STEP 2 PRINT Dec WRD ," " NEXT
' Perform an upward loop ' Display the value of WRD ' Close the loop
Mostrar en decimal, todos los valores de WRD dentro de un ciclo a la baja DIM WRD as WORD FOR WRD = 2000 TO 0 STEP -2 ' Perform a downward loop PRINT Dec WRD ," " ' Display the value of WRD NEXT ' Close the loop Mostrar en decimal, todos los valores de DWRD dentro de un ciclo a la baja DIM DWRD as DWORD FOR DWRD = 200000 TO 0 STEP -200 ' Perform a downward loop
PRINT Dec DWRD ," NEXT
"
' Display the value of DWRD
Mostrar en decimal, todos los valores de WRD1 utilizando una expresión como parte de la construcción de FOR-NEXT DIM WRD1 as WORD DIM WRD2 as WORD WRD2 = 1000 FOR WRD1= WRD2 + 10 TO WRD2 + 1000 ' Perform a loop PRINT Dec WRD1," " ' Display the value of WRD1 NEXT ' Close the loop Notas de programación según fabricante Para la serie 16f el pin4 del puerto A es colector abierto con drenaje a tierra, tratar de no usar como salida. Ver ficha del micro Para la serie 16f8xx los puertos A y E por defecto trabajan los ADC usar comando de bloqueo Para la serie 16f6xx el puerto A será analógico usar CMCON = 7 Para la serie 16f87x el puerto A o E será analógico usar ADCON1 = 7
CODIGOS DEC,HEX.BIN Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
000 001 002 003 004 005 006 007 010 011 012 013 014 015 016 017
00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037
00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 00011110 00011111
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
040 041 042 043 044 045 046 047 050 051 052 053 054 055 056 057
00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
060 061 062 063 064 065 066 067 070 071 072 073 074 075 076 077
00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117
01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137
01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
140 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157
01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
160 161 162 163 164 165 166 167 170 171 172 173 174 175 176 177
01110000 01110001 01110010 01110011 01110100 01110101 01110110 01110111 01111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
200 201 202 203 204 205 206 207 210 211 212 213 214 215 216 217
10000000 10000001 10000010 10000011 10000100 10000101 10000110 10000111 10001000 10001001 10001010 10001011 10001100 10001101 10001110 10001111
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
220 221 222 223 224 225 226 227 230 231 232 233 234 235 236 237
10010000 10010001 10010010 10010011 10010100 10010101 10010110 10010111 10011000 10011001 10011010 10011011 10011100 10011101 10011110 10011111
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
240 241 242 243 244 245 246 247 250 251 252 253 254 255 256 257
10100000 10100001 10100010 10100011 10100100 10100101 10100110 10100111 10101000 10101001 10101010 10101011 10101100 10101101 10101110 10101111
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
260 261 262 263 264 265 266 267 270 271 272 273 274 275 276 277
10110000 10110001 10110010 10110011 10110100 10110101 10110110 10110111 10111000 10111001 10111010 10111011 10111100 10111101 10111110 10111111
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
Dec
Hex
Oct
Bin
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
300 301 302 303 304 305 306 307 310 311 312 313 314 315 316 317
11000000 11000001 11000010 11000011 11000100 11000101 11000110 11000111 11001000 11001001 11001010 11001011 11001100 11001101 11001110 11001111
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
320 321 322 323 324 325 326 327 330 331 332 333 334 335 336 337
11010000 11010001 11010010 11010011 11010100 11010101 11010110 11010111 11011000 11011001 11011010 11011011 11011100 11011101 11011110 11011111
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
340 341 342 343 344 345 346 347 350 351 352 353 354 355 356 357
11100000 11100001 11100010 11100011 11100100 11100101 11100110 11100111 11101000 11101001 11101010 11101011 11101100 11101101 11101110 11101111
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
360 361 362 363 364 365 366 367 370 371 372 373 374 375 376 377
11110000 11110001 11110010 11110011 11110100 11110101 11110110 11110111 11111000 11111001 11111010 11111011 11111100 11111101 11111110 11111111
CODIGO ASCII ASCII
Hex
Símbolo
ASCII
Hex
Símbolo
ASCII
Hex
Símbolo
ASCII
Hex
Símbolo
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
(espacio) ! " # $ % & ' ( ) * + , . /
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
ASCII
Hex
Símbolo
ASCII
Hex
Símbolo
ASCII
Hex
Símbolo
ASCII
Hex
Símbolo
64 65 66 67 68 69 70 71 72 73 74 75 76
40 41 42 43 44 45 46 47 48 49 4A 4B 4C
@ A B C D E F G H I J K L
80 81 82 83 84 85 86 87 88 89 90 91 92
50 51 52 53 54 55 56 57 58 59 5A 5B 5C
P Q R S T U V W X Y Z [ \
96 97 98 99 100 101 102 103 104 105 106 107 108
60 61 62 63 64 65 66 67 68 69 6A 6B 6C
` a b c d e f g h i j k l
112 113 114 115 116 117 118 119 120 121 122 123 124
70 71 72 73 74 75 76 77 78 79 7A 7B 7C
p q r s t u v w x y z { |
77 78 79
4D 4E 4F
M N O
93 94 95
5D 5E 5F
] ^ _
109 110 111
6D 6E 6F
m n o
125 126 127
7D 7E 7F
Programación I El proceso se desarrolla en diferentes fases sin comprobar que el objetivo se ha alcanzado satisfactoriamente. En el ejemplo de una lavadora, la señal de salida (que sería la ropa lavada) no se introduce en el sistema en ningún momento para poder dar el proceso por terminado. Es posible que la ropa no esté bien lavada pero el sistema no puede rectificar automáticamente. Esto se denomina laso abierto 1-ACTIVEMOS UN LED, pero con un destello
D1 U1
Device 16F870 Xtal = 20 TRISB=0 PORTB=0 E: PORTB.0=1 DelayMS 1000 1SEG PORTB.0=0 DelayMS 1000 1SEG End
'microcontrolador 'velocidad ' DECLARO PUERTO B SALIDA ' ASEGURO EL PUERTO B LOW 'ETIQUETA 'ENVIO UN NIVEL ALTO AL PIN 0 ' EL LED SE MANTIENE ACTIVO POR
9 10 1 2 3 4 5 6 7
'ENVIO UN NIVEL BAJO AL PIN 0 ' EL LED SE MANTIENE APAGADO POR
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28
LED
11 12 13 14 15 16 17 18
PIC16F870
'FIN DE LA RUTINA
2-ACTIVEMOS UN LED, destello infinito Device 16F870 Xtal = 20 TRISB=0 PORTB=0 E: PORTB.0=1 DelayMS 1000 PORTB.0=0 DelayMS 1000 GoTo E
'microcontrolador 'velocidad ' DECLARO PUERTO B SALIDA ' ASEGURO EL PUERTO B LOW 'ETIQUETA 'ENVIO UN NIVEL ALTO AL PIN 0 ' EL LED SE MANTIENE ACTIVO POR 1SEG 'ENVIO UN NIVEL BAJO AL PIN 0 ' EL LED SE MANTIENE APAGADO POR 1SEG 'IR A ETIQUETA
3-ACTIVEMOS UN LED, alterando la pausa Device 16F870 'microcontrolador Xtal = 20 'velocidad TRISB=0 ' DECLARO PUERTO B SALIDA PORTB=0 ' ASEGURO EL PUERTO B LOW E: 'ETIQUETA PORTB.0=1 'ENVIO UN NIVEL ALTO AL PIN 0 DelayMS 50 ' EL LED SE MANTIENE ACTIVO POR 50mSEG PORTB.0=0 'ENVIO UN NIVEL BAJO AL PIN 0 DelayMS 50 ' EL LED SE MANTIENE APAGADO POR 50mSEG Goto E ' IR AL COMIENZO DEL PROGRAMA U1 9 OSC1/CLKIN 4-ACTIVEMOS UN LED, cambiando el pin 10 OSC2/CLKOUT 1
Device 16F870 Xtal = 20 TRISB=0 PORTB=0 E: PORTB.5=1 DelayMS 100 PORTB.5=0
MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
2 RA0/AN0 'microcontrolador 3 RA1/AN1 4 RA2/AN2/VREF5 'velocidad RA3/AN3/VREF+ 6 RA4/T0CKI 7 ' DECLARO PUERTO B SALIDA RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI ' ASEGURO EL PUERTO B LOW RC2/CCP1 RC3 RC4 'ETIQUETA RC5 RC6/TX/CK 'ENVIO UN NIVEL ALTO AL PIN 5 RC7/RX/DT ' EL LED SE MANTIENE ACTIVO POR 100mSEG PIC16F870 'ENVIO UN NIVEL BAJO AL PIN 5
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
D1
LED
} ~
DelayMS 100 Goto E
' EL LED SE MANTIENE APAGADO POR 100mSEG ' IR AL COMIENZO DEL PROGRAMA
5-ACTIVEMOS UN LED, cambiando de puerto Device 16F870 Xtal = 20 TRISC=0 PORTC=0 E: PORTC.0=1 DelayMS 50 PORTC.0=0 DelayMS 50 Goto E
'microcontrolador 'velocidad ' DECLARO PUERTO C SALIDA ' ASEGURO EL PUERTO C LOW 'ETIQUETA 'ENVIO UN NIVEL ALTO AL PIN 5 ' EL LED SE MANTIENE ACTIVO POR 50mSEG 'ENVIO UN NIVEL BAJO AL PIN 5 ' EL LED SE MANTIENE APAGADO POR 50mSEG ' IR AL COMIENZO DEL PROGRAMA
U1 9 10 1 2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RA0/AN0 RB4 RA1/AN1 RB5 RA2/AN2/VREFRB6/PGC RA3/AN3/VREF+ RB7/PGD RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
OTRAS FORMAS inicio: High led pause 1000 Low led pause 1000 GoTo inicio End ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ inicio: High PORTB.0 pause 1000 Low PORTB.0 pause 1000 GoTo inicio End `````````````````````````````````````````````````````````````````````` inicio1: PORTB.0 = 1 pause 1000 PORTB.0 = 0 pause 1000 GoTo inicio End ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ inicio: High 0:Low 1:Low 2:Low 3:Low 4: High 5 DelayMS 1000 High 0:High 1:Low 2:Low 3:Low 4: High 5 DelayMS 1000 GoTo inicio End ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ inicio: PORTB = %00100001 delayms 1000 PORTB = %00100011 delayms 1000 GoTo inicio End
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
D1
LED
Actividades de programación I U1
1. DESARROLLE UN SISTEMA PROGRAMADO QUE ACTIVE 8 LED EN EL PUERTO C DEL MICROCONTROLADOR 16F870, CON UNA PAUSA DE ½ Segundo EN FORMA INFINITA, CADA UN0 DE LOS LED ACTUARAN EN ESCALERA.
9 10 1
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
2 3 4 5 6 7
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28
U2
11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10
PIC16F870
20 19 18 17 16 15 14 13 12 11 LED-BARGRAPH-GRN
U1 9 10 1
2. DESARROLLE UN SISTEMA PROGRAMADO QUE ACTIVE 8 LED EN EL PUERTO C DEL MICROCONTROLADOR 16F870, CON UNA PAUSA DE ½ Segundo EN FORMA INFINITA, LOS LED ACTUARAN EN PENDULO
2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
U2 1 2 3 4 5 6 7 8 9 10
20 19 18 17 16 15 14 13 12 11 LED-BARGRAPH-GRN
U3 U1
3. DESARROLLE UN PENDULO INFINITO CON LOS PUERTOS B Y C, CON PAUSAS DE 100 mseg. CON EFECTO SEGUIDOR DE POSICION, los led se activaran, dejandolo en posición otro led.
9 10 1 2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
U2 LED
20 19 18 17 16 15 14 13 12 11 20 19 18 17 16 15 14 13 12 11
LED
4. DESARROLLE
SEMAFORO CON EL PUERTO B , CON PAUSAS DE 100 mseg.
Nota: esquematice cada circuito en un formato A4, con su diagrama de flujo y programa.
Programación II Si la señal que queremos controlar debe alcanzar un valor determinado, es habitual que el sistema la mida constantemente y actúe para alcanzar ese valor deseado. En este caso el sistema es realimentado, y hablamos de un sistema automático de lazo cerrado. El funcionamiento de un sistema automático de lazo cerrado se resume de esta forma. D1 U1
Resistor
Re sistor
9 10 1
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
2 3 4 5 6 7
R1 10k
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28
LED
El circuito, se ha complementado con un pulsador, y una resistencia, enviaran un estado lógico al PIC, en este caso el pulsador enviara un 1 al pulsar, sin pulsar la resistencia mantiene un estado 0 por estar a tierra, si no esta la resistencia siempre existirá un 1.
11 12 13 14 15 16 17 18
PIC16F870
Resistor
Resistor
D1 R1 10k
U1 9 10 1 2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
LED
El circuito, se ha complementado con un pulsador, y una resistencia, enviaran un estado lógico al PIC, en este caso el pulsador enviara un 0 al pulsar, sin pulsar la resistencia mantiene un estado 1 por estar a +5vcc, si no esta la resistencia siempre existirá un 1.
Estos circuitos, serán capas de relacionar estados externos, actuando como condicionales para la ejecución de los programas. Vea: IF_____Then______Endif PIC16F870
1-ACTIVANDO UN LED, por un pulsador, enviando un1(button)
Device 16F870 Xtal = 20 TRISA=1 TRISB=0 All_Digital= true PORTB=0 E: If PORTA.0 = 0 Then PORTB.0=1 DelayMS 1000 PORTB.0=0 DelayMS 1000 EndIf End
Resistor
Resistor
Device 16F870 'microcontrolador Xtal = 20 'velocidad TRISA=1 'declaro que el puerto A es entrada R1 TRISB=0 ' DECLARO PUERTO B SALIDA 10k All_Digital= true ' todos los pines del micro son digitales PORTB=0 ' ASEGURO EL PUERTO B LOW E: 'ETIQUETA If PORTA.0 = 1 Then 'el micro espera un 1 para activar PORTB.0=1 'ENVIO UN NIVEL ALTO AL PIN 7 DelayMS 1000 ' EL LED SE MANTIENE ACTIVO POR 1SEG PORTB.0=0 'ENVIO UN NIVEL BAJO AL PIN 7 DelayMS 1000 ' EL LED SE MANTIENE APAGADO POR 1SEG EndIf ' si es fin End 'fin 2-ACTIVANDO UN LED, por un pulsador, enviando un 0 (button) 'microcontrolador 'velocidad 'declaro que el puerto A es entrada ' DECLARO PUERTO B SALIDA ' todos los pines del micro son digitales ' ASEGURO EL PUERTO B LOW 'ETIQUETA 'el micro espera un 1 para activar 'ENVIO UN NIVEL ALTO AL PIN 0 ' EL LED SE MANTIENE ACTIVO POR 1SEG 'ENVIO UN NIVEL BAJO AL PIN 0 ' EL LED SE MANTIENE APAGADO POR 1SEG ' si es fin 'fin
D1 U1 9 10 1 2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
LED
3-ACTIVANDO UN LED, por 2 pulsadores, solo cuando estén en 1 (button)
D1 U1
Device 16F870 'microcontrolador Xtal = 20 'velocidad TRISA.0=1 'declaro que el puerto A pin 0 es entrada TRISA.1=1 'declaro que el puerto A pin 1 es entrada TRISB=0 ' DECLARO PUERTO B SALIDA All_Digital= true ' todos los pines del micro son digitales PORTB=0 ' ASEGURO EL PUERTO B LOW E: 'ETIQUETA If PORTA.0 = 1 AND PORTA.1 = 1 THEN 'los 2 sw activaran el led PORTB.0=1 'ENVIO UN NIVEL ALTO AL PIN 0 DelayMS 1000 ' EL LED SE MANTIENE ACTIVO POR 1SEG PORTB.0=0 'ENVIO UN NIVEL BAJO AL PIN 0 DelayMS 1000 ' EL LED SE MANTIENE APAGADO POR 1SEG EndIf ' si es fin End 'fin
9 10 1
Device 16F870 Xtal = 20 TRISA=1 TRISB=0 All_Digital= true PORTB=0
button2
led
0
0
0
0
1
1
1
0
1
1
1
0
'microcontrolador 'velocidad 'declaro que el puerto A es entrada ' DECLARO PUERTO B SALIDA ' declaro que todos los pines del micro son digitales ' ASEGURO EL PUERTO B LOW
E: 'ETIQUETA If PORTA.0 = 0 And PORTA.1 = 0 Then E' estado regreza a etiqueta principal If PORTA.0 = 0 And PORTA.1 = 1 Then PORTB.0=1 'ENVIO UN NIVEL ALTO DelayMS 1000 ' EL LED SE MANTIENE PORTB.0=0 'ENVIO UN NIVEL BAJO DelayMS 1000 ' EL LED SE MANTIENE EndIf
AL PIN 0 ACTIVO POR 1SEG AL PIN 0 APAGADO POR 1SEG
If PORTA.0 = 1 And PORTA.1 = 0 Then PORTB.0=1 'ENVIO UN NIVEL ALTO DelayMS 1000 ' EL LED SE MANTIENE PORTB.0=0 'ENVIO UN NIVEL BAJO DelayMS 1000 ' EL LED SE MANTIENE EndIf
AL PIN 0 ACTIVO POR 1SEG AL PIN 0 APAGADO POR 1SEG
If PORTA.0 = 1 And PORTA.1 = 1 Then PORTB.0=1 'ENVIO UN NIVEL ALTO DelayMS 1000 ' EL LED SE MANTIENE PORTB.0=0 'ENVIO UN NIVEL BAJO DelayMS 1000 ' EL LED SE MANTIENE EndIf ' si es fin GoTo E 'ir al principio
AL PIN 0 ACTIVO POR 1SEG AL PIN 0 APAGADO POR 1SEG
5-ACTIVANDO UN LED, por 2 pulsadores, según tabla con sub. Programas button1
button2
Resistor
10k
R2 10k
led
0
0
0
0
1
1
1
0
1
1
1
1
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
4-ACTIVANDO UN LED, por 2 pulsadores, según tabla (button) button1
R1
Resistor
Resistor
Resistor
2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
LED
Device 16F870 Xtal = 20 TRISA=1 TRISB=0 All_Digital= true PORTB=0 E: If PORTA.0 If PORTA.0 If PORTA.0 If PORTA.0 GoTo E
= = = =
0 0 1 1
'microcontrolador 'velocidad 'declaro que el puerto A es entrada ' DECLARO PUERTO B SALIDA ' declaro que todos los pines del micro son digitales ' ASEGURO EL PUERTO B LOW
'ETIQUETA And PORTA.1 And PORTA.1 And PORTA.1 And PORTA.1
= = = =
0 1 1 1
Then E' estado regreza a etiqueta principal Then activo ' sub programa Then activo ' sub programa Then activo ' sub programa
activo:
' sub programa
PORTB.0=1 DelayMS 1000 PORTB.0=0 DelayMS 1000 GoTo E
'ENVIO UN NIVEL ALTO ' EL LED SE MANTIENE 'ENVIO UN NIVEL BAJO ' EL LED SE MANTIENE 'ir al principio
AL PIN 0 ACTIVO POR 1SEG AL PIN 0 APAGADO POR 1SEG
Actividades de programación II 1. DESARROLLE UN SISTEMA DOMOTICO, PARA 3 PIESAS LOS CUALES SE RELACIONAN CON 3 PULSADORES. ELLOS ACTIVARAN, LA ILUMINACION DE CADA PIESA. D1 U1 9 10 1
R3 10k
Resistor
Resistor
10k
Resistor
R4
Resistor
Resistor
Resistor
2 3 4 5 6 7
R2 10k
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28
LED
D2
11 12 13 14 15 16 17 18
LED
D3
LED
PIC16F870
2. DESARROLLE UN SISTEMA PROGRAMADO QUE ACTIVE 4 LED EN EL PUERTO C DEL MICROCONTROLADOR 16F870, CON UNA PAUSA DE ½ segundo. LOS LED TENDRAN DIRECTA RELACION CON 4 PULSADORES, LOS CUALES EJUTARAN 4 DISTINTAS RUTINAS CON UN MAXIMO DE 6SEG, OCUPANDO SUB PROGRAMAS. D1 U1 9 10 1
R2 10k
Resi stor
10k
Resi stor
Resi stor
R3
Resi stor
10k
Resi stor
R4
Resi stor
Resi stor
Resi stor
2 3 4 5 6 7
R1 10k
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
LED
D2
LED
D3
LED
D4
LED
3. DESARROLLE UN SISTEMA PROGRAMADO QUE ACTIVE LAS 8 COMPUERTAS LOGICAS CON EL 16F870, BUFFER, OR, AND, NOT, XOR, NAND, NOR Y XNOR
Programación III ACTIVANDO UN DISPLAY DE 7 SEGMENTOS
LOS DISPLAYS SON FABRICADOS CON ANODO COMUN O CATADO COMUN, SI ES DE CATODO COMUN DEBERA ACTIVAR CON NIVEL ALTO, PERO SI ES ANODO COMUN CON NIVEL BAJO. PORTB=%01111111 ‘forma el numero 8 para catado comun PORTB=%00000000 ‘forma el numero 8 para anodo comun Segun puertob seria % X g f e d c b A 1. ACTIVE UN DISPLAY DE CATODO COMUN, FORMANDO LOS NUMEROS DEL 0 AL 9 U1
9 Device 16F870 OSC1/CLKIN RB0/INT 10 OSC2/CLKOUT RB1 1 Dim num As Byte MCLR/Vpp/THV RB2 RB3/PGM 2 RA0/AN0 RB4 Dim vec As Byte 3 RA1/AN1 RB5 4 RA2/AN2/VREFRB6/PGC TRISB = 0 5 RA3/AN3/VREF+ RB7/PGD 6 RA4/T0CKI prog: 7 RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI For vec = 0 To 9 RC2/CCP1 RC3 LookUp vec, [191,134,219,207,230,237,253,135,255,239], num RC4 RC5 PORTB=num RC6/TX/CK RC7/RX/DT DelayMS 500 PIC16F870 Next vec GoTo prog End
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
2. ACTIVE UN DISPLAY DE CATODO COMUN, FORMANDO LOS NUMEROS DEL 0 AL 9 (Baja - sube) U1 Device 16F870 9 OSC1/CLKIN RB0/INT 10 OSC2/CLKOUT RB1 Dim vec As Byte 1 MCLR/Vpp/THV RB2 RB3/PGM Dim num As Byte 2 RA0/AN0 RB4 3 RA1/AN1 RB5 4 TRISB = 0 RA2/AN2/VREFRB6/PGC 5 RA3/AN3/VREF+ RB7/PGD 6 prog: RA4/T0CKI 7 RA5/AN4 RC0/T1OSO/T1CKI For vec=0 To 9 RC1/T1OSI RC2/CCP1 LookUp vec, [191,134,219,207,230,237,253,135,255,239], num RC3 RC4 RC5 PORTB=num RC6/TX/CK RC7/RX/DT DelayMS 500 PIC16F870 Next vec For vec=9 To 0 Step -1 LookUp vec,[191,134,219,207,230,237,253,135,255,239],num PORTB=num DelayMS 500 Next vec GoTo prog End
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
3. Contador con un display, pero ahora con un vector en el cual almacenaremos los valores correspondientes a cada numero (Para los dos ejemplos el Display es de Ánodo Común) ACTIVE UN DISPLAY DE ANODO COMUN, FORMANDO LOS NUMEROS DEL 0 AL 9 con vectores Device 16F870 Dim vec[10] As Byte Dim pos As Byte vec[0]=191 vec[1]=134 vec[2]=219 U1 9 21 vec[3]=207 OSC1/CLKIN RB0/INT 10 22 OSC2/CLKOUT RB1 vec[4]=230 1 23 MCLR/Vpp/THV RB2 24 RB3/PGM vec[5]=237 2 25 RA0/AN0 RB4 3 26 vec[6]=253 RA1/AN1 RB5 4 27 RA2/AN2/VREFRB6/PGC 5 28 vec[7]=135 RA3/AN3/VREF+ RB7/PGD 6 RA4/T0CKI vec[8]=255 7 11 RA5/AN4 RC0/T1OSO/T1CKI 12 vec[9]=239 RC1/T1OSI 13 RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
TRISB=%00000000 loop: For pos=0 To 9 PORTB=vec[pos] DelayMS 500 Next GoTo loop End
14 15 16 17 18
PIC16F870
5-ACTIVANDO UN DISPLAY, contador ascendente y descendente posee dos pulsantes que sirven para subir y bajar el conteo
Device 16F870 Dim vec[10] As Byte Dim pos As Byte TRISA = %00000011 TRISB = 0 CMCON=7 vec=0 PORTB=64 inicio: If PORTA.0=0 Then vec=vec+1 LookUp vec,[0,191,134,219,207,230,237,253,135,255,239],num PORTB=num If vec>=10 Then vec=0 EndIf pause 200 EndIf If PORTA.1=0 Then vec=vec-1 LookUp vec,[0,191,134,219,207,230,237,253,135,255,239],num PORTB=num If vec<=1 Then vec=11 EndIf pause 200 EndIf GoTo inicio End
5-ACTIVANDO UN DISPLAY, DE 2 DIGITOS
U1 9 10 1 2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
U2 RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
7 1 2 6
A B C D
3 4 5
LT BI LE/STB
13 12 11 10 9 15 14
QA QB QC QD QE QF QG
4511
U3 1 2 3 4 5 6 7 8
1B 2B 3B 4B 5B 6B 7B 8B
COM 1C 2C 3C 4C 5C 6C 7C 8C
10 18 17 16 15 14 13 12 11
ULN2803
'El codigo, está formado por dos bucles, el primero que es de donde a donde va el contador (0-99) y el segundo bucle es el tiempo que quieres que permanesca visualizado el valor en el display, utilizo la funcion DIG es para tomar el digito correspondiente, y le sumo 16 ó 32 para activar el display para formar el número, es importante destcar que en este circuito se trabaja con el 4511 un decoder binario decimal.
Device = 16F870 Xtal = 20 Dim i As Byte Dim j As Byte Dim unidad As Byte Dim decena As Byte All_Digital = true TRISB = 0 TRISA = 1 xx: If PORTA.0 = 1 Then lod If PORTA.0 = 0 Then xx GoTo xx lod: For i=0 To 99 For j=0 To 99 unidad = i Dig 0 PORTB = unidad + 16 DelayMS 5 decena = i Dig 1 PORTB= decena + 32 DelayMS 5 Next j Next i GoTo xx End
Actividades de programación III 1-ACTIVE UN CONTADOR DE 0 A 9999 CON LAS MISMAS PROPIEDADES DEL 0 A 99
U1 9 10 1 2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
U2 RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT PIC16F870
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
7 1 2 6
A B C D
3 4 5
LT BI LE/STB
13 12 11 10 9 15 14
QA QB QC QD QE QF QG
4511
U3 1 2 3 4 5 6 7 8
1B 2B 3B 4B 5B 6B 7B 8B ULN2803
2-ACTIVE UN TABLERO DE BASQUETBOL
COM 1C 2C 3C 4C 5C 6C 7C 8C
10 18 17 16 15 14 13 12 11
Programación VI CONFIGURANDO UN LCD LCD1 16_X_2_LCD
D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28
RS RW E
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
4 5 6
2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
VSS VDD VEE
U1 9 10 1
1 2 3
Device 16F870 Xtal 20 ‘LCD CO VAR Byte Declare LCD_Type = 0 Declare LCD_DTPin = PORTC.0 Declare LCD_ENPin = PORTC.5 Declare LCD_RSPin = PORTC.4 Declare LCD_Interface = 4 Declare LCD_Lines = 2 All_Digital= true D: Print At 1,1, " ACTIVAR ESTACION DelayMS 5000 Print At 2,2, " ACTIVAR BOMBA 1 DelayMS 5000 GoTo D
11 12 13 14 15 16 17 18
PIC16F870
" "
CONFIGURANDO un Lm35 El LM35 es un sensor de temperatura con una precisión calibrada de 1ºC y un rango que abarca desde -55º a +150ºC. El sensor se presenta en diferentes encapsulados pero el mas común es el to-92 3 patas, dos de ellas para alimentarlo y la tercera nos entrega un valor de tensión proporcional a la temperatura medida por el dispositivo. Con el LM35 sobre la mesa las patillas hacia nosotros y las letras del encapsulado hacia arriba tenemos que de izquierda a derecha los pines son: VCC - Vout - GND. La salida es lineal y equivale a 10mV/ºC por lo tanto: +1500mV = 150ºC +250mV = 25ºC -550mV = -55ºC Device 16F877A Declare XTAL 4 Declare LCD_TYPE 0 ' Tipo LCD Alpha numérico Declare LCD_DTPIN PORTB.4 ' The control bits B4,B5,B6,B7 Declare LCD_RSPIN PORTB.2 ' RS pin on B2 Declare LCD_ENPIN PORTB.3 ' E pin on B3 Declare LCD_INTERFACE 4 ' Interface method is 4 bit Dim ADC_Result As Float Dim Temp_Float As Float ADCON1 = %10000000 ' Set all to analogue inputs (PORTA) TRISA = $FF ' Declare porta as all inputs DelayMS 150 Cls Main: ADC_Result = ADIn 0 Temp_Float = ADC_Result * 5000 / 65472 ' to reduce decimal error Print At 1,1, DEC1 Temp_Float , 0, "'C " Return
USANDO COUNTER: CONTEO = COUNTER Pin, 100 Cuente el número de impulsos que aparecen en el pin durante el período, y guardar el resultado en la variable 1. DESARROLLE UN CONTADOR Y REGISTRE LOS RESULTADOS EN UN LCD LCD1 16_X_2_LCD
R1 10k
D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14
21 22 23 24 25 26 27 28
VSS VDD VEE
RB0/INT RB1 RB2 RB3/PGM RA0/AN0 RB4 RA1/AN1 RB5 RA2/AN2/VREFRB6/PGC RA3/AN3/VREF+ RB7/PGD RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
4 5 6
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
2 3 4 5 6 7
1 2 3
9 10 1
RS RW E
U1
11 12 13 14 15 16 17 18
PIC16F870
En electrónica digital, Un contador (counter en inglés) es un circuito secuencial construido a partir de biestables y puertas lógicas capaz de realizar el cómputo de los impulsos que recibe en la entrada destinada a tal efecto, almacenar datos o actuar como divisor de frecuencia. Habitualmente, el cómputo se realiza en un código binario, que con frecuencia será el binario natural o el BCD natural (contador de décadas).
2. DESARROLLE UN FRECUENCIMETRO Y REGISTRE LOS RESULTADOS EN UN LCD LCD1 16_X_2_LCD
R1 10k
D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14
VSS VDD VEE
RB0/INT RB1 RB2 RB3/PGM RA0/AN0 RB4 RA1/AN1 RB5 RA2/AN2/VREFRB6/PGC RA3/AN3/VREF+ RB7/PGD RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
4 5 6
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
1 2 3
2 3 4 5 6 7
21 22 23 24 25 26 27 28
RS RW E
U1 9 10 1
11 12 13 14 15 16 17 18
Un frecuencímetro es un instrumento que sirve para medir la frecuencia, contando el número de repeticiones de una onda en un intervalo de tiempo, mediante el uso de un contador que acumula el número de periodos. Dado que la frecuencia se define como el número de eventos de una clase particular ocurridos en un período, es generalmente sencilla su medida.
PIC16F870
3. DESARROLLE UN ODOMETRO Y REGISTRE LOS RESULTADOS EN UN LCD. LCD1 16_X_2_LCD
R1 10k
D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
21 22 23 24 25 26 27 28
VSS VDD VEE
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
4 5 6
2 3 4 5 6 7
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
1 2 3
9 10 1
RS RW E
U1
11 12 13 14 15 16 17 18
PIC16F870
2
PERIMETRO
P= PI * RAIZ 2
Se llama así al aparato que utilizamos para medir la distancia recorrida entre dos puntos, o el camino recorrido entre dos puntos. Los odómetros llevan mucho tiempo de existir en su forma mecánica y recientemente, los dispositivos digitales han empezado a reemplazarlos. Existen odómetros que miden la distancia en millas así como también los hay para medir kilómetros y metros, algunos tienen la capacidad de borrarse (parciales) y ponerse en cero mientras que otros son permanentes, los automóviles generalmente traen un odómetro parcial y uno permanente.
4.DESARROLLE UN TACOMETRO Y REGISTRE LOS RESULTADOS EN UN LCD. LCD1 16_X_2_LCD
R1 10k
PIC16F870
11 12 13 14 15 16 17 18
D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14
21 22 23 24 25 26 27 28
RS RW E
RB0/INT RB1 RB2 RB3/PGM RA0/AN0 RB4 RA1/AN1 RB5 RA2/AN2/VREFRB6/PGC RA3/AN3/VREF+ RB7/PGD RA4/T0CKI RA5/AN4 RC0/T1OSO/T1CKI RC1/T1OSI RC2/CCP1 RC3 RC4 RC5 RC6/TX/CK RC7/RX/DT
4 5 6
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV
1 2 3
2 3 4 5 6 7
VSS VDD VEE
U1 9 10 1
Un tacómetro (Del griego, τάχος tachos = velocidad y μέτρον metron = medida) es un dispositivo para medir la velocidad de giro de un eje, normalmente la velocidad de giro del motor, se mide en Revoluciones por minuto (RPM).
Programación V ROBOTICA MOVIL
Motor servo
Como se conoce, la posición de un servo motor está determinada por el ancho del pulso que se aplica a su pin de control (para el caso de los motores HS-311 el cable amarillo). En el caso del motor HS-311, la posición de 0º se consigue con un pulso de 0.5 ms, la posición central de 90º con un pulso de 1.5 ms y el extremo de 180º con un pulso de 2.5 ms.Para controlar la posición del motor usaré la función pulsout, cuya sintaxis es: Pulsout pin, ancho_pulso La cual genera un ancho de pulso determinado por su segundo parámetro de entrada en el pin determinado. Por ejemplo:
PulsOut PORTB.0, 150 Generará un pulso de ancho 1.5 ms en el pin 0 de puerto B. Ahora bien, la frecuencia de envío de este pulso será generada por un ciclo for-next y la función pause. El ejemplo siguiente posicionará el motor en 90º:
Dim XX As Byte TRISB=0 PORTB=0 For XX=1 To 25 Step 1
PulsOut PORTB.0, 150 DelayMS 10 Next Es importante inicializar a 0 el pin por el cual se sacará el pulso, debido a que la función pulsout invierte el estado del pin. La resolución de Pulsout depende de la frecuencia del oscilador. Si un oscilador de 4 MHz es utilizada, el período del pulso generado estará en incrementos de 10us. Si un oscilador de 20 MHz se utiliza, Periodo tendrá una resolución 2US. Declarar un valor XTAL no tiene efecto sobre Pulsout. La resolución siempre cambia con la velocidad del oscilador real. Para el caso del motor HS-311 es necesario cambiar la configuración del motor para la simulación como muestra la siguiente figura:
Vamos a programar una secuencia que mantenga al motor en continuo movimiento de un extremo al otro. Aquí entra el ciclo for-next.
Device 16F628A XTAL 20 Dim m As Byte Dim n As Byte TRISB=0 PORTB=0 For m=50 To 250 Step 1 PulsOut PORTB.0,m DelayMS 10 Next For m=250 To 50 Step -1 PulsOut PORTB.0,m DelayMS 10 Next Vamos a ir un poco más adelante, y controlaremos la posición del motor con dos pulsadores: uno para girar el motor a una posición y el otro para llevarlo a la posición contraria. Device 16F628A XTAL 20 CMCON=7 Dim control As PORTB.1 Dim incrementar As PORTA.0 'Pin de pulsador para incremento Dim disminuir As PORTA.1 'Pin de pulsador para decremento Dim X As Byte 'x de tamaño 256 Dim r As Byte 'y de tamaño 256 TRISB=0 PORTB=0 X=150 ; 'Posición inicial del servo motor inicio: PulsOut control,X 'Envía x por el pin portb.1 (control) GoSub timer 'Subrutina de chequeo del pulsador GoTo inicio timer: If incrementar=0 Then GoSub mas 'Si el p esta a tierra, ir a subr "mas" If disminuir=0 Then GoSub menos 'Si el p esta a tierra, ir a subr "menos" Return mas: 'Subrutina de aumento de posición DelayMS 10 X=x+1 ; 'Aumento del pulso de salida If X>200 Then X=200 'Determina un valor máximo de 200 Return menos: 'Subrutina de disminución de posición DelayMS 10 X=x-1 'Disminución del pulso de salida If X<100 Then X=100 'Determina un valor mínimo de 100 Return End USANDO
SERVO Pin, VALOR ROTACION
DEVICE 16F628 ' PICmicro DIM Pos as WORD ' Servo Posición SYMBOL Pin = PORTA.3 ' Alias servo pin ALL_DIGITAL = ON ' PORTA TODOS EN FORMA digital CLS ' LIMPIAR LCD Pos = 1500 ' Centro servo PORTA = 0 ' PORTA low TRISA = %00000111 ' setup porta entrada 0,1 y 2 MXX: IF PORTA.0 = 0 AND Pos < 3000 Then Inc Pos ' Mover servo izquierda IF PORTA.1 = 0 Then Pos = 1500 ' Centro servo IF PORTA.2 = 0 AND Pos > 0 Then Dec Pos ' Mover servo derecha SERVO Pin , Pos DELAYMS 5 ' Servo update rate PRINT AT 1 , 1 , "Posición=" , Dec Pos , " " GOTO MXX
Motor Paso a Paso
El El motor de paso a paso es un dispositivo electromecánico que convierte una serie de impulsos eléctricos en desplazamientos angulares discretos, lo que significa es que es capaz de avanzar una serie de grados (paso) dependiendo de sus entradas de control. Este motor presenta las ventajas de tener alta precisión y repetibilidad en cuanto al posicionamiento. Entre sus principales aplicaciones destacan como motor de frecuencia variable, motor de corriente continua sin escobillas, servomotores y motores controlados digitalmente. Existen 3 tipos fundamentales de motores paso a paso: el motor de reluctancia variable, el motor de magnetización permanente, y el motor paso a paso híbrido.
Robótica sensorial
Programación VI El sensor Pir detector de movimientos por infrarrojos resulta muy adecuado para su empleo en robots, gracias a su pequeño tamaño y bajo consumo. El sensor incluye una lente tipo fresnel de plastico que le proporciona un alcance de 5 metros y un angulo de detección de 60 º. La señal de salida es compatible TTL y la alimentación es de 5V con un consumo de tan solo 350 uA mientras esta en reposo. Sus reducidas dimensiones de solo 25 x 35 x 18 mm hacen posible su utilización en todo tipo de robots y dispositivos sensores.
SRF04 es un sensor de distancias por ultrasonidos capaz de detectar objetos y calcular la distancia a la que se encuentra en un rango de 3 a 300 cm. El sensor srf04 funciona por ultrasonidos y contiene toda la electrónica encargada de hacer la medición
Interruptor final de carreras sin palanca muy útil como detector de obstáculos. Los finales de carrera son interruptores muy útiles para detectar posiciones de palancas, objetos, piezas motorizadas, etc.. También se convierten en la ultima línea de defensa en los robots para detectar obstáculos.
TSOP4838 es un sensor de infrarrojos empleado para recibir las señales infrarrojas de los mandos a distancia empleados normalmente en los electrodomésticos. El sensor tiene un su interior un circuito amplificador y un oscilador a 38 Khz que permiten la recepción de las señales incluso en presencia de fuentes de luz intensas.
Sensor de distancia por infrarrojo para robot con un alcance máximo de 15 cm. Este sensor es muy simple y funciona por reflexión detectando la presencia o no de objetos, pero sin proporcionar un valor numérico de la misma.
CMUcam3 es la ultima versión del popular sistema de visión para robots compuesto por una cámara en formato digital y un sistema de desarrollo de código abierto. Con estos dos componentes se obtiene un sensor de visión de bajo coste que es totalmente programable por lo que se puede utilizar en múltiples aplicaciones incluyendo reconocimiento de formas, detección de colores, seguimiento de objetos en movimiento
Actividades de programación VI Programación VII Configuración de una interface grafica en Visual 2008
SERIALPORT1 ABRE LA CONFIGURACION PARA EL PUERTO SERIAL IDEA PRINCIPAL, SE CONFIGURA UNA INTERFASE GRAFICA CON 4 BOTONES, QUE TRANSMITIRAN UN CODIGO EN HEXA. EN ESTE CASO SE TRANSMITEN LETRAS. NUESTRO RECEPTOR, (EL MICRO) DECODIFICA CADA ELEMENTO Y BUSCARA LA INSTRUCION DESEADA. EN ESTE CASO SE QUIERE COMANDAR ELECTROVALVULAS DE RIEGO POR ZONAS.
CODIGO EN VISUAL BASIC Imports System.IO.Ports Public Class Form_Principal Public Sub New() InitializeComponent() ' Abrir puerto mientra se ejecute la aplicación If Not SerialPort1.IsOpen Then Try SerialPort1.Open() Catch ex As System.Exception MessageBox.Show(ex.ToString()) End Try End If End Sub Private Sub Button_g_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_t.Click Dim mBuffer As Byte() = New Byte(0) {} mBuffer(0) = &H67 'ASCII letra "g". SerialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub Private Sub Button_b_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_b.Click Dim mBuffer As Byte() = New Byte(0) {} mBuffer(0) = &H62 'ASCII letra "b". SerialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub Private Sub Button_a_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_a.Click Dim mBuffer As Byte() = New Byte(0) {} mBuffer(0) = &H61 'ASCII letra "a" SerialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub Private Sub Button_l_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_l.Click Dim mBuffer As Byte() = New Byte(0) {} mBuffer(0) = &H6C 'ASCII letra "l". SerialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub Private Sub Button_Espacio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Espacio.Click Dim mBuffer As Byte() = New Byte(0) {} mBuffer(0) = &H20 'ASCII letra "Espacio". SerialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub Private Sub Form_Principal_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint End Sub End Class
CODIGO PROTON
Include "modedefs.bas" Device 16F877A Xtal 20 Serial_Baud = 9600 Rsout_Pin = PORTC.6 Rsout_Mode = TRUE Rsout_Pace = 1 Rsin_Pin = PORTC.7 Rsin_Mode = TRUE Hserial_Baud = 9600 Hserial_RCSTA = %10010000 Hserial_TXSTA = %00100100 Hserial_Clear = On PORTB=0 All_Digital=true DIM valor AS Byte inicio: HSerIn 1000, inicio, [valor] If valor = "a" Then PORTB.1=1 If valor = "g" Then PORTB.2=1 If valor = "b" Then PORTB.3=1 If valor = "l" Then PORTB.4=1 Clear valor GoTo inicio
Comandos y
Directivas
ADIN Leer análogo a bordo de un convertidor digital. ASM-ENDASM Inserte el código de la sección de idiomas. BOX dibujar un cuadrado en un LCD gráfico. BRANCH computarizada (equivalente a ON GOTO ..). BRANCHL se ramifican de la página (Long Branch). BREAK Salir de un FOR-NEXT, REPEAT-UNTIL, o mientras WEND antes de tiempo. BSTART Enviar una condición START para el bus I2C. BStop Enviar un estado de STOP al bus I2C. BRESTART Enviar una condición RESTART "para el bus I2C. Busack Enviar una condición RECONOCEN al bus I2C. Busin Lee bytes de un dispositivo I2C. BUSOUT Escribe bytes a un dispositivo I2C. BUTTÓN Detecta rebote al pulsar una tecla. Call Subrutina en lenguaje ensamblador. CDATA Definir inicial contenido de la memoria. CIRClE Dibuje un círculo en un LCD gráfico. CLEAR Coloque una variable o en un estado de bajo,o borrar todas las áreas de RAM. CLEARBIT Borrar un poco de un puerto o variable, con un índice variable. CLS Borrar la pantalla LCD. CONFIG Set o configuraciones de programación Perdí mi fusible. COUNTER Cuente el número de impulsos que ocurren en un PIN. CREAD Leer datos de la memoria de código. CURSOR Sitúe el cursor en la pantalla LCD. CWRITE Escribir datos en código de la memoria. DATA Definir inicio del contenido en la memoria. DEC Decremento de una variable. DECLARE Ajuste los parámetros de la colección de rutina. DELAYMS PAUSA (resolución 1mSec). DELAYUS PAUSA (resolución 1uSec). DEVICE Elija el tipo de PIC micro. DIG Devuelve el valor de un dígito decimal. DIM Crear una variable. DISABLE DISABLE interrupciones de software que estaban habilitados anteriormente. DTMFOUT Producir una nota DTMF Touch Tone para telefonía. Edata Definir inicial contenido de EEPROM de a bordo. ENABLE interrupciones de software para desconectar anteriormente. END detener la ejecución del programa BASIC. EREAD Leer un valor de EEPROM de a bordo. EWRITE Escriba un valor en la memoria EEPROM de a bordo. FOR..TO.NEXT..STEP ejecutar instrucciones. FREQOUT Generar uno o dos tonos, de distinta o las mismas frecuencias. GETBIT Examine un poco de un puerto o variable, utilizando un índice variable. GOSUB llamar a una subrutina BASIC en una etiqueta especificada. GOTO Continuar la ejecución en una etiqueta especificada.
HBSTART HBSTOP HBRESTART HBUSACK HBUSIN HBUSOUT HIGH HPWM HRSIN HRSOUT HSERIN HSEROUT HRSIN2 HRSOUT2 HSERIN2 HSEROUT2 IF .. THEN INC INCLUDE INKEY INPUT [LET] LCDREAD LCDWRITE LEFT$ LDATA LINE LineTo LOADBIT Lookdown LOOKDOWNL
LOOKUP LOOKUPL LOW LREAD MID$
Enviar una condición START para el bus I2C con el módulo MSSP. Enviar un estado de STOP al bus I2C utilizando el módulo MSSP. Enviar una condición RESTART "para el bus I2C con el módulo MSSP. Enviar una condición RECONOCEN al bus I2C utilizando el módulo MSSP. Leer de un dispositivo I2C con el módulo MSSP. Escriba a un dispositivo I2C con el módulo MSSP. Hacer un PIN o un puerto de alto. generar una señal PWM utilizando el módulo CCP. recibir datos del puerto serie de dispositivos que contienen un USART. Transmitir datos desde el puerto serie de dispositivos que contienen un USART. recibir datos del puerto serie de dispositivos que contienen un USART. Transmitir datos desde el puerto serie de dispositivos que contienen un USART. Igual que HRSIN pero utilizando una segunda USART si está disponible. Igual que HRSOUT pero utilizando una segunda USART si está disponible. Igual que HSERIN pero utilizando una segunda USART si está disponible. Igual que HSEROUT pero utilizando una segunda USART si está disponible. .. ELSEIF .. ELSE .. ENDIF condicional ejecutar instrucciones. Incremento de una variable. carga un fichero BASIC en el código fuente. escaneo de un teclado. Hacer un pin de entrada. Asignar el resultado de una expresión a una variable. Facultativo de mando Leer un solo byte de un LCD gráfico. Escribe bytes a un LCD gráfico. Extracto n cantidad de caracteres de la izquierda de una cadena Place información en la memoria de código. Para el acceso de los LREAD. Dibuja una línea en cualquier dirección en un LCD gráfico. DIBUJA línea recta en un LCD gráfico. establecer o borrar un bit de un puerto o variable, con un índice variable. Buscar una tabla lookdown, constante de un valor. Buscar lookdown constante o variable de mesa para un valor. Fetch un valor constante de una tabla de búsqueda. Fetch un valor constante o variable de tabla de búsqueda. Hacer un pin o un puerto de bajo. Leer un valor de una tabla y colocar en LDATA variable. Extracto n cantidad de caracteres de una cadena comenzando desde la izquierda.
ON_INTERRUPT
Ejecutar una subrutina o ensamblador usando una interrupción de software.
ON_INTERRUPT ASSEMBLER Ejecutar una subrutina en un harware de interrupción. ON_LOW_INTERRUPT ASSEMBLER Ejecutar una subrutina cuando existe baja prioridad. ON GOSUB llamar a una subrutina basada en un valor de índice. 16-bits. ON GOTO Saltar a una dirección en la memoria de código basado en un valor de índice. ON GOTOL Saltar a una dirección en memoria de código basado en un valor de índice. OUTPUT Hacer un alfiler una salida. OREAD Recibir datos de un dispositivo que utiliza el protocolo de Dallas 1-Wire. OWRITE Enviar datos a un dispositivo mediante el protocolo de Dallas 1-Wire. ORG Set Programa Origen. PEEK Leer un byte de un registro o variable. NO USAR PIXEL Leer un solo píxel de un LCD gráfico. PLOT Establecer un solo píxel de un LCD gráfico. POKE Escribe un byte en el registro o variable. NO USAR POT Leer un potenciómetro en el pin especificado. PRINT una representación gráfica caracteres en una pantalla LCD. PULSIN Mida el ancho de pulso de un alfiler. PULSOUT Generar un pulso a un alfiler. PWM Salida un tren de pulsos de ancho de pulso modulado a la clavija. RANDOM Genera un número pseudo-aleatorios. RCIN Medida un ancho de pulso de un alfiler. READ Leer un valor de la memoria. REM Añadir un comentario al código fuente. REPEAT.UNTIL ejecutar un bloque de instrucciones hasta que una condición es verdadera. RESTORE Ajuste la posición de datos para leer. RESUME Vuelva a habilitar interrupciones de software y retorno. RETURN Continuar en la siguiente declaración en los últimos GOSUB. RIGHT$ cantidad n Extracto de caracteres desde la derecha de una cadena. RSIN serie asíncronos de entrada de un pasador fijo y velocidad de transmisión. RSOUT serie asíncronos de salida a un pasador fijo y velocidad de transmisión. SEED el generador de números aleatorios, para obtener un resultado más al azar. SELEC CASE .ENDSELECT condicional ejecutar bloques de código. SERIN Reciba asíncrono de datos en serie (es decir, datos RS232). SEROUT transmisión asincrónica de datos en serie (es decir, datos RS232). SERVO control de un motor servo. SET Coloque un poco variable o en un estado alto. SET_OSCCAL Calibrar el oscilador interno se encuentra en algunos dispositivos PICmicro. SETBIT Establecer un poco de un puerto o variable, con un índice variable.
SHIN SHOUT SLEEP SNOOZE SONIDO SOUND2 STOP STR STRN STR$ Swap SYMBOL TOGGLE Tolower ToUpper UNPLOT USBINIT USBIN USBOUT VAL VarPtr WHILE.WEND XIN XOUT
serie síncrono de entrada. salida serie síncrona. Apague el procesador por un período de tiempo. Apague el procesador por un período breve de tiempo. Generar un tono o ruido blanco en un pin-especificado. Generar 2 tonos de 2 pines separados. Para la ejecución del programa. carga una matriz de bytes con valores. Crear una matriz de bytes NULL terminado. Convertir el contenido de una variable a una cadena terminada NULL. Cambio de valores de dos variables. Crear un alias a un puerto constante, pin, o regístro. Invertir el estado de bits de un puerto. Convertir los caracteres de una cadena a minúsculas. Convertir los caracteres de una cadena en MAYÚSCULAS. Borrar un solo píxel de un LCD gráfico. Inicializar la interrupción USB en los dispositivos USB. Recibir datos a través de un extremo USB en los dispositivos USB. transmisión de datos vía USB en un extremo de los dispositivos USB. Convertir una cadena terminada NULL en un valor entero. Busque la dirección de una variable. Ejecutar instrucciones mientras la condición es verdadera. recibir datos mediante el protocolo X10. transmisión de datos mediante el protocolo X10