Upload
monikilla-vm
View
766
Download
8
Embed Size (px)
Citation preview
qwertyuiopasdfghjklzxcvbnmqwertyui
opasdfghjklzxcvbnmqwertyuiopasdfgh
jklzxcvbnmqwertyuiopasdfghjklzxcvb
nmqwertyuiopasdfghjklzxcvbnmqwer
tyuiopasdfghjklzxcvbnmqwertyuiopas
dfghjklzxcvbnmqwertyuiopasdfghjklzx
cvbnmqwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqwertyuio
pasdfghjklzxcvbnmqwertyuiopasdfghj
klzxcvbnmqwertyuiopasdfghjklzxcvbn
mqwertyuiopasdfghjklzxcvbnmqwerty
uiopasdfghjklzxcvbnmqwertyuiopasdf
ghjklzxcvbnmqwertyuiopasdfghjklzxc
vbnmqwertyuiopasdfghjklzxcvbnmrty
uiopasdfghjklzxcvbnmqwertyuiopasdf
ghjklzxcvbnmqwertyuiopasdfghjklzxc
vbnmqwertyuiopasdfghjklzxcvbnmqw
PROGRAMACION PIC- ENCENDER UN LED
ROBOTICA
07/06/2011
DENNIS HUILLCA PORTILLA MONICA VASQUEZ MAMANI
PAMELA MONTES SENCE YOSELYN ROJAS ZUZUNAGA
Programación del PIC 18F4550-Prender un Led Página 2
PROGRAMACION PIC- ENCEDER UN LED
Ó
Significa ("Universal Serial Bus") ó su traducción al español es línea serial universal
de transporte de datos.
El puerto USB al que hace mención es el conector de entrada a un
bus de tipo serie en el que es posible conectar múltiples dispositivos,
tanto en frío como en caliente.
Si existe un controlador ya instalado que le permita comunicarse con
él, lo utilizará directamente e, incluso, pondrá en marcha la aplicación
que corresponda para acceder a dicho dispositivo. Si, por el contrario,
no hay un controlador preinstalado en el sistema, solicitara un
controlador adecuado.
El controlador, a su vez, ofrecerá a las aplicaciones un API
(application programming interface) de alto nivel que les permita
usar el dispositivo sin tener que preocuparse de los detalles de la
comunicación USB. 1
1.1 USB En un principio teníamos la interfaz serie y paralelo, pero era
necesario unificar todos los conectores creando uno más sencillo y de
mayores prestaciones. Así nació el USB (Universal Serial Bus) con
una velocidad de 12Mb/seg. y como su evolución, USB 2.0, apodado
USB de alta velocidad, con velocidades en este momento de hasta
480.
Una característica importante es que permite a los dispositivos
trabajar a velocidades mayores, en promedio a unos 12 Mbps, esto es
más o menos de 3 a 5 veces más rápido que un dispositivo de puerto
1 http://www.todoexpertos.com/categorias/ciencias-e-ingenieria/respuestas/1070173/transmision-de-datos-
por-puerto-usb
Programación del PIC 18F4550-Prender un Led Página 3
paralelo y de 20 a 40 veces más rápido que un dispositivo de puerto
serial.2
1.2 FUNCIONAMIENTO DEL USB
Trabaja como interfaz para transmisión de datos y distribución de
energía, que ha sido introducida en el mercado de PC´s y periféricos
para mejorar las lentas interfaces serie (RS-232) y paralelo. Esta
interfaz de 4 hilos, 12 Mbps y "plug and play", distribuye 5V para alimentación,
transmite datos y está siendo adoptada rápidamente por la industria informática.
Emplea una topología de estrellas apiladas que permite el funcionamiento simultáneo
de 127 dispositivos a la vez. En la raíz o vértice de las capas, está el controlador
anfitrión o host que controla todo el tráfico que circula por el bus.
El bus serie USB es síncrono, y utiliza el algoritmo de codificación NRZI ("Non Return to
Zero Inverted"). En este sistema existen dos voltajes opuestos; una tensión de
referencia corresponde a un "1", pero no hay retorno a cero entre bits, de forma que
una serie de unos corresponde a un voltaje uniforme; en cambio los ceros se marcan
como cambios del nivel de tensión, de modo que una sucesión de ceros produce
sucesivos cambios de tensión entre los conductores de señal.
Ó
El sistema de bus serie universal (USB) consta de tres componentes:
Controlador
Hubs o Concentradores Periféricos
Es un conector rectangular de 4 terminales que permite la
transmisión de datos entre una gran gama de dispositivos externos (periféricos) con la computadora; por ello es considerado puerto; mientras que la
2 http://www.monografias.com/trabajos11/usbmem/usbmem.shtml#QUEES
Programación del PIC 18F4550-Prender un Led Página 4
definición de la Real Academia Española de la lengua es "toma de conexión universal de uso frecuente en las
computadoras".3
El puerto USB 2.0 compite actualmente en el mercado contra el puerto FireWire.
El puerto USB 3.0 compite en altas velocidades de transmisión contra el puerto eSATA.
Figura 1. Símbolo de USB.
2.1 TERMINALES DEL PUERTO USB 1.X, USB 2.0, USB 3.0
Los puertos USB 1.0, 1.1 y USB 2.0 tienen 4 contactos, mientras que
el puerto USB 3.0 cuenta con 9 (2 por los cuáles será capaz de enviar, 2 por los cuáles recibir de manera simultánea); en las
siguientes figuras se muestran las líneas eléctricas y su descripción básica:
3 http://www.informaticamoderna.com/El_puerto_USB.htm
Programación del PIC 18F4550-Prender un Led Página 5
Figura 2. Líneas eléctricas del conector USB 1.0 y USB 2.0, las líneas centrales
conducen datos, las laterales la
alimentación.
1.- Vbus (+ 5 Volts, alimentación)
2.- D- (- datos) 3.- D+ (+ datos)
4.- GND (tierra)
Líneas eléctricas del puerto USB.
Figura 3. Líneas eléctricas del conector USB 3.0
1.- Vbus (+ 5 volts, alimentación) 2.- D- (- datos) 3.- D+ (+ datos)
4.- GND (tierra) 5.- StdA_SSRX- (Recibe datos)
6.- StdA_SSRX+ (Recibe datos) 7.- GND_DRAIN (tierra-drenado) 8.- StdA_SSTX- (Envía datos)
9.- StdA_SSTX+ (Envía datos)
Líneas eléctricas del puerto USB 3.0.
4
3. NIVELES DE TENSIONES DEL USB 2.0
3.1 LAS TENSIONES DEL PUERTO USB
El programador se alimenta directamente con la tensión suministrada
por VBUS del puerto USB. A su vez, por portabilidad y practicidad puede proporcionar el voltaje VDD para la programación de los
dispositivos Pics soportados. Esta última característica puede ser utilizada siempre y cuando la tensión VBUS del puerto se mantenga dentro de los márgenes mínimos admitidos en las especificaciones de
programación de estos microcontroladores.
Esto es muy importante tenerlo presente y puede ser una buena referencia ante posibles fallos en la programación de algún tipo de
4 http://www.informaticamoderna.com/El_puerto_USB.htm
Programación del PIC 18F4550-Prender un Led Página 6
PIC, debido a causas ajenas al programador y al software de programación. Puede estar todo funcionando correctamente y sin
embargo encontrarnos con la imposibilidad de grabar un Pic determinado simplemente por una deficiente alimentación durante la programación del microcontrolador.
La tensión que suministra el puerto USB, puede variar entre un
mínimo y un máximo según la computadora. Los niveles de tensión que podemos encontrar en VBUS, de acuerdo a la tabla de
especificaciones son los siguientes:
Incluso podemos medir valores aún inferiores a 4.4 volts en muchas PC, situados en 4.35 volts.
Teniendo presente lo anterior y volviendo específicamente a los microcontroladores PIC generales utilizados en nuestros proyectos,
que funcionan con una tensión nominal de 5 volts, podemos observar en las especificaciones de programación que la tensión mínima
necesaria para realizar un borrado completo de la mayoría de estos chips se sitúa en 4.5 volts, según la tabla de especificaciones:
Esto significa que si la tensión que suministra el puerto USB es menor a 4.5 volts,
corremos el riesgo que no pueda ser borrado el microcontrolador PIC y en consecuencia producirá un error al intentar grabarlo ya que es necesario realizar
Programación del PIC 18F4550-Prender un Led Página 7
un borrado general (memoria de programa, memoria de datos y registros de configuración) antes de la programación.
En este supuesto caso debemos recurrir a una alimentación externa para
solucionar los problemas durante la programación. Tanto la lectura, verificación e identificación del dispositivo, no están afectados por una tensión del puerto USB menor a 4.5 volts. Un microcontrolador PIC en "blanco" también puede ser
programado. Sólo afecta al borrado y a la secuencia borrado - grabación.
4. MATERIALES UTILIZADOS
KUBUNTU
PINGÜINO _BETA9-05_LINUX
PYTHON
3 LEDS DE COLORES
1 RESISTENCIA DE (460±23)Ω
1 PIC 18F4550
1 CABLE USB 2.0
1 PROTOBOARD
1 RESET
1 CAPACITOR
1 CRISTAL 4MHZ
1 ULN2003
Programación del PIC 18F4550-Prender un Led Página 8
5. PIC 18F4550 PINGÜINO
Programación del PIC 18F4550-Prender un Led Página 9
Programación del PIC 18F4550-Prender un Led Página 10
Programación del PIC 18F4550-Prender un Led Página 11
É
Características:
Memoria Flash: 32Kbytes
Máximo número de instrucciones simples: 16384
Memoria SRAM: 2048 bytes
Memoria EEPROM: (memoria no volatil) 256 bytes
Entradas / Salidas: 35
Número de entradas A/D: 13
Número de CCP: 1
Número de ECCP: 1
Soporta SPP: Si
Soporta SPI: Si
Soporta máster I2C: Si
Número de EAUSART: 1
Número de comparadores: 2
Número de temporizadores de 8 bits: 1
Número de temporizadores de 16 bits: 3
Universal Serial Bus (USB) module: Si
Programación del PIC 18F4550-Prender un Led Página 12
Programación del PIC 18F4550-Prender un Led Página 13
Programación del PIC 18F4550-Prender un Led Página 14
Diagrama de bloques PIC18F4550
Microchip distribuye de forma general dos tipos de micros dependiendo del voltaje de alimentación:
Clase F: Voltaje típico (4.2 V a 5.5V)
Clase LF: Bajo voltaje (2.0 V a 5.5V)
Estos son exactamente iguales sólo que los micros de clase LF puedes ser usados con la nueva alimentación de 3.3V que actualmente y
poco a poco se está imponiendo a los típicos 5V.
5.2 FUNCTIONS QUE NOS OFRECE LA PROGRAMACION PYTHON
.
1
1wire.readbit 1wire.readbyte 1wire.reset 1wire.writebit 1wire.writebyte
A
Abs AnalogRead AnalogWrite
C
CDC.print CDC.read Cos
D
DS18B20.configure
DS18B20.crc
G cont.
GLCD.SelectFont GLCD.SetDot GLCD.SetInverted GLCD.StringWidth GLCD.WriteCom
mand GLCD.WriteData GLCD.fastWriteHi
gh GLCD.fastWriteLo
w GetSystemClock
I
I2C.get I2C.init I2C.readchar I2C.restart I2C.send I2C.sendack I2C.sendnack
O cont.
OnCompare2 OnCompareAll OnCounter0 OnCounter1 OnCounter3 OnEeprom OnEvent OnLowVoltage OnOscFailed OnParallel OnSerialRX OnSerialTX OnTimer0 OnTimer1 OnTimer2 OnTimer3 OnUSB
P
PWM.setdutycycle PWM.setfrequency
Programación del PIC 18F4550-Prender un Led Página 15
DS18B20.find DS18B20.getfirst DS18B20.getnext DS18B20.matchro
m DS18B20.read DS18B20.readrom Delay DelayMicrosecond
s DigitalRead DigitalWrite
E
EEPROM.read16 EEPROM.read8 EEPROM.write16 EEPROM.write8
F
Flash.erase Flash.read Flash.write
G
GLCD.CharWidth GLCD.ClearPage GLCD.ClearScreen GLCD.ClearScreen
X GLCD.ClearSysTex
tLine GLCD.CursorTo GLCD.DoReadData GLCD.DrawBitmap
I2C.start I2C.stop I2C.wait I2C.writechar Int.detach
K
KB.get
L
Lcd Lcd.autoscroll Lcd.begin Lcd.blink Lcd.clear Lcd.command Lcd.cursor Lcd.display Lcd.home Lcd.init Lcd.leftToRight Lcd.noAutoscroll Lcd.noBlink Lcd.noCursor Lcd.noDisplay Lcd.print Lcd.printFloat Lcd.printNumber Lcd.printf Lcd.rightToLeft Lcd.scrollDisplayL
eft Lcd.scrollDisplayR
ight Lcd.send
PWM.setpercentdutycycle
PinMode Play Pow
R
Rand RandomSeed
S
SPI.init SPI.printf SPI.read SPI.write Serial.available Serial.begin Serial.flush Serial.getkey Serial.getstring Serial.print Serial.printf Serial.read Servo.attach Servo.detach Servo.read Servo.setMaximumP
ulse Servo.setMinimumP
ulse Servo.write Sin Sound Sprintf Sqrt
Programación del PIC 18F4550-Prender un Led Página 16
GLCD.DrawCircle GLCD.DrawHoriLin
e GLCD.DrawLine GLCD.DrawRect GLCD.DrawRound
Rect GLCD.DrawVertLin
e GLCD.Enable GLCD.FillRect GLCD.GotoXY GLCD.Init GLCD.InvertRect GLCD.PrintFloat GLCD.PrintNumbe
r GLCD.PutChar GLCD.Puts GLCD.ReadData
Lcd.setCursor Lcd.write
M
Millis
O
OnADC OnBusCol OnChangePin0 OnChangePin1 OnChangePin2 OnChangePin4to
7 OnCompare1
T
Tan Toggle
U
USB.available USB.read USB.send USB.sendint UserInterrupt
5.3 DE
Debido a la pequeña potencia que suministran los
microcontroladores, sólo podemos hacer funcionar directamente unos
LED y poco más. Por este motivo es necesario amplificar las salidas
en función de las cargas que vayamos a controlar. Un método sencillo
y económico es emplear el integrado ULN2003A, que es un conjunto
de Darlington (darlington array) montados en un chip con el que
podemos controlar cargas de hasta medio amperio. El chip lleva
diodos de protección contra las sobretensiones producidas por cargas
inductivas. Esto lo hace ideal para gobernar relés.
Programación del PIC 18F4550-Prender un Led Página 17
5.3.1 CARACTERÍSTICAS DEL CHIP ULN2003A
Intensidad por canal =500mA Tensión máxima de alimentación = 50 v
Protección interna contra sobretensiones producidas por
cargas inductivas Señal mínima de entrada = 2 v
Los pares Darlington pueden colocarse en paralelo para gobernar cargas que consumen intensidades elevadas, como
por ejemplo, pequeños motores. Precio aproximado = 0.6€
5.3.2 CONEXIÓN
Es necesario tener en cuenta que los terminales de salida de este chip conectan las cargas a masa cuando llega una señal positiva a las entradas adecuadas. Por este motivo, el terminal de la carga que no está conectado al chip ha de estar unido al borne positivo del generador. En el esquema de abajo vemos como se conectaría un motor al canal superior (1, 16). También se puede observar que pueden existir dos alimentaciones unidas por masa. En este ejemplo, el pulsador es el encargado de dar la señal de control al pin 1, para que el pin 16 se ponga a 0 voltios y quede conectado el motor.
Programación del PIC 18F4550-Prender un Led Página 18
5.3.4 ESQUEMA INTERNO Diagrama de un canal Esquema interno Esquema externo
Programación del PIC 18F4550-Prender un Led Página 19
5.4 CRISTAL DE 4MHZ HC49U
5.4.1 CARATERÍSTICAS & ESPECIFICACIONES
Lugar de Origen: NC,
ANH
Número de modelo:
Cristal de 4 Mhz HC49U
Marca: LCR
Número del artículo:
Cristal de 4 Mhz HC49U
Frecuencia: 1.800MHz -
110.000MHz
Rango de temperatura: -
10C - 60 C estándar,-40C -
85 C extendido
Estabilidad de la
frecuencia: + /-5ppm, + /-
10ppm, + /-30ppm
Tolerancia de la frecuencia
en 25C: + /-5ppm, + /-
10ppm, + /-30ppm
5.5 DIVISOR DE TENSION
Cuando dos o más resistencias se conectan en serie, la corriente que circula por ellas es la misma. Ver el diagrama más abajo.
La resistencia equivalente (Rs) de estas resistencias en serie se obtiene sumando los valores de las resistencias.
Una vez que se tenga la resistencia equivalente, se puede obtener la
corriente con ayuda de la Ley de Ohm
I = V / Rs
En el gráfico inferior de puede ver el circuito original y el equivalente
Programación del PIC 18F4550-Prender un Led Página 20
Para encontrar la tensión en cualquiera de las resistencias del circuito original se utiliza la fórmula de división de tensión
Como en resistencias en serie la corriente es la misma en todas las
resistencias, utilizando la ley de Ohm para cada resistencia se obtienen las siguientes fórmulas
I = Vin / Rs I = V1 / R1
I = V2 / R2
I = V3 / R3.
Como I = I, se pueden igualar las ecuaciones, entonces: Vin / Rs =
V1 / R1.
Suponiendo que el voltaje que se desea conocer es V1, se despeja este valor.
V1 = Vin x R1 / Rs. Las tensiones V2 y V3 se obtienen de igual
manera, pero con el valor correspondiente de resistencia. (para V2 se cambia R1 por R2, para V3 se cambia R1 por R3)
Expresando la fórmula en palabras, la fórmula de división de tensión
dice:
Vout = (Resistencia a través de la salida /resistencia total del circuito) x Vin
5.7 CONTRUCCION DEL PROTOBOARD
Programación del PIC 18F4550-Prender un Led Página 21
Programación del PIC 18F4550-Prender un Led Página 22
PINGUINO es un KUBUNTU, UBUNTU con aplicaciones básicas en Microchip 8-bit or 32-bit PIC microcontrollers. The goal of this project is to build an IDE (Integrated Development Environment) que es muy
facil usarlo en GNU/Linux.
Programación del PIC 18F4550-Prender un Led Página 23
6.1 DESCARGAS
Pinguino beta 9.05 (26-Dec-2010). Es la primera instalación
Después de la instalación
Pinguino IDE for [ GNU/Linux ]
Plataforma de programacion
Boot Loader - [ bootloaderV2.12.hex ] [ bootloaderARDE.hex ]
(for boards with buttons RUN and RESET)
6.2 INSTALAR EL IDE
En GNU/Linux En Windows En MacOS
6.3 BOOTLOADER
El bootloader es una pequeña rutina dentro del PIC. Se utiliza para la
transferencia de su programa en la memoria del PIC con esto en lugar de utilizar un programador. Este codigo solo debe ser grabado en el PIC una unica vez, luego el codigo generado con IDE de
Pinguino sera enviado via USB.
El bootloader es el mismo para versiones basadas en el PIC 18F2550 y para el PIC 18F4550.
6.4 COMPILAR Y GRABAR TU CODIGO
6.4.1 Compilar
Solo debes presionar el botón de compilar y si todo tu código está
bien escrito, debes poder apreciar un mensaje como este
Compilación hecha code size: XXXX / XXXXX bytes (XX% used)
Lo que te indica el tamaño de tu código, y el porcentaje que ocupara dentro de la memoria FLASH del micro.
Programación del PIC 18F4550-Prender un Led Página 24
6.4.2 Cargar código
*En GNU/Linux
Presionar el botón de Reset en la placa de Pinguino.
Esperar 3 segundos.
Presionar el botón de Upload to Pinguino en el IDE.
Aparecerá un mensaje en la consola del IDE. Luego de 5 segundos el led de RUN se encendera y
ya se estara ejecutando el ultimo código cargado.
6.5 HERRAMIENTAS UTILIZADAS
Librería PyGTK 2.0:
librería que ya viene incorporada en el python
Sistema operativo Linux Kubuntu 9.0 beta
import pygtk
pygtk.require(’2.0’)
import gtk
Programación del PIC 18F4550-Prender un Led Página 25
6.5 CODIGO DE PROGRAMACION PINGÜINO BETA PARA EL PIC
//definimos el PIC18F4550
#define PIC18F4550
//declaración de variables
int i;
char c;
int o;
// modulo de inicialización
void setup()
//definimos el uso del pin 22 en el PIC tanto para el OUTPUT como para LOW
pinMode(22,OUTPUT);
digitalWrite(22,LOW);
//inicializamos la variable “o” en bajo cero
o=0;
//método void del bucle infinito
void loop()
Programación del PIC 18F4550-Prender un Led Página 26
// verificamos que hay un stream de datos esperando ser leidos
if(USB.available())
// si hay entonces recuperamos ese byte ( que es un char
c = USB.read();
//segun haya sido los char elegimos una accion”
if(c == 'O')
o = 1;
if(c == 'F')
o = 2;
if(c == 'S')
o = 3;
if(o == 0)
// si no se eligio ninguna accion indica que es encendido o apagado, entonces
if (c=='H') digitalWrite(22,HIGH);
if (c=='L') digitalWrite(22,LOW);
if(o == 1)
//en el puerto 22 escribimos ya sea en alto(HIGH) o en bajo(LOW)
digitalWrite(22,HIGH);
delay(100);
digitalWrite(22,LOW);
//frecuencia, revolución o intensidad con la que prenderemos el led
delay(100);
Programación del PIC 18F4550-Prender un Led Página 27
if(o == 2)
digitalWrite(22,HIGH);
delay(50);
//escribimos por el pin 22 del PIC en bajo
digitalWrite(22,LOW);
delay(50);
if(o == 3)
digitalWrite(22,HIGH);
delay(1000);
digitalWrite(22,LOW);
delay(1000);
//iniciamos nuevamente en 0 para repetir todo
o = 0;
Programación del PIC 18F4550-Prender un Led Página 28
6.7 PROGRAMACION PYTHON DEL LADO DE LA PC
#!/usr/bin/env python # -⁻- coding: UTF-8 -*- #jalamos librerias para GUI (interfaz grafica) import pygtk pygtk.require('2.0') import gtk import usb #la clase q contendra los botones class Table: def callback(self, widget, data=None): #la function que es llamada por cada boton donde “data” contiene el char de instrucción #que se mandara al pic print "Instrucción %s enviada." % data self.dh.bulkWrite(0x01, data, 10000) def delete_event(self, widget, event, data=None): gtk.main_quit() return False def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("Comunicación USB") self.window.connect("delete_event", self.delete_event) self.window.set_border_width(10)
Programación del PIC 18F4550-Prender un Led Página 29
#creamos nuestra clase que contendra los botones, y luego creamos botones con eventos table = gtk.Table(5, 1, True) self.window.add(table) button = gtk.Button("Encender Led") button.connect("clicked", self.callback, "H") table.attach(button, 0, 1, 0, 1) button.show() button = gtk.Button("Apagar Led") button.connect("clicked", self.callback, "L") table.attach(button, 1, 2, 0, 1) button.show() button = gtk.Button("Oscilar") button.connect("clicked", self.callback, "O") table.attach(button, 0, 2, 1, 2) button.show() button = gtk.Button("Ocilar rapidor") button.connect("clicked", self.callback, "F") table.attach(button, 0, 2, 2, 3) button.show() button = gtk.Button("Oscilar Lento") button.connect("clicked", self.callback, "S") table.attach(button, 0, 2, 3, 4)
Programación del PIC 18F4550-Prender un Led Página 30
button.show()
button = gtk.Button("Salir") button.connect("clicked", lambda w: gtk.main_quit()) table.attach(button, 0, 2, 4, 5) button.show() table.show() self.window.show() busses = usb.busses() for bus in busses: devices = bus.devices for dev in devices: if dev.idVendor==0x04d8 and dev.idProduct==0xfeaa: pingu = dev self.dh = pingu.open() self.dh.setConfiguration(3) self.dh.claimInterface(0)
Programación del PIC 18F4550-Prender un Led Página 31
def main(): gtk.main() return 0 if __name__ == "__main__": Table() main()
Programación del PIC 18F4550-Prender un Led Página 32
7. BIBLIOGRAFIA
www.rugebiker.com/wp.../Implementacion-de-un-Circuito-de-Control.pdf
http://spanish.alibaba.com/product-gs/4mhz-hc49u-crystal-
357776966.html
http://www.tecnologiaseso.es/pdf/AMPLIFICADOR%20DE%20SA
LIDAS.pdf