Documentos de Académico
Documentos de Profesional
Documentos de Cultura
UNIVERSIDAD DE SALAMANCA
E.T.S. DE INGENIERA INDUSTRIAL DE BJAR
NDICE
A. MEMORIA
1.
Introduccin_______________________________________________ 29
1.1.
Objeto _____________________________________________________ 29
1.2.
Descripcin _________________________________________________ 29
1.2.1.
1.2.2.
1.2.3.
1.2.4.
1.2.5.
1.2.6.
1.2.7.
1.2.8.
1.2.9.
1.2.10.
2.
Introduccin ________________________________________________ 35
Motivacin _____________________________________________________35
2.2.
Vocabulario ________________________________________________ 36
2.3.
Historia ____________________________________________________ 38
2.3.1.
2.4.
Arquitectura________________________________________________ 39
2.5.
2.5.1. Token__________________________________________________________45
2.5.2. Token Especial: Transaccin Split ___________________________________45
2.5.2.1. Transacciones Split____________________________________________46
2.5.2.2. Paquetes Start-Of-Frame (SOF) __________________________________48
2.6.
2.6.1.
2.6.2.
2.6.3.
2.7.
3.
Microntroladores ___________________________________________ 55
3.1.
3.1.1.
3.1.2.
3.1.3.
3.1.4.
3.2.
Qu Microcontrolador Emplear?______________________________ 59
3.3.
vi
3.3.2.4.
3.3.2.5.
3.4.
vii
viii
ix
xi
3.5.
xii
3.5.1.22.
3.5.1.23.
3.5.1.24.
3.5.1.25.
3.5.1.26.
3.5.1.27.
3.5.1.28.
3.5.1.29.
3.5.1.30.
xiii
xiv
3.5.4.14.
3.5.4.15.
3.5.4.16.
3.5.4.17.
3.5.4.18.
3.5.4.19.
3.5.4.20.
3.5.4.21.
3.5.4.22.
3.5.4.23.
3.5.4.24.
3.5.4.25.
3.5.4.26.
3.5.4.27.
3.5.4.28.
3.5.4.29.
3.5.4.30.
3.5.4.31.
3.5.4.32.
3.5.4.33.
3.5.4.34.
3.5.4.35.
3.5.4.36.
3.5.4.37.
3.5.4.38.
3.5.4.39.
4.
4.2.
xv
4.3.
xvi
4.4.
xvii
xviii
5.
5.2.
5.3.
xix
5.4.
6.
6.2.
6.3.
6.4.
6.5.
xx
7.
7.2.
7.3.
xxi
7.4.
xxii
7.5.
7.6.
7.6.1.
7.6.2.
8.
Introduccin ___________________________________________________606
Programa de Control _____________________________________________606
7.6.2.1.
Programa _______________________________________________ 606
8.2.
8.3.
B. CLCULOS
1.
1.2.
C. PLANOS
Plano 1: Esquema del circuito elctrico _____________________________619
Plano 2: Esquema elctrico de la placa _____________________________621
Plano 3: Layout de la placa_______________________________________623
Plano 4: Chasis ________________________________________________625
Plano 5: Piezas del parachoques trasero ____________________________627
Plano 6: Piezas del parachoques delantero __________________________629
xxiii
D. PLIEGO DE CONDICIONES
1.
1.2.
1.3.
1.4.
1.4.1.
1.4.2.
1.4.3.
1.4.4.
1.5.
E. PRESUPUESTO
1.
2.
3.
F. CONCLUSIN
1.
xxiv
A. MEMORIA
1. INTRODUCCIN
29
1.
INTRODUCCIN
1.1.
OBJETO
1.2.
DESCRIPCIN
1.2.1.
La memoria comienza con un estudio del USB, las transmisiones entre host
(ordenador), hub (dispositivo concentrador) y perifrico. Dando especial importancia al
significado del vocabulario especfico de la conexin.
Del estudio de la norma del USB se obtienen los pasos que realiza el host para
detectar y configurar el dispositivo o los tipos de transferencia; y algunos aspectos
secundarios pero no menos importantes como los pasos necesarios para transferir un
byte. El principal objetivo de este apartado es la comprensin de la conexin al menor
nivel existente.
Al trabajar con microcontroladores que poseen puerto USB todos los pasos
citados en el prrafo anterior, no se observan ya que el chip lo realiza internamente. Lo
nico que hay que realizar es una correcta configuracin.
1.2.2.
CAPTULO 3: MICROCONTROLADORES
1.2.3.
1.2.4.
30
1.2.5.
1.2.6.
CAPTULO 7: APLICACIN
31
1.2.7.
CLCULOS
Se realizan los clculos necesarios para el proyecto.
1.2.8.
PLANOS
1.2.9.
PLIEGO DE CONDICIONES
1.2.10.
CONDICIONES
Con este ltimo apartado se pretende explicar los problemas que han surgido en
la realizacin de la aplicacin y las experiencias obtenidas.
32
2. NOCIONES BSICAS DE LA
NORMA USB 2.0
35
2.
2.1.
INTRODUCCIN
2.1.1.
MOTIVACIN
Las motivaciones que han inspirado la creacin del Universal Serial Bus ver. 1.0
son tres: conexin del PC al telfono, facilidad de uso y expansin de entrada/salida.
Las motivaciones a mejorar la versin y crear as la 2.0 han sido: la evolucin de
los ordenadores y de su velocidad, la mejora de los perifricos, la demanda de las
imgenes digitales y la necesidad de una mayor velocidad de transmisin de datos.
Las peridicas revisiones de la norma se realizan para que los desarrolladores no
fabriquen unos perifricos con una interfaz obsoleta.
2.2.
VOCABULARIO
36
MSb
Addr 1
Addr 2
Addr 3
Addr 4
Addr 5
Campo del Endpoint (ENDP): Los 4bits del campo del Endpoint permiten una
mayor flexibilidad en el direccionamiento de funciones en las que s necesita ms de un
Endpoint.
Excepto el Endpoint 0, los nmeros de los Endpoint son funciones especficas.
El campo del Endpoint se define en los tokens IN, SETUP y OUT y en el
especial PING.
37
2.3.
MSb
Endp 1
Endp 2
Endp 5
HISTORIA
2.3.1.
UTILIZACIN PREVISTA
38
2.4.
2.4.1.
ARQUITECTURA
DESCRIPCIN DEL SISTEMA USB
El USB es un sistema punto a punto: dado que el lugar de partida es el host (PC
o hub), el destino es un perifrico u otro hub. Slo hay un host.
Los perifricos comparten la banda de paso del USB. El protocolo se basa en el
llamado paso de testigo (token). El ordenador proporciona el testigo al perifrico
seleccionado y seguidamente, ste le devuelve el testigo en su respuesta.
Este bus permite la conexin y desconexin en caliente, sin apagar el equipo.
2.4.2.
La figura muestra la topologa del bus, que viene a estar representado por un
rbol, en donde el PC sera la raz y los perifricos las hojas.
39
2.4.3.
INTERFAZ FSICA
2.4.3.1.
Aspecto Elctrico
2.4.3.2.
Alimentacin
2.4.3.3.
Consumo
40
2.4.3.4.
Control De Consumo
2.4.3.5.
Una transaccin sobre el bus necesita al menos tres paquetes. Cada transaccin
comienza por el envo por parte del host de un paquete que indica el tipo, la direccin de
la transaccin, la direccin del USB y su punto terminal (Endpoint). Este paquete recibe
el nombre de token packet (paquete testigo).
A continuacin, el transmisor enva su paquete de datos, o indica que no tiene
paquetes que transmitir, por ltimo, el destinatario enva un paquete indicando que ha
recibido bien el paquete de datos.
Recibe el nombre de pipe el enlace virtual entre el host y un perifrico USB, con
su Endpoint (un perifrico puede tener varios Endpoints).
Existen dos tipos de enlaces virtuales (pipe): stream y message. En el caso de
stream, se trata de un flujo sin estructura; en el otro caso, si tiene una. Cada enlace est
caracterizado por su banda de paso, su tipo de servicio, el nmero del Endpoint y el
tamao de los paquetes. Estos enlaces se definen durante la inicializacin del USB.
Siempre existe un enlace virtual 0 que permite tener acceso a la informacin de
configuracin del perifrico USB (estado, control e informacin).
En el ordenador, el driver se encarga del encaminamiento de los paquetes sobre
el bus.
2.4.3.6.
Robustez
41
2.4.3.7.
Deteccin De Errores
2.4.3.8.
Gestin De Errores
2.4.3.9.
42
2.4.3.10.
Tipos De Transferencia
2.4.3.11.
Tipo Control
2.4.3.12.
Tipo Bulk
2.4.3.13.
Tipo Interrupt
2.4.3.14.
Tipo Isochronous
43
2.4.3.15.
2.4.3.16.
USB Device
2.4.3.17.
Caractersticas De Un Perifrico
44
2.5.
2.5.1.
TOKEN
LSb
Campo PID
8
BITs
ADDR ENDP
7
4
MSb
CRC5
5
Los paquetes token tienen cinco bits CRC que cubren los campos direccin y
Endpoint. El CRC no cubre el PID, su propsito es chequea el campo. Los paquetes
token y SOF estn delimitados por un EOP despus de tras bytes de paquete de datos. Si
un paquete se decodifica como otro token o SOF valido pero no termina con un EOP
despus de tres bytes, esto se tiene que considerar invlido y el receptor lo tiene que
ignorar.
2.5.2.
45
2.5.2.1.
Transacciones Split
Token
SSPLI
Token
FS/LS
Protocolo
DATAx
Fase Token
La transaccin genrica complete-split se compone de: la fase token que tiene
dos paquetes: el token especial SPLIT y el token full-/low-speed. El siguiente paquete
es uno de datos o uno de protocolo dependiendo de la direccin y el tipo especificado de
transaccin. Las complete-split pueden ser de 2 3 paquetes determinados por el tipo de
transferencia especfica y la direccin.
Protocolo
Token
SSPLI
Token
FS/LS
o
DATAx
Fase Token
El resultado de una transaccin Split se devuelve con una transaccin completesplit. El host emite una start-split (indicado con 1) al hub que puede proceder con otra
transaccin high-speed. El start-split provoca que el hub mande un Token IN full-/lowspeed algo despus (indicado con 2). El dispositivo responde al Token IN (en el ejemplo
con un paquete de datos) y el hub responde con un protocolo al hub. Finalmente, el host,
46
algo despus, enva un complete-split (indicado con 3) para recibir los datos enviados,
por el dispositivo. Darse cuenta de que en el ejemplo, el hub proporciona un protocolo
full-/low-speed (ACK en este caso) al Endpoint del dispositivo antes del complete-split
y el complete-split no proporciona un protocolo high-speed al hub.
1
start
split
SSPLIT
2
Full-/Low-Speed
TOKEN IN
TOKEN IN
Host
Hub
ACK
CSPLIT
3
complete
split
Dispositivo
DATA 0
TOKEN IN
DATA0
Bus
High-Speed
Bus
Full-/Low-Speed
Una transaccin OUT normal full-/low-speed es similar a invertir una startsplit y complete-split.
Ejemplo de transferencia interrupcin OUT: el host enva una transaccin startsplit consistente en un paquete token especial SSPLIT, un token OUT y un paquete de
datos. El hub, algo despus manda el token OUT y el paquete de datos al bus full-/lowspeed. El dispositivo responde con un protocolo. Algo despus, el host enva la
transaccin complete-split y el hub responde con los resultados (datos full-/low-speed o
protocolo) que el dispositivo ha cedido.
1
start
split
SSPLIT
TOKEN OUT
2
Full-/Low-Speed
DATA0
Host
3
complete
split
TOKEN OUT
Hub
DATA 0
Dispositivo
ACK
CSPLIT
TOKEN OUT
ACK
Bus
High-Speed
Bus
Full-/Low-Speed
47
2.5.2.2.
El host enva los SOF con un ratio nominal cada 1,00ms0,0005ms en un bus
full-speed y 125s0,0625s en uno high-speed. Los paquetes SOF consisten en un PID
indicando el tipo de paquete seguido de un nmero de frame de 11bits.
Campo
Bits
LSb
PID
8
FrameNumber
11
MSb
CRC5
5
48
2.6.
49
Unido
Alimentado
Por Defecto
Direccionado
Configurado
Reposo
No
USB no unido
Si
No
Si
Si
No
Si
Si
Si
No
No tiene direccin, el
dispositivo responde
con la direccin por
defecto
Si
Si
Si
Si
No
Si
Si
Si
Si
Si
No
Si
Dispositivo al mnimo.
Unido, alimentado y sin
actividad en 3ms. Puede
estar direccionado y
configurado. Se ha
puesto en reposo
porque el host no ha
mandado rdenes.
Si
2.6.1.
Si
POR DEFECTO
50
2.6.2.
DIRECCIONADO
2.6.3.
CONFIGURACIN
2.7.
Cuando se une o se quita un dispositivo USB del bus, el host realiza un proceso
conocido como enumeracin del bus para identificar y controlar los cambios necesarios
en el estado del dispositivo. Cuando se conecte un dispositivo USB a un puerto
alimentado, transcurren las siguientes acciones:
1. El hub al que se a unido el dispositivo informa al host por medio de una
respuesta del cambio de la pipe. En este punto, el dispositivo USB est
en el estado Alimentado y el puerto al que se ha unido desactivado.
2. El host determina la naturaleza exacta preguntando al hub.
3. Ahora el host conoce el puerto al cual est conectado el dispositivo, el
host espera 100ms para que se complete el proceso de insercin y para
que la alimentacin del dispositivo se vuelva estable. El host activa el
puerto y manda un reset al mismo.
4. El hub realiza el proceso requerido para el reset en este puerto. Cuando la
seal de reset se ha completado, el puerto se activa. El dispositivo USB
est en el estado por defecto y no puede consumir ms de 100mA del
VBUS. Todos estos registros y estados se han reseteado y responden al
estado Por Defecto.
5. El host asigna una direccin nica al dispositivo USB, trasladando al
dispositivo al estado Direccionado.
6. Antes de que el dispositivo tenga una nica direccin, se accede a la pipe
de control por defecto por la direccin por defecto. El host lee el
descriptor del dispositivo para determinar cual es el mximo del tamao
de los datos tiles que utiliza el dispositivo en la pipe por defecto.
51
52
3. MICROCONTROLADORES
55
3.
MICRONTROLADORES
3.1.
3.1.1.
CONTROLADOR Y MICROCONTROLADOR
3.1.2.
56
3.1.3.
57
3.1.4.
58
3.2.
QU MICROCONTROLADOR EMPLEAR?
59
60
3.2.1.
3.2.1.1.
Arquitectura Bsica
61
3.2.1.2.
El Procesador O CPU
3.2.1.3.
Memoria
62
Por otra parte, como slo existe un programa activo, no se requiere guardar una copia
del mismo en la RAM pues se ejecuta directamente desde la ROM.
Los usuarios de computadores personales estn habituados a manejar Megabytes
de memoria, pero, los diseadores con microcontroladores trabajan con capacidades de
ROM comprendidas entre 512 bytes y 8 k bytes y de RAM comprendidas entre 20 y
512 bytes.
Segn el tipo de memoria ROM que dispongan los microcontroladores, la
aplicacin y utilizacin de los mismos es diferente. Se describen las cinco versiones de
memoria no voltil que se pueden encontrar en los microcontroladores del mercado.
3.2.1.4.
3.2.1.5.
OTP
3.2.1.6.
EPROM
63
3.2.1.7.
EEPROM
3.2.1.8.
FLASH
64
3.2.1.9.
3.2.1.10.
Reloj Principal
3.2.2.
RECURSOS ESPECIALES
Temporizadores o Timers.
Perro guardin o Watchdog.
Proteccin ante fallo de alimentacin o Brownout.
Estado de reposo o de bajo consumo.
Conversor A/D.
Conversor D/A.
Comparador analgico.
Modulador de anchura de impulsos o PWM.
Puertos de E/S digitales.
Puertos de comunicacin.
65
3.2.2.1.
Temporizadores O Timers
3.2.2.2.
3.2.2.3.
3.2.2.4.
66
3.2.2.5.
3.2.2.6.
3.2.2.7.
Comparador Analgico
3.2.2.8.
3.2.2.9.
67
3.2.2.10.
Puertos De Comunicacin
3.2.3.
3.2.3.1.
68
3.3.
Qu es lo que ocurre con los PIC?, Por qu estn en boca de todos? Hemos
buscado en multitud de bibliografa y realmente nadie da una respuesta concreta, pero
una aproximacin a la realidad puede ser esta:
Los PIC tienen ngel, tienen algo que fascina a los diseadores, puede ser la
velocidad, el precio, la facilidad de uso, la informacin, las herramientas de apoyo...
Quizs un poco de todo eso es lo que produce esa imagen de sencillez y utilidad. Es
probable que en un futuro prximo otra familia de microcontroladores le arrebate ese
algo.
Queremos constatar que para las aplicaciones ms habituales (casi un 90%) la
eleccin de una versin adecuada de PIC es la mejor solucin; sin embargo, dado su
carcter general, otras familias de microcontroladores son ms eficaces en aplicaciones
especficas, especialmente si en ellas predomina una caracterstica concreta, que puede
estar muy desarrollada en otra familia.
69
3.3.1.
CARACTERSTICAS RELEVANTES
Descripcin de las caractersticas ms representativas de los PIC:
3.3.1.1.
Arquitectura
70
3.3.1.2.
Segmentacin
3.3.1.3.
3.3.1.4.
Juego De Instrucciones
3.3.1.5.
3.3.1.6.
Esto significa que todos los objetos del sistema (puertos de E/S, temporizadores,
posiciones de memoria, etc.) estn implementados fsicamente como registros.
3.3.1.7.
Diversidad De Modelos
Prestaciones Y Recursos Diferentes
De
Microcontroladores
Con
3.3.1.8.
La empresa Microchip y otras que utilizan los PIC ponen a disposicin de los
usuarios numerosas herramientas para desarrollar hardware y software. Son muy
abundantes los programadores, los simuladores software, los emuladores en tiempo real,
Ensambladores, Compiladores C, Intrpretes y Compiladores BASIC, etc.
71
3.3.2.
72
3.3.2.1.
Aunque los PIC enanos slo tienen 8 terminales, pueden destinar hasta 6 como
lneas de E/S para los perifricos porque disponen de un oscilador interno R-C.
En la tabla se presentan las principales caractersticas de los modelos de esta
subfamilia, que el fabricante tiene la intencin de potenciar en un futuro prximo. Los
modelos 12C5xx pertenecen a la gama baja, siendo el tamao de las instrucciones de 12
bits; mientras que los 12C6xx son de la gama media y sus instrucciones tienen 14 bits.
Los modelos 12F6xx poseen memoria Flash para el programa y EEPROM para los
datos.
MODELO
MEMORIA
PROGRAMA
MEMORIA
DATOS
FRECUENCIA
MAXIMA
LINEAS
E/S
PIC12C508
512x12
25x8
4MHz
PIC12C509
1024x12
41x8
PIC12C670
512x14
PIC12C671
TEMPORIZADO
RES
TERMIN
ALES
TMR0 + WDT
4MHz
TMR0 + WDT
80x8
4MHz
TMR0 + WDT
1024x14
128x8
4MHz
TMR0 + WDT
PIC12C672
2048x14
128x8
4MHz
TMR0 + WDT
PIC12C680
512X12
FLASH
80x8 16x8
EEPROM
4MHz
TMR0 + WDT
PIC12C681
1024x14
FLASH
80x8 16x8
EEPROM
4MHz
TMR0 + WDT
73
ADC
8BITS
3.3.2.2.
Se trata de una serie de PIC de recursos limitados, pero con una de la mejores
relaciones coste/prestaciones. Sus versiones estn encapsuladas con 18 y 28 terminales
y pueden alimentarse a partir de una tensin de 2,5 V, lo que les hace ideales en las
aplicaciones que funcionan con pilas teniendo en cuenta su bajo consumo (menos de 2
mA a 5 V y 4MHz). Tienen un repertorio de 33 instrucciones cuyo formato consta de 12
bits. No admiten ningn tipo de interrupcin y la Pila slo dispone de dos niveles. En la
figura se muestra el diagrama de conexionado de uno de estos PIC.
74
MODELO
MEMORIA
PROGRAMA
(x12bits)
EPROM
MEMORIA
DATOS
(bytes)
FRECUENCIA
MXIMA
LNEAS
E/S
TEMPORIZADORES
TERMINALES
ROM
PIC16C52
384
25
4MHz
TMR0+WDT
18
PIC16C54
512
25
20MHz
12
TMR0+WDT
18
PIC16C54A
512
25
20MHz
12
TMR0+WDT
18
25
20MHz
12
TMR0+WDT
18
PIC16CR54A
512
PIC16C55
512
24
20MHz
20
TMR0+WDT
28
PIC16C56
1K
25
20MHz
12
TMR0+WDT
18
PIC16C57
2K
72
20MHz
20
TMR0+WDT
28
72
20MHz
20
TMR0+WDT
28
73
20MHz
12
TMR0+WDT
18
73
20MHz
12
TMR0+WDT
18
PIC16CR57B
PIC16C58A
PIC16CR58A
2K
2K
2K
75
3.3.2.3.
En esta gama sus componentes aaden nuevas prestaciones a las que posean los
de la gama baja, hacindoles ms adecuados en las aplicaciones complejas. Admiten
interrupciones, poseen comparadores de magnitudes analgicas, convertidores A/D,
puertos serie y diversos temporizadores.
El repertorio de instrucciones es de 35, de 14 bits cada una y compatible con el
de la gama baja. Sus distintos modelos contienen todos los recursos que se precisan en
las aplicaciones de los microcontroladores de 8 bits. Tambin dispone de interrupciones
y una Pila de 8 niveles que permite el anidamiento de subrutinas. En la tabla se
presentan las principales caractersticas de los modelos de esta familia.
MODELO
MEMORIA
PROGRAMA
MEMORIA DATOS
RAM
EEPROM
REGISTROS
ESPECFICOS
TEMPORIZ
ADORES
INTERRUPCION
ES
E/S
RANGO
TENSIN
TERMINALES
PIC16C84
1Kx14
EEPROM
36
64
11
TMR0+WDT
13
2-6
18
PIC16F84
1Kx14 FLASH
68
64
11
TMR0+WDT
13
2-6
18
PIC16F83
512X14
FLASH
36
64
11
TMR0+WDT
13
2-6
18
PIC16CR8
4
1Kx14 ROM
68
64
11
TMR0+WDT
13
2-6
18
PIC16CR8
3
512x14 ROM
36
64
11
TMR0+WDT
13
2-6
18
76
3.3.2.4.
77
3.3.2.5.
78
3.4.
FAMILIA PIC18FXX5X
3.4.1.
DIAGRAMA DE PINES
79
80
3.4.2.
81
82
83
84
85
86
87
88
89
3.4.3.
90
3.4.3.1.
3.4.3.2.
Tipos De Oscilador
3.4.3.2.1.
91
3.4.3.2.2.
XTAL/Resonadores Cermicos
Nota:
1 Ver tablas 2-1 y 2-2 para conocer los valores iniciales de C1 y C2
2 Se puede necesitar una resistencia RS con cristales de AT
3 RF vara con el modo de oscilador seleccionado
TABLA 3-1: Condensador Para Osciladores Cermicos
Valores de los condensadores tpicos:
Modo
Freq
OSC1
OSC2
XT
4.0MHz
33pF
33pF
HS
8.0MHz
27pF
27pF
16.0MHz
22pF
22pF
92
Osciladores utilizados:
4.0MHz
8.0MHz
16.0MHz
TABLA 3-2: Condensadores Para Los XTAL
Valores de los condensadores tpicos:
Tipo de Osc
XTal
Condensadores probados
Freq
C1
C2
XT
4MHz
27pF
27pF
HS
4MHz
27pF
27pF
8MHz
22pF
22pF
20MHz
15pF
15pF
3.4.3.2.3.
Los modos EC, ECIO, ECPLL y ECPIO requieren una seal externa de reloj
conectada al pin OCS1. No se necesita un oscilador de puesta en marcha despus de
un reset o al salir del modo sleep.
En los modos EC y ECPLL, se obtiene una seal en el pin OSC2 de la seal de
reloj dividida por 4. Esta seal se puede usar para test o para sincronizar otros
dispositivos.
En los modos ECIO y ECPIO el pin OSC2 funciona como un pin E/S, ser el
RA6.
El postscaler interno que se utiliza en los modos XT y HS se puede usar tambin
en los modos EC y ECIO.
93
3.4.3.2.4.
94
3.4.3.2.5.
Temporizador de encendido
Monitor de reloj de seguridad
Temporizador perro guardin
Dos velocidades de inicio
95
Registro OSCTUNE
La salida interna de oscilacin est calibrada de fbrica pero se puede ajustar a la
aplicacin del usuario. Se puede hacer escribiendo el registro OSCTUNE. La
sensibilidad del ajuste es constante en todo el rango.
Cuando se modifica el OSCTUNE las frecuencias INTOSC e INTRC se
cambiarn a la nueva frecuencia. El reloj INTRC alcanzar la nueva frecuencia en 8
ciclos de reloj mientras que el reloj INTOSC se estabilizar en 1ms. El programa se
seguir ejecutando durante este proceso. No hay ninguna indicacin de que el suceso
haya concluido.
El registro OSCTUNE contiene el bit INTSRC que permite seleccionar que
oscilador interno da la seal de reloj cuando la frecuencia de 31kHz est seleccionada.
96
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
INTSRC
TUN4
TUN3
TUN2
TUN1
TUN0
BIT 7
BIT 6-5
BIT 4-0
97
Si la medida es mucho mayor que el tiempo calculado quiere decir que el bloque
del oscilador interno est funcionando demasiado rpido; para compensarlo, hay que
decrementar el registro OSCTUNE. Si la medida es mucho menor que la calculada, el
bloque del oscilador interno funciona muy lento; para compensarlo, aumentar el registro
OSCTUNE.
3.4.3.3.
48MHz
40MHz
24MHz
20MHz
16MHz
Divisor PILL
(PLLDIV2:PLLDIVO)
N/A(1)
12(111)
10(110)
6(101)
5(100)
4(011)
98
Frecuencia del
reloj del micro
48MHz
24MHz
16MHz
12MHz
48MHz
24MHz
16MHz
12MHz
48MHz
32MHz
24MHz
16MHz
40MHz
20MHz
13.33MHz
10MHz
48MHz
32MHz
24MHz
16MHz
24MHz
12MHz
8MHz
6MHz
48MHz
32MHz
24MHz
16MHz
20MHz
10MHz
6.67MHz
5MHz
48MHz
32MHz
24MHz
16MHz
16MHz
8MHz
Frecuencia de
entrada del Osc.
12MHz
8MHz
4MHz
Divisor PILL
(PLLDIV2:PLLDIVO)
3(010)
2(001)
1(000)
Frecuencia del
reloj del micro
5.33MHz
4MHz
48MHz
32MHz
24MHz
16MHz
12MHz
6MHz
4MHz
3MHz
48MHz
32MHz
24MHz
16MHz
8MHz
4MHz
2.67MHz
2MHz
48MHz
32MHz
24MHz
16MHz
4MHz
2MHz
1.33MHz
1MHz
48MHz
32MHz
24MHz
16MHz
3.4.3.3.1.
El reloj del USB cuando funciona a baja velocidad se obtiene del oscilador
primario y no del PLL. El oscilador se divide por 4 para obtener los 6MHz en el reloj.
Por esto, el microcontrolador necesita una frecuencia de 24MHz cuando el mdulo USB
est activo y el controlador del reloj est en uno de los modos primarios del oscilador
(XT, HS con o sin PLL).
Estas restricciones no se aplican si el reloj del microcontrolador es uno de los
secundarios o del bloque interno.
99
3.4.3.3.2.
Funcionamiento Diferente El Reloj Del USB Y El Del
Microcontrolador
El mdulo USB puede funcionar de una forma asncrona con respecto al reloj
del microcontrolador y otros perifricos. Esto se puede realizar cuando el USB funciona
con el oscilador primario y el microcontrolador con un reloj distinto con menor
velocidad. Si necesitamos esto para ejecutar una aplicacin entera con un solo reloj, las
operaciones a toda velocidad proporcionan una gran variedad de frecuencias del
microcontrolador.
3.4.3.4.
100
3.4.3.4.1.
101
3.4.3.4.2.
Esta familia de dispositivos tiene un circuito para prevenir problemas del reloj
cuando cambian entre las distintas fuentes de reloj. Ocurre una pequea pausa cuando
cambia la seal de reloj. La longitud de esta pausa es la suma de dos ciclos del reloj
antiguo mas de tres a cuatro ciclos del reloj nuevo. Esta formula indica cuando el reloj
nuevo se hace estable.
REGISTRO 3-2. OSCCON: Registro De Control Del Oscilador
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
IDLEN
IRCF2
IRCF1
IRCF0
OSTS
IOFS
SCS1
SCS0
BIT 7
BIT 6-4
BIT 3
BIT 2
BIT 1-0
IDLEN:
102
3.4.3.5.
Efecto De Los Modos De Control De Energa En Varias
Fuentes De Reloj
Cuando seleccionamos el modo PRI_IDLE el oscilador primario designado
contina sin interrupciones. En los dems modos de ahorro de energa, el oscilador que
utilice el pin OSC1 se desactiva. A menos que el USB est funcionando se desactivar
el pin OSC1 (y el OSC2 si se utiliza) y parar la oscilacin.
En el modo de reloj secundario (SEC_RUN y SEC_IDLE), el oscilador Timer1
funciona y proporciona la seal de reloj. El oscilador Timer1 o Timer3 pueden
funcionar en todos los modos de ahorro de energa si se requiere como reloj.
En los modos de oscilador interno (RC_RUN y RC_IDLE), el oscilador interno
proporciona la fuente de la seal de reloj. La salida de 31kHz de INTRC se puede
utilizar directamente para producir la seal de reloj y varios de los modos de ahorro de
energa especiales. La salida de INTOSC de 8MHz se puede utilizar para producir la
seal de reloj del dispositivo directamente o por medio de algn postscaler. La salida
del INTOSC se desactiva directamente si la seal de reloj la proporciona directamente
la salida de INTRC.
El reloj del USB funciona sin verse afectado por el modo Run o el modo reposo.
Si el dispositivo funciona con un XTAL o un circuito resonador, la oscilacin
continuar en el reloj del USB. ste mdulo y los dems puede cambiarse a una nueva
fuente de reloj.
Si se selecciona el modo sleep, se interrumpen todas las seales de reloj. Con
todas las corrientes de polarizacin de los transistores obtenemos el menor consumo en
el dispositivo.
No se debe activar el modo sleep cuando el mdulo USB est activado y existen
comunicaciones. La nica excepcin es cuando al dispositivo se le ha suspendido por
medio de un comando del USB. Una vez que el mdulo haya suspendido las
operaciones y puesto en el estado de baja potencia, el microcontrolador se puede poner
en modo sleep.
Activando cualquier proceso que funcione en el modo sleep se incrementar la
corriente que necesita el circuito. El reloj INTRC se necesita para proporcionar las
operaciones al WDT. El oscilador Timer1 se activar en aplicaciones en tiempo real.
Hay otras operaciones que se pueden activar sin necesitar una seal de reloj.
103
3.4.3.6.
Retraso En El Inicio
OSC1 Pin
Abierto, se conecta el reloj
Abierto, se conecta el reloj
Abierto, se conecta el reloj
Abierto, se conecta el reloj
Inactivo sin tensin
104
OSC2 Pin
Salida (reloj/4)
Configurado como PORTA, bit 6
Configurado como PORTA, bit 6
Salida (reloj/4)
Inactivo sin tensin
3.4.4.
Bits OSCCON
SCS1:SCS0
CPU
N/A
Off
Off
PRI-RUN
N/A
00
Clocked
Clocked
SEC-RUN
N/A
01
Clocked
Clocked
RC RUN
PRI IDLE
N/A
1
1x
00
Clocked
Off
Clocked
Clocked
SEC_IDLE
01
Off
Clocked
RC IDLE
1x
Off
Clocked
105
3.4.4.1.
3.4.4.1.1.
Los bits SCS1:SCS0 permiten la seleccin de una de tres fuentes del reloj para
los modos de control de energa. Son:
El reloj primario, segn lo definido en los bits de configuracin
FOSC3:FOSC0
El reloj secundario (el oscilador Timer1)
El bloque interno del oscilador (para los modos de RC)
3.4.4.1.2.
106
3.4.4.1.3.
La longitud de la transicin entre las fuentes del reloj es la suma de dos ciclos de
la fuente de reloj vieja y de tres a cuatro ciclos de la nueva fuente. Esta frmula asume
que la nueva fuente del reloj es estable. Tres bits indican la fuente actual del reloj y su
estado. Son:
OSTS (OSCCON<3>)
IOFS (OSCCON<2>)
T1RUN (T1CON<6>)
En general, slo uno de estos bits se fijar en un modo de energa. Cuando el bit
OSTS est activo, el reloj primario est proporcionando el reloj del dispositivo. Cuando
se activa el bit IOFS, la salida de INTOSC est proporcionando una fuente de reloj de
8MHz estable a un divisor que conduce el reloj del dispositivo. Cuando se activa el bit
de T1RUN, el oscilador Timer1 est proporcionando el reloj. Si no se activa ningunos
de estos bits, entonces el reloj INTRC controla el dispositivo, o la fuente INTOSC no es
estable todava.
Si el bloque del oscilador interno se configura como el reloj primario por los bits
de configuracin FOSC3:FOSC0, entonces los bits OSTS y IOFS pueden activarse en
los modos PRI_RUN y PRI_IDLE. Esto indica que es el reloj primario (salida
INTOSC) que genera una seal estable de salida de 8MHz. Cambiar el modo de control
de energa RC a otro de la misma frecuencia puede desactivar el bit OSTS.
Nota 1: Cuidado al modificar el bit IRCF. Si VDD es menor de 3V, es posible
seleccionar una velocidad de reloj ms alta que la soportada por VDD. Se puede provocar
un error si se violan las especificaciones de VDD/FOSC.
2: Ejecutar una instruccin SLEEP no pone necesariamente el dispositivo
en el modo sleep. Acta como disparador para colocar el controlador en el modo sleep,
o en el modo reposo, dependiendo del ajuste del bit IDLEN.
3.4.4.1.4.
107
3.4.4.2.
Modos De Ejecucin
En los modos de ejecucin, estn activos los relojes al ncleo y a los perifricos.
La diferencia entre estos modos es la fuente de reloj.
3.4.4.2.1.
Modo PRI_RUN
3.4.4.2.2.
Modo SEC_RUN
108
3.4.4.2.3.
Modo RC_RUN
109
110
3.4.4.3.
Modo SLEEP
111
3.4.4.4.
Modos De Reposo
Los modos reposo permiten que la CPU del regulador est apagada
selectivamente mientras que los perifricos continen funcionando. Seleccionar un
modo particular permite a usuarios manejar ms el consumo de energa.
Si el bit IDLEN se fija a 1 cuando se ejecuta una instruccin SLEEP, los
perifricos tendrn como fuente de reloj la seleccionada con los bits SCS1:SCS0; sin
embargo, la CPU no tendr reloj. A los bits de estado de la seal de reloj no les afecta.
Activando el bit IDLEN y ejecutando una la instruccin SLEEP proporciona un mtodo
rpido de cambiar de un modo de funcionamiento dado a su modo de reposo
correspondiente.
Si se selecciona el WDT, la fuente de INTRC continuar funcionando. Si se
permite el oscilador Timer1, tambin continuar funcionando.
Puesto que la CPU no est ejecutando instrucciones, las nicas salidas de los
modos de reposo son una interrupcin, un desbordamiento del WDT descanso o un
reset. Cuando ocurre un acontecimiento de este tipo, la CPU sufre un retraso del tipo
TCSD hasta que llega a ejecutar el cdigo. Cuando la CPU comienza a ejecutar cdigo, se
acciona con la misma fuente del reloj que posea el Modo reposo. Por ejemplo, al
despertar del modo RC_IDLE, el bloque del oscilador interno controlar la CPU y los
perifricos (es decir, el modo RC_RUN). A los bits IDLEN y SCS no les afecta el
reinicio.
Mientras que en cualquier modo reposo o modo sleep, un desbordamiento del
WDT dar lugar a un reinicio al modo de funcionamiento especificado por los bits
SCS1:SCS0.
3.4.4.4.1.
Modo PRI_IDLE
Este modo es el nico entre los tres modos de reposo de baja potencia que no
inhabilita el reloj primario del dispositivo. Para aplicaciones con una temporizacin
sensible, esto permite una reanudacin ms rpida del dispositivo, con una fuente
primaria ms exacta del reloj, puesto que la fuente del reloj no tiene que calentar o
esperar la transicin de otro oscilador.
El modo de PRI_IDLE entra en modo PRI_RUN activando el bit IDLEN y
ejecutando una instruccin SLEEP. Si el dispositivo est en otro modo de
funcionamiento, primero activa el bit IDLEN, despus borrar los bits SCS y por ltimo
ejecutar una instruccin SLEEP. Aunque la CPU est desactivada, los perifricos
continan gobernados por la fuente primaria de reloj especificada por los bits de
configuracin FOSC3:FOSC0. El bit OSTS se activar.
Cuando ocurre un acontecimiento que provoque un reset, la CPU se controlar
con la fuente primaria de reloj. Existe un retraso de tipo TCSD entre el cambio de modo y
el comienzo de la ejecucin de cdigo. Esto se provoca para permitir que la CPU est
lista para ejecutar instrucciones. Despus del reinicio, el resto de bits OSTS se activan.
A los bits IDLEN y SCS no les afecta el reset.
112
3.4.4.4.2.
MODO SEC_IDLE
113
3.4.4.4.3.
Modo RC_IDLE
3.4.4.5.
La salida del modo sleep o de los modos de reposo se provoca accionando una
interrupcin, un reset o un desbordamiento del WDT. Esta seccin discute los
disparadores que causan las salidas de modos de ahorro de energa. El subsistema que
registra las acciones se discuten en cada uno de los modos de ahorro de energa.
114
3.4.4.5.1.
3.4.4.5.2.
3.4.4.5.3.
115
3.4.4.5.4.
Algunas salidas de los modos de ahorro de energa no llaman al OST. Hay dos
casos:
El modo PRI_IDLE donde la fuente primaria de reloj no se detiene
La fuente primaria de reloj no es ni XT ni HS
En estas situaciones, la fuente primaria no necesita un retraso en el reinicio,
porque est funcionando (en el modo PRI_IDLE) o porque normalmente no necesita un
retraso en el inicio (el modo EC o cualquier modo del bloque interno). Sin embargo, se
necesita un retraso TCSD despus de reiniciar el sistema para dejar el modo sleep o
reposo para permitir que la CPU se prepare para ejecutar una instruccin. La ejecucin
de la instruccin se reanuda en el primer ciclo de reloj despus del retraso.
3.4.5.
RESET
Esta seccin discute los resets generados por MCLR*, POR y BOR y cubre la
operacin de los varios contadores de tiempo inicio.
116
3.4.5.1.
Registro RCON
Los resets del dispositivo se siguen con el registro RCON (registro 5-1). Los
cinco bits ms bajos del registro indican que ha ocurrido un reset. En la mayora de los
casos, estos bits se borran con el reset y se deben activar por software despus. El estado
de estos flags se puede leer para indicar el tipo de reset que acaba de ocurrir.
El registro de RCON tambin tiene bits de control para elegir la prioridad de la
interrupcin (IPEN) y del software de control del BOR (SBOREN).
117
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
IPEN
SBOREN
RI*
TO*
PD*
POR*
BOR*
BIT 7
IPEN:
BIT 6
SBOREN:
BIT 4
RI*:
BIT 3
TO*:
BIT 2
PD*:
BIT1
POR*:
BIT0
BOR*:
Nota 1: Se recomienda que el bit POR* est fijado despus de detectar el reset
para poder detectar otros resets.
2: Normalmente, cuando ocurre un reset por cese de energa BOR* es 0 y
POR* 1 (suponiendo que POR* se pone a 1 despus de un reset por subida de
tensin).
118
3.4.5.2.
3.4.5.3.
Un reset por subida de tensin se genera en el chip cuando VDD sube hasta un
umbral. Esto provoca que el dispositivo se inicialice cuando VDD tenga un valor
adecuado.
Para aprovecharse del POR, conectar el pin MCLR* a VDD a travs de una
resistencia (1k a 10k). Esto elimina los componentes RC externos que se necesitan
para crear un retraso en el reset por subida de tensin.
Cuando el dispositivo comienza la operacin normal (es decir, salir de la
condicin de reset), los parmetros de funcionamiento del dispositivo (tensin,
frecuencia, temperatura, etc.) se deben conocer para asegurar el correcto
funcionamiento del dispositivo. Si estas condiciones no se conocen, el dispositivo debe
estar en reset hasta averiguarlas. Los reset POR se capturan con el bit POR
(RCON<1>). El estado del bit se fija a 0 siempre que ocurra un POR; no lo cambia
ningn otro reset. POR no se ajusta a 1 con ningn acontecimiento de hardware. Para
capturar acontecimientos mltiples, el usuario pone manualmente el bit a 1 por
software despus de cualquier POR.
FIGURA 5-2: Circuito De Reset Externo Por Subida De Tensin (Para Lenta Subida
De VDD)
2: R<40 Recomendada para que la
tensin no dae el chip.
3: R11k limitar la corriente en
MCLR*.
119
3.4.5.4.
3.4.5.4.1.
120
3.4.5.4.2.
3.4.5.4.3.
Cuando BOREN1:BOREN0 = 10, los reset BOR estn bajo el control del
hardware y funciona como se ha descrito previamente. Siempre que el dispositivo entre
en modo sleep el BOR se inhabilita automticamente. Cuando el dispositivo vuelve a
cualquier otro modo de funcionamiento, se vuelve a permitir el BOR automticamente.
Este modo permite aplicaciones en las que el dispositivo se recupere de
situaciones de cese de energa, mientras que ejecutan cdigo, cuando el dispositivo
requiere la proteccin BOR. Al mismo tiempo, ahorra energa adicional en modo sleep
eliminando la corriente incremental de BOR.
TABLA 5-1: Configuracin Del BOR
Configuracin del BOR
BOREN1
BOREN0
Estado de
SBOREN
(RCON<6>)
0
0
1
0
1
0
No disponible
Disponible
No disponible
No disponible
3.4.5.5.
121
3.4.5.5.1.
El
temporizador
de
inicio
(PWRT)
de
los
dispositivos
PIC18F2455/2550/4455/4550 es un contador de 11 bits que utiliza la fuente de INTRC
como entrada de reloj. Este intervalo del tiempo de 2048x32s=65,6ms. Mientras que el
PWRT est contando, el dispositivo est en reset.
El retraso depende del reloj INTRC y variar en el chip debido a la variacin de
la temperatura y del proceso.
El PWRT se permite borrando el bit PWRTEN.
3.4.5.5.2.
3.4.5.5.3.
3.4.5.5.4.
Secuencia De Retraso
122
Salida del
Modo de ahorro de energa
1024TOSC
1024TOSC+2ms(2)
2ms(2)
1024TOSC
1024TOSC
1024TOSC+2ms(2)
2ms(2)
1024TOSC
3.4.5.6.
3.4.6.
ORGANIZACIN DE LA MEMORIA
Hay tres tipos de memoria en los PIC18:
Memoria de programa
RAM de datos
EEPROM de datos
123
3.4.6.1.
124
3.4.6.1.1.
Contador De Programa
3.4.6.1.2.
125
126
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SP4
SP3
SP2
SP1
SP0
STKFUL STKUNF
BIT 7
STKFUL:
BIT 6
STKUNF:
BIT 4-0
SP4:SP0:
127
3.4.6.1.3.
SUB1, FAST
SUB1
..
..
..
..
RETURN, FAST
128
3.4.6.1.4.
Programa
GOTO Controlado
Un GOTO controlado se logra agregando una compensacin al contador de
programa.
Una opcin de bsqueda en la tabla se puede conseguir con una instruccin
ADDWF PCL y un grupo de instrucciones RETLW nn. El registro W se carga con una
compensacin en la tabla antes de ejecutar la llamada a esa tabla. La primera instruccin
de la rutina llamada es la instruccin ADDWF PCL. La instruccin siguiente ejecutada
ser una RETLW nn que devuelve el valor nn a la funcin que llama.
El valor compensado (en WREG) especifica el nmero de bytes que el contador
de programa debe avanzar y deben ser los mltiplos de 2 (LSb = 0).
Con este mtodo, solamente se puede almacenar un byte de datos en cada
localizacin y sitio de cada instruccin, en la vuelta se requiere la direccin de pila.
EJEMPLO 6-2: GOTO Controlado Usando Un Valor Compensado
MOVF
CALL
ORG
nn00h
TABLE ADDWF
PCL
RETLWnnh
RETLWnnh
RETLWnnh
.
.
OFFSET, W
TABLE
129
3.4.6.2.
3.4.6.2.1.
Esquema De Reloj
3.4.6.2.2.
Instruccin Flow/Pipelining
130
Nota: Todas las instrucciones son de un solo ciclo, excepto las de salto. Estas
tienen dos ciclos desde que se busca la instruccin se utiliza hasta que la instruccin
nueva se busca y se ejecuta.
3.4.6.2.3.
3.4.6.2.4.
El sistema estndar del PIC18 tiene cuatro instrucciones de dos palabras: CALL,
MOVFF, GOTO y LSFR. En todos los casos, la segunda palabra de las instrucciones
son siempre 1111 como sus cuatro bits ms significativos; los otros 12 bits son datos
literales, generalmente una direccin de memoria de datos.
El uso del 1111 en los 4 MSbs de una instruccin especifica una forma
especial de NOP. Si la instruccin se ejecuta en la secuencia apropiada, inmediatamente
despus de la primera palabra, se conocen los datos de la segunda palabra y se utilizan
como secuencia de la instruccin. Si se salta la primera palabra por alguna razn y la
segunda palabra se ejecuta por s sola, se lee un NOP. Esto es necesario para los casos
cuando la instruccin de dos palabras es precedida por una instruccin condicional que
cambie el PC.
131
Cdigo fuente:
0110011000000000 TSTFSZ
1100000100100011 MOVFF
1111010001010110
0010010000000000 ADDWF
REG1
REG1,REG2
REG3
CASO 2:
0110011000000000 TSTSZ
1100000100100011 MOVFF
1111010001010110
0010010000000000 ADDWF
3.4.6.3.
REG1
REG1,REG2
REG3
132
Cuando a=0:
Se ignora el BSR y usamos el acceso al banco.
Los primeros 96bytes de la RAM son de propsito general (del banco 0)
Los 160bytes restantes son registros de funciones especiales (banco 15)
Cuando a=1:
El BSR especifica el banco usado en la instruccin.
133
3.4.6.3.1.
3.4.6.3.2.
134
3.4.6.3.3.
Acceso Al Banco
Mientras que el uso del BSR, con una direccin de 8bits, permite que los
usuarios traten la gama entera de memoria de datos, tambin significa que se debe
asegurar el usuario siempre que est seleccionado el banco correcto. Si no, los datos se
pueden leer o escribir en una localizacin incorrecta. Esto puede ser desastroso si un
GPR se va a modificar por una operacin porque se escribe un SFR a en lugar de otro.
Verificar y/o cambiar el BSR para cada lectura o escritura en la memoria de datos puede
resultar ineficaz.
Para mejorar el acceso a las posiciones de memoria de datos de uso general, la
memoria de datos se configura con un banco de acceso, que permite a usuarios el acceso
a un bloque mapeado de la memoria sin especificar un BSR. El banco de acceso
consiste en los primeros 96 bytes de memoria (00h-5Fh) en el banco 0 y los ltimos 160
bytes de memoria (60h-FFh) en el bloque 15. Se conoce la mitad inferior como el
acceso RAM y se compone de los GPRs. La mitad superior es donde los SFRs del
135
dispositivo estn mapeados. A estas dos reas mapeadas en el banco de acceso se puede
dirigir con una direccin de 8 bits.
El banco de acceso se utiliza por las instrucciones de ncleo de los PIC18 que
incluyen el bit de acceso a RAM (el parmetro a dentro de la instruccin). Cuando el
a es igual a 1, la instruccin utiliza el BSR y la direccin de 8 bits incluidos en el
cdigo para la direccin de memoria de datos. Cuando el a es 0, sin embargo, se
fuerza a utilizar el acceso con las direcciones mapeadas del banco a la instruccin; se
ignora el valor actual del BSR.
El usar estas direcciones forzadas permite a la instruccin funcionar en una
direccin de datos en un solo ciclo sin actualizar primero el bit BSR. Para direcciones
de 8bits de 60h y ms, esto significa que los usuarios pueden evaluar y modificar los
SFRs ms eficientemente. Acceso la a RAM por debajo de 60h es bueno para almacenar
los valores que el usuario pueda necesitar rpidamente, por ejemplo de cmputo
inmediato resultados o variables comunes del programa. Tener acceso a la RAM
tambin cuenta la rapidez y ms ahorro del cdigo y conmutacin de variables.
El acceso al banco mapeado es levemente diferente cuando se permite el sistema
de instrucciones extendidas (bit de configuracin XINST=1).
3.4.6.3.4.
3.4.6.3.5.
Los registros de funcin especfica (SFRs) son registros usados por la CPU y los
mdulos perifricos para controlar las operaciones deseadas del dispositivo. Estos
registros se ponen en ejecucin como RAM esttica en la memoria de datos. SFRs
empieza la ltima direccin de memoria de datos y extiende hacia abajo hasta ocupar el
segmento superior del banco 15, de F60h a FFFh.
Los SFRs se pueden clasificar en dos sistemas: los asociados a la funcionalidad
del ncleo del dispositivo (ALU, reajustes e interrupciones) y los relacionados con las
funciones de los perifricos.
Los SFRs se distribuyen por las funciones los perifricos que controlan. Las
localizaciones de SFR no utilizadas no estn implementadas y se leen como 0.
136
3.4.6.3.6.
Registro STATUS
137
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
OV
DC
U-0
U-0
U-0
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
BIT 4
N:
BIT 3
OV:
BIT 2
Z:
BIT 1
DC:
BIT0
C:
138
3.4.6.4.
Inherente
Literal
Directo
Indirecto
3.4.6.4.1.
3.4.6.4.2.
Direccionamiento Directo
139
3.4.6.4.3.
Direccionamiento Indirecto
FSR0,100h
POSTINC0
FSR0H,1
NEXT
140
141
142
3.4.6.5.
Memoria Del Programa Y El Sistema De Instrucciones
Extendidas
A la operacin de la memoria de programa no le afectada el uso del sistema de
instrucciones extendidas.
Permitir el sistema de instrucciones extendida agrega ocho comandos de
palabras dobles adicionales al sistema de instrucciones del PIC18: ADDFSR,
ADDULNK, CALLW, MOVSF, MOVSS, PUSHL, SUBFSR y SUBULNK.
3.4.6.6.
Memoria De Datos Y El Sistema De Instrucciones
Extendidas
Permitir el sistema de instrucciones extendidas del PIC18 (configuracin del bit
XINST=1) cambia ciertos aspectos de la memoria de datos y de su direccin.
Especficamente, el uso del banco de acceso para muchas de las instrucciones del ncleo
de los PIC18 es diferente. Esto se debe a la introduccin de un nuevo modo de direccin
para la memoria de datos. Este modo tambin altera el comportamiento de FSR2 que
usa direccionamiento indirecto y sus operandos asociados.
Lo que no cambia es lo importante. El tamao de la memoria de datos no
cambia, as como su direccionamiento lineal. El mapa de los SFRs sigue siendo igual.
Las instrucciones del ncleo de los PIC18 pueden funcionar en ambos modo de
direccionamiento, directo e indirecto; las instrucciones inherentes y literales no
cambian. Sigue habiendo un direccionamiento indirecto de FSR0 y FSR1 sin cambios.
143
3.4.6.6.1.
3.4.6.6.2.
Instrucciones Afectadas Por El Modo Indexado Por Literal
Compensado
Algunas de las instrucciones del ncleo del PIC18 pueden utilizar el
direccionamiento directo les afecta el modo indexado por literal compensado. Esto
incluye todas las instrucciones byte-orientadas y bit-orientadas, o casi una mitad del
sistema de instruccin estndar del PIC18. A las instrucciones que utilizan solamente
los modos de direccionamiento inherente o literal no les afecta.
Adems, las instrucciones byte-orientadas y bit-orientadas no les afecta si
utilizan el banco de acceso (El bit de acceso a RAM es 1) o incluye una direccin del
archivo de 60h para arriba. Las instrucciones que resuelven estos criterios continuarn
ejecutndose como antes.
Los que desean utilizar las instrucciones byte-orientadas o bit-orientadas en el
modo indexado por literal compensando deben observar los cambios de la sintaxis del
ensamblador.
144
FIGURA 6-8: El Comparar Tratando Las Opciones Para Las Instrucciones BitOrientadas Y Byte-Orientadas (Sistema De Instrucciones Extendidas Permitido)
INSTRUCCIN DEL EJEMPLO:
ADDWF, f, d, a (Opcode: ffff del ffff 0010 01da)
145
3.4.6.6.3.
Mapeo Del Banco De Acceso En El Modo Indexado Por
Literal Compensado
El uso del modo indexado por literal compensado cambia el mapeado de la parte
baja de la RAM accesible (00h a 5Fh). En vez de mantener el contenido de la mitad
inferior del banco 0, este modo mapea el contenido del banco 0 y otro definido por el
usuario ventana que se puede localizar en cualquier parte de la memoria de datos. El
valor de FSR2 establece bajar el lmite de las direcciones mapeadas en la ventana,
mientras que el lmite superior se define por FSR2 ms 95 (5Fh).
El remapeado del banco de acceso se aplica solamente a las operaciones usando
el modo indexado por literal compensado. Operaciones utilizan el BSR (el bit de acceso
a RAM es 1) continuar utilizando el direccionamiento directo. Cualquier operacin
indirecta o indexada que utilice operandos indirectos (FSR2 incluido) seguir
trabajando con el direccionamiento indirecto estndar. Cualquier instruccin que utilice
el banco de acceso, pero incluya una direccin del registro mayor que 05Fh, utilizar el
direccionamiento directo y el mapa normal del banco de acceso.
FIGURA 6-9: Remapeo Del Banco De Acceso En El Modo Indexado Por Literal
Compensado
Ejemplo de situacin:
ADDWF f,d,a
FSR2H:FSR2L=120h
146
3.4.6.6.4.
3.4.7.
3.4.7.1.
147
148
3.4.7.2.
Registros De Control
3.4.7.2.1.
Registro EECON1
Registro EECON2
Registro TABLAT
Registros TBLPTR
149
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
EEPGD
CFGS
FREE
WRERR(1)
WREN
WR
RD
R/W-x
r/w-x
U-0
R/W-0
R/W-x
R/W-0
R/S-0
R/S-0
BIT 7
EEPGD:
BIT 6
CFGS:
BIT 4
FREE:
BIT 3
WRERR:
BIT 2
WREN:
BIT 1
WR:
BIT 0
RD:
Nota 1: Cuando ocurre un WRERR, los bits EEPGD y CFGS no se borran. Esto
permite determinar la condicin de error.
150
3.4.7.2.2.
3.4.7.2.3.
3.4.7.2.4.
Ejemplo
TBLRD*
TBLWT*
No modifica TBLPTR
TBLRD*+
TBLWT*+
TBLRD*TBLWT*-
TBLRD+*
TBLWT+*
151
3.4.7.3.
152
3.4.7.4.
CODE_ADDR_UPPER
TBLPTRU
CODE_ADDR_HIGH
TBLPTRH
CODE_ADDR_LOW
TBLPTRL
TABLAT, W
WORD_EVEN
TABLAT, W
WORD_ODD
la
base
MOVWF
153
3.4.7.4.1.
3.
4.
5.
6.
7.
CODE_ADDR_UPPER
TBLPTRU
CODE_ADDR_HIGH
TBLPTRH
CODE_ADDR_LOW
TBLPTRL
EECON1, EEPGD
EECON1, CFGS
EECON1, WREN
EECON1, FREE
INTCON, GIE
55h
EECON2
0AAh
EECON2
EECON1, WR
INTCON, GIE
154
3.4.7.5.
155
3.4.7.5.1.
156
MODIFY_WORD
MOVLW DATA_ADDR_HIGH
; Puntero al buffer
MOVWF FSR0H
MOVLW DATA_ADDR_LOWMOVWF FSR0L
MOVLW NEW_DATA_LOW
; Actualizar buffer
MOVLW NEW_DATA_HIGH
MOVWF INDF0
ERASE_BLOCK
MOVLW CODE_ADDR_UPPER
MOVWF TBLPTRU
MOVLW CODE_ADDR_HIGH
MOVWF TBLPTRH
MOVLW CODE_ADDR_LOW
MOVWF TBLPTRL
BSF EECON1, EEPGD
BCF EECON1, CFGS
BSF EECON1, WREN
BSF EECON1, FREE
BCF INTCON, GIE
MOVLW 55h
MOVWF EECON2
MOVLW 0AAh
;Puntero a la Flash
;acceso a la Flash
;activar la escritura en memoria
;Activar la operacin de borrado de fila
;desactiva interrupciones
;escribe 55h
157
MOVWF EECON2
BSF EECON1, WR
BSF INTCON, GIE
TBLRD*MOVLW BUFFER_ADDR_HIGH
MOVWF FSR0H
MOVLW BUFFER_ADDR_LOW
MOVWF FSR0L
MOVLW D2
MOVWF COUNTER1
WRITE_BUFFER_BACK
MOVLW D32
MOVWF COUNTER
WRITE_BYTE_TO_HREGS
MOVF POSTINC0, W
MOVWF TABLAT
TBLWT+*
DECFSZ COUNTER
BRA WRITE_WORD_TO_HREGS
PROGRAM_MEMORY
BSF EECON1, EEPGD
BCF EECON1, CFGS
BSF EECON1, WREN
BCF INTCON, GIE
MOVLW 55h
MOVWF EECON2
MOVLW 0AAh
MOVWF EECON2
BSF EECON1, WR
DECFSZ COUNTER1
BRA WRITE_BUFFER_BACK
BSF INTCON, GIE
BCF EECON1, WREN
3.4.7.5.2.
;escribe 0AAh
;comienzo del borrado (CPU parada)
;reactiva interrupciones
;decremento despus de leer
; puntero al buffer
Verificacin De La Escritura
158
3.4.7.5.3.
Bit 7
Bit 6
Bit 5
TBLPTRU
bit 21(1)
Bit 4
Bit 3
Bit 2
Bit 1
TBLPTRH
TBLPTRL
TABLAT
INTCON
GIE/GIEH
EECON2
PEIE/GIEL
TMR0IE
Bit 0
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
EECON1
EEPGD
CFGS
FREE
WRERR
WREN
WR
RD
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
159
3.4.8.
EECON1
EECON2
EEDATA
EEADR
3.4.8.1.
160
3.4.8.2.
Para leer una posicin de memoria de datos, el usuario debe escribir la direccin
en el registro EEADR, borrar el bit EEPGD (EECON1<7>) y despus activar el bit RD
(EECON1<0>). Los datos estn disponibles en el siguiente ciclo de instruccin; por lo
tanto, el registro EEDATA se puede leer con la instruccin siguiente. EEDATA
mantendr este valor hasta otra operacin de lectura o hasta que lo escriba el usuario
(durante una operacin de escritura).
EJEMPLO 8-1: Lectura De La Memoria EEPROM
MOVLW
MOVWF
BCF
BCF
BSF
MOVWF
DATA_EE_ADDR
EEDRA
EECON1,EEPGD
EECON1,CFGS
EECON1,RD
EEDATA,W
3.4.8.3.
161
3.4.8.4.
DATA_EE_ADDR
EEDATA
DATA_EE_DATA
EEDATA
EECON1,EPGD
EECON1,CFGS
EECON1,WREN
INTCON,GIE
55h
EECON2
0AAh
EECON2
EECON1,WR
INTCON,GIE
EECON1,WREN
Verificacin De La Escritura
3.4.8.5.
3.4.8.6.
162
3.4.8.7.
Los datos EEPROM tienen una gran resistencia, una matriz direccionable de
bytes que se ha optimizado para el almacenamiento de informacin que cambia con
frecuencia (ej., variables de programa u otros datos que se actualizan a menudo). Los
valores que cambian con frecuencia se actualizarn muy a menudo. Si ste no es el caso,
se debe hacer un refresco de la matriz. Por esta razn, las variables que cambian
infrecuentemente (por ejemplo constantes, las identificaciones, la calibracin, etc.) se
deben almacenar en la memoria flash del programa.
Nota: Si los datos EEPROM se utilizan solamente para almacenar constantes y/o
datos que cambian raramente, no se necesita un refresco de la matriz.
EJEMPLO 8-3: Rutina De Refresco De La EEPROM
Loop
CLRF
BCF
BCF
BCF
BSF
EEADR
EECON1,CFGS
EECON1,EEPGD
INTCON,GIE
EECON1,WREN
;Comienzo en la direccin 0
;Activa memoria
;Activa memoria EEPROM
;Desactiva interrupciones
;Activa escritura
BSF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
BTFSC
BRA
INCFSZ
BRA
BCF
BSF
EECON1,RD
55h
EECON2
0AAh
EECON2
EECON1,WR
EECON1,WR
$-2
EEEDR,F
LOOP
EECON1,WREN
INTCON,GIE
163
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
EEADR
EEDATA
EECON2
EECON1
EEPGD
CFGS
FREE
WRERR
WREN
WR
RD
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
164
3.4.9.
3.4.9.1.
ARG1,W
ARG2
;ARG1*ARG2=PRODH:PRODL
;ARG1*ARG2=PRODH:PRODL
;Bit test del signo
;PRODH=PRODH-ARG1
;Bit test del signo
;PRODH=PRODH-ARG2
165
166
ARG1L,W
ARG2L
PRODH,RES1
PRODL,RES0
ARG1H,W
ARG2H
PRODH,RES3
PRODH,RES2
ARG1L,W
ARG2H
PRODL,W
RES1,F
PRODH,W
RES2,F
WREG
RES3,F
ARG1H,W
RES1,F
PRODH,W
RES2,F
WREG
RES3,F
ARG2H,7
SIGN_ARG1
ARG1L,W
RES2
ARG1H,W
RES3
ARG1H,7
CONT_CODE
ARG2L,W
RES2
ARG2H,W
RES3
167
3.4.10.
INTERRUPCIONES
RCON
INTCON
INTCON2
INTCON3
PIR1, PIR2
PIE1, PIE2
IPR1, IPR2
Cada fuente de interrupcin tiene tres bits para controlar su operacin. Las
funciones de estos bits son:
Flag para indicar que ha ocurrido una interrupcin
El bit que permite la ejecucin de programa en la direccin del puntero
de interrupcin cuando se activa el flag
El bit de prioridad para seleccionar alta o baja prioridad
Las caractersticas de prioridad de las interrupciones se determinan activando el
bit IPEN (RCON<7>). Cuando se permite la prioridad de las interrupciones, hay dos
bits que permiten las interrupciones globalmente. Activando el bit GIEH (INTCON<7>)
se permiten todas las interrupciones que tengan el bit de prioridad activo (prioritario).
Seteando el bit GIEL (INTCON<6>) permite todas las interrupciones que tengan el bit
de prioridad borrado (prioridad baja). Cuando el flag de interrupcin, el bit de permiso y
el bit de las interrupciones globales estn activos, el programa saltar inmediatamente a
la direccin 000008h 000018h, dependiendo del bit de prioridad. Las interrupciones
individuales pueden desactivarse con su correspondiente bit de permiso.
Cuando el bit IPEN est borrado (estado por defecto), las caractersticas de
prioridad de las interrupciones estn desactivadas y las interrupciones son compatibles
con los dispositivos de alcance medio de PICmicro. En el modo de compatibilidad, los
bits de prioridad de las interrupciones para cada fuente no tienen ningn efecto.
INTCON<6> es el bit PEIE el cul permite/inhabilita todas las fuentes perifricas de
interrupcin. INTCON<7> es el bit GIE que permite/inhabilita todas las fuentes de
interrupcin. Todas las interrupciones saltan a la direccin 000008h en modo de
compatibilidad.
168
3.4.10.1.
Como otros perifricos, el mdulo USB es capaz de generar una amplia gama de
interrupciones para muchos tipos de acontecimientos. stos incluyen varios tipos de
acontecimientos normales de comunicacin y de estado y varios niveles de errores de
acontecimientos.
Para manejar estos acontecimientos, el mdulo USB se equipa con su propia
lgica de interrupcin. La lgica funciona de una forma similar a las interrupciones del
microcontrolador, con cada fuente de interrupcin tenemos un flag separado y los bits
de permiso. Todos los acontecimientos se concentran en una sola interrupcin del
dispositivo, USBIF (PIR2<5>). A los acontecimientos individuales de interrupcin del
USB no se les puede asignar su propia prioridad. Esto se determinada en el nivel de
prioridad de las interrupciones del dispositivo para todos los acontecimientos del USB
con el bit USBIP.
169
3.4.10.2.
Registros INTCON
170
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF(1)
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/W-x0
BIT 7
GIE/GIEH:
BIT 6
PEIE/GIEL:
BIT 5
TMR0IE:
BIT 4
INT0IE:
BIT 3
RBIE:
BIT 2
TMR0IF:
BIT 1
INT0IF:
BIT 0
RBIF:
Nota 1: Una condicin de unin mal hecha continuar activando este bit. Al leer
PORTB terminar la condicin de unin mal hecha y permitir que el bit se borre.
171
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RBPU*
INTEDG0
INTEDG1
INTEDG2
TMR0IP
RBIP
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
RBPU*:
BIT 6
INTEDG0:
BIT 5
INTEDG1:
BIT 4
INTEDG2:
BIT 2
TMR0IP:
BIT 0
RBIP:
172
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
INT2IP
INT1IP
INT2IE
INT1IE
INT2IF
INT1IF
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
INT2IP:
BIT 6
INT1IP:
BIT 4
INT2IE:
BIT 3
INT1IE:
BIT 1
INT2IF:
BIT 0
INT1IF:
3.4.10.3.
Registros PIR
173
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SPPIF(1)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
SPPIF:
BIT 6
ADIF:
BIT 5
RCIF:
BIT 4
TXIF:
BIT 3
SSPIF:
BIT 2
CCP1IF:
BIT 1
TMR2IF:
BIT 0
TMR1IF:
Nota 1: Este pin est reservado en los micros de 28 pines; mantenerlo siempre
borrado.
174
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
OSCIF
CMIF
USBIF
EEIF
BCLIF
HLVIF
TMR3IF
CCP2IF
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
OSCIF:
BIT 6
CMIF:
BIT 5
USBIF:
BIT 4
EEIF:
BIT 3
BCLIF:
BIT 2
HLVIF:
BIT 1
TMR3IF:
BIT 0
CCP2IF:
175
3.4.10.4.
Registros PIE
Los registros PIE contienen los bits de permiso individual para las interrupciones
perifricas. Debido al nmero de fuentes de interrupcin perifricas, se necesitan dos
registros de permiso (PIE1 y PIE2). Cuando IPEN = 0, el bit PEIE se debe activar para
no permitir ninguna de estas interrupciones.
REGISTRO 10-6: PIE1: Registro De Permiso De Las Interrupciones Perifricas
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SPPIE(1)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
SPPIE:
BIT 6
ADIE:
BIT 5
RCIE:
BIT 4
TXIE:
BIT 3
SSPIE:
BIT 2
CCP1IE:
BIT 1
TMR2IE:
BIT 0
TMR1IE:
Nota 1: Este pin est reservado en los micros de 28 pines; mantenerlo siempre
borrado.
176
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
OSCIE
CMIE
USBIE
EEIE
BCLIE
HLVIE
TMR3IE
CCP2IE
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
OSCIE:
BIT 6
CMIE:
BIT 5
USBIE:
BIT 4
EEIE:
BIT 3
BCLIE:
BIT 2
HLVIE:
BIT 1
TMR3IE:
BIT 0
CCP2IE:
177
3.4.10.5.
Registros IPR
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SPPIP(1)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
SPPIP:
BIT 6
ADIP:
BIT 5
RCIP:
BIT 4
TXIP:
BIT 3
SSPIP:
BIT 2
CCP1IP:
BIT 1
TMR2IP:
BIT 0
TMR1IP:
Nota 1: Este pin est reservado en los micros de 28 pines; mantenerlo siempre
borrado
178
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
OSCIP
CMIP
USBIP
EEIP
BCLIP
HLVIP
TMR3IP
CCP2IP
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
R/W-0
R/W-0
R/Wx0
BIT 7
OSCIP:
BIT 6
CMIP:
BIT 5
USBIP:
BIT 4
EEIP:
BIT 3
BCLIP:
BIT 2
HLVIP:
BIT 1
TMR3IP:
BIT 0
CCP2IP:
179
3.4.10.6.
Registro RCON
El registro RCON contiene los flags los cuales se utilizan para determinar la
causa del reset o del reinicio que ha provocado la salida de los modos de reposo o
SLEEP. RCON tambin contiene el bit IPEN el cul permite las prioridades de las
interrupciones.
REGISTRO 10-10: RCON: Registro De Control Del Reset
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
IPEN
SBOREN
RI*
TO*
PD*
POR*
BOR*
R/W-0
R/W-1(1)
U-0
R/W-0
R-1
R-1
R/W-0
R/W-0
BIT 7
IPEN:
BIT 6
SBOREN:
BIT 4
RI*:
BIT 3
TO*:
BIT 2
PD*:
BIT 1
POR*:
BIT 0
CCP2IP:
180
3.4.10.7.
3.4.10.8.
Interrupcin TMR0
3.4.10.9.
3.4.10.10.
181
3.4.11.
;Restaura BSR
;Restaura WREG
;Restaura ESTADO
PUERTOS DE ENTRADA-SALIDA
182
Nota 1: Los puertos de E/S tienen un diodo de proteccin para VDD y VSS.
3.4.11.1.
183
comparador. La operacin de los pines RA5 y RA3:RA0 como entradas del convertidor
A/D se seleccionan al borrar/activar los bits de control en el registro ADCON1 (registro
de control A/D1).
Nota: En un reset por subida de tensin, RA5 y RA3:RA0 se configuran como
entradas analgicas y se leen como 0. RA4 se configura como entrada digital.
El resto de los pines de PORTA tienen niveles de introduccin de datos de TTL
y drivers de salida de CMOS.
El registro TRISA controla la direccin de los pines RA, aun cuando se estn
utilizando como entradas analgicas. El usuario debe asegurarse de que los bits del
registro TRISA son 1 al usarlos como entradas analgicas.
EJEMPLO 11-1: Inicializacin PORTA
CLRF PORTA
CLRF LATA
MOVLW 0Fh
MOVWF ADCON1
MOVLW 07h
MOVWF CMCON
MOVLW 0CFh
MOVWF TRISA
184
Configuracin
Del TRIS
E/S
Tipo de E/S
Descripcin
salida
salida digital
entrada
Buffer de
entrada TTL
entrada
analgica
salida
salida digital
entrada
Buffer de
entrada TTL
entrada
analgica
salida
salida digital
entrada
Buffer de
entrada TTL
AN2
entrada
analgica
VREF-
entrada
analgica
CVREF
salida
analgica
salida
salida digital
entrada
Buffer de
entrada TTL
AN3
entrada
analgica
VREF+
entrada
analgica
salida
salida digital
entrada
T0CKI
entrada
C1OUT
salida
salida digital
RCV
entrada
Buffer de
entrada TTL
RA5
salida
salida digital
entrada
AN4
entrada
SS*
entrada
HLVDIN
entrada
Buffer de
entrada TTL
analgica
Buffer de
entrada TTL
analgica
C2OUT
salida
salida digital
OSC2
salida
analgica
Funcin
RA0
RA0/AN0
AN0
RA1
RA1/AN1
AN1
RA2
RA2/AN2/ VREF/CVREF
RA3
RA3/AN3/
VREF+
RA4
RA4/T0CKI/
C1OUT/RCV
RA5/AN4/SS*/
HLVDIN/C2OUT
OSC2/CLKO/RA6
Buffer de
entrada
Schmitt
Buffer de
entrada
Schmitt
185
CLKO
salida
salida digital
salida
salida digital
entrada
Buffer de
entrada TTL
RA6
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PORTA
RA6(1)
RA5
RA4
RA3
RA2
RA1
RA0
LATA
LATA6(1)
LATA5
LATA4
LATA3
LATA2
LATA1
LATA0
TRISA
TRISA6(1)
TRISA5
TRISA4
TRISA3
TRISA2
TRISA1
TRISA0
ADCON1
VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
PCFG0
CMCON
C2OUT
C1OUT
C2INV
C1INV
CIS
CM2
CM1
CM0
CVRCON
CVREN
CVROE
CVRR
CVRSS
CVR3
CVR2
CVR1
CVR0
UCON
PPBRST
SE0
PKTDIS
USBEN
RESUME
SUSPND
3.4.11.2.
186
187
Configuracin
Del TRIS
E/S
Tipo
De E/S
salida
salida digital
entrada
Buffer de
entrada TTL
AN12
entrada
INT0
entrada
FLT0
entrada
SDI
entrada
Funcin
RB0
RB0/AN12/
INT0/FLT0/
SDI/SDA
seal analgica
Buffer de
entrada Schmitt
Buffer de
entrada Schmitt
Buffer de
entrada Schmitt
salida
salida digital
entrada
I2C/SMB
salida
salida digital
entrada
Buffer de
entrada TTL
AN10
entrada
INT1
entrada
salida
salida digital
entrada
Buffer de
entrada Schmitt
SDA
RB1
RB1/AN10/
INT1/SCK/
SCL
SCK
seal analgica
Buffer de
entrada Schmitt
salida
salida digital
entrada
I2C/SMB
salida
salida digital
entrada
Buffer de
entrada TTL
AN8
entrada
INT2
entrada
VMO
salida
seal analgica
Buffer de
entrada Schmitt
salida digital
salida
salida digital
entrada
Buffer de
entrada TTL
entrada
seal analgica
salida
entrada
salida
salida digital
Buffer de
entrada Schmitt
salida digital
salida
salida digital
entrada
Buffer de
entrada TTL
entrada
seal analgica
SCL
RB2
RB2/AN8/
INT2/VMO
RB3
RB3/AN9/
CCP2/VPO
AN9
CCP2(2)
VPO
RB4/AN11/
KBI0/CSSPP
RB4
AN11
188
Descripcin
LATB<0> salida de datos; no le afectan las entradas
analgicas
PORTB<0> entrada de datos; cuando el bit RBPU se
borre, poca resistencia. Desactivada cuando se activen
las entradas analgicas(1)
Canal de entrada A/D 12.(1)
Entrada de interrupcin externa 0
Entrada de PWM mejorado contra fallos (Mdulo
ECCP1); activo por software
SPI entrada de datos (Mdulo MSSP).
Salida de datos I2C (Mdulo MSSP); tiene prioridad
sobre el puerto de datos.
Entrada de datos I2C (Mdulo MSSP); el tipo de entrada
depende de las caractersticas seleccionadas en el
mdulo.
LATB<1> salida de datos; no le afectan las entradas
analgicas
PORTB<1> entrada de datos; cuando el bit RBPU se
borre, poca resistencia. Desactivada cuando se activen
las entradas analgicas(1)
Canal de entrada A/D 10.(1)
Entrada de interrupcin externa 1
Salida de reloj SPI (Mdulo MSSP); tiene prioridad
sobre el puerto de datos.
Entrada de reloj SPI (Mdulo MSSP).
Salida de reloj I2C (Mdulo MSSP); tiene prioridad
sobre el puerto de datos.
Entrada de reloj I2C (Mdulo MSSP); el tipo de entrada
depende de las caractersticas seleccionadas del mdulo.
LATB<2> salida de datos; no le afectan las entradas
analgicas
PORTB<2> entrada de datos; cuando el bit RBPU se
borre, poca resistencia. Desactivada cuando se activen
las entradas analgicas(1)
Canal de entrada A/D 8.(1)
Entrada de interrupcin externa 2
Salida de datos del transmisor externo USB VMO.
LATB<3> salida de datos; no le afectan las entradas
analgicas
PORTB<3> entrada de datos; cuando el bit RBPU se
borre, poca resistencia. Desactivada cuando se activen
las entradas analgicas(1)
Canal de entrada A/D 9.(1)
Salida del comparador CCP2 y del PWM.
Capturador de entrada CCP2.
Salida de datos del transmisor externo USB VPO.
LATB<4> salida de datos; no le afectan las entradas
analgicas
PORTB<4> entrada de datos; cuando el bit RBPU se
borre, poca resistencia. Desactivada cuando se activen
las entradas analgicas(1)
Canal de entrada A/D 11.(1)
KBI0
entrada
salida
salida
entrada
KBI1
entrada
PGM
entrada
Buffer de
entrada Schmitt
salida
salida digital
entrada
Buffer de
entrada TTL
KBI2
entrada
Buffer de
entrada TTL
Interrupcin al cambiar.
PGC
entrada
Buffer de
entrada Schmitt
salida
salida digital
entrada
Buffer de
entrada TTL
entrada
Buffer de
entrada TTL
Interrupcin al cambiar.
salida
salida digital
entrada
Buffer de
entrada Schmitt
CSSPP
(4)
RB5
RB5/KBI1/
PGM
RB6
RB6/KBI2/
PGC
RB7
RB7/KBI3/
PGD
Buffer de
entrada TTL
salida digital
KBI3
PGD
salida digital
Buffer de
entrada TTL
Buffer de
entrada TTL
Interrupcin al cambiar.
Salida de control del chip select de SPP.
LATB<5> salida de datos.
PORTB<5> entrada de datos; cuando el bit RBPU se
borre, poca resistencia.
Interrupcin al cambiar.
189
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PORTB
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
LATB
LATB7
LATB6
LATB5
LATB4
LATB3
LATB2
LATB1
LATB0
TRISB
TRISB7
TRISB6
TRISB5
TRISB4
TRISB3
TRISB2
TRISB1
TRISB0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
INTCON2
RBPU*
INTEDG0
INTEDG1
INTEDG2
TMR0IP
RBIP
INTCON3
INT2IP
INT1IP
INT2IE
INT1IE
INT2IF
INT1IF
ADCON1
VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
PCFG0
SPPCON(1)
SPPOWN
SPPEN
SPPCFG(1)
CLKCFG1
CLKCFG0
CSEN
CLK1EN
WS3
WS2
WS1
WS0
UCON
PPBRST
SE0
PKTDIS
USBEN
RESUME
SUSPND
190
3.4.11.3.
191
RC0/T1OS
O/
T13CKI
Funcin
Ajustes
del TRIS
E/S
Tipo de E/S
Descripcin
RC0
salida digital
Buffer de
entrada Schmitt
T1OSO
T13CKI
seal analgica
salida digital
Salida del comparador CCP2 y del PWM output; tiene prioridad sobre el
puerto de datos.
RC1
RC1/T1OSI
/
CCP2/UOE
*
T1OSI
CCP2
(1)
UOE*
RC4/D/VM
RC5/D+/V
P
Buffer de
entrada Schmitt
salida digital
Buffer de
entrada Schmitt
Buffer de
entrada Schmitt
salida digital
S
S
salida digital
Salida del comparador ECCP1 y del PWM output; tiene prioridad sobre el
puerto de datos.
Buffer de
entrada Schmitt
P1A(3)
salida digital
RC4
(2)
Buffer de
entrada TTL
(2)
transmisor USB
(2)
transmisor USB
VM
(2)
Buffer de
entrada TTL
RC5
(2)
Buffer de
entrada TTL
(2)
transmisor USB
(2)
transmisor USB
Lnea de salida del bus USB diferencial positivo USB (transmisor interno).
Lnea de entrada del bus USB diferencial positivo USB (transmisor
interno).
(2)
CCP1
D+
RC6
salida digital
Buffer de
entrada Schmitt
D-
VP
RC6/TX/C
K
Salida del oscilador del Timer1; activo cuando se active el oscilador del
Timer1. Inhabilita las E/S digitales.
0
RC2
RC2/CCP1/
P1A
seal analgica
Buffer de
entrada TTL
salida digital
Buffer de
entrada Schmitt
192
TX
salida digital
salida digital
salida digital
Buffer de
entrada Schmitt
salida digital
CK
RC7
RX
RC7/RX/D
T/ SDO
DT
SDO
Buffer de
entrada Schmitt
salida digital
Buffer de
entrada Schmitt
Buffer de
entrada Schmitt
Nota 1: Asignacin del pin por defecto. La asignacin del pin alternativa es
RB3 (cuando CCP2MX = 0).
2: RC4 y RC5 no tienen bits correspondientes de TRISC. En el modo de
puertos estos pines son slo entradas. La direccin de los datos del USB se determina
por la configuracin del USB.
3: Solamente dispositivos de 40/44pines.
TABLA 11-6: Resumen De Registros Asociados Al PORTC
Nombre
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PORTC
RC7
RC6
RC5(1)
RC4(1)
RC2
RC1
RC0
LATC
LATC7
LATC6
LATC2
LATC1
LATC0
TRISC
TRISC7
TRISC6
TRISC2
TRISC1
TRISC0
UCON
PPBRST
SE0
PKTDIS
USBEN
RESUME
SUSPND
193
3.4.11.4.
194
Funcin
RD0
RD0/SPP0
Ajustes
del TRIS
E/S
Tipo de E/S
Descripcin
salida
entrada
Salida digital
Buffer de
entrada Schmitt
salida
entrada
salida
entrada
salida
entrada
salida
entrada
salida
entrada
salida
entrada
SPP0
RD1
RD1/SPP1
SPP1
RD2
RD2/SPP2
SPP2
RD3
RD3/SPP3
RD4/SPP4
RD5/SPP5/P1B
RD6
RD6/SPP6/P1C
RD7/SPP7/P1D
RD7
Salida digital
Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt
Salida digital
entrada
salida
entrada
salida
entrada
salida
entrada
salida
Salida digital
entrada
Buffer de
entrada TTL
salida
Salida digital
salida
entrada
Salida digital
Buffer de
entrada Schmitt
Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt
Salida digital
Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt
salida
Salida digital
entrada
Buffer de
entrada TTL
salida
Salida digital
salida
entrada
Salida digital
Buffer de
entrada Schmitt
SPP6
P1C
Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt
SPP5
P1B
Salida digital
salida
SPP4
RD5
Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt
1
SPP3
RD4
Salida digital
195
salida
Salida digital
entrada
Buffer de
entrada TTL
salida
Salida digital
SPP7
P1D
Nota 1: Puede que configurarse como triestado en los flancos de bajada del
PWM mejorado.
TABLA 11-8: Resumen De Registros Asociados Al PORTD
Nombre
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PORTD(3)
RD7
RD6
RD5
RD4
RD3
RD2
RD1
RD0
LATD(3)
LATD7
LATD6
LATD5
LATD4
LATD3
LATD2
LATD1
LATD0
TRISD(3)
TRISD7
TRISD6
TRISD5
TRISD4
TRISD3
TRISD2
TRISD1
TRISD0
PORTE
RDPU(3)
RE3(1,2)
RE2(3)
RE1(3)
RE0(3)
CCP1CON
P1M1(3)
P1M0(3)
DC1B1
DC1B0
CCP1M3
CCP1M2
CCP1M1
CCP1M0
SPPCON(3)
SPPOWN
SPPEN
196
3.4.11.5.
197
3.4.11.5.1.
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RDPU(3)
RE3(1,2)
RE2(3)
RE1(3)
RE0(1)
R/W-0
U-0
U-0
U-0
R/W-x
R/W-0
R/W-0
R/W-0
BIT 7
RDPU:
BIT 3-0
RE3:RE0:
198
Ajustes
del TRIS
E/S
Tipo de E/S
salida
Salida digital
entrada
Buffer de
entrada
Schmitt
AN5
entrada
Seal
analgica
CK1SPP
salida
Salida digital
salida
Salida digital
entrada
Buffer de
entrada
Schmitt
AN6
entrada
Seal
analgica
CK2SPP
salida
Salida digital
salida
Salida digital
entrada
Buffer de
entrada
Schmitt
AN7
entrada
Seal
analgica
OESPP
salida
Salida digital
MCLR*
(1)
entrada
Buffer de
entrada
Schmitt
VPP
(1)
entrada
Seal
analgica
RE3
(1)
entrada
Buffer de
entrada
Schmitt
Funcin
RE0
RE0/AN5/
CK1SPP
RE1
RE1/AN6/
CK2SPP
RE2
RE2/AN7/
OESPP
MCLR*/VPP/
RE3
Descripcin
LATE<0> salida de datos; no le afectan las entradas analgicas.
199
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
PORTE
RDPU(3)
RE3(1,2)
RE2(3)
RE1(3)
RE0(3)
LATE(3)
LATE2
LATE1
LATE0
TRISE(3)
TRISE2
TRISE1
TRISE0
ADCON1
VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
PCFG0
CMCON
C2OUT
C1OUT
C2INV
C1INV
CIS
CM2
CM1
CM0
SPPCON(3)
SPPOWN
SPPEN
SPPCFG(3)
CLKCFG1
CLKCFG0
CSEN
CLK1EN
WS3
WS2
WS1
WS0
200
3.4.12.
MDULO TIMER0
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
TMR0ON
T08BIT
T0CS
T0SE
PSA
T0PS2
T0PS1
T0PS0
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2-0
TMR0ON:
201
3.4.12.1.
3.4.12.2.
202
3.4.12.3.
Prescaler
3.4.12.3.1.
3.4.12.4.
Interrupcin Timer0
203
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
TMR0L
TMR0H
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
INTCON2
RBPU
INTEDG0
INTEDG1
INTEDG2
TMR0IP
RBIP
T0CON
TMR0ON
T08BIT
T0CS
T0SE
PSA
T0PS2
T0PS1
T0PS0
TRISA
TRISA6(1)
TRISA5
TRISA4
TRISA3
TRISA2
TRISA1
TRISA0
204
3.4.13.
MDULO TIMER1
El mdulo
caractersticas:
temporizador/contador
Timer1
incorpora
las
siguientes
205
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RD16
T1RUN
T1CKPS1
T1CKPS0
T1OSCEN
T1SYNC*
TMR1CS
TMR1ON
R/W-0
R-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
BIT 6
BIT 5-4
BIT 3
BIT 2
BIT 1
BIT 0
RD16:
206
3.4.13.1.
3.4.13.2.
207
3.4.13.3.
Oscilador Timer1
208
3.4.13.3.1.
Osc
Freq
C1
C2
LP
32 kHz
27 pF
27 pF
El oscilador Timer1 est tambin disponible como fuente del reloj en los modos
de ahorro de energa. Poniendo los bits, SCS1:SCS0 (OSCCON<1:0>), a 01, el
dispositivo cambia al modo SEC_RUN. La CPU y los perifrico se controlan con el
oscilador Timer1. Si el bit IDLEN (OSCCON<7>) se borra y se ejecuta la instruccin
SLEEP, el dispositivo entra en el modo SEC_IDLE.
Siempre que el oscilador Timer1 proporcione la fuente de reloj, el flag de estado
del reloj del sistema Timer1, T1RUN (T1CON<6>), se activa. Esto se puede utilizar
para determinar el modo que controla el dispositivo. Puede indicar tambin la fuente del
reloj que utiliza actualmente el monitor a prueba de fallos. Si se permite el monitor del
reloj y el oscilador del Timer1 falla mientras que proporciona la seal de reloj,
preguntando al bit T1RUN sabremos si el reloj lo proporciona el oscilador Timer1 u
otra fuente.
3.4.13.3.2.
3.4.13.3.3.
El circuito del oscilador Timer1 crea una energa muy pequea durante su
operacin. Debido a la naturaleza de baja potencia del oscilador, puede provocarse
interferencias rpidamente. El circuito del oscilador debe localizarse lo ms cercano
posible al microcontrolador. No puede haber circuitos que pasen por dentro de los
lmites del oscilador del circuito con excepcin de VSS o de VDD.
Si hay que poner un circuito de alta velocidad cerca del oscilador (por ejemplo el
pin CCP1, o el oscilador primario usando el pino OSC2), hay que poner un anillo de
puesta a tierra protector alrededor del circuito del oscilador; puede ser til cuando est
utilizado en PWB de una cara o adems de un plano de tierra.
209
3.4.13.4.
Interrupcin Timer1
3.4.13.5.
Reset Del Timer1 Usando El Disparador Especial Del
Acontecimiento CCP
Si cualquiera de los mdulos CCP se configuran como un modo de comparacin
para generar un disparo especial (CCP1M3:CCP1M0 o CCP2M3:CCP2M0 = 1011),
esta seal resetear el Timer1. El disparo de CCP2 tambin comenzar una conversin
A/D, si es el mdulo A/D est permitido.
El mdulo se debe configurar como un temporizador o un contador sncrono
para aprovechar esta caracterstica. Cuando se est utilizando de esta manera, el par de
registros CCPRH:CCPRL se convierten en un registro del perodo del Timer1.
Si Timer1 est funcionando en modo contador asncrono, esta operacin de reset
puede que no funcione.
En caso que al escribir el Timer1 coincida con un evento de disparo especial, la
operacin de escritura tomar precedencia.
Nota: Los acontecimientos de disparo especiales del mdulo CCP2 no activarn
el flag de interrupcin TMR1IF (PIR1<0>).
210
3.4.13.6.
211
RTCisr
MOVLW
MOVWF
CLRF
MOVLW
MOVWF
CLRF
CLRF
MOVLW
MOVWF
BSF
RETURN
80h
TMR1H
TMR1L
b'00001111'
T1OSC
Secs
mins
d'12'
hours
PIE1,TMR1IE
BSF
TMR1H,7
BCF
PIR1,TMR1IF
INCF
secs,F
MOVLW
d'59'
CPFSGT
secs
RETURN
CLRF
secs
INCF
mins,F
MOVLW d' 59'
CPFSGT
mins
RETURN
CLRF
mins
INCF
hours,F
MOVLW
d' 23'
CPFSGT
hours
RETURN
MOVLW
d' 01'
MOVWF
hours
RETURN
212
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
PIR1
SPPIF(1)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
SPPIE(1)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR1
SPPIP(1)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
T1SYNC*
TMR1CS
TMR1ON
TMR1L
TMR1H
T1CON
RD16
T1RUN
T1CKPS1
T1CKPS0
T1OSCEN
3.4.14.
MDULO TIMER2
PR2,
213
3.4.14.1.
En una operacin normal, TMR2 se incrementa de 00h en cada pulso del reloj
(FOSC/4). Un contador/prescaler de 2bits en la entrada de reloj da la entrada directa, con
las opciones de prescaler divisor por 4 y divisor por 16. stos se eligen con los bits,
T2CKPS1:T2CKPS0 (T2CON<1:0>). El valor de TMR2 se compara al del registro del
perodo, PR2, en cada ciclo de reloj. Cuando los dos valores son iguales, el comparador
genera una seal de sincronismo como temporizador de salida. Esta seal tambin
resetea el valor de TMR2 a 00h en el ciclo siguiente y controla el contador/postscaler de
salida.
Los registros TMR2 y PR2 son directamente legibles y escribibles. El registro
TMR2 se borra en cualquier reset del dispositivo, mientras que el registro PR2 se
inicializa en FFh. Los contadores del prescaler y del postscaler se borran con los
siguientes acontecimientos:
Al escribir en el registro TMR2
Al escribir en el registro T2CON
Cualquier reset del dispositivo
El TMR2 no se borra cuando se escribe el T2CON.
214
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
T2OUTPS3
T2OUTPS2
T2OUTPS1
T2OUTPS0
TMR2ON
T2CKPS1
T2CKPS0
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 6-3
BIT 2
BIT 1-0
3.4.14.2.
T2OUTPS3:T2OUTPS0:
Bits selectores del Postscaler de la salida
0000 = 1:1 Postscaler
0001 = 1:2 Postscaler
Interrupcin Timer2
3.4.14.3.
La salida sin escala del TMR2 est disponible sobre todo para los mdulos de
CCP, donde se utiliza como base de tiempos de operaciones en modo PWM.
El Timer2 se puede utilizar opcionalmente como fuente del reloj para el mdulo
MSSP que funciona en modo SPI.
215
Asociados
Al
Timer2
trabajando
Como
Nombre
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
PIR1
SPPIF(1)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
SPPIE(1)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR1
SPPIP(1)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
TMR2ON
T2CKPS1
T2CKPS0
TMR2
T2CON
Timer2 Register
T2OUTPS3
T2OUTPS2
PR2
T2OUTPS1
T2OUTPS0
3.4.15.
MDULO TIMER3
El mdulo
caractersticas:
Timer3
temporizador/contador
incorpora
las
siguientes
216
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RD16
T3CCP2
T3CKPS1
T3CKPS0
T3CCP1
T3SYNC*
TMR3CS
TMR3ON
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
BIT 6,3
BIT 5-4
BIT 2
BIT 1
BIT 0
RD16:
217
3.4.15.1.
3.4.15.2.
Timer3 se puede configurar para que lea y escriba 16bits. Cuando el bit RD16
(T3CON<7>) se activa, la direccin del TMR3H se mapea con un registro de
almacenamiento intermedio con el byte alto de Timer3. Al leer TMR3L cargar el
contenido del byte alto de Timer3 en el byte alto del registro de almacenamiento
intermedio. Esto proporciona al usuario la capacidad de leer los 16 bits sin tener que
determinar si es el byte alto, seguido por el byte bajo, las lecturas redundantes provocan
que sea invlido.
Al escribir el byte alto del Timer3 debe pasar a travs del registro de
almacenamiento intermedio de TMR3H. El byte alto del Timer3 se actualiza con el
contenido de TMR3H cuando se escribe el TMR3L. Esto permite que el usuario escriba
los 16 bits a los bytes altos y bajos de Timer3 inmediatamente.
218
3.4.15.3.
El oscilador interno Timer1 se puede utilizar como el reloj fuente del Timer3. El
oscilador Timer1 se activa seteando el bit T1OSCEN (T1CON<3>). Para utilizarlo
como fuente de reloj del Timer3, el bit TMR3CS debe estar activado. Esto configura el
Timer3 para que incremente en cada flanco de subida de la fuente del oscilador.
3.4.15.4.
Interrupcin Timer3
219
3.4.15.5.
Reset Del Timer3 usando El Disparador Especial De
Acontecimientos Del CCP
Si el mdulo CCP2 se configura para generar el disparador especial de
acontecimiento en el modo de comparacin (CCP2M3:CCP2M0=1011), esta seal
resetear el Timer3. Tambin comenzar una conversin A/D si el mdulo A/D est
activado.
El mdulo se debe configurar como temporizador o contador sncrono para
aprovecharse de esta caracterstica. Cuando se est utilizando este modo, el par de
registros CCPR2H:CCPR2L se convierten en un registro de perodo del Timer3.
Si Timer3 est funcionando en modo contador asncrono, el reset puede que no
funcione.
En caso que coincida una escritura en el Timer3 con el disparo especial de un
mdulo de CCP, la escritura tiene preferencia.
Nota: Los acontecimientos de disparo especiales del mdulo CCP2 no activarn
el flag TMR3IF (PIR2<1>).
TABLA 15-1: Los Registros
Temporizador/Contador
Asociados
Al
Timer3
Trabajando
Como
Nombre
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
TMR3L
TMR3H
T1CON
RD16
T1RUN
T1CKPS1
T1CKPS0
T1OSCEN
T1SYNC*
TMR1CS
TMR1ON
T3CON
RD16
T3CCP2
T3CKPS1
T3CKPS0
T3CCP1
T3SYNC*
TMR3CS
TMR3ON
220
3.4.16.
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
DCxB1
DCxB0
CCPxM3
CCPxM2
CCPxM1
CCPxM0
U-0
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 5-4
BIT 3-0
DCxB1:DCxB0:
221
3.4.16.1.
3.4.16.1.1.
Recurso temporizador
Captura
Timer1 o Timer3
Comparacin
Timer1 o Timer3
PWM
Timer2
222
TABLA 16-2: Interacciones Entre CCP1 y CCP2 Para Los Recursos Del Temporizador
Modo CCP1
Modo CCP2
Interaccin
Captura
Captura
Cada modulo puede usar TMR1 o TMR3 como base de tiempos. La base de tiempos puede
ser distinta para cada CCP.
Captura
Comparacin
CCP2 se puede configurar para resetear TMR1 o TMR3 en el disparo de un evento especial
(dependiendo de la base de tiempos utilizada). Se pueden hacer conversiones A/D
automticas en el disparo. Puede afectar a las operaciones de CCP1 si tienen la misma base de
tiempos.
Comparacin
Captura
Comparacin
Comparacin
Cada modulo se puede configurar para que resetee la base de tiempos en un disparo de un
evento especial. Se pueden utilizar las conversiones A/D automticas en el CCP2. Puede
haber conflictos si los dos mdulos usan la misma base de tiempos.
Captura
PWM(1)
Ninguno
Comparacin
PWM(1)
Ninguno
PWM(1)
Captura
Ninguno
PWM(1)
Comparacin
Ninguno
PWM(1)
PWM
3.4.16.1.2.
223
3.4.16.2.
MODO CAPTURA
3.4.16.2.1.
3.4.16.2.2.
3.4.16.2.3.
3.4.16.2.4.
CCP Prescaler
Hay cuatro ajustes del prescaler en el modo captura. Se especifican como parte
del modo de funcionamiento seleccionado por los bits selectores del modo
(CCPxM3:CCPxM0). Siempre que el mdulo CCP se apague o el modo captura se
desactiva, el contador del prescaler se borra. Esto significa que cualquier reset borrar el
contador del prescaler.
El cambio de un prescaler de captura a otro puede generar una interrupcin.
Tambin, el contador del prescaler no se borra, por lo tanto, la primera captura puede
ser de un prescaler diferente a cero.
224
CCP2CON
NEW_CAPT_PS
MOVWF
CCP2CON
;Desconecta el CCP2
;Carga el WREG con el valor del nuevo
;prescaler y CCP encendido
;Carga CCP2CON con este valor
3.4.16.3.
Modo Comparacin
Se pone en alto
Se pone en bajo
flip-flop (alto-a-bajo o bajo-a-alto)
sin cambiar (es decir, refleja el estado del latch de la E/S)
La accin del pin se basa en el valor del modo seleccionado con los bits
(CCPxM3:CCPxM0). Al mismo tiempo, se fija el flag de interrupcin, CCPxIF.
3.4.16.3.1.
El usuario debe configurar el pin CCPx como salida borrando el bit apropiado
del TRIS.
Nota: Borrar el registro CCP2CON forzar el latch de comparacin de salida de
RB3 o RC1 (dependiendo de la configuracin del dispositivo) a nivel bajo por defecto.
ste no es el PORTB o el latch de E/S de PORTC.
225
3.4.16.3.2.
3.4.16.3.3.
Cuando
se
elige
el
modo
de
interrupcin
por
software
(CCPxM3:CCPxM0=1010), no varia el pin correspondiente al CCPx. Solamente se
genera una interrupcin CCP, si est permitida, y se activa el bit CCPxIE.
3.4.16.3.4.
226
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
RCON
IPEN
SBOREN(1)
RI*
TO*
PD*
POR*
BOR*
PIR1
SPPIF(2)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
SPPIE(2)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR1
SPPIP(2)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
TRISB
TRISB7
TRISB6
TRISB5
TRISB4
TRISB3
TRISB2
TRISB1
TRISB0
TRISC
TRISC7
TRISC6
TRISC2
TRISC1
TRISC0
T1SYNC*
TMR1CS
TMR1ON
T3SYNC*
TMR3CS
TMR3ON
CCP1M1
CCP1M0
CCP2M1
CCP2M0
TMR1L
TMR1H
T1CON
RD16
T1RUN
T1CKPS1
T1CKPS0
T1OSCEN
TMR3H
TMR3L
T3CON
RD16
T3CCP2
T3CKPS1
T3CKPS0
T3CCP1
CCPR1L
CCPR1H
CCP1CON
P1M1(2)
P1M0(2)
DC1B1
DC1B0
CCP1M3
CCP1M2
CCPR2L
CCPR2H
CCP2CON
DC2B1
DC2B0
CCP2M3
CCP2M2
227
3.4.16.4.
Modo PWM
En modo de modulacin del ancho del pulso (PWM), el pin CCPx produce una
salida PWM de hasta 10bits de resolucin. Como el pin CCP2 se multiplexa con el
PORTB o el latch del PORTC, el bit apropiado de TRIS tiene que borrarse para
configurar el pin CCP2 como salida.
Nota: Borrar el registro CCP2CON forzar el latch de comparacin de salida de
RB3 o RC1 (dependiendo de la configuracin del dispositivo) a nivel bajo por defecto.
ste no es el PORTB o el latch de E/S de PORTC.
Una salida PWM tiene un tiempo base (periodo) y un tiempo en el que la salida
permanece en nivel alto (Duty cicle). La frecuencia del PWM es la inversa del periodo.
FIGURA 16-3: Diagrama De Bloques Simplificado Del PWM
Nota 1: el valor de 8bits de Timer2 se concatena con los 2bits del reloj interno Q
o 2bits del prescaler, para crear los 10bit del tiempo base
FIGURA 16-4: Salida PWM
228
3.4.16.4.1.
3.4.16.4.2.
229
ECUACIN 16-3:
FOSC
)
FPWM
bits
log(2)
log(
Resolucin_mxima_PWM =
Nota: Si el valor del ciclo de trabajo de PWM es mayor que el periodo, el pin
CCPx no se borrar.
TABLA 16-4: Ejemplo De Frecuencias Y Resoluciones A 40MHz
Frecuencia del PWM
2,44kHz
9,77kHz
39,06kHz
156,25kHz
312,50kHz
416,67kHz
16
PR2 Valor
FFh
FFh
FFh
3Fh
1Fh
17h
10
10
10
6,58
3.4.16.4.3.
Las caractersticas del auto-apagado del PWM mejorado del mdulo CCP estn
tambin disponibles en el CCP1 de los dispositivos de 28pines.
Las caractersticas del auto-apagado no estn disponibles en el CCP2.
3.4.16.4.4.
230
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
RCON
IPEN
SBOREN(1)
RI*
TO*
PD*
POR*
BOR*
PIR1
SPPIF(2)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
SPPIE(2)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR1
SPPIP(2)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
TRISB
TRISB7
TRISB6
TRISB5
TRISB4
TRISB3
TRISB2
TRISB1
TRISB0
TRISC
TRISC7
TRISC6
TRISC2
TRISC1
TRISC0
TMR2ON
T2CKPS1
T2CKPS0
CCP1M1
CCP1M0
TMR2
Timer2 Register
PR2
T2CON
T2OUTPS3
T2OUTPS2
T2OUTPS1
T2OUTPS0
CCPR1L
CCPR1H
CCP1CON
P1M1(2)
P1M0(2)
DC1B1
DC1B0
CCP1M3
CCP1M2
CCPR2L
CCPR2H
CCP2CON
DC2B1
DC2B0
CCP2M3
CCP2M2
CCP2M1
CCP2M0
ECCP1AS
ECCPASE
ECCPAS2
ECCPAS1
ECCPAS0
PSSAC1
PSSAC0
PSSBD1(2)
PSSBD0(2)
ECCP1DEL
PRSEN
PDC6(2)
PDC5(2)
PDC4(2)
PDC3(2)
PDC2(2)
PDC1(2)
PDC0(2)
231
3.4.17. MDULO
(ECCP)
MEJORADO
DE
CAPTURA/COMPARACIN/PWM
3.4.17.1.
3.4.17.1.1.
Como los mdulos estndar CCP, el mdulo ECCP puede utilizar los
temporizadores 1, 2 3, dependiendo del modo seleccionado. Timer1 y Timer3 estn
disponibles para los modos captura o comparacin, mientras que Timer2 est disponible
para el modo PWM. Las interacciones entre el estndar y los mdulos mejorados CCP
son idnticas a las descritas para los mdulos estndares CCP.
232
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
P1M1
P1M0
DC0B1
DC0B0
CCP0M3
CCP0M2
CCP0M1
CCP0M0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7-6
BIT 5-4
BIT 3-0
P1M1:P1M0:
233
3.4.17.2.
3.4.17.2.1.
3.4.17.3.
Configuracin CCP1CON
RC2
RD5
RD6
RD7
dispositivos PIC18F4455/4550
Compatible CCP
00xx 11xx
CCP1
RD5/SPP5
RD6/SPP6
RD7/SPP7
Dual PWM
10xx 11xx
P1A
P1B
RD6/SPP6
RD7/SPP7
Quad PWM
x1xx 11xx
P1A
P1B
P1C
P1D
234
3.4.17.4.
Nota 1: el valor de 8bits de Timer2 se concatena con los 2bits del reloj interno Q
o 2bits del prescaler, para crear los 10bit del tiempo base.
235
3.4.17.4.1.
Periodo De PWM
3.4.17.4.2.
236
ECUACIN 17-3:
FOSC
)
FPWM
bits
log(2)
log(
Re solicin _ mxima _ PWM =
Nota: Si el valor del ciclo de trabajo de PWM es mayor que el periodo, el pin
CCPx no se borrar.
TABLA 17-2: EJEMPLO DE FRECUENCIAS Y RESOLUCIONES A 40mhz
Frecuencia del PWM
2,44kHz
9,77kHz
39,06kHz
156,25kHz
312,50kHz
416,67kHz
16
PR2 Valor
FFh
FFh
FFh
3Fh
1Fh
17h
10
10
10
6,58
3.4.17.4.3.
Salida simple
Salida half-bridge (medio-puente)
Salida full-bridge (puente-completo); modo directo
Salida full-bridge; modo inverso
237
3.4.17.4.4.
El Modo Half-Bridge
238
3.4.17.4.5.
Modo Full-Bridge
En la salida del modo Full-Bridge, los cuatro pines se utilizan como salidas; con
dos entradas activas a la vez. En el modo directo, el pin P1A est activo y el pin P1D
modula. En el modo inverso, el pin P1C est activo y el pin P1B modula.
Las salidas P1A, P1B, P1C y P1D se multiplexan con los latchs de datos
PORTC<2>, PORTD<5>, PORTD<6> y PORTD<7>. Los bits TRISC<2>, TRISD<5>,
TRISD<6> y TRISD<7> deben borrarse para configurar los pines como salidas.
239
240
241
Si hay que cambiar la direccin en una aplicacin con el duty cicle alto, hay que
cumplir una de estas condiciones:
1. Reducir el periodo de PWM antes de cambiar las direcciones.
2. Utilizar conmutaciones ms rpidas.
Pueden existir otras opciones para prevenir el pico de corriente.
FIGURA 17-8: Cambio De Direccin
242
3.4.17.4.6.
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
PRSEN
PDC6(1)
PDC5(1)
PDC4(1)
PDC3(1)
PDC2(1)
PDC1(1)
PDC0(1)
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
PRSEN:
BIT 6-0
PDC6:PDC0:
243
3.4.17.4.7.
Cuando se programa ECCP con un modo PWM mejorado, los pines activos de
salida se pueden configurar para un auto-apagado. El auto-apagado coloca
inmediatamente los pines de salida del PWM mejorados en un estado definido de
apagado cuando ocurre un acontecimiento de apagado.
Un acontecimiento de apagado se puede provocar con los mdulos del
comparador, con un nivel bajo en el pin RB0/AN12/INT0/FLT0/SDI/SDA, o de
cualquier combinacin de estas tres fuentes. Los comparadores se pueden utilizar para
supervisar una entrada de tensin proporcional a una corriente supervisada por el
circuito del puente. Si la tensin excede un umbral, el comparador cambia de estado y
acciona un apagado. Alternativamente, una seal numrica en el pin INT0 puede
provocar un apagado. La caracterstica del auto-apagado se puede inhabilitar al no
seleccionar ninguna fuente de auto-apagado. Las fuentes de auto-apagado que se
utilizarn se seleccionan usando los bits ECCPAS2:ECCPAS0 (bits<6:4> del registro
ECCP1AS).
Cuando ocurre un apagado, los pines de salida se colocan asncronamente en su
estado de apagado, especificados por los bits PSSAC1:PSSAC0 y PSSBD1:PSSBD0
(ECCP1AS3:ECCP1AS0). Cada pareja de pines (P1A/P1C y P1B/P1D) se puede
activar para conducir en alto, conducir en bajo o un tercer estado (no conduce).
El bit ECCPASE (ECCP1AS<7>) tambin se activa para llevar a cabo las
salidas mejoradas de PWM a sus estados de parada.
El bit ECCPASE se activa por hardware cuando ocurre un acontecimiento de
parada. Si el reinicio automtico no est activo, el bit ECCPASE lo borra el firmware
cuando cesa la causa de apagado. Si el reinicio automtico est activo, el bit ECCPASE
se borra automticamente cuando cesa la causa de apagado.
Si se activa el bit ECCPASE cuando comienza un periodo de PWM, las salidas
del PWM siguen estando en su estado de apagado durante el periodo entero de PWM.
Cuando el bit ECCPASE est borrado, las salidas del PWM volvern al funcionamiento
normal al principio del periodo siguiente de PWM.
Nota: El escribir el bit ECCPASE se desactiva cuando una condicin de
apagado est activa.
244
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
ECCPASE
ECCPAS2
ECCPAS1
ECCPAS0
PSSAC1
PSSAC0
PSSBD1(1)
PSSBD0(1)
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
ECCPASE:
BIT 6-4
BIT 3-2
BIT 1-0
245
El Auto-Apagado Y El Auto-Reinicio
La caracterstica del auto-apagado se puede configurar para permitir el reinicio
automtico del mdulo despus de un acontecimiento de apagado. Esto se permite
activando el bit PRSEN del registro ECCP1DEL (ECCP1DEL<7>).
En modo del apagado con PRSEN=1, el bit ECCPASE seguir activo mientras
contine la causa de apagado. Cuando la condicin de apagado desaparece, el bit
ECCP1ASE se borra. Si PRSEN=0, cuando ocurre la condicin de parada, el bit
ECCPASE sigue activo hasta que se borra por firmware. Cuando ECCPASE se borra, el
PWM mejorado parar al principio del siguiente periodo PWM.
Nota: El escribir el bit ECCPASE se desactiva cuando la condicin de apagado
est activa.
Independientemente del ajuste del bit PRSEN, si la fuente del auto-apagado es
uno de los comparadores, la condicin de la parada es un nivel. El bit ECCPASE no
puede borrarse mientras dure la causa del apagado.
El modo auto-apagado puede forzarse escribiendo un 1 en el bit ECCPASE.
FIGURA 17-10: Auto-Apagado (PRSEN=1, Auto-Reinicio Activo)
246
3.4.17.4.8.
Consideraciones De Reinicio
3.4.17.4.9.
Hay que tomar los siguientes pasos para configurar el mdulo ECCP en el modo
PWM:
1. Configurar los pines de PWM, P1A y P1B (y P1C y P1D, si se utilizan),
como entradas activando los bits correspondientes de TRIS.
2. Fijar el perodo de PWM cargando el registro PR2.
3. Si se requiere el Auto-apagado:
9 Inhabilita el Auto-apagado (ECCPASE = 0)
9 Configurar la fuente (FLT0, comparador 1 o comparador 2)
9 Esperar una condicin de no apagado
4. Configurar el mdulo ECCP con el modo PWM deseado y configurar el
registro CCP1CON cargando los valores apropiados:
9 Seleccionar una de las configuraciones y de las direcciones
disponibles de salida con los bits P1M1:P1M0.
9 Seleccionar las polaridades de las seales de salida de PWM con
los bits CCP1M3:CCP1M0.
5. Fijar el ciclo de trabajo de PWM cargando el registro CCPR1L y los bits
CCP1CON<5:4>.
6. Para el modo de salida Half-Bridge, fijar el retraso banda-muerta
cargando el valor apropiado en ECCP1DEL<6:0>.
7. Si se necesita el auto-apagado, cargar el registro ECCP1AS:
9 Seleccionar las fuentes del auto-apagado usando los bits
ECCPAS2:ECCPAS0.
247
248
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
RCON
IPEN
SBOREN(1)
RI*
TO*
PD*
POR*
BOR*
(2)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
(2)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
SPPIE
(2)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
TRISB
TRISB7
TRISB6
TRISB5
TRISB4
TRISB3
TRISB2
TRISB1
TRISB0
TRISC
TRISC7
TRISC6
TRISC2
TRISC1
TRISC0
TRISD7
TRISD6
TRISD5
TRISD4
TRISD3
TRISD2
TRISD1
TRISD0
T1SYNC*
TMR1CS
TMR1ON
TMR2ON
T2CKPS1
T2CKPS0
T3SYNC*
TMR3CS
TMR3ON
CCP1M1
CCP1M0
IPR1
SPPIP
PIR1
SPPIF
(2)
TRISD
TMR1L
TMR1H
T1CON
RD16
T1RUN
T1CKPS1
TMR2
T2CON
T1CKPS0
T1OSCEN
T2OUTPS3
T2OUTPS2
PR2
T2OUTPS1
T2OUTPS0
TMR3L
TMR3H
T3CON
RD16
T3CCP2
CCPR1L
T3CKPS0
T3CCP1
CCPR1H
CCP1CON
T3CKPS1
(2)
P1M0
(2)
DC1B1
DC1B0
CCP1M3
CCP1M2
(2)
ECCP1AS
ECCPASE
ECCPAS2
ECCPAS1
ECCPAS0
PSSAC1
PSSAC0
PSSBD1
ECCP1DEL
PRSEN
PDC6(2)
PDC5(2)
PDC4(2)
PDC3(2)
PDC2(2)
PDC1(2)
PSSBD0(2)
PDC0(2)
249
3.4.18.
3.4.18.1.
250
Nota 1: Esta seal solo est disponible si el transmisor interno est desactivado
(UTRDIS=1)
2: Las resistencias internas pull-up se tienen que desactivar (UPUEN=0)
3: No hay que activar el regulador interno cuando se utiliza una fuente de
3,3V externa.
3.4.18.2.
Las operaciones del mdulo USB se configuran y controlan con tres registros.
En total hay 22 registros para manejar las transacciones del USB. Los registros son:
3.4.18.2.1.
El registro de control del USB UCON contiene los bits necesarios para dirigir el
comportamiento del mdulo durante las transferencias. El registro contiene los bits que
gobiernan lo siguiente:
251
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
PPBRST
SE0
PKTDIS
USBEN
RESUME
SUSPND
U-0
R/W-0
R-x
R/C-0
R/W-0
R/W-0
R/W-0
U-0
BIT 6
PPBRST:
BIT 5
SE0:
BIT 4
PKTDIS:
BIT 3
USBEN:
BIT 2:
RESUME:
252
BIT 1
SUSPND:
3.4.18.2.2.
El registro UCFG tambin contiene dos bits que ayudan a probar el mdulo,
eliminando errores y certificaciones del USB. La salida de control de estos bits permite
el monitor de estado y generacin de patrones de ojo.
Nota: La velocidad del USB, la transmisin y las pull-up deben configurase
solamente durante la fase de activacin del mdulo. No se recomienda cambiar estos
ajustes mientras que el mdulo est funcionando.
253
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
UTEYE
UOEMON(1)
UPUEN(2,3)
UTRDIS(2)
FSEN(2)
PPB1
PPB0
R/W-0
R/W-0
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
UTEYE:
BIT 6
UOEMON:
BIT 4
UPUEN:
BIT 3
UTRDIS:
BIT 2
FSEN:
BIT 1-0
PPB1:PPB0:
254
Transmisor Interno
El perifrico USB tiene, USB 2.0, full-speed y un transmisor de poca velocidad,
internamente conectado al SIE. Esta caracterstica es til en aplicaciones baratas con un
chip. El bit UTRDIS (UCFG<3>) controla el transmisor; est permitido por defecto
(UTRDIS = 0). El bit FSEN (UCFG<2>) controla la velocidad del transmisor; activar el
bit permite las operaciones full-speed.
Las resistencias pull-up del chip del USB se controlan con el bit UPUEN
(UCFG<4>). Pueden seleccionarse solamente cuando se permite el transmisor del chip.
Las especificaciones del USB requieren 3,3V en las comunicaciones; sin
embargo, el resto del chip puede funcionar con una tensin ms alta. As, la fuente de
energa del transmisor es una fuente separada, VUSB.
Transmisor Externo
Este mdulo proporciona ayuda para el uso de un transmisor fuera del chip. El
transmisor externo se utiliza en aplicaciones donde las condiciones fsicas dictan la
localizacin del transmisor lejos del SIE. Por ejemplo, aplicaciones que requieren el
aislamiento del USB poda utilizar un transmisor externo con algunos aislamientos en el
SIE del microcontrolador. Las operaciones con un transmisor externo se permiten
activando el bit UTRDIS.
FIGURA 18-2: Transmisor Externo Con Aislamientos
Las seales VPO y VMO son salidas del SIE al transmisor externo. La seal del
RCV es la salida del transmisor externo al SIE; representa las seales diferenciales del
bus serie traducido en un tren de pulsos. Las seales VM y VP se utilizan para divulgar
condiciones en el bus serie al SIE que no se puede capturar con la seal del RCV.
255
La seal UOE* indica el estado del transmisor externo. A esta lnea la pone en
nivel bajo el dispositivo para activar las transmisiones de datos del SIE con un
dispositivo externo.
TABLA 18-1: Salidas Diferenciales Al Transmisor
VPO
VMO
Single-Ended Cero
Diferencial 0
Diferencial 1
Condicin Ilegal
VM
Single-Ended Cero
Baja velocidad
Toda velocidad
Error
256
Regulador Interno
Los dispositivos PIC18FX455/X550 tienen un regulador incorporado 3,3V para
proporcionar energa al transmisor interno y proporcionar una fuente para el pull-up
257
interno y externo. Para que el regulador sea estable se necesita un condensador externo
de 220nF (20%).
Nota: La corriente de VUSB es suficiente para controlar un pull-up externo y el
transmisor interno.
El regulador se activa por defecto y puede inhabilitarse a travs del bit de
configuracin VREGEN. Cuando est activo, la tensin es visible en el pin VUSB.
Cuando el regulador est desactivado, se tiene que conectar una fuente de 3,3V al pin
VUSB para alimentar el transmisor interno. Si el transmisor interno no se utiliza, VUSB
tampoco se activa.
Nota 1: No permitir el regulador interno si el regulador externo est conectado
a VUSB.
2: VDD debe ser mayor que VUSB en cualquier momento, o igual con el
regulador inhabilitado.
3.4.18.2.3.
El registro de estado del USB divulga el estado de las transacciones dentro del
SIE. Cuando el SIE publica una interrupcin de transferencia completa por el USB, hay
que leer USTAT para determinar el estado de la transferencia. USTAT contiene el
nmero del Endpoint de la transferencia, direccin y valor del puntero del buffer pingpong (si est utilizado).
Nota: Los datos en el registro de estado del USB son vlidos solamente cuando
el flag de interrupcin TRNIF est activo.
El registro USTAT es realmente una ventana legible de los cuatro bytes de
estado FIFO mantenida por el SIE. Permite al microcontrolador procesar una
transferencia mientras que SIE procesa los Endpoints adicionales. Cuando el SIE
termina con un buffer de lectura o escritura de datos, actualiza el registro USTAT. Si se
realiza otra transferencia USB antes de realizar una interrupcin de transaccin
completa, el SIE almacenar el estado de la transferencia siguiente en el estado FIFO.
Despejando el flag de la transferencia completa, TRNIF, provoca al SIE que
avance el FIFO. Si los datos siguientes en el registro FIFO son vlidos, el SIE
inmediatamente reafirma la interrupcin. Si no hay datos adicionales presentes, TRNIF
seguir borrado; los datos de USTAT puede que no sean correctos.
Nota: Si se recibe una peticin de Endpoint mientras que el USTAT FIFO este
lleno, el SIE publica automticamente un NAK de nuevo al anfitrin.
258
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
ENDP3
ENDP2
ENDP1
ENDP0
DIR
PPBI(1)
U-0
R-x
R-x
R-x
R-x
R-x
R-x
U-0
BIT 6-3
BIT 2
BIT 1
Nota 1: Este bit es solamente vlido para los Endpoints con registros Even y
Odd BD disponibles.
259
3.4.18.2.4.
260
REGISTRO 18-4: UEPn: Registro De Control Del Endpoint n Del USB (UEP0 Hasta
UEP15)
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
EPSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL(1)
U-0
U-0
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 4
EPHSHK:
BIT 3
EPCONDIS:
BIT2
EPOUTEN:
BIT 1
EPINEN:
BIT 0
EPSTALL:
3.4.18.2.5.
El registro de direccin del USB contiene la nica direccin del USB que el
perifrico descifra cuando est activo. UADDR se pone a 00h cuando recibe un reset del
USB, indicado por URSTIF, o con un reset al microcontrolador. La direccin del USB
la tiene que escribir el microcontrolador durante la fase de setup del USB como parte
del firmware del USB de la ayuda de microchip.
3.4.18.2.6.
UFRML)
Los registros del nmero del frame contienen los 11bits del nmero del frame.
El byte de orden inferior est en UFRML, mientras que los tres bits de orden superior
permanecen en UFRMH. El par de registros se actualizan con el nmero de frame actual
cuando recibe un SOF. Para el microcontrolador, estos registros son slo de lectura. El
registro del nmero del frame se utiliza sobre todo para transferencias sncronas.
261
3.4.18.3.
Los datos del USB se mueven entre el ncleo del microcontrolador y el SIE a
travs de una memoria conocida como USB RAM. sta es una memoria de puerto dual
especial que est mapeada en la memoria normal de datos en los bancos de 4 a 7 (400h a
7FFh) para un total de 1kbyte.
El banco 4 (400h con 4FFh) se utiliza especficamente en el control del buffer
del Endpoint, mientras que los bancos de 5 a 7 estn disponibles para los datos del USB.
Dependiendo del tipo de buffer que se utilice, los 8 bytes del banco 4 pueden estar
disponibles para utilizarlos como buffer del USB.
Aunque la RAM del USB est disponible en el microcontrolador como memoria
de datos, las secciones que est modificando el SIE no las puede usar el
microcontrolador. Se utiliza un mecanismo de semforos para determinar el acceso a un
buffer en un momento dado.
FIGURA 18-5: Implementacin De La RAM Del USB En La Espacio De Memoria De
Datos
262
3.4.18.4.
Los registros del banco 4 se utilizan especficamente para el control del buffer
del Endpoint en una estructura conocida como Tabla del Buffer descriptor (BDT). Esto
proporciona un mtodo flexible a los usuarios para construir y para controlar los Buffers
del Endpoint de varias longitudes y configuraciones.
Los BDT se componen de los Buffers descriptores (BD) que se utilizan para
definir y controlar los Buffers reales del Espacio de la RAM del USB. Cada BD,
alternadamente, consiste en cuatro registros, donde n representa uno de los 64 BDs
posibles (gama de 0 a 63):
263
3.4.18.4.1.
264
originales del BD. El registro BDnSTAT lo actualiza el SIE con el PID; la cuenta de la
transferencia, BDnCNT, se actualiza tambin.
El byte BDnSTAT del BDT debe ser el ltimo byte que se actualice al
prepararse para armar un Endpoint. El SIE borrar el bit UOWN cuando se termine una
transaccin. La nica excepcin es cuando KEN y/o BSTALL estn permitidos.
No existe ningn mecanismo por hardware para bloquear el acceso cuando se
setea el bit UOWN. As, puede ocurrir un comportamiento inesperado si el
microcontrolador intenta modificar la memoria cuando el SIE lo posee.
Semejantemente, leyendo tal memoria se pueden obtener datos inexactos hasta que el
perifrico USB devuelve la propiedad al microcontrolador.
265
Configuracin
BDnSTAT
DTSEN
DTS
Protocolo
UOWN
TRNIF
DATA0
ACK
Actualizado
DATA1
ACK
No Actualizado
DATA0
ACK
Actualizado
DATA1
ACK
No Actualizado
Otro
ACK
Actualizado
NAK
No Actualizado
REGISTRO 18-5: BDnSTAT: Registro Del Estado Del Buffer Descriptor N (BD0STAT
Hasta BD63STAT), Modo CPU (Los Datos Se Escriben Al Lado)
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
UOWN(1)
DTS(2)
KEN
INCDIS
DTSEN
BSTALL
BC9
BC8
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
BIT 7
UOWN:
BIT 6
DTS:
BIT 5
KEN:
BIT 4
INCDIS:
266
BIT 3
DTSEN:
BIT 2
BSTALL:
BIT 1-0
BC9:BC8:
Nota 1: Este bit debe inicializarlo el usuario con el valor deseado antes de
permitir el mdulo USB.
2: Se ignora este bit a menos que DTSEN = 1.
267
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
UOWN
PID3
PID2
PID1
PID0
BC9
BC8
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
BIT 7
UOWN:
BIT 5-2
PID3:PID0:
BIT 1-0
BC9:BC8:
3.4.18.4.2.
Byte De Cuenta De BD
3.4.18.4.3.
Validacin De La Direccin De BD
268
3.4.18.4.4.
Buffering Ping-Pong
Un Endpoint se define para tener un Buffer ping-pong cuando tiene dos sistemas
de entradas de BD: un sistema para una transferencia par y otro para una transferencia
impar. Esto permite a la CPU procesar un BD mientras que el SIE procesa el otro BD.
El doble buffering BD, permite un rendimiento de procesamiento mximo del/al USB.
El mdulo USB apoya cuatro modos de operacin:
Ninguna ayuda del ping-pong
Ayuda del Buffer del ping-pong del OUT Endpoint 0 solamente
Ayuda del Buffer del ping-pong para todas los Endpoints
Ayuda del Buffer del ping-pong para el resto de los Endpoints excepto el 0
Los ajustes del Buffer ping-pong se configuran con los bits PPB1:PPB0 en el
registro UCFG.
El mdulo USB no pierde de vista el puntero ping-pong de cada Endpoint.
Todos los punteros estn reseteados inicialmente al BD par cuando se activa el mdulo.
Al terminar una transaccin (SIE borra UOWN), el puntero se une al BD impar. Al
terminar la transaccin siguiente, el puntero se une de nuevo al BD par y as
sucesivamente.
El estado par/impar de la transaccin realizada se almacena en el bit PBI del
registro USTAT. El usuario puede resetear todos los punteros ping-pong al par con el
bit PPBRST.
Cada BD tiene una relacin fija con un Endpoint particular, dependiendo de la
configuracin del buffering. Esta relacin significa tambin que pueden aparecer vacos
en las BDT si los Endpoints no se activan contiguamente. Esto significa en teora, que
los BDs de los Endpoints desactivados podan utilizarse como espacio de Buffer. En la
prctica, los usuarios deben evitar usar tales espacios en el BDT a menos que el mtodo
de validar direcciones de BD est en ejecucin.
269
FIGURA 18-7: Tablas Del Buffer Descriptor Mapeadas Para Los Modos De Los Buffer
270
Modo 1(Ping-Pong en
EP0 OUT)
Modo 3(Ping-Pong en
todos EPs, excepto EP0)
Out
In
Out
In
Out
In
Out
In
0(E), 1(O)
0(E), 1(O)
2(E), 3(O)
4(E), 5(O)
6(E), 7(O)
2(E), 3(O)
4(E), 5(O)
8(E), 9(O)
10(E),
11(O)
6(E), 7(O)
8(E), 9(O)
12(E), 13(O)
14(E),
15(O)
10(E),
11(O)
12(E),
13(O)
10
16(E), 17(O)
18(E),
19(O)
14(E),
15(O)
16(E),
17(O)
10
11
11
12
20(E), 21(O)
22(E),
23(O)
18(E),
19(O)
20(E),
21(O)
12
13
13
14
24(E), 25(O)
26(E),
27(O)
22(E),
23(O)
24(E),
25(O)
14
15
15
16
28(E), 29(O)
30(E),
31(O)
26(E),
27(O)
28(E),
29(O)
16
17
17
18
32(E), 33(O)
34(E),
35(O)
30(E),
31(O)
32(E),
33(O)
18
19
19
20
36(E), 37(O)
38(E),
39(O)
34(E),
35(O)
36(E),
37(O)
10
20
21
21
22
40(E), 41(O)
42(E),
43(O)
38(E),
39(O)
40(E),
41(O)
11
22
23
23
24
44(E), 45(O)
46(E),
47(O)
42(E),
43(O)
44(E),
45(O)
12
24
25
25
26
48(E), 49(O)
50(E),
51(O)
46(E),
47(O)
48(E),
49(O)
13
26
27
27
28
52(E), 53(O)
54(E),
55(O)
50(E),
51(O)
52(E),
53(O)
14
28
29
29
30
56(E), 57(O)
58(E),
59(O)
54(E),
55(O)
56(E),
57(O)
15
30
31
31
32
60(E), 61(O)
62(E),
63(O)
58(E),
59(O)
60(E),
61(O)
271
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
BDnSTAT(1)
UOWN
DTS(4)
PID3(2)
KEN(3)
PID2(2)
INCDIS(3)
PID1(2)
DTSEN(3)
PID0(2)
BSTALL(3)
BC9
BC8
BDnCNT(1)
Byte cuenta
BDnADRL(1)
BDnADRH(1)
3.4.18.5.
272
273
3.4.18.5.1.
El registro de estado de las interrupciones del USB contiene los flags para el
estado de cada fuente de interrupcin. Cada una de estas interrupciones tiene un bit de
permiso en el registro UIE correspondiente. Todos los flags de estado del USB se
suman para generar el flag de interrupcin USBIF para el tnel de interrupcin del
micro.
Una vez que el SIE active un bit de interrupcin, se tiene que borrar por software
escribiendo un 0. Los flags se pueden activar por software para ayudar en la bsqueda
de errores del firmware.
REGISTRO 18-7: UIR: Registro De Estado De Las Interrupciones Del USB
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SOFIF
STALLIF
IDLEIF(1)
TRNIF(2)
ACTVIF(3)
UERRIF(4)
URSTIF
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 6
SOFIF:
BIT 5
STALLIF:
BIT 4
IDLEIF:
BIT 3
TRNIF:
BIT 2
bus(3)
ACTVIF:
BIT 1
UERRIF:
BIT 0
URSTIF:
Nota 1: Una vez que se detecte un estado de reposo, el usuario puede colocar
al mdulo USB en este modo.
274
2: Borrar este bit har avanzar la USTAT FIFO (vlido solamente con los
smbolos IN, OUT y SETUP).
3: Este bit es desenmascarado al detectar un acontecimiento de
interrupcin UIDLE.
4: Solamente las condiciones de error permitidas a travs del registro
UEIE activarn este bit. Este bit es bit de estado y no lo puede modificar el usuario.
DONE:
BCF
UCON, SUSPND
BTFSS
BRA
BCF
BRA
UIR, ACTVIF
DONE
UIR, ACTVIF
LOOP
C:
UCONbits.SUSPND=0;
while (UIRbits.ACTVIF) {UIRbits.ACTVIF=0;}
3.4.18.5.2.
275
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SOFIE
STALLIE
IDLEIE
TRNIE
ACTVIE
UERRIE
URSTIE
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 6
SOFIE:
BIT 5
STALLIE:
BIT 4
IDLEIE:
BIT 3
TRNIE:
BIT 2
ACTVIE:
BIT 1
UERRIE:
BIT 0
URSTIE:
276
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
BTSEF
BTOEF
DFN8EF
CRC16EF
CRC5EF
PIDEF
R/C-0
U-0
U-0
R/C-0
R/C-0
R/C-0
R/C-0
R/C-0
BIT 7
BTSEF:
BIT 4
BTOEF:
BIT 3
DFN8EF:
BIT 2
CRC16EF:
BIT 1
CRC5EF:
BIT 0
PIDEF:
277
3.4.18.5.4.
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
BTSEE
BTOEE
DFN8EE
CRC16EE
CRC5EE
PIDEE
R/C-0
U-0
U-0
R/C-0
R/C-0
R/C-0
R/C-0
R/C-0
BIT 7
BTSEF:
BIT 4
BTOEF:
BIT 3
DFN8EF:
BIT 2
CRC16EF:
BIT 1
CRC5EF:
BIT 0
PIDEF:
278
3.4.18.6.
3.4.18.6.1.
3.4.18.6.2.
Slo Self-Power
3.4.18.6.3.
279
Nota: Los usuarios deben tener presente los lmites de energa del USB. Segn la
especificacin del USB 2.0, no puede exceder 100mA en un dispositivo de baja
potencia 500mA en uno de alta.
3.4.18.7.
El puerto paralelo (SPP) es una ruta alternativa de los datos adems de la RAM
del USB. Usando el SPP, un Endpoint se puede configurar para enviar o para recibir
datos directamente del hardware externo.
Este mtodo presenta posibilidades de diseo donde el microcontrolador acta
como encargado de los datos, permitiendo al SPP pasar bloques grandes de datos sin
que el micro regule lo que procesa realmente. Un ejemplo de aplicacin puede incluir
un sistema de adquisicin de datos, donde los datos fluyen de una FIFO externa a travs
del USB al ordenador. En este caso, el control del Endpoint lo realiza el
microcontrolador y los movimientos de datos en bruto se procesan externamente.
El SPP se permite como puerto de un Endpoint del USB a travs del BD
asociado al Endpoint. El Endpoint tiene que activarse de la siguiente manera:
1. Activar BDnADRL:BDnADRH direccionado a FFFFh.
2. Activar KEN (BDnSTAT<5>) par que el SIE controle el Buffer.
3. Activar INCDIS (BDnSTAT<4>) para inhabilitar el incremento de
direccin automtico.
Nota 1: Si un Endpoint se configura para utilizar el SPP, el mdulo SPP debe
configurarse para utilizar el mdulo USB. Si no, puede ocurrir una operacin
inesperada.
2: Adems, si un Endpoint se configura para utilizar el SPP, el tipo de
transferencia de datos de ese Endpoint debe ser sncrona.
3.4.18.8.
Oscilador
El mdulo USB necesita una seal especfica de reloj. En operaciones fullspeed, el reloj tiene que ser de 48MHz. El microcontrolador y los perifricos no tienen
porque tener la misma frecuencia de reloj o la misma fuente.
280
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
UCON
PPBRST
SE0
PKTDIS
USBEN
RESUME
SUSPND
UCFG
UTEYE
UOEMON
UPUEN
UTRDIS
FSEN
PPB1
PPB0
USTAT
ENDP3
ENDP2
ENDP1
ENDP0
DIR
PPBI
UADDR
ADDR6
ADDR5
ADDR4
ADDR3
ADDR2
ADDR1
ADDR0
UFRML
FRM7
FRM6
FRM5
FRM4
FRM3
FRM2
FRM1
FRM0
UFRMH
FRM10
FRM9
FRM8
UIR
SOFIF
STALLIF
IDLEIF
TRNIF
ACTVIF
UERRIF
URSTIF
UIE
SOFIE
STALLIE
IDLEIE
TRNIE
ACTVIE
UERRIE
URSTIE
UEIR
BTSEF
BTOEF
DFN8EF
CRC16EF
CRC5EF
PIDEF
UEIE
BTSEE
BTOEE
DFN8EE
CRC16EE
CRC5EE
PIDEE
UEP0
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP1
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP2
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP3
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP4
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP5
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP6
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP7
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP8
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP9
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP10
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP11
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP12
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP13
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP14
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
UEP15
EPHSHK
EPCONDIS
EPOUTEN
EPINEN
EPSTALL
281
3.4.18.9.
Esta seccin presenta algunos conceptos bsicos del USB e informacin til
necesaria para disear un dispositivo USB. As, se anima al lector que refiera a las
especificaciones del USB para ms informacin (www.usb.org). Si ests muy al
corriente de los detalles de USB, entonces sta seccin sirve como recuerdo bsico, de
alto nivel del USB.
3.4.18.9.1.
Esquema De Capas
282
3.4.18.9.2.
Frames
3.4.18.9.3.
Transferencias
3.4.18.9.4.
Energa
La energa se puede obtener del USB. Las especificaciones del USB definen los
requisitos de energa del bus. Los dispositivos pueden ser self-powered o alimentados
por bus. Los dispositivos Self-powered consiguen energa de una fuente externa,
mientras que los dispositivos alimentados por bus utilizan la energa del bus.
La especificacin del USB limita la energa tomada del bus. Cada dispositivo se
asegura 90mA y 5V (una unidad de carga). La energa adicional puede solicitarse, hasta
un mximo de 500mA. Observar que ceder ms energa que la de una unidad de carga
es una peticin y el anfitrin o el hub no tiene que proporcionarla obligatoriamente. As,
un dispositivo capaz de consumir ms de una unidad de carga debe ser capaz de
mantener una configuracin de baja potencia de una unidad carga o menos, en caso de
necesidad.
La especificacin del USB tambin define un modo de reposo. En esta situacin,
la corriente se debe limitar a 500A, sobre 1 segundo. Un dispositivo se debe incorporar
al estado de reposo despus de 3ms de inactividad (es decir, ningn smbolo SOF en
3ms). El entrar el dispositivo en el modo reposo debe caer la consumicin actual en los
10ms siguientes. Asimismo, al sealar un reinicio, el dispositivo debe sealarlo en los
10ms cediendo corriente.
283
3.4.18.9.5.
Enumeracin
3.4.18.9.6.
Descriptores
Hay ocho estndares del descriptor de cul cinco son los ms importantes para
este dispositivo.
Descriptor De La Configuracin
El descriptor de la configuracin proporciona la informacin de los requisitos de
energa del dispositivo y cuntos interfaces diferentes soporta cuando est en esta
configuracin. Puede haber ms de una configuracin del dispositivo (es decir,
configuraciones de baja potencia y de alta potencia).
Descriptor De La Interfaz
El descriptor de la interfaz detalla el nmero de Endpoints utilizados en esta
interfaz, as como la clase de la interfaz. Puede haber ms de una interfaz en la
configuracin.
284
Descriptor De La Secuencia
Muchos de los descriptores anteriores se refieren a uno o ms descriptores de la
secuencia. Los descriptores de la secuencia proporcionan informacin legible por un
humano sobre la capa que pueden describir. Estas secuencias muestran en el anfitrin
una ayuda para identificar el dispositivo. Los descriptores de la secuencia son
generalmente opcionales para ahorrar memoria y se codifican en formato unicode.
3.4.18.9.7.
3.4.18.9.8.
Las especificaciones del USB incluyen las especificaciones de clase que los
vendedores del sistema operativo apoyan opcionalmente. Los ejemplos de clases
incluyen el audio, memoria de masa, comunicaciones e interfaz humano (HID). En la
mayora de los casos, se requiere un driver en el lado del anfitrin para comunicarse con
el dispositivo USB. En aplicaciones de encargo, se puede necesitar un driver convertido.
Afortunadamente, los drivers estn disponibles para la mayora de los sistemas
anfitriones comunes para las clases ms comunes de los dispositivos. As, estos drivers
se pueden reutilizar.
285
3.4.19.
3.4.19.1.
286
3.4.19.1.1.
Permitir El SPP
Para permitir el SPP, activar el bit SPPEN (SPPCON<0>). Adems, los bits del
TRIS del SPP correspondientes los pines se deben configurar correctamente. El mnimo:
Bits TRISD<7:0> se deben activar (= 1)
Bits TRISE<2:1> se deben borrar (= 0)
Si se utiliza CK1SPP:
El bit TRISE<0> se debe borrar(= 0)
Si se utiliza CSPP:
El bit TRISB<4> se debe borrar (= 0)
REGISTRO 19-1: SPPCON: Registro De Control Del SPP
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SPPOWN
SPPEN
U-0
U-0
U-0
U-0
U-0
U-0
R/W-0
R/W-0
BIT2
EPOUTEN:
BIT1
SPPOWN:
BIT0
SPPEN:
287
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
CLKCFG1
CLKCFG0
CSEN
CLK1EN
WS3
WS2
WS1
WS0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7-6
CLKCFG1:CLKCFG0:
Bits de configuracin del reloj del SPP
1x= CLK1 cambia a lectura o escritura una direccin
impar de Endpoint; CLK2 cambia a lectura o escritura
una direccin par de Endpoint.
01= CLK1 cambia a escritura; CLK2 cambia a lectura
00= CLK1 cambia slo en la direccin del Endpoint de
escritura; CLK2 cambia en la lectura o escritura de
datos
CSEN:
Bit de permiso del pin selector del chip del SPP
1 = RB4 lo controla el mdulo SPP y funciona como
salida CS del SPP
0 = RB4 funciona como un puerto digital de E/S
CLK1EN:
Bit de permiso del pin del SPP CLK1
1 = RE0 lo controla el mdulo SPP y funciona como la
salida del SPP CLK1
0 = RE0 funciona como un puerto digital de E/S
WS3:WS0:
Bits de los estados espera del SPP
1111 = 30 estados de espera adicionales
1110 = 28 estados de espera adicionales
.
...
0001 = 2 estados de espera adicionales
0000 = 0 estados de espera adicionales
BIT 5
BIT 4
BIT 3-0
3.4.19.1.2.
Registro De Datos
288
CLK1 controla los datos en las direcciones impares mientras que CLK2
controla las de los pares.
Las opciones de control adicionales derivan inhabilitando las salidas CK1SPP y
CSSPP. Se permiten o inhabilitan con los bits CLK1EN y CSEN, respectivamente.
3.4.19.1.3.
Estados De Espera
3.4.19.1.4.
SPP Pull-Ups
Las lneas de datos del SPP (SPP<7:0>) se equipan con pull-ups internas para
aplicaciones que puedan salir del puerto en condiciones e alta impedancia. Los pull-ups
se permiten con el bit de control, RDPU (PORTE<7>).
FIGURA 19-2: Sincronizacin Para El Microcontrolador Escribe Direccin, Escribe
Datos Y Lee Datos (Ningn Estado De Espera)
289
FIGURA 19-4: Sincronizacin Para El USB Escribe Direccin Y Lee Datos (Estados
De Espera)
3.4.19.2.
Cuando el SPP se configura para operar como USB, los datos se pueden
controlar directamente a y desde el perifrico USB sin la intervencin del
microcontrolador; as, no requiere tiempo de procesado. Los datos se manejan a o hacia
fuera del SPP con la informacin del Endpoint (direccin) primero, seguido por uno o
ms bytes de datos. Esto es ideal en aplicaciones que requieren transmisin sncrona, de
gran capacidad. Los siguientes pasos se requieren para configurar el SPP para controlar
el USB:
1. Configurar el SPP segn lo deseado, incluyendo estados de espera y
relojes.
2. Activar el bit SPPOWN para la propiedad del USB.
3. Activar el descriptor del buffer que comienza la direccin
(BDnADRL:BDnADRH) a FFFFh.
4. Activar el bit KEN (BDnSTAT<5>) pero el buffer descriptor lo se
guarda indefinidamente el SIE.
290
3.4.19.3.
El SPP puede actuar como puerto paralelo del microcontrolador. En este modo,
el registro SPPEPS proporciona el estado y la direccin de control de escritura. Los
datos se escriben y se leen en el registro SPPDATA. Cuando el SPP lo gobierna el
microcontrolador, el reloj del SPP lo controla el reloj de instruccin (FOSC/4). Los pasos
siguientes se requieren para configurar el SPP para operacin del microcontrolador:
1. Configurar el SPP segn lo deseado, incluyendo estados de espera y
relojes.
2. Borrar el bit SPPOWN.
3. Activar SPPEN para permitir el mdulo.
3.4.19.3.1.
Interrupciones SPP
291
3.4.19.3.2.
Escribir El SPP
Una vez que est configurado, la escritura del SPP se realiza escribiendo los
registros SPPEPS y SPPDATA. Si el SPP se configura para registrar la direccin de los
Endpoint OUT con los datos, escribiendo el registro SPPEPS inicia el ciclo de escritura
en la direccin. Si no, la escritura comienza escribiendo los datos al registro SPPDATA.
El bit SPPBUSY indica el estado de la direccin y los datos de los ciclos de escritura.
Lo que sigue es un ejemplo de secuencia de escritura:
1. Escribir la direccin de 4 bits al registro SPPEPS. El SPP comienza
automticamente escribiendo la direccin. Si la escritura de la direccin no
se utiliza, vamos al paso 3.
2. Supervisar el bit SPPBUSY para determinar cuando se ha enviado la
direccin. La duracin depende en los estados de espera.
3. Escribir los datos al registro SPPDATA. El SPP comienza automticamente
a escribir los datos.
4. Supervisar el bit SPPBUSY para determinar cuando se han enviado los
datos. La duracin depende de los estados de espera.
5. Ir de nuevo a los pasos 1 3 para escribir una nueva direccin o datos.
Nota: Se debe comprobar el bit SPPBUSY para asegurarse de que las sucesivas
escrituras a los registros SPPEPS o SPPDATA no invadan el tiempo de espera debido al
ajuste del estado de espera.
3.4.19.3.3.
La lectura del SPP implica leer el registro SPPDATA. Leyendo el registro por
primera vez inicia la operacin de lectura. Cuando la lectura ha finalizado, se indica con
el bit SPPBUSY, el SPPDATA se habr cargado con los datos actuales.
Ejemplo de secuencia de lectura:
1. Escribir la direccin de 4bits al registro SPPEPS. El SPP comienza
automticamente escribiendo la direccin. Si la direccin escrita no se
usa saltemos al paso 3.
2. Supervisar el bit SPPBUSY para determinar cuando se ha enviado la
direccin. La duracin depende de los estados de espera.
3. Leer los datos del registro SPPDATA; se devuelven los datos de la
operacin de lectura anterior. El SPP comienza automticamente la
lectura para el prximo ciclo de lectura.
4. Supervisar el bit SPPBUSY para determinar cuando se han ledo los
datos. La duracin depende de los estados de espera.
5. Ir al paso 3 para leer el byte actual del SPP y empezar el siguiente ciclo
de lectura.
292
REGISTRO 19-3: SPPEPS: Direccin Del Endpoint Del SPP Y Registro De Estado
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RDSPP
WRSPP
SPPBUSY
ADDR3
ADDR2
ADDR1
ADDR0
R-0
R-0
U-0
R-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
BIT 6
BIT 4
BIT 3-0
RDSPP:
0001
0000 = Endpoint 0
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
SPPCON(3)
SPPOWN
SPPEN
SPPCFG(3)
CLKCFG1
CLKCFG0
CSEN
CLK1EN
WS3
WS2
WS1
WS0
SPPEPS(3)
RDSPP
WRSPP
SPPBUSY
ADDR3
ADDR2
ADDR1
ADDR0
SPPDATA(3)
DATA7
DATA6
DATA5
DATA4
DATA3
DATA2
DATA1
DATA0
PIR1
SPPIF(3)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
SPPIE(3)
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR1
SPPIP(3)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
PORTE
RDPU(3)
RE3(1,2)
RE2(3)
RE1(3)
RE0(3)
293
3.4.20.
(A/D)
294
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
CHS3
CHS2
CHS1
CHS0
GO/DONE*
ADON
U-0
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 5-2
CHS3:CHS0:
BIT 1
GO/DONE*:
BIT 0
ADON:
295
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
PCFG0
U-0
U-0
R/W-0
R/W-0
R/W-0(1)
R/W(1)
R/W(1)
R/W(1)
BIT 5
VCFG1:
BIT 4
BIT 3-0
PCFG3:
PCFG0
AN12
AN11
AN10
AN9
AN8
AN7(2)
AN6(2)
AN5(2)
AN4
AN3
AN2
AN1
AN0
0000(1)
0001
0010
0011
0100
0101
0110
(1)
0111
1000
1001
1010
1011
1100
1101
1110
1111
A= Entrada analgica
D= E/S digital
Nota 1: El valor de POR de los bits PCFG depende del valor del bit de
configuracin PBADEN. Cuando PBADEN=1, PCFG<3: 0>=0000; cuando
PBADEN=0, PCFG<3: 0>=0111.
2: AN5 con AN7 estn disponibles solamente en los dispositivos
40/44pines.
296
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
ADFM
ACQT2
ACQT1
ACQT0
ADCS2
ADCS1
ADCS0
R/W-0
U-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
BIT 5-3
BIT 2-0
ADFM:
297
298
comenzar. Se puede programar un periodo de adquisicin para que ocurra entre activar
el bit GO/DONE* y el comienzo real de la conversin.
Hay que seguir los siguientes pasos para realizar la conversin A/D:
1. Configurar el mdulo A/D:
Configura los pines analgicos, referencia de tensin y entrada-salida
digital (ADCON1)
Seleccionar el canal A/D de entrada (ADCON0)
Seleccionar el tiempo de adquisicin A/D (ADCON2)
Seleccionar el reloj e la conversin A/D (ADCON2)
Cambiar el mdulo A/D (ADCON0)
2. Configuran la interrupcin A/D (si se desea):
Borrar el bit ADIF
Activar el bit ADIE
Activar el bit GIE
3. Esperar el tiempo requerido de adquisicin (si procede).
4. Comienzo de la conversin:
Activar el bit GO/DONE* (registro ADCON0)
5. Esperar que termine la conversin A/D, por cualquiera:
La interrogacin del bit GO/DONE* para ver si est borrado
Esperar la interrupcin A/D
6. Leer los registros del resultado A/D (ADRESH:ADRESL); borrar el bit ADIF, si
procede.
7. Para la conversin siguiente, ir al paso 1 o al paso 2, al que se necesite. El
tiempo de la conversin A/D por bit es definido como TAD. Se necesita esperar
como mnimo 3TAD antes de comenzar la siguiente adquisicin.
FIGURA 20-2: Funcin De Transferencia A/D
299
3.4.20.1.
300
3.4.20.2.
Tiempo
301
3.4.20.3.
El tiempo A/D de conversin por bit se define como TAD. La conversin A/D
requiere 11 TAD para la conversin de 10 bits. La fuente de reloj A/D de la conversin
es seleccionable por software. Hay siete opciones posibles para el TAD:
2 TOSC
4 TOSC
8 TOSC
16 TOSC
32 TOSC
64 TOSC
Oscilador interno RC
Para las conversiones A/D correctas, el reloj de conversin A/D (TAD) debe ser
tan corto como sea posible pero mayor que un mnimo TAD (para ms informacin vase
el parmetro 130 en la tabla 28-29).
TABLA 20-1: TAD Vs. Frecuencias De Operacin De Los Dispositivos
Fuente del reloj AD (TAD)
Opcin
ADCS2:ADCS0
PIC18FXXXX
PIC18LFXXXX(4)
2 TOSC
000
2.86MHz
1.43MHz
4 TOSC
100
5.71MHz
2.86MHz
8 TOSC
001
11.43MHz
5.72MHz
16 TOSC
101
22.86MHz
11.43MHz
32 TOSC
010
45.71MHz
22.86MHz
64 TOSC
110
48.0MHz
45.71MHz
RC(3)
x11
1.00MHz(1)
1.00MHz(2)
302
3.4.20.4.
3.4.20.5.
Los registros ADCON1, TRISA, TRISB y TRISE configuran los pines de los
puertos A/D. Los pines tienen que estar como entradas analgicas, deben tener sus bits
correspondientes del TRIS activos (entrada). Si es el bit TRIS est borrado (salida), el
nivel de salida digital (VOH o VOL) se convertir.
La operacin A/D es independiente del estado de los bits CHS3:CHS0 y los bits
TRIS.
Nota 1: Al leer el registro PORT, todos los pines configurados como canales
de entrada analgica se leern como borrado (un nivel bajo). Los pines configurados
como entrada digital convertirn como entradas analgicas. Los niveles analgicos de la
entrada digital estarn bien convertidos.
2: Los niveles analgicos en cualquier pin definido como entrada digital
puede causar al buffer de entrada digital que consuma una corriente fuera de los lmites
de la especificacin de dispositivo.
3: El bit PBADEN en el registro de configuracin 3H configura los pines
de PORTB a resetar como pines analgicos o digitales dependiendo de como estn los
bits PCFG0 de ADCON1 despus el reset.
303
3.4.20.6.
Conversiones A/D
La figura 20-4 muestra la operacin del convertidor A/D despus de que se haya
activado el bit GO/DONE* y los bits ACQT2:ACQT0 se hayan borrado. Comienza una
conversin despus de que la siguiente instruccin permita la entrada en el modo sleep
antes de comenzar la conversin.
La figura 20-5 muestra la operacin del convertidor A/D despus de que se
hayan fijado los bits GO/DONE*, y ACQT2:ACQT0 a 010 y seleccionar el tiempo de
adquisicin a 4TAD antes del comienzo de la conversin.
Despejar el bit GO/DONE* durante una conversin aborta la conversin actual.
El par de registros del resultado A/D no se actualiza cuando termina una parte de la
conversin A/D. Esto significa que los registros ADRESH:ADRESL continuarn
conteniendo el valor de la conversin anterior (o el ltimo valor escrito en los registros
ADRESH:ADRESL).
Despus de que termine o se aborte la conversin A/D, se necesita esperar 2TAD
antes de que la adquisicin siguiente pueda comenzar. Despus de esta espera, la
adquisicin en el canal seleccionado se activa automticamente.
Nota: El bit de GO/DONE* no se debe activar dentro de la misma instruccin
que activa el A/D.
3.4.20.7.
Descarga
304
3.4.20.8.
Una conversin A/D puede empezar con el disparo de un evento especial del
mdulo CCP2. Esto requiere que los bits CCP2M3:CCP2M0 (CCP2CON<3:0>) se
programen como 1011 y que el mdulo A/D est activo (ADON est activo). Cuando
ocurre un disparo, el bit GO/DONE* se activar, empezando la adquisicin y
conversin A/D y el Timer1 (o Timer3) se resetea para repetir automticamente el
periodo de adquisicin A/D con el uso de un mnimo de software (mover
ADRESH:ADRESL a las localizaciones deseadas). Se tiene que seleccionar el canal de
entrada analgico apropiado y un tiempo de adquisicin mnimo elegido por el usuario
o un TACQ apropiado antes de que el disparo del evento especial active el bit
GO/DONE* (comience la conversin).
Si el mdulo A/D no est permitido (ADON est borrado), el disparo del evento
especial lo ignora el mdulo A/D pero resetear el contador Timer1 (o Timer3).
305
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
(4)
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
(4)
SPPIE
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
IPR1
SPPIP(4)
ADIP
RCIP
TXIP
SSPIP
CCP1IP
TMR2IP
TMR1IP
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
PIR1
SPPIF
ADRESH
ADRESL
ADCON0
CHS3
CHS2
CHS1
CHS0
GO/DONE*
ADON
ADCON1
VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
PCFG0
ADCON2
ADFM
ACQT2
ACQT1
ACQT0
ADCS2
ADCS1
ADCS0
PORTA
RA6(2)
RA5
RA4
RA3
RA2
RA1
RA0
TRISA5
TRISA4
TRISA3
TRISA2
TRISA1
TRISA0
TRISA
TRISA6
(2)
PORTB
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
TRISB
TRISB7
TRISB6
TRISB5
TRISB4
TRISB3
TRISB2
TRISB1
TRISB0
LATB
LATB7
LATB6
LATB5
LATB4
LATB3
LATB2
LATB1
LATB0
PORTE
(4)
(4)
TRISE
LATE
RDPU
(4)
(1,3)
RE2
(4)
RE1
(4)
RE0(4)
RE3
TRISE2
TRISE1
TRISE0
LATE2
LATE1
LATE0
306
3.4.21.
MDULO COMPARADOR
BIT 6
C1OUT
R-0
BIT 5
C2INV
R/W-0
BIT 7
C2OUT:
BIT 6
C1OUT:
BIT 5
C2INV:
BIT 4
C1INV:
BIT 3
CIS:
BIT 2-0
CM2:CM0:
BIT 4
C1INV
R/W-0
BIT 3
CIS
R/W-0
BIT 2
CM2
R/W-1
BIT 1
CM1
R/W-1
BIT 0
CM0
R/W-1
307
308
3.4.21.1.
Hay ocho modos de operacin para los comparadores. Los bits CM2:CM0 del
registro CMCON se utilizan para seleccionar estos modos. El registro TRISA controla
la direccin de los datos de los pines del comparador en cada modo. si cambia el modo
del comparador, el nivel de salida del comparador puede que no sea vlido para el modo
especificado de cambio de retraso.
Nota: Las interrupciones del comparador se tienen que desactivar durante el
cambio de modo del comparador. En otro caso, puede que ocurra una falsa interrupcin.
3.4.21.2.
3.4.21.3.
309
3.4.21.3.1.
3.4.21.3.2.
3.4.21.4.
3.4.21.5.
Las salidas del comparador se leen con el registro CMCON. Estos bits son
inalterables. Las salidas del comparador se pueden poner directamente a los pines RA4
y RA5 de E/S. Cuando est permitido, los multiplexores en la trayectoria de salida de
los pines RA4 y RA5 cambiar y la salida de cada pin no estar sincronizada con la del
comparador. La incertidumbre de cada uno de los comparadores se relaciona con la
tensin compensada de la entrada y el tiempo de reaccin dado en las especificaciones.
Los bits TRISA activarn/desactivarn la salida de los pines RA4 y RA5
mientras est en este modo.
La polaridad de las salidas del comparador se puede cambiar usando los bits
C2INV y C1INV (CMCON<5: 4>).
Nota 1: Al leer el registro PORT, todos los pines configurados como entradas
analgicas se leern 0. Los pines configurados como entradas digitales convertir una
entrada analgica segn las especificaciones de entrada del disparador Schmitt.
2: Los niveles analgicos de cualquier pin definidos como entrada digital
pueden hacer que el buffer de entrada consuma ms corriente que la que se especifica.
310
3.4.21.6.
311
3.4.21.7.
3.4.21.8.
Efectos De Un Reset
3.4.21.9.
Consideraciones
Analgicas
En
La
Conexin
De
Las
Entradas
Como los pines analgicos se conectan a una salida digital, hay diodos
polarizados inversamente a VDD y VSS. La entrada analgica, tiene que estar entre la
corriente de salida VSS y VDD. Si la tensin de entrada se desva de este rango ms de
0,6V en cualquier direccin, uno de los diodos se polariza directamente y ocurre una
condicin de lacth-up. Se recomienda una impedancia mxima de la fuente de 10k
para fuentes analgicas. Cualquier componente externo conectado a un pin de entrada
analgica, como un condensador o un diodo zener, debe tener muy poca prdida de
corriente.
FIGURA 21-4: Modelo De Entrada Del Comparador Analgico
312
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
CMCON
C2OUT
C1OUT
C2INV
C1INV
CIS
CM2
CM1
CM0
CVRCON
CVREN
CVROE
CVRR
CVRSS
CVR3
CVR2
CVR1
CVR0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
PORTA
RA6(1)
RA5
RA4
RA3
RA2
RA1
RA0
LATA
LATA6(1)
LATA5
LATA4
LATA3
LATA2
LATA1
LATA0
TRISA
TRISA6(1)
TRISA5
TRISA4
TRISA3
TRISA2
TRISA1
TRISA0
313
3.4.22.
3.4.22.1.
Configuracin Del Mdulo Comparador De Tensin De
Referencia
El mdulo comparador de tensin de referencia se controla con el registro
CVRCON. El comparador de tensin de referencia proporciona dos gamas de tensin de
salida, cada uno con 16 niveles distintos. La gama que se utiliza se selecciona con el bit
CVRR (CVRCON<5>). La diferencia primaria entre las gamas es el tamao de los
pasos seleccionados con los bits CVREF (CVR3:CVR0), con una gama de resolucin
ms fina. Las ecuaciones utilizadas para calcular la salida de referencia de la tensin del
comparador son:
Si CVRR=1:
CVREF=((CVR3:CVR0)/24)xCVRSRC
Si CVRR=0:
CVREF=(CVRSRC/4)+(((CVR3:CVR0)/32)xCVRSRC)
La tensin de la fuente de referencia del comparador puede venir de VDD y de
VSS, o de VREF+ externo y VREF- que se multiplexan con RA2 y RA3. La fuente de
tensin se selecciona con el bit CVRSS (CVRCON<4>).
Se tiene que considerar el periodo de configuracin de comparador de tensin de
referencia al cambiar la salida CVREF.
314
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
CVREN
CVROE(1)
CVRR
CVRSS
CVR3
CVR2
CVR1
CVR0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
BIT 7
CVREN:
BIT 6
CVROE:
BIT 5
CVRR:
BIT 4
CVRSS:
BIT 3-0
CVR3:CVR0:
315
3.4.22.2.
3.4.22.3.
3.4.22.4.
Efectos De Un Reset
316
3.4.22.5.
Consideraciones De La Conexin
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
CVRCON
CVREN
CVROE
CVRR
CVRSS
CVR3
CVR2
CVR1
CVR0
CMCON
C2OUT
C1OUT
C2INV
C1INV
CIS
CM2
CM1
CM0
TRISA
TRISA6(1)
TRISA5
TRISA4
TRISA3
TRISA2
TRISA1
TRISA0
317
3.4.23.
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
VDIRMAG
IRVST
HLVDEN
HLVDL3
HLVDL2
HLVDL1
HLVDL0
R/W-0
U-0
R/W-0
R/W-0
R/W-0
R/W-1
R/W-0
R/W-1
BIT 7
BIT 5
BIT 4
BIT 3-0
VDIRMAG:
318
3.4.23.1.
Operacin
319
FIGURA 23-1: Diagrama De Bloques Del Mdulo HLVD (Con Entrada Externa)
3.4.23.2.
320
3.4.23.3.
Consumicin De Corriente
3.4.23.4.
321
3.4.23.5.
Aplicaciones
322
3.4.23.6.
3.4.23.7.
Efectos De Un Reset
Un reset del dispositivo fuerza a los registros a su estado de reset. Esto provoca
que el mdulo HLVD se apague.
TABLA 23-1: Registros Asociados Al Mdulo Detector De Alta/Baja Tensin
Nombre
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
HLVDCON
VDIRMAG
IRVST
HLVDEN
HLVDL3
HLVDL2
HLVDL1
HLVDL0
INTCON
GIE/GIEH
PEIE/GIEL
TMR0IE
INT0IE
RBIE
TMR0IF
INT0IF
RBIF
PIR2
OSCFIF
CMIF
USBIF
EEIF
BCLIF
HLVDIF
TMR3IF
CCP2IF
PIE2
OSCFIE
CMIE
USBIE
EEIE
BCLIE
HLVDIE
TMR3IE
CCP2IE
IPR2
OSCFIP
CMIP
USBIP
EEIP
BCLIP
HLVDIP
TMR3IP
CCP2IP
323
3.4.24.
324
3.4.24.1.
Bits De Configuracin
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Valor por
defecto
300000h
CONFIG1L
USBDIV
CPUDIV1
CPUDIV0
PLLDIV2
PLLDIV1
PLLDIV0
--000000
300001h
CONFIG1H
IESO
FCMEN
FOSC3
FOSC2
FOSC1
FOSC0
00--0101
300002h
CONFIG2L
VREGEN
BORV1
BORV0
BOREN1
BOREN0
PWRTEN*
--011111
300003h
CONFIG2H
WDTPS3
WDTPS2
WDTPS1
WDTPS0
WDTEN
---11111
300005h
CONFIG3H
MCLRE
LPT1OSC
PBADEN
CCP2MX
1----011
300006h
CONFIG4L
DEBUG*
XINST
ICPRT(3)
LVP
STVREN
100--1-1
300008h
CONFIG5L
CP3(1)
CP2
CP1
CP0
----1111
300009h
CONFIG5H
CPD
CPB
11-----
30000Ah
CONFIG6L
WRT3(1)
WRT2
WRT1
WRT0
----1111
30000Bh
CONFIG6H
WRTD
WRTB
WRTC
111----
30000Ch
CONFIG7L
EBTR3(1)
EBTR2
EBTR1
EBTR0
----1111
30000Dh
CONFIG7H
EBTRB
-1-----
3FFFFEh
DEVID1
DEV2
DEV1
DEV0
REV4
REV3
REV2
REV1
REV0
xxxxxxxx(2)
3FFFFFh
DEVID2
DEV10
DEV9
DEV8
DEV7
DEV6
DEV5
DEV4
DEV3
00010010(2)
325
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
USBDIV
CPUDIV1
CPUDIV0
PLLDIV2
PLLDIV1
PPDIV0
U-0
U-0
U-0
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
BIT 5
BIT 4-3
BIT 2-0
USBDIV:
326
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
IESO
FCMEN
FOSC3(1)
FOSC2(1)
FOSC1(1)
FOSC0(1)
R/P-0
R/P-0
U-0
U-0
R/P-0
R/P-1
R/P-0
R/P-1
BIT 7
BIT 6
BIT 3-0
IESO:
327
(ECPIO)
0101= Oscilador EC, CLKO en RA6 (EC)
0100 = Oscilador EC, puerto en RA6 (ECIO)
001x= oscilador XT, PLL permitido (XTPLL)
000x = oscilador de XT (XT)
Nota 1: El microcontrolador y el mdulo USB utilizan el oscilador seleccionado
como su fuente del reloj en los modos XT, HS y EC. El mdulo USB utiliza el oscilador
indicado XT, HS o EC como su fuente del reloj siempre que el microcontrolador utilice
el oscilador interno.
REGISTRO 24-3: CONFIG2L: Registro De Configuracin Bajo (Direccin Del Byte
300002h)
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
VREGEN
BORV1
BIRV0
BOREN1(1)
BOREN1(1)
PWRTEN*(1)
U-0
U-0
R/P-0-0
R/P-1
R/P-1
R/P-1
R/P-1
R/P-1
BIT5
BIT 4-3
BIT 2-1
BIT 0
VREGEN:
328
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
USBDIV
CPUDIV1
CPUDIV0
PLLDIV2
PLLDIV1
PPDIV0
U-0
U-0
U-0
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
BIT 4-1
BIT 0
329
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
MCLRE
LPT1OSC
PBADEN
CCP2MX
R/P-1
U-0
U-0
U-0
U-0
R/P-0
R/P-1
R/P-1
BIT 7
MCLRE:
BIT 2
LPT1OSC:
BIT 1
PBADEN:
BIT 0
CCP2MX:
330
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
DEBUG*
XINST
ICPRT(1)
LVP
STVREN
R/P-1
R/P-0
R/P-0
U-0
U-0
R/P-1
U-0
R/P-1
BIT 7
DEBUG*:
BIT 6
XINST:
BIT 5
ICPRT:
BIT 2
LVP:
BIT 0
STVREN:
331
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
CP3(1)
CP2
CP1
CP0
U-0
U-0
U-0
U-0
R/C-1
R/C-1
R/C-1
R/C-1
BIT 3
CP3:
BIT 2
CP2:
BIT 1
CP1:
BIT 0
CP0:
332
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
CPD
CP8
R/C-1
R/C-1
U-0
U-0
U-0
U-0
U-0
U-0
BIT 7
CPD:
BIT 6
CPB:
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
WRT3(1)
WRT2
WRT1
WRT0
U-0
U-0
U-0
U-0
R/C-1
R/C-1
R/C-1
R/C-1
BIT 3
WRT3:
BIT 2
WRT2:
BIT 1
WRT1:
BIT 0
WRT0:
333
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
WRTD
WRTB
WRTC(1)
R/C-1
R/C-1
R/C-1
U-0
U-0
U-0
U-0
U-0
BIT 7
WRTD:
BIT 6
WRTB:
BIT 5
WRTC:
334
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
EBTR3(1)
EBTR2
EBTR1
EBTR0
U-0
U-0
U-0
U-0
R/C-1
R/C-1
R/C-1
R/C-1
BIT 3
EBTR3:
BIT 2
EBTR2:
BIT 1
EBTR1:
BIT 0
EBTR0:
335
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
EBTRB
U-0
R/C-1
U-0
U-0
U-0
U-0
U-0
U-0
BIT 6
EBTRB:
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
DEV2
DEV1
DEV0
REV4
REV3
REV2
REV1
REV0
BIT 7-5
DEV2:DEV0:
BIT 4-0
REV3:REV0:
336
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
DEV10(1)
DEV9(1)
DEV8(1)
DEV7(1)
DEV6(1)
DEV5(1)
DEV4(1)
DEV3(1)
BIT 7-0
3.4.24.2.
337
3.4.24.2.1.
Registro De Control
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SWDTEN(1)
U-0
U-0
U-0
U-0
U-0
U-0
U-0
R/W-0
BIT 0
SWDTEN:
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
RCON
IPEN
SBOREN(1)
RI*
TO*
PD*
POR*
BOR*
WDTCON
SWDTEN
338
3.4.24.3.
339
3.4.24.4.
340
3.4.24.4.1.
Los FSCM y los WDT se controlan con el Oscilador INTRC. Puesto que el
WDT funciona con el divisor separado y el contador, inhabilitar el WDT no tiene
ningn efecto sobre el oscilador INTRC cuando se activa el FSCM.
Segn lo observado ya, la fuente de reloj se cambia al Reloj INTOSC cuando se
detecta un fallo. Dependiendo de la frecuencia seleccionada por los bits IRCF2:IRCF0,
puede significar un cambio substancial en la velocidad de ejecucin del cdigo. Si se
permite el WDT con un valor pequeo de prescaler, disminuye la velocidad del reloj y
permite que ocurra un desbordamiento del WDT y su correspondiente reset del
dispositivo. Por esta razn, los acontecimientos del monitor de reloj a prueba de fallos
tambin resetean el WDT y el postscaler, permitiendo comenzar la sincronizacin del
cambio de la velocidad de ejecucin y disminuyendo la probabilidad de un
desbordamiento errneo.
3.4.24.4.2.
341
monitor de reloj a prueba de fallos entonces reanuda la supervisin del reloj del
perifrico.
La fuente primaria de reloj puede que no llegue a estar lista en el inicio. En este
caso, la operacin se controla con el multiplexor INTOSC. El registro OSCCON seguir
en reset hasta que entre en un modo de ahorro de energa.
FIGURA 24-4: Diagrama De Tiempos Del FSCM
3.4.24.4.4.
342
3.4.24.5.
343
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
300008h
CONFIG5L
CP3(1)
CP2
CP1
CP0
300009h
CONFIG5H
CPD
CPB
30000Ah
CONFIG6L
WRT3(1)
WRT2
WRT1
WRT0
30000Bh
CONFIG6H
WRTD
WRTB
WRTC
30000Ch
CONFIG7L
EBTR3(1)
EBTR2
EBTR1
EBTR0
30000Dh
CONFIG7H
EBTRB
344
3.4.24.5.1.
345
346
3.4.24.5.2.
Los datos EEPROM se protegen contra lecturas y escrituras externas con dos
bits: CPD y WRTD. CPD inhibe lecturas y escrituras externas en los datos EEPROM. Y
WRTD inhibe escrituras internas y externas en los datos EEPROM. La CPU puede
continuar leyendo y escribiendo datos en la EEPROM sin importar el ajuste de los bits
de proteccin.
3.4.24.5.3.
3.4.24.6.
Localizaciones De Identificacin
3.4.24.7.
3.4.24.8.
Depuracin In-Circuit
347
RB6, RB7
Pila:
2 niveles
Memoria de programa:
512 bytes
Memoria de datos:
10 bytes
3.4.24.9.
Caractersticas Especiales De Icport (Sealando Paquetes
Solamente)
Bajo circunstancias especficas, los pines que no se conectan (NC) de los
dispositivos PIC18F4455/4550 de 44pines en encapsulado TQFP pueden proporcionar
funcionalidad adicional. stas caractersticas se controlan con los bits de configuracin
del dispositivo y estn disponibles solamente en este tipo de encapsulado y nmero de
pines.
3.4.24.9.1.
Los dispositivos de 44pines con encapsulado TQFP pueden utilizar los pines NC
para proporcionar un puerto alterno para depuracin In-Circuit (ICD) y la programacin
serie In-Circuit (ICSP). Estos pines se conocen como el puerto dedicado ICSP/ICD,
puesto que no comparten ninguna otra funcin del dispositivo.
Cuando se implementa, el puerto dedicado activa tres pines NC para
proporcionar un reset del dispositivo, datos y puertos del reloj alternos. Ningunos de
estos puertos se solapan con los pines estndares de E/S, poniendo los pines de E/S a
disposicin de la aplicacin del usuario.
El puerto dedicado ICSP/ICD se permite activando el bit de configuracin
ICPRT. El puerto funciona de la misma manera que el puerto de herencia ICSP/ICD en
RB6/RB7.
Aun cuando el puerto dedicado est permitido, el ICSP y las funciones de ICD
siguen funcionando en el puerto de herencia. Cuando se detecta VIH en el pin
MCLR*/VPP/RE3, el estado de ICRST/ICVPP se ignora.
Nota 1: El bit de configuracin ICPRT puede estar programado con puerto
ICSP por defecto.
2: El bit de configuracin ICPRT debe mantenerse borrado en los
dispositivos de 28pines y 40pines; si no, pueden ocurrir operaciones inesperadas.
348
3.4.24.9.2.
Tipo
de pin
Funcin del
pin
NC/ICRST*/
ICVPP
Energa
Reset del
dispositivo y
permiso de
programacin
RB6/KBI2/
PGC
NC/ICCK/
ICPGC
Entrada
Reloj serie
RB7/KBI3/
PGD
NC/ICDT/
ICPGD
E/S
Datos serie
Puerto
herencia
Puerto
dedicado
MCLR*/VPP/
RE3
Emulacin De 28 Pines
3.4.24.10.
349
350
3.5.
Los fuses son los variables que hay que configurar dependiendo de la aplicacin.
Existe el fuse del oscilador, de los prescaler
3.5.1.
PIC18F2455
3.5.1.1.
3.5.1.2.
PLLDIV = 2
PLLDIV = 3
PLLDIV = 4
PLLDIV = 5
PLLDIV = 6
PLLDIV = 10
PLLDIV = 12
CPUDIV = OSC1_PLL2
CPUDIV = OSC2_PLL3
CPUDIV = OSC3_PLL4
CPUDIV = OSC4_PLL6
3.5.1.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)
USBDIV = 1
USBDIV = 2
351
3.5.1.4.
FOSC = XT_XT
FOSC = XTPLL_XT
FOSC = ECIO_EC
FOSC = EC_EC
FOSC = ECPLLIO_EC
Reloj externo, PLL activo, funciona como puerto RA6, EC usado por USB
FOSC = ECPLL_EC
FOSC = INTOSCIO_EC
FOSC = INTOSC_EC
FOSC = INTOSC_XT
FOSC = INTOSC_HS
FOSC = HS
FOSC = HSPLL_HS
3.5.1.5.
3.5.1.6.
3.5.1.7.
FCMEM = ON
IESO = ON
PWRT activo
PWRT = OFF
PWRT desactivado
352
3.5.1.8.
BOR = ON_ACTIVE
BOR = ON
3.5.1.9.
Configuracin mxima
BORV = 1
BORV = 2
BORV = 3
3.5.1.10.
3.5.1.11.
Configuracin mnima
VREGEN = ON
HW Desactivado - SW Controlado
WDT = ON
HW Activo - SW Desactivado
353
3.5.1.12.
3.5.1.13.
3.5.1.14.
1:1
WDTPS = 2
1:2
WDTPS = 4
1:4
WDTPS = 8
1:8
WDTPS = 16
1:16
WDTPS = 32
1:32
WDTPS = 64
1:64
WDTPS = 128
1:128
WDTPS = 256
1:256
WDTPS = 512
1:512
WDTPS = 1024
1:1024
WDTPS = 2048
1:2048
WDTPS = 4096
1:4096
WDTPS = 8192
1:8192
WDTPS = 16384
1:16384
WDTPS = 32768
1:32768
MCLRE = ON
LPT1OSC = ON
354
3.5.1.15.
3.5.1.16.
3.5.1.17.
3.5.1.18.
3.5.1.19.
3.5.1.20.
PBADEN = ON
CCP2MX = ON
STVREN = ON
ICSP desactivado
LVP = ON
ICSP activo
XINST = ON
DEBUG = ON
DEBUG = OFF
355
3.5.1.21.
3.5.1.22.
3.5.1.23.
3.5.1.24.
3.5.1.25.
3.5.1.26.
3.5.1.27.
CP0 = OFF
Bloque 0 (000800-001FFFh)
CP1 = OFF
CP2 = OFF
CPB = OFF
CPD = OFF
WRT0 = OFF
WRT1 = OFF
356
3.5.1.28.
3.5.1.29.
WRT2 = OFF
WRTC = OFF
3.5.1.30.
Bits De Proteccin Contra Escritura En Los Registros De
Configuracin:
3.5.1.31.
Datos:
3.5.1.32.
3.5.1.33.
WRTB = ON
WRTB = OFF
WRTD = OFF
EBTR0 = OFF
EBTR1 = OFF
357
3.5.1.34.
3.5.1.35.
Inicio:
3.5.2.
EBTR2 = OFF
EBTRB = OFF
PIC18F2550
3.5.2.1.
3.5.2.2.
PLLDIV = 2
PLLDIV = 3
PLLDIV = 4
PLLDIV = 5
PLLDIV = 6
PLLDIV = 10
PLLDIV = 12
CPUDIV = OSC1_PLL2
CPUDIV = OSC2_PLL3
CPUDIV = OSC3_PLL4
CPUDIV = OSC4_PLL6
358
3.5.2.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)
3.5.2.4.
USBDIV = 1
USBDIV = 2
FOSC = ECPLLIO_EC
FOSC = ECPLL_EC
FOSC = INTOSCIO_EC
FOSC = INTOSC_EC
FOSC = INTOSC_XT
FOSC = INTOSC_HS
FOSC = HS
FOSC = HSPLL_HS
3.5.2.5.
3.5.2.6.
FCMEM = ON
IESO = ON
359
3.5.2.7.
3.5.2.8.
PWRT = ON
PWRT activo
PWRT = OFF
PWRT desactivado
3.5.2.9.
Configuracin mxima
BORV = 1
BORV = 2
BORV = 3
3.5.2.10.
3.5.2.11.
Configuracin mnima
VREGEN = ON
HW Desactivado - SW Controlado
WDT = ON
HW Activo - SW Desactivado
360
3.5.2.12.
3.5.2.13.
3.5.2.14.
1:1
WDTPS = 2
1:2
WDTPS = 4
1:4
WDTPS = 8
1:8
WDTPS = 16
1:16
WDTPS = 32
1:32
WDTPS = 64
1:64
WDTPS = 128
1:128
WDTPS = 256
1:256
WDTPS = 512
1:512
WDTPS = 1024
1:1024
WDTPS = 2048
1:2048
WDTPS = 4096
1:4096
WDTPS = 8192
1:8192
WDTPS = 16384
1:16384
WDTPS = 32768
1:32768
MCLRE = ON
LPT1OSC = ON
361
3.5.2.15.
3.5.2.16.
3.5.2.17.
3.5.2.18.
3.5.2.19.
3.5.2.20.
3.5.2.21.
PBADEN = ON
CCP2MX = ON
STVREN = ON
ICSP desactivado
LVP = ON
ICSP activo
XINST = ON
DEBUG = OFF
CP0 = OFF
362
3.5.2.22.
3.5.2.23.
3.5.2.24.
3.5.2.25.
3.5.2.26.
3.5.2.27.
3.5.2.28.
CP1 = OFF
CP2 = OFF
CP3 = OFF
CPB = OFF
CPD = OFF
WRT0 = OFF
WRT1 = OFF
363
3.5.2.29.
3.5.2.30.
3.5.2.31.
WRT2 = OFF
WRT3 = OFF
WRTB = OFF
3.5.2.32.
Bits De Proteccin Contra Escritura En Los Registros De
Configuracin:
3.5.2.33.
Datos:
3.5.2.34.
WRTC = ON
WRTC = OFF
WRTD = OFF
EBTR0 = OFF
364
3.5.2.35.
3.5.2.36.
3.5.2.37.
3.5.2.38.
Inicio:
EBTR1 = OFF
EBTR2 = OFF
EBTR3 = OFF
EBTRB = OFF
365
3.5.3.
PIC18F4455
3.5.3.1.
3.5.3.2.
PLLDIV = 2
PLLDIV = 3
PLLDIV = 4
PLLDIV = 5
PLLDIV = 6
PLLDIV = 10
PLLDIV = 12
CPUDIV = OSC1_PLL2
CPUDIV = OSC2_PLL3
CPUDIV = OSC3_PLL4
CPUDIV = OSC4_PLL6
3.5.3.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)
USBDIV = 1
USBDIV = 2
366
3.5.3.4.
FOSC = ECPLLIO_EC
FOSC = ECPLL_EC
FOSC = INTOSCIO_EC
FOSC = INTOSC_EC
FOSC = INTOSC_XT
FOSC = INTOSC_HS
FOSC = HS
FOSC = HSPLL_HS
3.5.3.5.
3.5.3.6.
3.5.3.7.
FCMEM = ON
IESO = ON
PWRT activo
PWRT = OFF
PWRT desactivado
367
3.5.3.8.
3.5.3.9.
Configuracin mxima
BORV = 1
BORV = 2
BORV = 3
3.5.3.10.
3.5.3.11.
Configuracin mnima
VREGEN = ON
HW Desactivado - SW Controlado
WDT = ON
HW Activo - SW Desactivado
368
3.5.3.12.
3.5.3.13.
3.5.3.14.
1:1
WDTPS = 2
1:2
WDTPS = 4
1:4
WDTPS = 8
1:8
WDTPS = 16
1:16
WDTPS = 32
1:32
WDTPS = 64
1:64
WDTPS = 128
1:128
WDTPS = 256
1:256
WDTPS = 512
1:512
WDTPS = 1024
1:1024
WDTPS = 2048
1:2048
WDTPS = 4096
1:4096
WDTPS = 8192
1:8192
WDTPS = 16384
1:16384
WDTPS = 32768
1:32768
MCLRE = ON
LPT1OSC = ON
369
3.5.3.15.
3.5.3.16.
PBADEN = ON
CCP2MX = OFF
CCP2MX = ON
3.5.3.17.
3.5.3.18.
STVREN = ON
ICSP desactivado
LVP = ON
ICSP activo
3.5.3.19.
Bit De Permiso
Programacin (ICPORT):
3.5.3.20.
3.5.3.21.
Del
Debug
En-Circuito/Puerto
ICPRT = OFF
ICPORT desactivado
ICPRT = ON
ICPORT activo
De
XINST = ON
DEBUG = OFF
370
3.5.3.22.
3.5.3.23.
3.5.3.24.
3.5.3.25.
3.5.3.26.
3.5.3.27.
3.5.3.28.
CP0 = OFF
CP1 = OFF
CP2 = OFF
CPB = OFF
CPD = OFF
WRT0 = OFF
WRT1 = OFF
371
3.5.3.29.
3.5.3.30.
WRT2 = OFF
WRTB = OFF
3.5.3.31.
Bits De Proteccin Contra Escritura En Los Registros De
Configuracin:
3.5.3.32.
Datos:
3.5.3.33.
3.5.3.34.
WRTC = ON
WRTC = OFF
WRTD = OFF
EBTR0 = OFF
EBTR1 = OFF
372
3.5.3.35.
3.5.3.36.
Inicio:
3.5.4.
EBTR2 = OFF
EBTRB = OFF
PIC18F4550
3.5.4.1.
3.5.4.2.
PLLDIV = 2
PLLDIV = 3
PLLDIV = 4
PLLDIV = 5
PLLDIV = 6
PLLDIV = 10
PLLDIV = 12
CPUDIV = OSC1_PLL2
CPUDIV = OSC2_PLL3
CPUDIV = OSC3_PLL4
CPUDIV = OSC4_PLL6
373
3.5.4.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)
3.5.4.4.
USBDIV = 1
USBDIV = 2
FOSC = ECPLLIO_EC
FOSC = ECPLL_EC
FOSC = INTOSCIO_EC
FOSC = INTOSC_EC
FOSC = INTOSC_XT
FOSC = INTOSC_HS
FOSC = HS
FOSC = HSPLL_HS
3.5.4.5.
3.5.4.6.
FCMEM = ON
IESO = ON
374
3.5.4.7.
3.5.4.8.
PWRT = ON
PWRT activo
PWRT = OFF
PWRT desactivado
3.5.4.9.
Configuracin mxima
BORV = 1
BORV = 2
BORV = 3
3.5.4.10.
3.5.4.11.
Configuracin mnima
VREGEN = ON
HW Desactivado - SW Controlado
WDT = ON
HW Activo - SW Desactivado
375
3.5.4.12.
3.5.4.13.
3.5.4.14.
1:1
WDTPS = 2
1:2
WDTPS = 4
1:4
WDTPS = 8
1:8
WDTPS = 16
1:16
WDTPS = 32
1:32
WDTPS = 64
1:64
WDTPS = 128
1:128
WDTPS = 256
1:256
WDTPS = 512
1:512
WDTPS = 1024
1:1024
WDTPS = 2048
1:2048
WDTPS = 4096
1:4096
WDTPS = 8192
1:8192
WDTPS = 16384
1:16384
WDTPS = 32768
1:32768
MCLRE = ON
LPT1OSC = ON
376
3.5.4.15.
3.5.4.16.
3.5.4.17.
3.5.4.18.
PBADEN = ON
CCP2MX = ON
STVREN = ON
ICSP desactivado
LVP = ON
ICSP activo
3.5.4.19.
Bit De Permiso
Programacin (ICPORT):
3.5.4.20.
3.5.4.21.
Del
Debug
En-Circuito/Puerto
ICPRT = OFF
ICPORT desactivado
ICPRT = ON
ICPORT activo
De
XINST = ON
DEBUG = OFF
377
3.5.4.22.
3.5.4.23.
3.5.4.24.
3.5.4.25.
3.5.4.26.
3.5.4.27.
3.5.4.28.
CP0 = OFF
CP1 = OFF
CP2 = OFF
CP3 = OFF
CPB = OFF
CPD = OFF
WRT0 = OFF
378
3.5.4.29.
3.5.4.30.
3.5.4.31.
3.5.4.32.
WRT1 = OFF
WRT2 = OFF
WRT3 = OFF
WRTC = OFF
3.5.4.33.
Bits De Proteccin Contra Escritura En Los Registros De
Configuracin:
3.5.4.34.
Datos:
WRTB = ON
WRTB = OFF
WRTD = ON
WRTD = OFF
379
3.5.4.35.
3.5.4.36.
3.5.4.37.
3.5.4.38.
3.5.4.39.
Inicio:
EBTR0 = OFF
EBTR1 = OFF
EBTR2 = OFF
EBTR3 = OFF
EBTRB = OFF
380
4. LENGUAJE DE PROGRAMACIN
C18
383
4.
4.1.
INTRODUCCIN
El lenguaje C fue creado en los aos 70 para escribir el cdigo del sistema
operativo UNIX. Tanto por su origen como por sus caractersticas, es un lenguaje muy
adecuado para la programacin de sistemas, ya que combina la abstraccin de los
lenguajes de alto nivel con la eficiencia del lenguaje mquina.
La amplia utilizacin de C para distintos tipos de computadores ocasion
muchas variantes. stas eran similares, pero a menudo incompatibles, lo que se volvi
un problema serio para los desarrolladores que necesitaban escribir programas que se
ejecutaran en distintas plataformas. Entonces, se hizo evidente la necesidad de una
versin estndar de C. En 1983, se cre el comit tcnico X3J11 bajo la supervisin de
American National Standards Comitte on Computer and Information Processing (X3),
para proporcionar una definicin del lenguaje clara e independiente de la
computadora. En 1989, el estndar fue aprobado. ANSI cooper con la International
Organization for Standardization (ISO) para estandarizar C a nivel mundial; el
documento conjunto del estndar se public en 1990 y se conoce como
ANSI/ISO9899:1990 o ANSI C.
Entre las caractersticas de este lenguaje cabe citar que es altamente portable, es
muy flexible, genera cdigo muy eficiente y permite escribir cdigo muy compacto (se
pueden realizar muchas funciones escribiendo pocas lneas de cdigo).
El C18 es una versin del C creada especficamente para los microcontroladores
PIC18, que por sus caractersticas resulta demasiado complicado la programacin en su
lenguaje de bajo nivel, el Assambler.
4.2.
4.2.1.
Optimizacin multinivel.
Acceso transparente en la lectura/escritura de la memoria.
Versin estudiante gratuita.
En este manual, aparecen en verde y con tipo de letra Comic Sans MS el
cdigo fuente y en verde con tipo de letra Times New Roman las notas del cdigo.
4.2.2.
TIPOS DE DATOS
4.2.2.1.
4.2.2.2.
Enteros
Tipo
Tamao
Mnimo
Mximo
Char
8 bits
-128
127
Signedchar
8 bits
-128
127
Unsigned char
8 bits
255
Int
16 bits
-32768
32767
Unsigned Int
16 bits
65535
Short
16 bits
-32768
32767
Unsigned Short
16 bits
65535
Short long
24 bits
-8.388.608
8.388.607
24 bits
16.777.215
Long
32 bits
-2.147.483.648
2.147.483.647
Unsigned long
32 bits
4.294.967.295
Reales
Tipo
Tamao
Exponente Mnimo
Exponente Mximo
Float
32 bits
-126
128
Double
32 bits
-126
128
384
4.2.2.3.
Estructuras
4.2.2.4.
Almacenamiento
385
Static:
9 Variables locales que retiene su valor al salir de la funcin en la
que se ha declarado.
9 Se inicializan a cero.
9 Ahorra nmero de instrucciones para acceder a las variables.
Typedef:
9 Asigna un nuevo nombre a un tipo de datos.
Overlay:
9 Declara las variables locales Static pero se inicializan cada vez
que se llama la funcin.
9 Ahorra espacio de memoria.
4.2.2.5.
Calificadores
Const: Definicin de una constante.
Volatile: El contenido de la variable puede cambiar.
Far: Los datos se encuentran en un banco lejano, hay que cambiar de
banco o de acceso indirecto para acceder a la variable. Si se declara
cdigo, podemos acceder a objetos por encima de 64KB.
Near: La variable se declara en el banco de acceso. Si se declara cdigo,
accedemos a una zona inferior de 64KB.
RAM: La variable se sita en la memoria de datos.
ROM: La variable se sita en la memoria de programa.
4.2.3.
ESTRUCTURAS DE CONTROL
4.2.3.1.
Repetitivas
4.2.3.1.1.
Sentencia While
386
4.2.3.1.2.
Sentencia Do
4.2.3.1.3.
Sentencia For
4.2.3.1.4.
Sentencia If
4.2.3.1.5.
Sentencia If-Else
387
4.2.3.1.6.
Sentencia Switch
4.2.3.1.7.
Sentencia Break
4.2.3.1.8.
Sentencia Continue
4.2.3.1.9.
Sentencia Goto
identificador:
instrucciones;
388
4.2.4.
PUNTEROS
car;
*pcar;
car=0xAA
pcar=&car
*pcar;
pcar=(char*)0x501
*pcar=0xAA
CAR (*(char*)0x501)
CAR=0xAA
4.2.5.
CADENAS DE CONSTANTES
Las cadenas de constantes se pueden almacenar en la memoria de programa.
Existen instrucciones especiales para moverlas entre la RAM y la ROM:
char *strcpy (auto char *s1, auto const char *s2). Copia dos cadenas
ambas de la RAM.
char *strcpypgm2ram (auto char *s1, auto rom const char *s2). Copia
dos cadenas, la original de la memoria de programa y la copia en la
RAM.
rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2).
Copia dos cadenas, la original en la RAM y la copia en la memoria de
programa.
rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2).
Copia dos cadenas ambas en la memoria de programa.
389
4.3.
4.3.1.
A
ACM
ACT
Actividad, activa
ADR
Direccin
ALLOC
Asignacin
ALT
Alterno
AUX
Auxiliar
BD
Buffer Descriptor
BDT
BUFF
Buffer
CDC
CFG
Configuracin
CLR
borrar
CLS
Clase
CTRL
Control
DC
DEF
Definicin
DEFS
ver DEF
DEV
Dispositivo
DIR
Direccin
390
DSC
Descriptor
ENDP
Endpoint
EP
Endpoint
EXT
Externo
FN
funcional
FS
Full-Speed
HID
INIT
inicializar
INT
Interrupcin/interno
INTF
Interfaz
IO
Entrada-salida
ISOCH
Sncrono
ISR
LANG
Lenguaje
LEN
Longitud
LS
Low-speed
MAX
Mximo
MCHP
Tecnologa de microchip
MEM
Memoria
MFR
MGT
Gerencia
MIN
Mnimo
MSD
391
N
NUM
Nmero
OP
Operacional
PKT
Paquete
PID
Paquete de identificacin
PP
Ping-pong
PREP
Preparacin
PTR
Puntero
RDY
listo
REG
registro
REQ
Peticin
RCPT
Receptor
RPT
Informe
RWU
Reinicio remoto
RX
recibir
SIE
STAT
Estado
STD
Estndar
SYNCH
sncrono, sincronizacin
SYS
Sistema
TEL
Telfono
TR
Emisor
TRF
Transferencia
TX
transmisin
392
U
USB
UTIL
Utilidad
VAR
Variable
VAL
Valor
VEND
Vendedor
ZLP
4.3.2.
4.3.2.1.
char BusyADC(void)
Comprueba si el conversor est realizando una conversin o no. Devuelve un 1
si el conversor A/D realiza la conversin y un 0 si no lo hace.
BusyADC();
void CloseADC(void)
Desactiva el conversor A/D y el mecanismo de interrupcin.
CloseADC();
void ConvertADC(void)
Esta funcin comienza la conversin A/D. Se puede utilizar BusyADC() para
detectar el final de la conversin.
ConvertADC();
393
FOSC/2
ADC_FOSC_4
FOSC/4
ADC_FOSC_8
FOSC/8
ADC_FOSC_16
FOSC/16
ADC_FOSC_32
FOSC/32
ADC_FOSC_64
FOSC/64
ADC_FOSC_RC
FOSC/RC
ADC_LEFT_JUST
0 Tad
ADC_2_TAD
2 Tad
ADC_4_TAD
4 Tad
ADC_6_TAD
6 Tad
ADC_8_TAD
8 Tad
ADC_12_TAD
12 Tad
ADC_16_TAD
16 Tad
ADC_20_TAD
20 Tad
394
config2:
Canal:
ADC_CH0
Canal 0
ADC_CH1
Canal 1
ADC_CH2
Canal 2
ADC_CH3
Canal 3
ADC_CH4
Canal 4
ADC_CH5
Canal 5
ADC_CH6
Canal 6
ADC_CH7
Canal 7
ADC_CH8
Canal 8
ADC_CH9
Canal 9
ADC_CH10
Canal 10
ADC_CH11
Canal 11
ADC_CH12
Canal 12
ADC_CH13
Canal 13
ADC_CH14
Canal 14
ADC_CH15
Canal 15
Interrupciones A/D:
ADC_INT_ON
Interrupciones activadas
ADC_INT_OFF
Interrupciones desactivadas
&
ADC_RIGHT_JUST
395
&
ADC_12_TAD,
DC_CH0
&
int ReadADC(void)
Esta funcin devuelve los 16 bits con signo resultado de la conversin A/D.
Basndose en la configuracin del conversor A/D, el resultado puede almacenarse en
los bits menos o ms significativos.
int resultado;
resultado=ReadADC();
Canal 0
ADC_CH1
Canal 1
ADC_CH2
Canal 2
ADC_CH3
Canal 3
ADC_CH4
Canal 4
ADC_CH5
Canal 5
ADC_CH6
Canal 6
ADC_CH7
Canal 7
ADC_CH8
Canal 8
ADC_CH9
Canal 9
ADC_CH10
Canal 10
ADC_CH11
Canal 11
ADC_CH12
Canal 12
ADC_CH13
Canal 13
ADC_CH14
Canal 14
ADC_CH15
Canal 15
SetChanADC(ADC_CH1);
396
4.3.3.
Esta librera trata la modulacin de ancho de pulso tanto de los CCP como de los
mejorados.
Todas las funciones aparecen con una x, esta corresponde al nmero del CCP
que se est utilizando.
La forma de invocar las funciones est escrita en verde (cdigo). Antes de llamar
las funciones hay que incluir la librera:
#include <pwm.h>
4.3.3.1.
OpenPWM2(0xFF);
397
void SetOutputEPWM1(unsigned
outputmode)
char
outputconfig,
unsigned
Salida simple
FULL_OUT_FWD
FULL_OUT_REV
HALF_OUT
Salida half-bridge
outputmode:
PWM_MODE_1
PWM_MODE_2
P1A y P1C activo por altos y P1B y P1D activo por bajos
PWM_MODE_3
P1A y P1C activo por bajos y P1B y P1D activo por altos
PWM_MODE_4
SetOutputEPWM1(SIGNED_OUT, PWM_MODE_1);
398
char
4.3.4.
4.3.4.1.
void CloseTimerx(void)
Esta funcin desactiva el temporizador x y su interrupcin.
CloseTimer2();
Activa
TIMER_INT_OFF
Desactiva
Modo 8bits
T0_16BIT
Modo 16bits
Fuente de reloj:
T0_SOURCE_EXT
Fuente esterna
T0_SOURCE_INT
Fuente interna
(TOSC)
Flanco de bajada
T0_EDGE_RISE
Flanco de subida
399
Prescaler 1:1
T0_PS_1_2
Prescaler 1:2
T0_PS_1_4
Prescaler 1:4
T0_PS_1_8
Prescaler 1:8
T0_PS_1_16
Prescaler 1:16
T0_PS_1_32
Prescaler 1:32
T0_PS_1_64
Prescaler 1:64
T0_PS_1_128
Prescaler 1:128
T0_PS_1_256
Prescaler 1:256
Activa
TIMER_INT_OFF
Desactiva
Modo 8bits
T1_16BIT_RW
Modo 16bits
Fuente de reloj:
T1_SOURCE_EXT
Fuente esterna
T1_SOURCE_INT
Fuente interna
(TOSC)
Prescaler 1:1
T0_PS_1_2
Prescaler 1:2
T0_PS_1_4
Prescaler 1:4
T0_PS_1_8
Prescaler 1:8
400
Oscilador:
T1_OSC1EN_ON
Activo
T1_OSC1EN_OFF
Desactivo
T1_CCP1_T3_CCP2
T1_SOURCE_CCP
T2_PS_1_15
Postscaler 1:15
T0_PS_1_16
Prescaler 1:16
401
Activa
TIMER_INT_OFF
Desactiva
Modo 8bits
T3_16BIT_RW
Modo 16bits
Fuente de reloj:
T3_SOURCE_EXT
Fuente esterna
T3_SOURCE_INT
Prescaler 1:1
T3_PS_1_2
Prescaler 1:2
T3_PS_1_4
Prescaler 1:4
T3_PS_1_8
Prescaler 1:8
T1_CCP1_T3_CCP2
T1_SOURCE_CCP
402
403
4.3.5.
4.3.5.1.
void Delay1TCY(void)
Esta funcin es una definicin de la instruccin NOP. Cuando se encuentra en el
cdigo, el compilador inserta un NOP.
Delay1TCY();
404
405
4.3.6.
Las libreras que aqu aparecen son un ejemplo. Dependiendo de la clase (HID,
MSD, GEN, BOOT o CDC) hay algunas variaciones.
En rojo aparecen los datos que hay que cambiar en cada firmware. En azul las
lneas que dependen de la clase. Y en verde la parte de la librera que es cdigo, aunque
el texto en rojo y en azul tambin es cdigo.
Para realizar una conexin sin caractersticas especficas, lo recomendable es
utilizar la clase genrica (GEN) ya que permite una velocidad ms alta que la clase
CDC, aunque esta ltima se utiliza por resultar ms fcil la programacin del host. Para
ello se copian todas las libreras de esta clase que suministra Microchip y se modifican
las lneas que aqu aparecen en rojo. Lo ms importante es definir bien las interfaces y
los Endpoints.
Para realizar una aplicacin en una clase determinada, lo ms sencillo es copiar
todas las libreras de esa clase, corregirlas y modificar las libreras user.h y las aqu
comentadas. Haciendo esto, nos evitamos tener que modificar el cdigo al cambiar la
clase del dispositivo.
Para ms informacin visitar la pgina web de microchip, en la que hay
ejemplos de cada clase.
4.3.6.1.
Usb.h
Esta librera proporciona la forma de incluir todos los archivos necesarios del
firmware del USB de Microchip.
En realidad, es la nica librera que hay que incluir en el programa de inicio, ya
que se encarga de aadir las dems.
El orden de inclusin es importante, ya que se resuelven los conflictos de
dependencia con el orden correcto:
#include "autofiles\usbcfg.h"
#include "system\usb\usbdefs\usbdefs_std_dsc.h"
#include "autofiles\usbdsc.h"
#include "system\usb\usbdefs\usbdefs_ep0_buff.h"
#include "system\usb\usbmmap.h"
#include "system\usb\usbdrv\usbdrv.h"
#include "system\usb\usbctrltrf\usbctrltrf.h"
#include "system\usb\usb9\usb9.h"
406
Ver autofiles\usbcfg.h
Ver autofiles\usbcfg.h
Ver autofiles\usbcfg.h
407
4.3.6.2.
Usbcfg.h: Configuracin
4.3.6.2.1.
Definiciones
_PPBM0
Valor de configuracin:
#define UCFG_VAL
_PUEN|_TRINT|_FS|MODE_PP
E/S auto-alimentadas:
#define USE_SELF_POWER_SENSE_IO
4.3.6.2.2.
9
9
0
1
2
3
Ninguna
USB9
Interfaz humana
Clase de comunicacin del dispositivo
408
4.3.6.2.3.
#define
#define
#define
#define
#define
#define
HID_INTF_ID
HID_UEP
HID_BD_OUT
HID_INT_OUT_EP_SIZE
HID_BD_IN
HID_INT_IN_EP_SIZE
#define HID_NUM_OF_DSC
#define HID_RPT01_SIZE
0x00
UEP1
ep1Bo
3
ep1Bi
3
1
50
Identificacin de la interfaz
Endpoints que se utlizan
Buffer descriptor de salida
Tamao de la interrupcin del Endpoint de salida
Buffer descriptor de entrada
Tamao de la interrupcin del Endpoint de
entrada
Nmero de descriptores
Tamao del informe
Macros HID
Ver la direccin del descriptor HID:
#define mUSBGetHIDDscAdr(ptr)
{
if(usb_active_cfg == 1)
ptr = (rom byte*)&cfg01.hid_i00a00;
}
//UEP1
409
4.3.6.3.
4.3.6.3.1.
Incluye:
#include "system\typedefs.h"
4.3.6.3.2.
Definiciones
Tipos de descriptores:
#define DSC_DEV
#define DSC_CFG
#define DSC_STR
#define DSC_INTF
#define DSC_EP
0x01
0x02
0x03
0x04
0x05
Definicin de los Endpoint (slo usarse con los descriptores, para cualquier otro
uso utilizar los definidos en usbdrv.h):
#define _EP01_OUT
#define _EP01_IN
#define _EP02_OUT
#define _EP02_IN
#define _EP03_OUT
#define _EP03_IN
#define _EP04_OUT
#define _EP04_IN
#define _EP05_OUT
#define _EP05_IN
#define _EP06_OUT
#define _EP06_IN
#define _EP07_OUT
#define _EP07_IN
#define _EP08_OUT
#define _EP08_IN
#define _EP09_OUT
#define _EP09_IN
#define _EP10_OUT
#define _EP10_IN
#define _EP11_OUT
#define _EP11_IN
0x01
0x81
0x02
0x82
0x03
0x83
0x04
0x84
0x05
0x85
0x06
0x86
0x07
0x87
0x08
0x88
0x09
0x89
0x0A
0x8A
0x0B
0x8B
410
#define _EP12_OUT
#define _EP12_IN
#define _EP13_OUT
#define _EP13_IN
#define _EP14_OUT
#define _EP14_IN
#define _EP15_OUT
#define _EP15_IN
0x0C
0x8C
0x0D
0x8D
0x0E
0x8E
0x0F
0x8F
Atributos de configuracin:
#define _DEFAULT
#define _SELF
#define _RWU
0x01<<7
0x01<<6
0x01<<5
0x00
0x01
0x02
0x03
Transferencia de control
Transferencia sncrona
Transferencia Bulk
Transferencia interrupcin
0x00<<2
0x01<<2
0x02<<2
0x03<<2
Sin sincronizacin
Asncrona
Adaptivo
Sncrona
4.3.6.3.3.
0x00<<4
0x01<<4
0x02<<4
Endpoint de datos
Endpoint retroalimentado
Endpoint de datos y retroalimentado
Estructuras
411
byte iSerialNum;
} USB_DEV_DSC;
byte bNumCfg;
Longitud total;
word wTotalLength;
Informacin
de
byte iCfg;
Nmero de interfaz;
byte bIntfNum;
Clase de interfaz;
byte bIntfCls;
Informacin de la interfaz;
byte iIntf;
Tipo de descriptor;
byte bDscType;
Tamao mximo del paquete;
word wMaxPktSize;
412
4.3.6.4.
Usbdsc.h: Descriptores
4.3.6.4.1.
#include "system\typedefs.h"
#include "autofiles\usbcfg.h"
#include "system\usb\usb.h"
4.3.6.4.2.
Definiciones
4.3.6.4.3.
Configuracin 01
Descriptor de configuracin
Descriptor de la interfaz
Endpoint descriptor de salida
Endpoint descriptor de entrada
Externas
413
4.3.6.5.
4.3.6.5.1.
Incluye
#include "system\typedefs.h"
#include "autofiles\usbcfg.h"
Tipo de respuesta
Respuesta
Valor
ndice
Longitud
Valor
ndice
Longitud
414
unsigned Recipient:5;
unsigned RequestType:2;
unsigned DataDir:1;
unsigned :8;
byte bFeature;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
};
struct
{
unsigned :8;
unsigned :8;
byte bDscIndex;
byte bDscType;
word wLangID;
unsigned :8;
unsigned :8;
};
struct
{
unsigned :8;
unsigned :8;
BYTE bDevADR;
byte bDevADRH;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
};
struct
{
unsigned :8;
unsigned :8;
byte bCfgValue;
byte bCfgRSD;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
};
struct
{
415
unsigned :8;
unsigned :8;
byte bAltID;
byte bAltID_H;
byte bIntfID;
byte bIntfID_H;
unsigned :8;
unsigned :8;
};
struct
{
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
byte bEPID;
byte bEPID_H;
unsigned :8;
unsigned :8;
};
struct
{
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned EPNum:4;
unsigned :3;
unsigned EPDir:1;
unsigned :8;
unsigned :8;
unsigned :8;
};
} CTRL_TRF_SETUP;
416
417
4.3.6.6.
Usbmmap.h
4.3.6.6.1.
Incluye
#include "system\typedefs.h"
4.3.6.6.2.
Definiciones
0x04
0x08
0x10
0x20
#define _DAT0
#define _DAT1
#define _DTSMASK
#define _USIE
#define _UCPU
0x00
0x40
0x40
0x80
0x00
Tipos de memoria
USB_DEVICE_STATUS:
0
1
2
3
4
5
6
para
Sin conexin
Conectado
Alimentado
Por defecto
Pendiente de direccin
Direccionado
Configurado
el
control
#define _RAM 0
#define _ROM 1
418
de
transferencias,
utilizado
en
4.3.6.6.3.
Tipos
Paquete de identificacin
419
struct
{
BD_STAT Stat;
byte Cnt;
byte ADRL;
byte ADRH;
};
struct
{
unsigned :8;
unsigned :8;
byte* ADR;
};
} BDT;
4.3.6.6.4.
Externas
420
421
4.3.6.7.
4.3.6.7.1.
Incluye
#include "system\typedefs.h"
#include "system\usb\usb.h"
4.3.6.7.2.
Definiciones
0x00
0x01
0x02
0x00
0x04
0x00
0x08
0x10
0x40
0x80
0x06
Pipe de control
0x0C
Pipe de salida
0x0A
Pipe de entrada
0x0E
Pipe de entrada y salida
0x10
Activar paquetes de protocolo
Los paquetes de protocolo se tienen que desactivar en la
sncronas
direccin
de
los
EP
PICmicro:
422
#define OUT
#define IN
0
1
((0x00<<3)|(OUT<<2))
((0x00<<3)|(IN<<2))
((0x01<<3)|(OUT<<2))
((0x01<<3)|(IN<<2))
((0x02<<3)|(OUT<<2))
((0x02<<3)|(IN<<2))
((0x03<<3)|(OUT<<2))
((0x03<<3)|(IN<<2))
((0x04<<3)|(OUT<<2))
((0x04<<3)|(IN<<2))
((0x05<<3)|(OUT<<2))
((0x05<<3)|(IN<<2))
((0x06<<3)|(OUT<<2))
((0x06<<3)|(IN<<2))
((0x07<<3)|(OUT<<2))
((0x07<<3)|(IN<<2))
((0x08<<3)|(OUT<<2))
((0x08<<3)|(IN<<2))
((0x09<<3)|(OUT<<2))
((0x09<<3)|(IN<<2))
((0x0A<<3)|(OUT<<2))
((0x0A<<3)|(IN<<2))
((0x0B<<3)|(OUT<<2))
((0x0B<<3)|(IN<<2))
((0x0C<<3)|(OUT<<2))
((0x0C<<3)|(IN<<2))
((0x0D<<3)|(OUT<<2))
((0x0D<<3)|(IN<<2))
((0x0E<<3)|(OUT<<2))
((0x0E<<3)|(IN<<2))
((0x0F<<3)|(OUT<<2))
((0x0F<<3)|(IN<<2))
423
mInitializeUSBDriver()
Configura el modulo USB.
La definicin de UCFG_VAL est en autofiles\usbcfg.h
Este registro determina: velocidad del USB Speed, seleccin de las resistencias
pull-up del chip, seleccin del transmisor-receptor del chip, modo de chequeo patrn
de ojo, buffer modo Ping-pong
#define mInitializeUSBDriver()
{UCFG = UCFG_VAL;
usb_device_state = DETACHED_STATE;
usb_stat._byte = 0x00;
usb_active_cfg = 0x00;
}
void mDisableEP1to15()
Esta macro desactiva todos los Endpoints menos el 0.
Hay que invocar esta macro cada vez que el host enve una seal de RESET o
una respuesta a SET_CONFIGURATION
#define mDisableEP1to15()
ClearArray((byte*)&UEP1,15);
O lo que es lo mismo:
#define mDisableEP1to15()
UEP1=0x00;UEP2=0x00;UEP3=0x00;
UEP4=0x00;UEP5=0x00;UEP6=0x00;UEP7=0x00;
UEP8=0x00;UEP9=0x00;UEP10=0x00;UEP11=0x00;
UEP12=0x00;UEP13=0x00;UEP14=0x00;UEP15=0x00;
mUSBBufferReady(buffer_dsc)
Precondicin:
Endpoint IN: El buffer est cargado y listo para enviar.
Endpoint OUT: El buffer puede escribir al SIE.
Entrada: byte buffer_dsc: Nombre del grupo del buffer descriptor (e.j. ep0Bo,
ep1Bi) declarado en usbmmap.h. Los nombres se pueden cambiar por legibilidad; ver
los ejemplos en usbcfg.h (#define HID_BD_OUT ep1Bo)
Esta macro se tiene que llamar cada vez que ocurra:
1. Que se llene un buffer de un Endpoint, que no sea el EP0, con datos.
2. Que se lea un buffer de un Endpoint, que no sea el EP0.
Esta macro convierte la propiedad del buffer al SIE para dar servicio; adems,
cambia el bit DTS para sincronizacin.
424
#define mUSBBufferReady(buffer_dsc)
{
buffer_dsc.Stat._byte &= _DTSMASK;
buffer_dsc.Stat.DTS = !buffer_dsc.Stat.DTS;
buffer_dsc.Stat._byte |= _USIE|_DTSEN;
}
4.3.6.7.3.
Prototipos pblicos
void USBCheckBusStatus(void);
void USBDriverService(void);
void USBRemoteWakeup(void);
void USBSoftDetach(void);
void ClearArray(byte* startAdr,byte count);
425
4.3.6.8.
4.3.6.8.1.
Incluye
#include "system\typedefs.h"
4.3.6.8.2.
Definiciones
0
1
2
Espera Setup
Transf. de control de transmisin
Transf. de control de recepcin
0b00001101
0b00000001
0b00001001
Token setup
Token de salida
Token de entrada
Tipos de Tokens:
#define SETUP_TOKEN
#define OUT_TOKEN
#define IN_TOKEN
4.3.6.8.3.
0
1
0x00
0x01
0x02
0
1
2
3
Host-al-Dispositivo
Dispositivo-al-Host
Clase
Fabricante
Dispositivo destinatario
Destinatario de la interfaz
Destinatario del Endpoint
Externas
4.3.6.8.4.
Prototipos pblicos
void USBCtrlEPService(void);
void USBCtrlTrfTxService(void);
void USBCtrlTrfRxService(void);
void USBCtrlEPServiceComplete(void);
void USBPrepareForNextSetupTrf(void);
426
4.3.6.9.
Usb9.h
4.3.6.9.1.
Incluye
#include "system\typedefs.h"
4.3.6.9.2.
Definiciones
0
1
3
5
6
7
8
9
10
11
12
Obtiene estado
Borra caracterstica
Fija caracterstica
Fija direccin
Obtiene descriptor
Fija descriptor
Obtiene configuracin
Fija configuracin
Obtiene interfaz
Fija interfaz
Marco de sincronismo
0x01
0x00
mUSBCheckAdrPendingState()
Rutina de chequeo especializado, comprueba si el dispositivo est en el estado
Pendiente de direccin y le da servicio si est.
#define mUSBCheckAdrPendingState()
if(usb_device_state==ADR_PENDING_STATE)
{
UADDR = SetupPkt.bDevADR._byte;
if(UADDR > 0)
usb_device_state=ADDRESS_STATE;
else
usb_device_state=DEFAULT_STATE;
}
4.3.6.9.3.
Prototipos pblicos
void USBCheckStdRequest(void);
427
4.3.6.10.
4.3.6.10.1.
Incluye
#include "system\typedefs.h"
4.3.6.10.2.
Definiciones
(bit) mUSBGenRxIsBusy(void)
Esta macro se utiliza para comprobar que el Endpoint de salida est ocupado (lo
controla el SIE) o no.
Uso tpico: if(mUSBGenRxIsBusy())
#define mUSBGenRxIsBusy()
USBGEN_BD_OUT.Stat.UOWN
(bit) mUSBGenTxIsBusy(void)
Esta macro se utiliza para comprobar que el Endpoint de entrada est ocupado
(lo controla el SIE) o no.
Uso tpico: if(mUSBGenTxIsBusy())
#define mUSBGenTxIsBusy()
USBGEN_BD_IN.Stat.UOWN
byte mUSBGenGetRxLength(void)
Salida: mUSBGenGetRxLength devuelve usbgen_rx_len (longitude de Rx).
mUSBGenGetRxLength se utiliza para recuperar el nmero de bytes copiados al
buffer del usuario en la ltima llamada a la funcin USBGenRead.
#define mUSBGenGetRxLength()
4.3.6.10.3.
usbgen_rx_len
Externas
4.3.6.10.4.
Prototipos Pblicos
void USBGenInitEP(void);
void USBGenWrite(byte *buffer, byte len);
byte USBGenRead(byte *buffer, byte len);
428
4.3.6.11.
4.3.6.11.1.
Incluye
#include "system\typedefs.h"
#include "io_cfg.h"
4.3.6.11.2.
Definiciones
0x08
0x06
0x50
Comandos de la clase:
#define MSD_RESET
#define GET_MAX_LUN
0xff
0xfe
#define BLOCKLEN_512
0x0200
#define STMSDTRIS
#define STRUNTRIS
#define STMSDLED
#define STRUNLED
#define ToggleRUNLED()
TRISD0
TRISD1
LATDbits.LATD0
LATDbits.LATD1
STRUNLED = !STRUNLED;
429
0x12
0x23
0x25
0x28
0x2A
0x03
0x1A
0x1E
0x00
0x2F
#define STOP_START
0x1B
#define INVALID_CBW
#define VALID_CBW
#define MAX_LUN
1
!INVALID_CBW
0
0x0
0x1
0x2
0x3
0X4
0x5
0x6
0x7
0x8
0x9
0xA
0xB
0xC
0xD
0xE
#define S_CURRENT
#define S_DEFERRED
0x70
0x71
Con una respuesta de clave sense ilegal para probar si la unidad est disponible:
#define ASC_LOGICAL_UNIT_NOT_SUPPORTED 0x25
#define ASCQ_LOGICAL_UNIT_NOT_SUPPORTED 0x00
430
(bit) mMSDRxIsBusy(void)
Esta macro se utiliza para comprobar si el Endpoint MSD OUT est ocupado
(controlado por el SIE) o no.
Uso tpico: if(mMSDRxIsBusy())
#define mMSDRxIsBusy()
MSD_BD_OUT.Stat.UOWN
(bit) mMSDTxIsBusy(void)
Esta macro se utiliza para comprobar si el Endpoint MSD IN est ocupado
(controlado por el SIE) o no.
Uso tpico: if(mMSDTxIsBusy())
#define mMSDTxIsBusy()
MSD_BD_IN.Stat.UOWN
431
(bit) mMin(void)
Esta macro se utiliza para encontrar el menor de dos argumentos.
Uso tpico: mMin(A, B)
#define mMin(A,B) (A<B)?A:B
4.3.6.11.3.
Estructuras
byte Opcode;
byte Flags;
DWORD LBA;
byte GroupNumber;
WORD TransferLength;
byte Control;
} ReadWriteCB;
typedef struct {
byte Opcode;
byte EVPD;
byte PageCode;
word AllocationLength;
byte Control;
} InquiryCB;
432
typedef struct {
byte Opcode;
byte Reserved1;
dword LBA;
word Reserved2;
byte PMI;
byte Control;
} ReadCapacityCB;
capacidad de lectura 10
typedef struct {
byte Opcode;
byte Desc;
word Reserved;
byte AllocationLength;
byte Control;
} RequestSenseCB;
typedef struct {
byte Opcode;
byte DBD;
byte PageCode;
cdigo
byte SubPageCode;
byte AllocationLength;
byte Control;
} ModeSenseCB;
typedef struct {
byte Opcode;
byte Reserved[3];
byte Prevent;
byte Control;
} PreventAllowMediumRemovalCB;
typedef struct {
byte Opcode;
dword Reserved;
byte Control;
} TestUnitReadyCB;
typedef struct {
byte Opcode;
433
byte VRProtect;
dword LBA;
byte GroupNumber;
word VerificationLength;
byte Control;
} VerifyCB;
typedef struct {
byte Opcode;
byte Immed;
word Reserved;
byte Start;
STOP_START 0x1B
byte Control;
} StopStartCB;
typedef struct _USB_MSD_CSW
{
dword dCSWSignature;
dword dCSWTag;
dword dCSWDataResidue;
byte bCSWStatus;
CSW
55 53 42 53h firma del paquete de CSW
eco dCBWTag del paquete CBW
diferencia en los datos esperados
(dCBWDataTransferLength)
y la cantidad actual procesada/enviada
00h Comando aprobado, 01h Comando Fallido,
02h Error de fase, el resto obsoleto/reservado
} USB_MSD_CSW;
typedef struct
{
byte Peripheral;
byte Removble;
byte Version;
byte Response_Data_Format;
byte AdditionalLength;
byte Sccstp;
byte bqueetc;
byte CmdQue;
434
Modo corto del bloque descriptor LBA (ver Pgina 1009, SBC-2)
typedef struct {
byte NumBlocks[4];
byte Resv;
byte BlockLen[3];
} tBlockDescriptor;
reservado
SPC-3 7.4.5
SubPageFormat=0 medio Page_0 formato
Parmetros salvables
si 2..n bytes del modo parmetro PageLength=n-1
modo parmetros
typedef struct {
tModeParamHdr Header;
tBlockDescriptor BlockDsc;
tModePage modePage;
} ModeSenseResponse;
435
18bytes
de respuesta sense de formato fijado
};
} RequestSenseResponse;
4.3.6.11.4.
Externas
4.3.6.11.5.
declarado en sdcard.c
Prototipos pblicos
void USBCheckMSDRequest(void);
void ProcessIO(void);
void SDCardInit(void);
void MSDInitEP(void);
436
4.3.6.12.
4.3.6.12.1.
Incluye
#include "system\typedefs.h"
4.3.6.12.2.
Definiciones
0x00
0x01
0x02
0x03
0x04
0x20
0x21
0x22
0x23
Notificaciones
Nota: las notificaciones se obtienen de la interface de comunicacin (Endpoint
Interrupcin)
#define NETWORK_CONNECTION
#define RESPONSE_AVAILABLE
#define SERIAL_STATE
0x00
0x01
0x20
0x02
0x02
0x02
0x01
0x0A
437
0x00
0x01
0x02
Descriptores funcionales
Tipos de valor del campo bDscType
#define CS_INTERFACE
#define CS_ENDPOINT
0x24
0x25
0x00
0x01
0x02
#define DSC_FN_DLM
#define DSC_FN_TELEPHONE_RINGER
#define DSC_FN_RPT_CAPABILITIES
#define DSC_FN_UNION
#define DSC_FN_COUNTRY_SELECTION
#define DSC_FN_TEL_OP_MODES
#define DSC_FN_USB_TERMINAL
0x03
0x04
0x05
0x06
0x07
0x08
0x09
0
1
2
3
BOOL mUSBUSARTIsTxTrfReady(void)
Esta macro se utiliza para comprobar si la clase CDC est disponible para enviar
mas datos.
Uso tpico: if(mUSBUSARTIsTxTrfReady())
#define mUSBUSARTIsTxTrfReady()
(cdc_trf_state == CDC_TX_READY)
438
(bit) mCDCUsartRxIsBusy(void)
Esta macro se utiliza para comprobar si el Endpoint CDC Bulk OUT est
ocupado (controlado por el SIE) o no.
Uso tpico: if(mCDCUsartRxIsBusy())
#define mCDCUsartRxIsBusy()
CDC_BULK_BD_OUT.Stat.UOWN
(bit) mCDCUsartTxIsBusy(void)
Esta macro se utiliza para comprobar si el Endpoint CDC Bulk IN est ocupado
(controlado por el SIE) o no.
Uso tpico: if(mCDCUsartTxIsBusy())
#define mCDCUsartTxIsBusy()
CDC_BULK_BD_IN.Stat.UOWN
byte mCDCGetRxLength(void)
Salida: devuelve cdc_rx_len
mCDCGetRxLength se utiliza para recuperar el nmero de bytes que se han
copiado al buffer del usuario en la ltima llamada a la funcin getsUSBUSART.
#define mCDCGetRxLength()
cdc_rx_len
439
4.3.6.12.3.
Estructuras
0x07
440
441
byte bDataInterface;
} USB_CDC_CALL_MGT_FN_DSC;
4.3.6.12.4.
Externas
4.3.6.12.5.
Prototipos publicos
void USBCheckCDCRequest(void);
void CDCInitEP(void);
byte getsUSBUSART(char *buffer, byte len);
void putrsUSBUSART(const rom char *data);
void putsUSBUSART(char *data);
void CDCTxService(void);
#endif
CDC_H
442
4.3.6.13.
4.3.6.13.1.
Incluye
#include "system\typedefs.h"
4.3.6.13.2.
Definiciones
0x01
0x02
0x03
0x09
0x0A
0x0B
Obtener informe
Obtener reposo
Obtener protocolo
Fijar informe
Fijar reposo
Fijar protocolo
0x21
0x22
0x23
Descriptor HID
Descriptor informe
0x00
0x01
Protocolo de inicio
Informe de protocolo
Seleccin de protocolo:
#define BOOT_PROTOCOL
#define RPT_PROTOCOL
0x03
Interfaz HID
0x00
0x01
0x02
443
Ninguno
Teclado
Ratn
(bit) mHIDRxIsBusy()
Esta macro comprueba si el Endpoint de salida del HID est ocupado
(controlado por el SIE) o no.
Aplicacin tpica: if(mHIDRxIsBusy())
#define mHIDRxIsBusy()
HID_BD_OUT.Stat.UOWN
(bit) mHIDTxIsBusy()
Esta macro comprueba si el Endpoint de entrada del HID est coupado
(controlado por el SIE) o no.
Aplicacin tpica: if(mHIDTxIsBusy())
#define mHIDTxIsBusy()
HID_BD_IN.Stat.UOWN
byte mHIDGetRptRxLength()
Salida: mHIDGetRptRxLength devuelve un informe de la longitud del receptor
HID (hid_rpt_rx_len).
La mHIDGetRptRxLength se utiliza para recuperar el nmero de bytes
copindolos al buffer de usuario en orden de la ltima llamada a la funcin
HIDRxReport.
#define mHIDGetRptRxLength()
4.3.6.13.3.
hid_rpt_rx_len
Estructuras
4.3.6.13.4.
Externas
444
4.3.6.13.5.
Prototipos pblicos
void HIDInitEP(void);
void USBCheckHIDRequest(void);
void HIDTxReport(char *buffer, byte len);
byte HIDRxReport(char *buffer, byte len);
4.3.6.14.
Io_cfg.h
4.3.6.14.1.
Incluye
#include "autofiles\usbcfg.h"
4.3.6.14.2.
Tris
#define INPUT_PIN
#define OUTPUT_PIN
4.3.6.14.3.
1
0
USB
#define tris_usb_bus_sense
TRISAbits.TRISA1
entrada
#if defined(USE_USB_BUS_SENSE_IO)
#define usb_bus_sense
PORTAbits.RA1
#else
#define usb_bus_sense
1
#endif
#define tris_self_power
TRISAbits.TRISA2
entrada
#if defined(USE_SELF_POWER_SENSE_IO)
#define self_power
PORTAbits.RA2
#else
#define self_power
1
#endif
TRISBbits.TRISB3
TRISBbits.TRISB2
TRISAbits.TRISA4
TRISCbits.TRISC5
TRISCbits.TRISC4
TRISCbits.TRISC1
445
Salida
Salida
Entrada
Entrada
Entrada
Salida
#define tris_usb_suspnd
4.3.6.14.4.
Interruptores
#define mInitAllSwitches()
#define mInitSwitch2()
#define mInitSwitch3()
//#define sw2
#define sw3
4.3.6.14.6.
Salida
LED
#define mInitAllLEDs()
#define mLED_1
#define mLED_2
#define mLED_3
#define mLED_4
#define mLED_1_On()
#define mLED_2_On()
#define mLED_3_On()
#define mLED_4_On()
#define mLED_1_Off()
#define mLED_2_Off()
#define mLED_3_Off()
#define mLED_4_Off()
#define mLED_1_Toggle()
#define mLED_2_Toggle()
#define mLED_3_Toggle()
#define mLED_4_Toggle()
4.3.6.14.5.
TRISAbits.TRISA3
TRISBbits.TRISB4=1;TRISBbits.TRISB5=1;
TRISBbits.TRISB4=1;
TRISBbits.TRISB5=1;
PORTBbits.RB4
PORTBbits.RB5
Potencimetro
#define mInitPOT()
TRISAbits.TRISA0=1;ADCON0=0x01;ADCON2=0x3C;
4.3.6.14.7.
4.3.6.14.8.
Salida
Salida
SDMMC
#define TRIS_CARD_DETECT
#define CARD_DETECT
#define TRIS_WRITE_DETECT
#define WRITE_DETECT
TRISBbits.TRISB4
PORTBbits.RB4
TRISAbits.TRISA4
PORTAbits.RA4
446
Entrada
Entrada
4.3.6.15.
interrupt.h
4.3.6.15.1.
Incluye
#include "system\typedefs.h"
4.3.6.15.2.
Definiciones
4.3.6.15.3.
Prototipos
void low_isr(void);
void high_isr(void);
447
4.3.6.16.
Usb_compile_time_validation.h: Validacin Del Tiempo De
Compilado
Esta librera se utiliza para comprobar errores en la compilacin. Es totalmente
opcional.
4.3.6.16.1.
Incluye
#include "system\typedefs.h"
#include "system\usb\usb.h"
4.3.6.16.2.
#if
4.3.7.
448
4.4.
4.4.1.
4.4.1.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include "io_cfg.h"
4.4.1.2.
Variables
#pragma udata
4.4.1.3.
Prototipos privados
void USBModuleEnable(void);
void USBModuleDisable(void);
void USBSuspend(void);
void USBWakeFromSuspend(void);
void USBProtocolResetHandler(void);
void USB_SOF_Handler(void);
void USBStallHandler(void);
void USBErrorHandler(void);
4.4.1.4.
Declaraciones
#pragma code
449
4.4.1.4.1.
void USBCheckBusStatus(void)
1
0
if(usb_bus_sense == USB_BUS_ATTACHED)
{
if(UCONbits.USBEN == 0)
USBModuleEnable();
}
else
{
if(UCONbits.USBEN == 1)
USBModuleDisable();
} end if(usb_bus_sense...)
Despus de activar el modulo USB, hay un retardo para que la tensin de las
lneas D+ o D- se pongan en alto lo suficiente para que salga de la condicin SE0.
La interrupcin de Reset del USB tiene que estar enmascarada hasta que la
condicin SE0 est borrada. Esto ayuda a prevenir que el firmware confunda este evento
con un reset del host.
if(usb_device_state == ATTACHED_STATE)
{
if(!UCONbits.SE0)
{
UIR = 0;
UIE = 0;
USB
UIEbits.URSTIE = 1;
UIEbits.IDLEIE = 1;
usb_device_state = POWERED_STATE;
} end if
borrado
} end if(usb_device_state == ATTACHED_STATE)
} end USBCheckBusStatus
450
4.4.1.4.2.
void USBModuleEnable(void)
4.4.1.4.3.
void USBModuleDisable(void)
4.4.1.4.4.
void USBSoftDetach(void)
451
4.4.1.4.5.
void USBDriverService(void)
USBProtocolResetHandler();
452
4.4.1.4.6.
void USBSuspend(void)
void USBSuspend(void)
{
Nota: No borrar UIRbits.ACTVIF aqu
Razn:
ACTVIF slo se genera si IDLEIF se ha generado.
Es un ratio de generacin de interrupcin de 1:1.
Por cada IDLEIF, habr slo un ACTVIF sea cual sea el nmero de transacciones en el
bus.
Si el ACTIF se borra aqu, puede ocurrir un problema cuando:
[ IDLE ][bus activity ->
<--- 3 ms -----> ^
^
ACTVIF=1
IDLEIF=1
# # # # (#=Banderas de programa de interrogacin)
^
Este ciclo de pregunta mira IDLEIF=1 y ACTVIF=1. Sin embargo, el programa sirve
primero IDLEIF porque ACTIVIE=0. Si esta rutina borra el nico ACTIVIF, puede que no salga nunca
del modo suspendido.
UIEbits.ACTVIE = 1;
Activa las interrupciones del bus
UIRbits.IDLEIF = 0;
UCONbits.SUSPND = 1;
Pone el modulo USB en el modo reserva
de
energa, el reloj SIE inactivo.
En este punto el PIC puede ponerse en sleep, reposo, cambiar a un reloj ms lento, etc.
/* Seccin modificable */
/* Final de la seccin modificable */
} end USBSuspend
4.4.1.4.7.
void USBWakeFromSuspend(void)
void USBWakeFromSuspend(void)
{
Si se cambia la frecuencia de reloj, en este lugar se vuelve a poner la frecuencia
original.
UCONbits.SUSPND = 0;
UIEbits.ACTVIE = 0;
UIRbits.ACTVIF = 0;
} end USBWakeFromSuspend
453
4.4.1.4.8.
void USBRemoteWakeup(void)
Esta funcin la tiene que llamar el usuario cuando el dispositivo se despierte por
un estmulo externo que no sea ACTIVIF.
Nota: La seccin modificable en esta rutina se puede cambiar dependiendo de
las especificaciones de la aplicacin. La implementacin actual bloquea temporalmente
otras funciones de ejecucin en un periodo de 1-13ms dependiendo de la frecuencia del
ncleo.
De acuerdo con las especificaciones del USB 2.0 en la seccin 7.1.7.7, El
reinicio remoto del dispositivo tiene que bloquear la seal al menos por 1ms y no ms
de 15ms. La idea aqu es utilizar un retraso por contador, usando un valor comn que
pueda trabajar con un gran rango de frecuencias del ncleo. Este valor es 1800. Ver la
tabla de debajo:
Frec del ncleo (MHz)
48
4
MIP
12
1
/* Seccin modificable */
454
4.4.1.4.9.
void USB_SOF_Handler(void)
4.4.1.4.10.
void USBStallHandler(void)
455
4.4.1.4.11.
void USBErrorHandler(void)
4.4.1.4.12.
void USBProtocolResetHandler(void)
Precondicin: Se tiene que haber recibido un reset del bus USB desde el host.
Efectos secundarios: Esta rutina purga cualquier transaccin pendiente. Borra la
FIFO USTAT.
Hay que llamar esta rutina cuando el reset del bus USB se ha recibido. Resetea
la direccin del dispositivo a cero, desactiva todos los Endpoints menos el cero,
inicializa el EP0 para que est disponible las comunicaciones por defecto, borra todas
los flags de interrupcin, desenmascara las interrupciones USB aplicables y reinicializa
las variables internas de estado-mquina.
void USBProtocolResetHandler(void)
{
UEIR = 0;
Borra todas los flags de error del USB
UIR = 0;
Borra todas las interrupciones USB
UEIE = 0b10011111;
Desenmascara todos los errores de interrupcin USB
UIE = 0b01111011;
Activa todas las interrupciones menos ACTVIE
UADDR = 0x00;
Resetea a la direccin por defecto
mDisableEP1to15();
Resetea todos los registros UEPn non-EP0
UEP0 = EP_CTRL|HSHK_EN;
Inicializa el EP0 como EP Ctrl, ver usbdrv.h
while(UIRbits.TRNIF == 1)
Borra cualquier transaccin pendiente
UIRbits.TRNIF = 0;
UCONbits.PKTDIS = 0;
Se asegura de que el procesamiento de paquetes est activo
USBPrepareForNextSetupTrf(); Declarado en usbctrltrf.c
usb_stat.RemoteWakeup = 0;
Desactiva el flag de estado por defecto
usb_active_cfg = 0;
Borra la configuracin activa
usb_device_state = DEFAULT_STATE;
} end USBProtocolResetHandler
456
4.4.1.5.
Funcin auxiliar
4.4.2.
USB9.C
Estas macros establecen la conexin.
4.4.2.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include "io_cfg.h"
4.4.2.2.
Variables
#pragma udata
4.4.2.3.
Prototipos privados
void USBStdGetDscHandler(void);
void USBStdSetCfgHandler(void);
void USBStdGetStatusHandler(void);
void USBStdFeatureReqHandler(void);
4.4.2.4.
Declaraciones
#pragma code
4.4.2.4.1.
void USBCheckStdRequest(void)
Esta rutina chequea el paquete de datos setup para ver si sabe cuando conectarse.
void USBCheckStdRequest(void)
{
if(SetupPkt.RequestType != STANDARD) return;
switch(SetupPkt.bRequest)
{
case SET_ADR:
ctrl_trf_session_owner = MUID_USB9;
457
458
ctrl_trf_session_owner = MUID_USB9;
usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID;
break;
case SET_DSC:
case SYNCH_FRAME:
default:
break;
} end switch
} end USBCheckStdRequest
4.4.2.4.2.
void USBStdGetDscHandler(void)
}
}
usb_stat.ctrl_trf_mem = _ROM;
end if
end USBStdGetDscHandler
459
4.4.2.4.3.
void USBStdSetCfgHandler(void)
Esta rutina primero desactiva todos los Endpoints borrando los registros UEP.
Configura (inicializa) los Endpoints especificados en la seccin modificable.
void USBStdSetCfgHandler(void)
{ ctrl_trf_session_owner = MUID_USB9;
mDisableEP1to15();
Ver usbdrv.h
ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT);
usb_active_cfg = SetupPkt.bCfgValue;
if(SetupPkt.bCfgValue == 0)
usb_device_state = ADDRESS_STATE;
else
{ usb_device_state = CONFIGURED_STATE;
/* Seccin modificable */
BootInitEP();
/* Final de la seccin modificable */
} end if(SetupPkt.bcfgValue == 0)
} end USBStdSetCfgHandler
4.4.2.4.4.
void USBStdGetStatusHandler(void)
Inicializa el contenido
switch(SetupPkt.Recipient)
{
case RCPT_DEV:
ctrl_trf_session_owner = MUID_USB9;
_byte0: bit0: Estado auto-alimentado [0] Alimentado por el bus [1] auto-alimentado
bit1: Reinicio remoto [0] Desactivado [1] Activado
if(self_power == 1)
Auto-alimentado definido en io_cfg.h
CtrlTrfData._byte0|=0b000000001; Activa bit0
if(usb_stat.RemoteWakeup == 1)
CtrlTrfData._byte0|=0b00000010;
break;
case RCPT_INTF:
ctrl_trf_session_owner = MUID_USB9; No hay datos a actualizar
break;
case RCPT_EP:
ctrl_trf_session_owner = MUID_USB9;
_byte0: bit0: Estado parado [0] No parado [1] Parado
pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4);
460
break;
end switch
if(ctrl_trf_session_owner == MUID_USB9)
{
pSrc.bRam = (byte*)&CtrlTrfData;
usb_stat.ctrl_trf_mem = _RAM;
LSB(wCount) = 2;
} end if(...)
} end USBStdGetStatusHandler
4.4.2.4.5.
Fija fuente
Fija el tipo de memoria
Activa la cuenta de datos
void USBStdFeatureReqHandler(void)
461
4.4.3.
USBCTRLTRF.C
Estas macros controlan las transferencias.
4.4.3.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
4.4.3.2.
Variables
#pragma udata
byte ctrl_trf_state;
byte ctrl_trf_session_owner;
POINTER pSrc;
POINTER pDst;
WORD wCount;
4.4.3.3.
Prototipos privados
void USBCtrlTrfSetupHandler(void);
void USBCtrlTrfOutHandler(void);
void USBCtrlTrfInHandler(void);
4.4.3.4.
Declaraciones
#pragma code
4.4.3.4.1.
void USBCtrlEPService(void)
EP0 SETUP
EP0 OUT
462
4.4.3.4.2.
EP0 IN
void USBCtrlTrfSetupHandler(void)
4.4.3.4.3.
{
void USBCtrlTrfSetupHandler(void)
byte i;
Estado 1
ctrl_trf_state = WAIT_SETUP;
ctrl_trf_session_owner = MUID_NULL;
wCount._word = 0;
Estado 2
USBCheckStdRequest();
Ver system\usb9\usb9.c
/* Seccin Modificable */
Insertar otra respuesta de unin de clase de dispositivo USB aqu
/* Fin de la seccin modificable */
463
Estado 3
USBCtrlEPServiceComplete();
} end USBCtrlTrfSetupHandler
4.4.3.4.4.
void USBCtrlTrfOutHandler(void)
Esta rutina une una transaccin OUT de acuerdo con el estado de la transferencia
de control que est actualmente activa.
Nota: Si la transferencia de control es del host al dispositivo, hay que notificar el
dueo de la sesin cada transaccin OUT para dar servicio a los datos recibidos.
void USBCtrlTrfOutHandler(void)
{
if(ctrl_trf_state == CTRL_TRF_RX)
{
USBCtrlTrfRxService();
No preocuparse de reescribir el bit _KEEP porque si est activo, TRNIF no se generar en
primer lugar.
if(ep0Bo.Stat.DTS == 0)
ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN;
else
ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN;
}
else
CTRL_TRF_TX
USBPrepareForNextSetupTrf();
} end USBCtrlTrfOutHandler
4.4.3.4.5.
void USBCtrlTrfInHandler(void)
if(ctrl_trf_state == CTRL_TRF_TX)
{
USBCtrlTrfTxService();
if(ep0Bi.Stat.DTS == 0)
464
else
ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN;
ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN;
}
else
CTRL_TRF_RX
USBPrepareForNextSetupTrf();
} end USBCtrlTrfInHandler
4.4.3.4.6.
void USBCtrlTrfTxService(void)
465
} end while
} end USBCtrlTrfTxService
4.4.3.4.7.
void USBCtrlTrfRxService(void)
4.4.3.4.8.
void USBCtrlEPServiceComplete(void)
Esta rutina consigue que la tarea en servicio sea una repuesta setup. Esta tarea
sirve para configurar los controles del Endpoint apropiadamente para una situacin
dada.
Hay tres:
a. No hay unin para la respuesta, in este caso hay que mandar un
STALL.
b. El host ha respondido con una lectura de transferencia de control,
los Endpoints se necesitan para determinar el camino.
c. El host ha respondido con una escritura de transferencia de
control o no se necesita un estado de control de datos, los
Endpoints se necesitan para determinar el camino.
Se resume el procesamiento del paquete borrando el bit PKTDIS.
void USBCtrlEPServiceComplete(void)
{
if(ctrl_trf_session_owner == MUID_NULL)
{
466
Si ninguno sabe cmo dar servicio a esta respuesta, entonces se para. * If no one knows how to
service this request then stall. Tiene que preparar el EP0 para que reciba la siguiente transaccin SETUP.
ep0Bo.Cnt = EP0_BUFF_SIZE;
ep0Bo.ADR = (byte*)&SetupPkt;
ep0Bo.Stat._byte = _USIE|_BSTALL;
ep0Bi.Stat._byte = _USIE|_BSTALL;
}
else
El modulo demanda el control de la sesin de transferencia.
{
if(SetupPkt.DataDir == DEV_TO_HOST)
{
if(SetupPkt.wLength < wCount._word)
wCount._word = SetupPkt.wLength;
USBCtrlTrfTxService();
ctrl_trf_state = CTRL_TRF_TX;
Control de lectura:
<SETUP[0]><IN[1]><IN[0]>...<OUT[1]> | <SETUP[0]>
1. Prepara EP OUT para responder a una terminacin temprana
NOTA:
Si algo va mal durante la transferencia de control, puede que el host no enve la ltima fase de
estado. Cuando pasa esto, pueden ocurrir dos cosas dependiendo del host:
a) El host enva un RESET
b) El host puede mandar una nueva transaccin SETUP sin enviar primero un
RESET.
Para que el caso b) comunique correctamente, el EP OUT tiene que configurarse para recibir una
transaccin OUT de longitud cero o una nueva transaccin SETUP.
Como la transaccin SETUP necesita que el bit DTS sea DAT0, el estado de longitud cero
necesita que el bit DTS sea DAT1, la comprobacin del bit DTS por hardware tiene que desactivarse. En
este caso el SIE puede aceptar cualquiera de las dos transacciones.
Adems, el byte Cnt se tiene que fijar para prepararse para el dato SETUP (8bytes o mas), y el
buffer de direccin tiene que apuntar al SetupPkt.
ep0Bo.Cnt = EP0_BUFF_SIZE;
ep0Bo.ADR = (byte*)&SetupPkt;
ep0Bo.Stat._byte = _USIE;
Nota: DTSEN es 0
2. Prepara el EP IN para una transferencia de datos, Cnt tiene que estar inicializado para ser el
responsable de una respuesta de dueo.
ep0Bi.ADR = (byte*)&CtrlTrfData;
ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN;
}
else
(SetupPkt.DataDir = HOST_TO_DEV)
{
ctrl_trf_state = CTRL_TRF_RX;
Control Escritura:
<SETUP[0]><OUT[1]><OUT[0]>...<IN[1]> | <SETUP[0]>
1. Prepara el EP IN para responder ante una finalizacin temprana. Es lo mismo que una
respuesta a un paquete de longitud cero para una transferencia de control sin fase de datos.
ep0Bi.Cnt = 0;
ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN;
2. Prepara el EP OUT para recibir datos.
467
ep0Bo.Cnt = EP0_BUFF_SIZE;
ep0Bo.ADR = (byte*)&CtrlTrfData;
ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN;
}
end if(SetupPkt.DataDir == DEV_TO_HOST)
} end if(ctrl_trf_session_owner == MUID_NULL)
El bit PKTDIS se activa cuando se recibe una transaccin Setup. Borrar para resumir el
procesamiento del paquete.
UCONbits.PKTDIS = 0;
} end USBCtrlEPServiceComplete
4.4.3.4.9.
void USBPrepareForNextSetupTrf(void)
La rutina fuerza al EP0 OUT que est listo para una nueva transaccin Setup, y
fuerza a que la CPU controle el EP0 IN.
void USBPrepareForNextSetupTrf(void)
{
ctrl_trf_state = WAIT_SETUP;
ep0Bo.Cnt = EP0_BUFF_SIZE;
ep0Bo.ADR = (byte*)&SetupPkt;
ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN;
usbmmap.h
ep0Bi.Stat._byte = _UCPU;
} end USBPrepareForNextSetupTrf
468
Ver usbctrltrf.h
Definido en usbcfg.h
Inicializacin
EP0
buff
dsc,
ver
4.4.4.
USB_CFG_DSC
cd01;
USB_INTF_DSC
i00a00;
USB_EP_DSC
ep01o_i00a00;
USB_EP_DSC
ep01i_i00a00;
USB_INTF_DSC
i01a00;
USB_EP_DSC
ep02i_i01a00;
cfg01
469
470
de caracteres igual a <size>. <size> se tiene que contar manualmente y meter en las
declaraciones de la matriz. Ejemplo:
Si el string es USB, entonces el string descriptor debe ser:
(Utilizando ndice 02)
rom struct{byte bLength;byte bDscType;word string[3];}sd002={
sizeof(sd002),DSC_STR,'U','S','B'};
Un proyecto USB puede que tenga varios strings y el firmware soporta el control
de mltiples strings como una bsqueda en tabla.
La bsqueda en tabla se define:
rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002};
La declaracin de arriba tiene 3 strings, sd000, sd001 y sd002. Los strings se
pueden aadir o borrar. sd000 es un string descriptor especial, define el idioma,
normalmente es ingls americano (US English (0x0409)). El ndice del string debe ser
igual que el ndice de posicin de la matriz USB_SD_Ptr, &sd000 tiene que estar en la
posicin USB_SD_Ptr[0], &sd001 tiene que estar en la posicin USB_SD_Ptr[1] y as
sucesivamente.
La bsqueda en tabla USB_SD_Ptr la utiliza la funcin de unin string en
usb9.c.
El esquema de bsqueda en tabla tambin se aplica a la descriptor de
configuracin. Un dispositivo USB puede tener varios descriptores de configuraciones,
ej. CFG01, CFG02, etc. Para aadir un descriptor de configuracin, el usuario tiene que
implementar una estructura similar a CFG01.
El siguiente paso es aadir el nombre del descriptor de configuracin, ej. cfg01,
cfg02; a la bsqueda en tabla USB_CD_Ptr. USB_CD_Ptr[0] es muy fcil poner el
titular ya que la configuracin 0 es el estado no configurado de acuerdo con las
especificaciones del USB.
Los tipos de descriptor especficos se definen en:
system\usb\usbdefs\usbdefs_std_dsc.h
La informacin de configuracin se define en:
autofiles\usbcfg.h
4.4.4.1.
Incluye
#include "system\typedefs.h"
#include "system\usb\usb.h"
471
4.4.4.2.
Constantes
#pragma romdata
Descriptor del dispositivo
rom USB_DEV_DSC device_dsc=
{
sizeof(USB_DEV_DSC),
DSC_DEV,
0x0200,
0x00,
0x00,
0x00,
EP0_BUFF_SIZE,
0x04D8,
0x0000,
0x0001,
0x01,
0x02,
0x00,
0x01
};
Descriptor de configuracin 1
CFG01={
Descriptor de configuracin
sizeof(USB_CFG_DSC),
DSC_CFG,
sizeof(cfg01),
1,
1,
0,
_DEFAULT|_RWU,
50,
Descriptor de la interfaz
sizeof(USB_INTF_DSC),
DSC_INTF,
0,
0,
1,
HID_INTF,
BOOT_INTF_SUBCLASS,
HID_PROTOCOL_MOUSE,
0,
472
};
rom struct{byte bLength;byte bDscType;word string[1];}sd000={
sizeof(sd000),DSC_STR,0x0409};
rom struct{byte bLength;byte bDscType;word string[25];}sd001={
sizeof(sd001),DSC_STR,
'M','i','c','r','o','c','h','i','p',' ',
'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'};
rom struct{byte bLength;byte bDscType;word string[22];}sd002={
sizeof(sd002),DSC_STR,
'M','o','u','s','e',' ','I','n',' ','a',' ',
'C','i','r','c','l','e',' ','D','e','m','o'};
473
0x95, 0x02,
0x81, 0x06,
0xC0, 0xC0};
4.4.5.
USBMMAP.C
Este archivo es el que controla la memoria del USB, sirve para asignar la
memoria en cada instante a los Endpoint. Utiliza los tiempos de compilacin de
usbcfg.h instantneamente para los Endpoints y sus buffers.
Cada Endpoint necesita fijar un registro del buffer descriptor (BDT). Un BDT
tiene 4bytes de longitud y una memoria especfica en la RAM para cada Endpoint. El
BDT del EP0 OUT est entre las direcciones 0x400 a 0x403, el BDT del EP0 IN en
0x404 a0x407, el del EP1 OUT 0x408 a 0x40B y as sucesivamente. Estas
localizaciones son correctas con el Buffer Ping-Pong en Modo 0. Estas localizaciones
estn conectadas en el chip. Al hacerlas instantneas, ej. volatile far BDT ep0Bo, es
para proporcionar al compilador de C un camino para direccionar cada variable
directamente. Esto es muy importante porque cuando se puede acceder a un registro
directamente, se ahorra tiempo de ejecucin y se reduce el tamao de programa.
Los Endpoints se definen con el nmero de Endpoint y la direccin de
transferencia. Para simplificar, usbmmap.c slo utiliza el nmero del Endpoint del
esquema de direccionamiento de los registros BDT. Con este mtodo si
MAX_EP_NUMBER es 1, tenemos cuatro BDTs instantneamente: uno para EP0IN,
otro para EP0OUT, que se tiene que inicializar instantneamente para las transferencias
de control por defecto, y otros dos para EP1IN y EP1OUT. El nombre convenido es
ep<#>B<d> donde # es el nmero del Endpoint y d es la direccin de transferencia, que
puede ser <i> o <o>.
El control de la memoria USB utiliza MAX_EP_NUMBER, definido en
usbcfg.h, para saber que Endpoints se necesitan instantneamente. Representa el
nmero mximo de Endpoints que se direccionan, no cuantos Endpoints se utilizan.
Como los BDTs para los Endpoints tienen la direccin asignada en el Bank 4 en
hardware, configurar este valor con un dato muy grande puede que se utilice
inadecuadamente la RAM. Por ejemplo, en una aplicacin se utiliza los EP0 y EP4, el
MAX_EP_NUMBER es 4, y no 2. Los Endpoints del medio (EP1, EP2 y EP3) no se
474
utilizan, y los 24bytes de memoria asociados se pierden. No tiene mucho sentido saltar
Endpoints, pero la decisin final la tiene el usuario.
El paso siguiente es asignar los BDTs instantneos a las distintas funciones del
USB. El firmware asume que cada funcin del USB sabe que Endpoint utiliza, ej. la
transferencia de control por defecto sabe que utiliza el EP0IN y el EP0OUT. Una clase
HID puede elegir que Endpoint utiliza, pero una vez elegido tiene que saber el nmero.
La asignacin de los Endpoints de las funciones del USB se gobiernan en
usbcfg.h. Esto ayuda a prevenir errores de tener ms de una funcin USB con el mismo
Endpoint. La seccin Distribucin de los Endpoints en usbcfg.h proporciona un
ejemplo de cmo distribuir los Endpoints del USB con funciones USB.
Se puede cambiar la configuracin en esta seccin. No hay una forma correcta
de configuracin y los usuarios tienen que elegir el mtodo ms adecuado para la
aplicacin.
Normalmente, un usuario mapear lo siguiente para una funcin de interfaz:
1.
2.
3.
4.
El ID de la interfaz USB
Los registros de control de los Endpoint (UEPn)
El registro BDT (ep<#>B<d>)
El tamao del Endpoint.
0x00
#define FOO_UEP
UEP1
#define FOO_BD_OUT
ep1Bo
#define FOO_BD_IN
ep1Bi
#define FOO_EP_SIZE
64
475
Para que la variable sea accesible globalmente con otros ficheros, se tiene que
declarar en el archivo de cabecera usbmmap.h como una definicin externa, como
extern volatile far unsigned char[FOO_EP_SIZE] data;
Conclusin:
Las dependencias entre usbcfg y usbmmap se pueden mostrar como:
usbcfg[MAX_EP_NUMBER] -> usbmmap
usbmmap[ep<#>B<d>] -> usbcfg
usbcfg[EP size] -> usbmmap
usbcfg[abstract ep definitions] -> usb9/hid/cdc/etc class code
usbmmap[endpoint buffer variable] -> usb9/hid/cdc/etc class code
El mapeo proporciona una manera directa de direccionado de BDT y un buffer
del Enpoint. Esta forma utiliza menos punteros, y se equipara con un cdigo de
programa ms rpido y pequeo.
4.4.5.1.
Incluye
#include "system\typedefs.h"
#include "system\usb\usb.h"
4.4.5.2.
#pragma udata
byte usb_device_state;
USB_DEVICE_STATUS usb_stat;
byte usb_active_cfg;
byte usb_alt_intf[MAX_NUM_INT];
4.4.5.3.
Endpoint #1 BD Out
Endpoint #1 BD In
476
Endpoint #2 BD Out
Endpoint #2 BD In
Endpoint #3 BD Out
Endpoint #3 BD In
Endpoint #4 BD Out
Endpoint #4 BD In
Endpoint #5 BD Out
Endpoint #5 BD In
Endpoint #6 BD Out
Endpoint #6 BD In
Endpoint #7 BD Out
Endpoint #7 BD In
Endpoint #8 BD Out
Endpoint #8 BD In
Endpoint #9 BD Out
Endpoint #9 BD In
477
478
4.4.6.
En este archivo se han creado todas las funciones de transferencia de los datos
que desee el usuario en la clase genrica.
4.4.6.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#ifdef USB_USE_GEN
4.4.6.2.
Variables
#pragma udata
byte usbgen_rx_len;
4.4.6.3.
Declaraciones
#pragma code
4.4.6.4.
4.4.6.4.1.
void USBGenInitEP(void)
479
4.4.6.4.2.
480
4.4.6.4.3.
Precondicin: El valor del argumento de entrada len tiene que ser menor que
el tamao mximo del Endpoint responsable de la recepcin del informe de datos del
host para la clase HID.
El argumento de entrada buffer debe apuntar al rea de buffer que sea
mayor o igual que len.
Salida: El nmero de bytes copiados al buffer.
Efectos secundarios: el acceso a la variable pblica usbgen_rx_len se actualiza
con el nmero de bytes copiados al buffer. Una vez llamado USBGenRead, la
recuperacin de usbgen_rx_len se puede hacer llamando la macro
mUSBGenGetRxLength().
USBGenRead copia un string de los bytes recibidos a travs de un Endpoint
OUT a una localizacin especificada por el usuario. Es una funcin que espera a recibir
los datos si no estn disponibles. Devuelve 0 para notificar que no hay datos
disponibles.
Nota: Si el nmero actual de bytes recibidos es mayor que el nmero de bytes
esperados (len), slo se copian el nmero de bytes esperados al buffer.
Si el nmero de bytes recibidos es menor que el nmero de bytes
esperados (len), se copian los bytes recibidos al buffer.
byte USBGenRead(byte *buffer, byte len)
{
usbgen_rx_len = 0;
if(!mUSBGenRxIsBusy())
{
Ajusta el nmero de bytes que se esperan al nmero de bytes recibidos.
if(len > USBGEN_BD_OUT.Cnt)
len = USBGEN_BD_OUT.Cnt;
Copia los datos de la ram-dual al buffer del usuario
for(usbgen_rx_len = 0; usbgen_rx_len < len; usbgen_rx_len++)
buffer[usbgen_rx_len] = usbgen_out[usbgen_rx_len];
Prepara la ram-dual para la prximo transaccin OUT.
USBGEN_BD_OUT.Cnt = sizeof(usbgen_out);
mUSBBufferReady(USBGEN_BD_OUT);
} end if
return usbgen_rx_len;
} end USBGenRead
#endif
def USB_USE_GEN
481
4.4.7.
En este archivo se han creado todas las funciones de transferencia de los datos
que desee el usuario en la clase MSD.
4.4.7.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include<string.h>
#ifdef USB_USE_MSD
4.4.7.2.
Variables
#pragma udata
byte MSD_State;
USB_MSD_CBW gblCBW;
byte gblCBWLength;
SDCSTATE gblFlag;
RequestSenseResponse gblSenseData;
byte *ptrNextData;
482
4.4.7.3.
Protoripos privados
void MSDCommandHandler(void);
void MSDInquiryHandler(void);
void MSDReadCapacityHandler(void);
void MSDReadHandler(void);
void MSDWriteHandler(void);
void MSDModeSenseHandler(void);
void MSDMediumRemovalHandler(void);
void MSDRequestSenseHandler(void);
void MSDTestUnitReadyHandler(void);
void MSDVerifyHandler(void);
void MSDStopStartHandler(void);
byte IsMeaningfulCBW(void);
byte IsValidCBW(void);
void PrepareCSWData(void);
void SendData(byte*, byte);
void SendCSW(void);
void ResetSenseData(void);
void MSDDataIn(void);
void MSDDataOut(void);
extern SDC_Error MediaInitialize(SDCSTATE*);
extern void SocketInitialize(void);
extern SDC_Error SectorRead(dword, byte*);
extern SDC_Error SectorWrite(dword, byte*);
extern SDC_Error CSDRead(void);
extern int DetectSDCard (void);
extern byte IsWriteProtected(void);
4.4.7.4.
Declaraciones
#pragma code
4.4.7.5.
4.4.7.5.1.
void USBCheckMSDRequest(void)
483
4.4.7.5.2.
void ProcessIO(void)
4.4.7.5.3.
void MSDInitEP(void)
4.4.7.5.4.
void SDCardInit(void)
4.4.7.5.5.
void MSDCommandHandler(void)
4.4.7.5.6.
void SendCSW(void)
484
4.4.7.5.7.
4.4.7.5.8.
void MSDDataIn(void)
4.4.7.5.9.
void IsValidCBW()
4.4.7.5.10.
void IsMeaningfulCBW()
4.4.7.5.11.
con
void PrepareCSWData()
Esto prepara el dato de estado del CSW copiando el dCSWTag del CBWTage y
fijando la firma de vlido CSW=53425355h
4.4.7.5.12.
void MSDInquiryHandler(void)
4.4.7.5.13.
void ResetSenseData(void)
Sense,
485
inicializando
la
estructura
4.4.7.5.14.
void MSDReadCapacityHandler()
Esta funcin procesa el dato del registro CSD (leido durante la inicializacin de
la tarjeta SD) para encontrar el nmero de bloques (gblNumBLKS) y la longitud del
bloque (gblBLKLen). Este dato se copia a msd_buffer y se prepara para responder al
comando Leer Capacidad.
4.4.7.5.15.
void MSDReadHandler(void)
4.4.7.5.16.
void MSDDataOut(void)
Efectos
secundarios:
MSD_BD_OUT.ADR
se
incrementa
MSD_OUT_EP_SIZE (para leer los 64B siguientes en msd_buffer).
con
4.4.7.5.17.
void MSDWriteHandler()
4.4.7.5.18.
void MSDRequestSenseHandler(void)
Esta funcin prepara el Dato Sense para responder al comando Respuesta Sense.
El contenido de la estructura RequestSenseResponse se copia a msd_buffer y se fija un
satisfactorio bCSWStatus=0x00.
4.4.7.5.19.
void MSDModeSenseHandler()
486
4.4.7.5.20.
void MSDMediumRemovalHandler()
4.4.7.5.21.
void MSDTestUnitReadyHandler()
4.4.7.5.22.
void MSDVerifyHandler()
4.4.7.5.23.
void MSDStopStartHandler()
487
4.4.8.
En este archivo se han creado todas las funciones de transferencia de los datos
que desee el usuario en la clase CDC.
4.4.8.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#ifdef USB_USE_CDC
4.4.8.2.
Variables
#pragma udata
byte cdc_rx_len;
Longitud total rx
byte cdc_trf_state;
POINTER pCDCSrc;
POINTER pCDCDst;
byte cdc_tx_len;
byte cdc_mem_type;
SEND_ENCAPSULATED_COMMAND
y
GET_ENCAPSULATED_RESPONSE se necesitan para responder de acuerdo a las
especificaciones CDC. Sin embargo, realmente no se empieza a usar aqu, se utiliza un
buffer por comodidad.
#define dummy_length
0x08
byte dummy_encapsulated_cmd_response[dummy_length];
4.4.8.3.
Declaraciones
#pragma code
4.4.8.4.
4.4.8.4.1.
void USBCheckCDCRequest(void)
Esta rutina chequea el paquete de datos setup para ver si este sabe como
manipularlo.
488
4.4.8.5.
4.4.8.5.1.
void CDCInitEP(void)
4.4.8.5.2.
Precondicin: El valor del argumento de entrada len tiene que ser menor que
el tamao mximo del Endpoint responsable de la recepcin de datos bulk del host para
la clase CDC.
El argumento de entrada buffer tiene que apuntar a un rea mayor o igual que
el tamao especificado por len.
Entrada: Buffer: Puntero a donde se guardan los datos recibidos.
len: El nmero de bytes esperados.
Salida: El nmero de bytes copiados al buffer.
Efectos secundarios: Se actualiza la variable de acceso pblico cdc_rx_len con
el nmero de bytes copiados al buffer. Para recuperar esta variable llamamos a la macro
mCDCGetRxLength().
getsUSBUSART copia un string de bytes recibidos a travs del Endpoint OUT
CDC Bulk a una localizacin especificada por el usuario. Es una funcin de no bloqueo.
No espera a los datos si no estn disponibles. Devuelve un 0 para notificar que no hay
datos disponibles.
Nota: Si el nmero actual de bytes recibidos es mayor que el nmero de bytes
esperados (len), slo se copian el nmero de bytes esperados. En cambio, si es menor el
nmero de los recibidos, se copian todos.
4.4.8.5.3.
489
4.4.8.5.4.
4.4.8.5.5.
void CDCTxService(void)
490
4.4.9.
En este archivo se han creado todas las funciones de transferencia de los datos
que desee el usuario en la clase HID.
4.4.9.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#ifdef USB_USE_HID
4.4.9.2.
Variables
#pragma udata
byte idle_rate;
byte active_protocol;
byte hid_rpt_rx_len;
4.4.9.3.
Prototipos privados
void HIDGetReportHandler(void);
void HIDSetReportHandler(void);
4.4.9.4.
Declaraciones
#pragma code
4.4.9.5.
4.4.9.5.1.
void USBCheckHIDRequest(void)
Esta rutina chequea el paquete de datos especfico para ver si sabe como
manipularlo.
4.4.9.6.
4.4.9.6.1.
void HIDInitEP(void)
491
4.4.9.6.2.
4.4.9.6.3.
Precondicin: El valor del arguemento de entrada len tiene que ser menor que
el tamao mximo del Endpoint responsable de la recepcin de datos del host USB para
la clase HID. El argumento de entrada buffer tiene que apuntar a un rea mayor o
igual al tamao especificado por len.
Entrada: buffer: Puntero al lugar donde se guardan los datos recibidos.
len: Nmero de bytes que se esperan.
Salida: Nmero de bytes copiados al buffer.
Efectos secundarios: Se actualiza la variable de acceso pblico hid_rpt_rx_len
con el nmero de bytes copiados al buffer. Para recuperar esta variable llamamos a la
macro mHIDGetRptRxLength().
HIDRxReport copia un string de bytes recibidos a travs del Endpoint OUT HID
a una localizacin especificada por el usuario. Es una funcin de no bloqueo. No espera
a los datos si no estn disponibles. Devuelve un 0 para notificar que no hay datos
disponibles.
Nota: Si el nmero actual de bytes recibidos es mayor que el nmero de bytes
esperados (len), slo se copian el nmero de bytes esperados. En cambio, si es menor el
nmero de los recibidos, se copian todos.
492
4.4.10.
MAIN.C
4.4.10.1.
Incluye
#include <p18cxxx.h>
#include "system\typedefs.h"
Requerido
#include "system\usb\usb.h"
Requerido
#include "io_cfg.h"
Requerido
#include "system\usb\usb_compile_time_validation.h"
Opcional
#include "user\user_mouse.h"
Modificable
4.4.10.2.
Variables
#pragma udata
4.4.10.3.
Prototipos privados
4.4.10.3.1.
Remapeo de vectores
4.4.10.3.2.
Declaraciones
#pragma code
void main(void)
void main(void)
{
InitializeSystem();
while(1)
{
USBTasks()
ProcessIO();
} end while
} end main
USB Tasks
Aqui se llama al programa del usuario
493
#if defined(USE_USB_BUS_SENSE_IO)
tris_usb_bus_sense = INPUT_PIN;
Ver io_cfg.h
#endif
#if defined(USE_SELF_POWER_SENSE_IO)
tris_self_power = INPUT_PIN;
#endif
mInitializeUSBDriver();
Ver usbdrv.h
UserInit();
} end InitializeSystem
void USBTasks(void)
Precondicin: Se tiene que haber llamado InitializeSystem
Da vueltas dando servicio a las tareas USB.
void USBTasks(void)
{
Da servicio al Hardware
USBCheckBusStatus();
if(UCFGbits.UTEYE!=1)
USBDriverService();
} end USBTasks
494
4.4.11.
INTERRUPT.C
En este archivo se declaran la parte del programa que se ejecuta durante una
interrupcin.
4.4.11.1.
Incluye
#include <p18cxxx.h>
#include "system/typedefs.h"
#include "system/interrupt/interrupt.h"
4.4.11.2.
Vectores de interrupcin
4.4.11.3.
Declaraciones
4.4.11.3.1.
void high_isr(void)
4.4.11.3.2.
void low_isr(void)
void low_isr(void)
{
}
#pragma code
495
5. LENGUAJE DE PROGRAMACIN
VISUAL BASIC
499
5.
5.1.
INTRODUCCIN
Tal fue ese abandono por parte de los usuarios, que la aparicin del QuickBASIC de Microsoft, una versin ya potente del BASIC, que correga casi todos los
defectos de las versiones pas prcticamente inadvertida, a no ser porque las ltimas
versiones del sistema operativo MS-DOS incluan una versin de Quick-BASIC algo
recortada (Q-Basic) como un producto mas dentro de la amplia gama de ficheros
ejecutables que acompaan al sistema operativo, y aprovecha de l el editor de textos
(Cada vez que se llama al EDIT estamos corriendo el editor del Q-Basic).
Esta versin del popular BASIC ya es un lenguaje estructurado, lo que permite
crear programas modularmente, mediante subrutinas y mdulos, capaz de crear
programas ya competitivos con otros lenguajes de alto nivel. Sin embargo llegaba tarde,
pues los entornos MS-DOS estaban ya superados por el entorno grfico Windows.
Sin embargo algo haba en el BASIC que tentaba a superarse: su gran sencillez
de manejo. Si a esto se le aade el entorno grfico Windows, el aprovechamiento al
mximo de las posibilidades de Windows en cuanto a intercambio de informacin, de
sus libreras, de sus drivers y controladores, manejo de bases de datos, etc. el producto
resultante puede ser algo que satisfaga todas las necesidades de programacin en el
entorno Windows. La suma de todas estas cosas es VISUAL - BASIC. Esta herramienta
conserva del BASIC de los aos 80 nicamente su nombre y su sencillez, y tras su
lanzamiento al mercado, la aceptacin a nivel profesional hizo borrar por fin el "mal
nombre" asociado a la palabra BASIC.
Actualmente (2001) se est comercializando la versin 6.0 de este producto.
Desde su salida al mercado, cada versin supera y mejora la anterior. Dados los buenos
resultados a nivel profesional de este producto, y el apoyo prestado por el fabricante
para la formacin de programadores, Visual-Basic se ha convertido en la primera
herramienta de desarrollo de aplicaciones en entorno Windows.
Es obligado decir sin embargo, que sigue siendo BASIC. No se pueden
comparar sus prestaciones con otros lenguajes cuando deseamos llegar al fondo de la
mquina y controlar uno a uno sus registros. No es ese el fin perseguido con VB y si es
necesario llegar a esas precisiones ser necesario utilizar otro lenguaje que permita bajar
el nivel de programacin. (Visual-C). o realizar libreras (DLLs) que lo hagan. En la
mayor parte de las aplicaciones, las herramientas aportadas por VB son mas que
suficiente para lograr un programa fcil de realizar y de altas prestaciones.
500
5.2.
501
5.3.
TIPOS DE DATOS
5.3.1.
CONSTANTES
5.3.2.
VARIABLES
5.3.2.1.
Nombre
El nombre de una variable tiene que comenzar por una letra, puede tener hasta
255 caracteres de longitud y debe ser nico dentro de su mbito.
Los caracteres pueden ser letras, dgitos, el carcter subrayado (_) y los
caracteres de declaracin de tipo de la variable (%, &, !, #, @ y $). Los caracteres de
declaracin de tipo, cuando se utilicen, tienen que ocupar la ltima posicin.
No se pueden utilizar el punto (.) ni otros que tienen un significado especial en
VB (por ejemplo, los parntesis). El nombre de una variable no puede ser una palabra
reservada de VB (como For, Caption, Long, And...)
502
5.3.2.2.
Tipo
Todas las variables tienen un tipo de dato que determina la clase de datos que
pueden almacenar:
CAR-
TIPO
DESCRIPCION
Integer
Entero (2 bytes)
-32768 a 32767
Long
&
-2147483648 a 2147483647
Single
-3.40E+38 a 3.40E+38
Double
-1.79D+308 a 1.79D+308
Currency
9223372036854775807
String
(no)
String
Cadena de c. Variable
Byte
Carcter (1 byte)
(no)
0 a 255
Boolean
Boolean (2 bytes)
(no)
True o False
Date
(no)
1/1/100 a 3 1/12/9999
Object
Referencia a un objeto
(no)
Variant
(no)
TIPO
503
RANGO
Numrico = Double
Cadena = String
5.3.2.3.
mbito
5.3.3.
OPERADORES
OPERACIN
OPERADOR
Aritmticos
Exponenciacin
Cambio de signo
Multiplicacin, divisin
Divisin entera
Resto de div. entera
Suma, resta
^
*,/
\
Mod
+,-
Concatenacin
Enlazar cadenas
&
Relacional
Otros
Like
Is
Lgico
Negacin
And
Or inclusiva (Or)
Or Exclusiva (Xor)
Equivalencia (opuesto a Xor)
Implicacin
Not
And
Or
Xor
Eqv
Imp
504
5.3.4.
SENTENCIAS DE CONTROL
5.3.4.1.
Sentencia If
Donde condicin debe ser una expresin numrica, relacional o lgica (el
resultado que se obtiene al evaluar la condicin es Trae o False, y accin 1 | accin2
son una o ms sentencias separadas por :.
Si la condicin es verdadera, se ejecuta la accin 1 y si es falsa se ejecuta la
accin2, lgicamente en el caso de que sea especificada.
En cualquier caso, la ejecucin contina con la siguiente sentencia ejecutable.
505
5.3.4.2.
Sentencia Select
La sentencia Select permite ejecutar una de varias acciones en funcin del valor
de una expresin. Es una alternativa a la sentencia If cuando lo que se necesita es
comparar la misma expresin con diferentes valores.
Su sintaxis es:
Select Case expr-test
Case lista-1
[sentencias-1]
[Case lista-2
[sentencias-2]] ...
[Case Else
[sentencias-n]]
End Select
5.3.4.3.
Sentencia ForNext
La sentencia Exit For permite salir del bucle For...Next antes de que ste finalice
normalmente.
La/s variable/s en la sentencia Next pueden ser omitidas, en cuyo caso la
sentencia Next actuar sobre la sentencia For ms reciente (aunque se recomienda
incluir las variables, evitando confusiones).
506
5.3.4.3.1.
5.3.4.4.
Sentencia WhileWend
5.3.4.4.1.
507
5.3.4.5.
Sentencia DoLoop
[sentencias]
[Exit Do]
[sentencias]
Loop
Formato 2:
Do
[sentencias]
[Exit Do]
[sentencias]
5.3.4.6.
Sentencia Goto
Transfiere el control a una lnea especfica del cdigo, identificada por una
etiqueta o n de lnea. Su sintaxis es:
Goto {etiqueta|n de lnea}
508
5.4.
5.4.1.
5.4.1.1.
Inroduccin
5.4.1.2.
FUNCIONES
5.4.1.2.1.
MPUSBGetDLLVersion(Void)
5.4.1.2.2.
MPUSBGetDeviceCount(pVID_PID)
509
5.4.1.2.3.
MPUSBOpen(instance,
dwReserved)
pVID_PID,
pEP,
dwDir,
510
Este argumento puede ser NULL (nulo) para crear lazos con Endpoints
de funciones no especficas.
Las funciones
MPUSBReadInt.
especficas
son:
MPUSBRead,
MPUSBWrite,
5.4.1.2.4.
MPUSBRead(handle,
dwMilliseconds)
pData,
dwLen,
pLength,
handle: Input: Identifica la pipe del Endpoint que se va a leer. La pipe unida
tiene que crearse con el atributo de acceso MP_READ.
pData: Output: Puntero al buffer que recibe el dato ledo de la pipe.
dwLen: Input: Especifica el nmero de bytes que hay que leer de la pipe.
pLenght: Output: Puntero al nmero de bytes ledos. MPUSBRead pone este
valor a cero antes de cualquier lectura o de chequear un error.
dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La
funcin vuelve si transcurre el intervalo aunque no se complete la operacin.
Si dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve
inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out
nunca termina.
MPUSBRead(myInPipe, VarPtr(s(0)), DatosDeseados, Datos, 1000)
511
5.4.1.2.5.
MPUSBWrite(handle,
dwMilliseconds)
pData,
dwLen,
pLength,
handle: Input: Identifica la pipe del Endpoint que se va a escribir. La pipe unida
tiene que crearse con el atributo de acceso MP_WRITE.
pData: Output: Puntero al buffer que contiene los datos que se van a escribir en
la pipe.
dwLen: Input: Especifica el nmero de bytes que se van a escribir en la pipe.
pLenght: Output: Puntero al nmero de bytes que se escriben al llamar esta
funcin. MPUSBWrite pone este valor a cero antes de cualquier lectura o de
chequear un error.
dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La
funcin vuelve si transcurre el intervalo aunque no se complete la operacin.
Si dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve
inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out
nunca termina.
MPUSBWrite(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000)
5.4.1.2.6.
MPUSBReadInt(handle,
dwMilliseconds)
pData,
dwLen,
pLength,
handle: Input: Identifica la pipe del Endpoint que se va a leer. La pipe unida
tiene que crearse con el atributo de acceso MP_READ.
pData: Output: Puntero al buffer que recibe el dato ledo de la pipe.
dwLen: Input: Especifica el nmero de bytes que hay que leer de la pipe.
pLenght: Output: Puntero al nmero de bytes ledos. MPUSBRead pone este
valor a cero antes de cualquier lectura o de chequear un error.
dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La
funcin vuelve si transcurre el intervalo aunque no se complete la operacin.
Si dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve
inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out
nunca termina.
MPUSBReadInt(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000)
5.4.1.2.7.
MPUSBClose(handle)
512
5.4.1.3.
TIPOS DE TRANSFERENCIAS
Funcin
Aplicable time-out?
Interrupt IN
MPUSRead, MPUSReadInt
si
Interrupt OUT
MPUSBWrite
si
Bulk IN
MPUSBRead
si
Bulk OUT
MPUSWrite
si
Isochronous IN
MPUSBRead
no
Isochronous OUT
MPUSBWrite
no
5.4.1.4.
En Visual Basic:
out_pipe= \MCHP_EPx
in_pipe= \MCHP_EPy
En C y Delphi:
out_pipe= \\MCHP_EPx
in_pipe= \\MCHP_EPy
Siendo x e y nmeros del Endpoint por los que se van a realizar las
transmisiones.
513
5.4.1.5.
5.4.1.5.1.
5.4.1.5.2.
VB
514
5.4.1.5.3.
Delphi
515
DWORD,
pLength:
pLength:
pLength:
6. INTERCONEXIN
USB-PC
519
6.
INTERCONEXIN USB-PC
6.1.
INTRODUCCIN
6.2.
ARQUITECTURA WINDOWS
6.3.
6.4.
EL DRIVER .SYS
Una vez actualizada la tabla DriverObject, el driver puede efectuar las primeras
operaciones (inicializacin o carga del cdigo, por ejemplo). Los programas se quedan
en reposo hasta que la aplicacin efecta una peticin o se produce un evento
(desconexin, por ejemplo).
6.4.1.
Pueden utilizarse varios grupos de funciones para dialogar. El primero utiliza las
funciones bsicas de creacin, apertura, lectura y escritura en un fichero. El perifrico se
ve como un fichero, y este grupo no permite el envo de mensajes de control sobre el
Endpoint 0.
El inters de estas funciones es que utilizan los puntos de entrada clsicos de
Windows. A priori, pueden utilizarse todos los compiladores de 32bits. La familia de
funciones Device IOControl permite un acceso ms completo al USB. Como decamos
al principio de este captulo, se puede obtener informacin ms completa en Microsoft.
520
6.4.2.
GESTIN DE BUGS
6.4.3.
CARACTERSTICAS DE UN DRIVER
No hay que creer que un driver no es ms que eso: un driver; del mismo modo
que para un mecnico profesional no hay slo un coche. Las particulares caractersticas
hacen que un driver sea diferente del resto. Todo lo que ocurra depender del driver, por
tanto, de la eleccin del software por parte del desarrollador de ese programa. Por esto,
vamos a comentar las principales caractersticas de un driver.
En este punto se irn comentando las caractersticas del driver mchpusb.sys de
Microchip.
521
6.4.3.1.
Principios De Acceso
La aplicacin puede acceder al driver tanto por los puntos de entrada clsicos
Read y Write, como por la funcin IoControl. En el primer caso, se pasa solamente un
buffer, en el otro, se pasan dos buffers y un cdigo de funcin. El desarrollador puede
elegir una u otra solucin, incluso las dos. La primera permite ofrecer una
compatibilidad descendente con los anteriores sistemas orientados a ficheros, pero es
ms frecuente la segunda solucin, ya que permite hacer otras peticiones, tales como las
de estado.
El cdigo de funcin IoControl depende del desarrollador. Sin embargo, las
opciones elegidas por este modifican el cdigo en funcin de los campos de bits
normalizados.
La librera de Microchip hace la transferencia IoControl.
6.4.3.2.
Modo De Acceso
6.4.3.3.
6.4.3.4.
Paso De Datos
Para paquetes pequeos, nicamente se pasa el puntero, que suele ser la solucin
ms sencilla. Cuando el paquete es mayor, se pasa una estructura que describe el
paquete, ya que este puede encontrarse en distintas posiciones de la memoria. Todo esto
puede resultar transparente para la aplicacin, sin embargo, el driver debe ser capaz de
manejar ambos casos.
522
6.4.3.5.
Limitacin de 4Kbytes
En las capas ms profundas del sistema operativo, hay que moverse rpido y
no se puede andar dividiendo los paquetes en bloques. Esto viene a cuento porque existe
una restriccin fsica de 4Kbytes que se localiza a nivel del DMA. As, un driver que
reciba un paquete superior a 4Kbytes debe ser troceado y pasado al USB en
subpaquetes. El driver de Microsoft BULK sirve precisamente para esto.
6.4.3.6.
Mltiples Perifricos
En este caso nos pasamos al otro lado, o sea, al dilogo hacia el perifrico USB.
La aplicacin tiene puntos de entrada hacia el driver (pasando por el sistema),
pero el sistema dialoga tambin con el driver.
Cuando el sistema detecta un nuevo perifrico USB, le solicita su PID y VID por
el fichero inf (o el descriptor). El sistema carga el driver y le pide un nombre de fichero.
Ser este nombre el que utilizar la aplicacin para abrir el fichero (create).
Desafortunadamente, si este nombre ya existe, por ejemplo, por que el driver
haya sido utilizado anteriormente para cargar un perifrico idntico al que se trata de
instalar, el sistema lo rechazar y devolver un mensaje negativo al driver. Un driver
con mltiples perifricos propondr otro nombre.
La gestin de mltiples perifricos obliga sin embargo a mantener informacin
para cada perifrico. Utilizando en cada vez un VID/PID diferente, se puede rodear el
problema con el mismo driver. El nombre que permite asociar la aplicacin con su
driver tiene una importancia decisiva. Este nombre debe ser conocido por la aplicacin
y nico, de otro modo, ser rechazado por el sistema. Por ello Microchip permite
registrar el PID.
6.4.3.7.
6.4.3.8.
El sistema operativo (OS) tambin tiene peticiones que hacer. Microsoft, que
controla el OS, ha hecho evolucionar las peticiones a medida que el USB ha ido
avanzando. Incluso aunque el desarrollo de los perifricos se hubiera estancado, la
evolucin del sistema operativo es constante, por lo que hay que actualizar el driver.
523
6.5.
EL DRIVER DE MICROCHIP
A lo largo del captulo, se han comentado carctersticas del driver que cede
Microchip para desarrollar aplicaciones para sus microcontroladores.
Al disponer de un driver estable con las caractersticas apropiadas y con un
mbito de aplicacin muy grande, por sencillez y comodidad, se utilizar este. El
problema es que dependiendo de la aplicacin habr que modificar el PID y el VID,
aunque este ltimo no es recomendable.
Para realizar las modificaciones oportunas, no hay que programar; lo que hay
que hacer es modificar el archivo .inf desde el bloc de notas. Cambiando el VID, el PID
y el nombre, descripcin y los dems datos que aparecen en las ltimas lneas. Con estas
pequeas y sencillas modificaciones se adapta el driver de Microchip a nuestra
aplicacin.
524
7. APLICACIN
527
7.
APLICACIN
7.1.
INTRODUCCIN
7.2.
CIRCUITO ELCTRICO
7.2.1.
528
7.2.2.
COMPONENTES
7.2.2.1.
Microcontrolador
7.2.2.2.
ULN2803
Este dispositivo es un buffer de alta tensin y alta corriente, formado por una
matriz de ocho transistores interconectados en Darlington.
Sus ocho transistores NPN estn diseados especialmente para interconectar
circuitos lgicos de baja potencia (TTL, CMOS o PMOS/NMOS) con componentes que
requieren alta tensin/corriente como bombillas, motores, relees.
Tambin pertenece a la familia de este integrado el ULN2804, la diferencia entre
ambos, reside en que este ltimo est diseado para amplificar dispositivos CMOS o
PMOS y el ULN2803 los TTL.
Como el microcontrolador tiene lgica TTL, se ha utilizado el ULN2803, para
amplificar los pulsos de control del motor paso a paso, las bombillas, los LEDs y el
zumbador.
La conexin es sencilla:
Las salidas del micro se conectan en las entradas del buffer.
El terminal 9 es GND, por lo que se conecta a la masa del circuito.
El terminal 10 es COM, que se conecta a la alimentacin del circuito de
salida, en este caso, se conecta a la fuente de alimentacin.
Las salidas, cuando se activan proporcionan 0V, por lo que se utilizan
como la masa del componente que se quiere amplificar.
529
7.2.2.3.
L293D
7.2.2.4.
Sensor De Distancia
7.2.2.5.
Finales De Carrera
Los conmutadores del tipo final de carrera (en el circuito aparece como FINx,
siendo x el nmero del componente), se utilizan, en este caso, para detectar cuando se
choca el coche con algn objeto ya que al terminal del microcontrolador le llegan 5V.
Las resistencias conectadas en paralelo con los conmutadores, se utilizan para
que en el momento de cambio entre las dos posiciones del interruptor, al micro le sigan
llegando 0V y reconozca un nivel bajo en la entrada hasta que el interruptor cambie.
Impidiendo as, el estado de alta impedancia.
530
7.2.2.6.
Zumbador
7.2.2.7.
Bombillas Y LEDs
Las bombillas y los LEDs se utilizan para simular las luces del coche. Como el
zumbador, se conectan al ULN2803 para suministrar la corriente necesaria.
Los LEDs utilizados son sper LEDs rojos. La diferencia entre un LED normal y
estos, es que estos lucen con ms intensidad que los tradicionales.
7.2.2.8.
Conector USB
531
7.2.2.9.
Estos polos pueden ser invertidos fcilmente con slo cambiar la polaridad de la
bobina, por otro lado al ncleo de las bobinas las convierte en un electroimn, como las
cargas opuestas o polos opuestos se atraen y cargas del mismo signo o polos del mismo
signo se repelen, esto hace que el eje del motor gire produciendo un determinado torque.
Torque
S
N N
Torque
532
7.2.2.9.1.
Existen varias formas de lograr que estos motores inviertan su sentido de giro
una es utilizando una fuente simtrica o dos fuentes de alimentacin con un interruptor
simple de dos contactos y otra es utilizar una fuente comn con un interruptor doble es
decir uno de 4 contactos, en todos los casos es bueno conectar tambin un condensador
en paralelo entre los bornes del motor, ste para amortiguar la induccin que generan las
bobinas internas del motor (aunque no aparece representado para facilitar un poco la
comprensin del circuito), las conexiones seran:
Con fuente simtrica:
+12V
+12V
-12V
GND -12V
GND
12V
12V
+Vcc
Control
GND
-Vcc
533
+Vcc
Control2 Control1
"1"
"1"
Control1
"0"
Control2
"0"
GND
GND
Estos Driver's son circuitos integrados que facilitan el diseo de los circuitos,
tales como el UCN5804, el BA6286, el L293B, L297, L298 o tambin con el ULN2803
o el ULN2003, estos dos ltimos son arrays de transistores, como se ha explicado
anteriormente.
7.2.2.9.2.
M1
M2
+Vs
GND
A
11
10
14
B
15
16
9
1/2 L293
4, 5, 12, 13
534
+Vcc
Ven
M1
M2
Parado
Encendido
Encendido
Parado
Alta
Impedancia
Alta
Impedancia
+Vs
B
2
16
1
1/2 L293
4, 5, 12, 13
535
+Vcc
Ven
Sentido 1
Sentido 2
C=D
Parado
Motor Libre
7.2.2.9.3.
Control De La Velocidad
T1
Salida
R1
R2
T2
1
0
T1>T2
T1=0,7(R1+R2)C
T2=0,7R2C
536
Claro que para mayor velocidad la frecuencia de los pulsos ira mucho ms
rpido de lo que se muestra en esta imagen.
El esquema para el 555 podra ser:
Vcc
R1
R2
R3
7
6
2
C1
7.2.2.9.4.
4
R
DISCH
8
Vcc
555
OUT
Clock
THERS
TRIG
GND
Los motores suelen girar entre 2700 y 2800rpm sin carga, pero con un par de 15
a 26gcm. Se necesitar crear un sistema de transmisin del movimiento que reduzca la
velocidad y aumente el par de giro, es decir, una reductora. Una reductora est formada
por engranajes y/o poleas.
A los motores elegidos para la aplicacin, les acompaa una reductora
seleccionable mediante una sencilla configuracin. En la aplicacin, se ha seleccionado
una reductora de 243:1 ya que la siguiente inferior genera un par muy pequeo y la
siguiente superior una velocidad muy reducida.
537
7.2.2.10.
A diferencia de los Motores-CC que giran a todo lo que dan cuando son
conectados a la fuente de alimentacin, los Motores-PaP solamente giran un ngulo
determinado, los primeros slo disponen de dos terminales de conexin, mientras los
otros pueden tener 4, 5 6, segn el tipo de motor que se trate, por otro lado los motores
de corriente continua no pueden quedar enclavados en una sola posicin, mientras los
motores paso a paso s.
Los motores paso a paso son comnmente utilizados en situaciones en que se
requiere un cierto grado de precisin, por ejemplo en las disqueteras se puede encontrar
unido al cabezal hacindolo avanzar, retroceder o posicionarse en una determinada
regin de datos alojadas en el disquete.
El ngulo de giro de estos motores es muy variado pasando desde los 90 hasta
los 1.8 e incluso 0.72, cada ngulo de giro, (tambin llamado paso) se efecta
enviando un pulso en uno de sus terminales, es decir que por ejemplo en motores que
tienen 90 de giro por paso, se requiere 4 pulsos para dar una vuelta completa, mientras
que en los de 1,8 necesitas 200 pulsos, y en los otros necesitas 500.
Los Motores-PaP suelen ser clasificado en dos tipos, segn su diseo y
fabricacin pueden ser Bipolares o Unipolares:
Motor paso a paso bipolar:
1a
1b
2a
2b
2a
2b
538
7.2.2.10.1.
Motores Bipolares
Para identificar los cables 1a, 1b, 2a y 2b, hay que medir la resistencia entre cada
par de terminales, ya que los extremos 1a y 1b deben tener la misma resistencia que los
extremos 2a y 2b, ahora si se mide la resistencia en forma cruzada no marcar nada ya
que corresponden a bobinas distintas.
Para controlar estos motores hay que invertir las polaridades de los terminales de
las bobinas 1 y 2 en una determinada secuencia para lograr un giro a derecha, y en
secuencia opuesta para que gire a izquierda, la secuencia es la que se muestra en la
tabla:
N de pasos
1a
1b
2a
2b
Paso 1
Paso 2
Paso 3
Paso 4
+Vss
GND
+Vs
GND
+Vss
D1 D2
1
L1
L2
2
D3 D4
D5 D6
+Vs
C1
539
D7 D8
En el esquema L1 y L2 son las bobinas del motor, los diodos D1 a D8 son para
proteger al integrado de las sobretensiones generadas por dichas bobinas, las lneas
marcadas en azul corresponden a la tensin de alimentacin de los motores, mientras la
marcada en verde a los niveles TTL de control del integrado, los terminales 1 y 9 se
unieron para hacer un solo terminal de habilitacin, y finalmente 1a, 1b, 2a y 2b son las
entradas de control para la secuencia de las bobinas del motor, este circuito puede servir
de base para muchos proyectos, ya sea controlado por PC o por microcontrolador.
7.2.2.10.2.
Motores Unipolares
Estos motores comparados a los anteriores tienen sus ventajas, a pesar de tener
ms de 4 cables son ms fciles de controlar, esto se debe a que tienen un terminal
comn a ambas bobinas. Una forma de identificar cada uno de los cables es analizar la
forma de conexin interna de estos motores.
A
Com1
B
En la imagen los dos bobinados del motor se encuentran separados, pero ambos
tienen un terminal central el cual lo llamaremos comn (Com1, Com2). Este es el
modelo utilizado en la aplicacin.
La cuestin es que este motor tiene 6 cables, y ahora nombrarlos correctamente.
Con el multmetro en modo ohmetro comenzamos a medir resistencias por todos los
cables obtenindose tres valores distintos que se repiten varias veces. Por ejemplo:
No marca nada
47
100
100 es el mayor valor por lo tanto corresponde a los extremos de las bobinas,
es decir A-B o bien C-D.
47 es aproximadamente la mitad de 100, por tanto esa debe ser la resistencia
entre el terminal comn y ambos extremos de una bobina, por ejemplo entre A-Com1 o
B-Com1, o bien en la otra bobina, C-Com2 o D-Com2.
Lo que queda pendiente es cuando no marca nada, y bueno es que en ese
momento se midieron los cables de bobinas distintas.
540
A
B
Puerto
Paralelo
D0
D1
D2
D3
18...25
ULN2803
A
B
C
D
GND
D1...D4
1N4148
IN1
IN2
IN3
IN4
GND
GND
OUT1
OUT2
OUT3
OUT4
CC
D5
zener de 12V
541
Paso 2
Paso 3
Paso 4
Al trabajar con una sola bobina se pierde un poco el torque del motor.
La otra propuesta es activar las bobinas de en dos, en este caso el campo
magntico se duplica, y en consecuencia el motor tiene mayor fuerza de giro y
retencin. Esta es la secuencia recomendada por el fabricante y se conoce como
secuencia normal:
N de Pasos A B C D
Paso 1
Paso 2
Paso 3
Paso 4
Con este tipo de secuencia se consigue que los movimientos resulten demasiado
bruscos, y las bateras no te aguantan mucho tiempo.
542
Paso 2
Paso 3
Paso 4
Paso 5
Paso 6
Paso 7
Paso 8
7.2.2.10.3.
Caractersticas Importantes
Hay que tener en cuenta que hay un tiempo determinado para realizar la
secuencia en cada uno de los pasos que se debe dar, ya que si la velocidad de los pulsos
es demasiado alta, es posible que el motor se inestabilice y gire en un sentido
cualquiera, o bien quedarse titubeando en una sola posicin.
Para obtener un arranque suave y preciso, es recomendable comenzar con una
frecuencia de pulso baja y gradualmente ir aumentndola hasta la velocidad deseada sin
superar la mxima tolerada.
El giro en reversa debera realizarse bajando la velocidad de giro y luego
cambiando el sentido de rotacin.
543
7.2.3.
544
7.3.
7.3.1.
MAIN.C
7.3.1.1.
Incluye
// Requerida
// Requerida
// Requerida
#include "system\usb\usb_compile_time_validation.h"
#include "user\user.h"
// Opcional
// Modificable
545
546
7.3.1.2.
Variables
7.3.1.3.
Prototipos privados
Los prototipos privados son las funciones que se utilizan dentro de un mismo
archivo.
static void InitializeSystem(void);
void USBTasks(void);
547
7.3.1.4.
7.3.1.5.
Declaraciones
#pragma code
7.3.1.5.1.
//Vector de inicio
//Vector de interrupcin
//Vector de reset
void main(void)
Cada vez que se inicia el sistema, el micro ejecuta este cdigo lo primero.
void main(void)
{
InitializeSystem();
while(1)
{
USBTasks();
Aplicacion();
}
7.3.1.5.2.
void InitializeSystem(void)
#if defined(USE_USB_BUS_SENSE_IO)
tris_usb_bus_sense = INPUT_PIN;
#endif
#if defined(USE_SELF_POWER_SENSE_IO)
tris_self_power = INPUT_PIN;
#endif
mInitializeUSBDriver();
Inicializacion();
548
7.3.1.5.3.
void USBTasks(void)
void USBTasks(void)
{
USBCheckBusStatus();
if(UCFGbits.UTEYE!=1)
USBDriverService();
#if defined(USB_USE_CDC)
CDCTxService();
#endif
}
7.3.2.
USBCFG.H
7.3.2.1.
Definiciones
#define EP0_BUFF_SIZE
#define MAX_NUM_INT
8
1
// 8, 16, 32, 64
// For tracking Alternate Setting
7.3.2.2.
Definicin De La Clase
#define USB_USE_GEN
/*
* MUID = Microchip USB Class ID
* Se utiliza para indicar la clase de la sesin actual del control del EP0
*/
#define MUID_NULL
0
#define MUID_USB9
1
549
7.3.2.3.
7.3.2.3.1.
Identificador De La Interfaz
7.3.2.3.2.
0x00
Endpoints
UEP1
ep1Bo
8
ep1Bi
8
7.3.3.
// UEP1
USBDSC.H
7.3.3.1.
Incluye
#include "system\typedefs.h"
#include "autofiles\usbcfg.h"
#include "system\usb\usb.h"
550
7.3.3.2.
Definiciones
7.3.3.3.
\
\
\
\
\
Funciones Externas
7.3.4.
USBDSC.C
Este archivo contiene los descriptores de la aplicacin.
7.3.4.1.
Incluye
#include "system\typedefs.h"
#include "system\usb\usb.h"
7.3.4.2.
Constantes
#pragma romdata
7.3.4.2.1.
sizeof(USB_DEV_DSC),
DSC_DEV,
0x0200,
0x00,
0x00,
0x00,
EP0_BUFF_SIZE,
0x04D8,
0x8008,
0x0000,
0x01,
0x02,
551
0x00,
0x01
};
7.3.4.2.2.
Descriptor De La Configuracin 1
CFG01={
Descriptor de configuracin
sizeof(USB_CFG_DSC),
DSC_CFG,
sizeof(cfg01),
1,
1,
0,
_DEFAULT,
50,
Descriptor de la interfaz
sizeof(USB_INTF_DSC),
DSC_INTF,
0,
0,
2,
0,
0,
0,
0,
552
7.3.5.
IO_CFG.H
#ifndef IO_CFG_H
#define IO_CFG_H
7.3.5.1.
Incluye
#include "autofiles\usbcfg.h"
7.3.5.2.
Tris
Define el valor para asignar al tris de un puerto para que este trabaje en entrada o
salida.
#define INPUT_PIN
#define OUTPUT_PIN
7.3.5.3.
1
0
Puerto
PORTAbits.RA0
PORTAbits.RA1
PORTAbits.RA2
PORTAbits.RA3
#define Bombillas
#define LED1
#define LED2
#define Zumbador
#define PaPD
#define PaPC
#define PaPB
#define PaPA
PORTBbits.RB0
PORTBbits.RB1
PORTBbits.RB3
PORTBbits.RB2
PORTBbits.RB4
PORTBbits.RB5
PORTBbits.RB6
PORTBbits.RB7
#define Sentido1
#define PWM
#define Sentido2
#define Dmenos
PORTCbits.RC0
PORTCbits.RC1
PORTCbits.RC2
PORTCbits.RC4
553
#define Dmas
#define Verde
#define Rojo
7.3.5.4.
PORTCbits.RC5
PORTCbits.RC6
PORTCbits.RC7
USB
// Input
#if defined(USE_USB_BUS_SENSE_IO)
#define usb_bus_sense
PORTAbits.RA1
#else
#define usb_bus_sense
1
#endif
#define tris_self_power
TRISAbits.TRISA2
// Input
#if defined(USE_SELF_POWER_SENSE_IO)
#define self_power
PORTAbits.RA2
#else
#define self_power
1
#endif
7.3.6.
USER.H
#ifndef USER_H
#define USER_H
7.3.6.1.
Prototipos Pblicos
En este apartado se definen las funciones a las cuales se va a acceder desde otros
archivos.
void Inicializacion(void);
void Aplicacion(void);
#endif
554
7.3.7.
USER.C
Este archivo se ha creado para la aplicacin, siendo totalmente nuevo.
7.3.7.1.
Incluye
Aade las libreras necesarias para la ejecucin del cdigo de este archivo.
#include <p18f2455.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include "io_cfg.h"
#include "user\user.h"
#include <pwm.h>
#include <delays.h>
#include <adc.h>
#include <timers.h>
7.3.7.2.
Variables
#pragma udata
char input_buffer[8];
char output_buffer[8];
char OFF=1;
7.3.7.3.
Prototipos Privados
void Mdelante(void);
void Mdetras(void);
void Giroizq(void);
void Giroder(void);
void Sensores(void);
void Claxon(void);
void LucesON(void);
void Paro(void);
void Apagado(void);
void Velocidad(void);
void LucesOFF(void);
void Encendido(void);
void enviar(char datos);
void chequeo(void);
void ANOpen(void);
void BlinkUSBStatus(void);
555
7.3.7.4.
Declaraciones
7.3.7.4.1.
void Inicializacion(void)
ADCON1=0xFF;
Zumbador=0;
OpenPWM2(0xFF);
//Inicializa el PWM
OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
//Inicializa el Timer2 para el PWM
ANOpen();
//Inicializa el Conversor A/D para el sensor de distancias
}
7.3.7.4.2.
void Aplicacion(void)
556
7.3.7.4.3.
void chequeo(void)
557
7.3.7.4.4.
void enviar(void)
7.3.7.4.5.
void Mdelante(void)
Esta funcin activa las salidas oportunas para que el coche avance.
void Mdelante(void)
{
if (!OFF)
{
Velocidad();
Sentido1=1;
Sentido2=0;
}
}
7.3.7.4.6.
void Mdetras(void)
Esta funcin activa las salidas oportunas para que los motores retrocedan
void Mdetras(void)
{
if (!OFF)
{
Velocidad();
Sentido1=0;
Sentido2=1;
}
}
558
7.3.7.4.7.
void Velocidad(void)
Esta funcin cambia el duty cicle del PWM2 para modificar la velocidad del
coche.
void Velocidad(void)
{
long dato;
OpenPWM2(0xFF);
switch (input_buffer[2])
//Inicializa el PWM
Esta rutina transforma los dos bytes recibidos en un long para modificar el Duty
Cicle del PWM que es de 10bits. Realiza una transformacin a decimal del dato
recibido.
En el ltimo caso, comprueba si el dato recibido es el 3FFh, para desactivar el
PWM y activar el puerto del PWM, ya que si no no se activa la velocidad mxima.
{
case 0:
dato=input_buffer[1];
break;
case 1: dato=input_buffer[1]+256;
break;
case 2: dato=input_buffer[1]+512;
break;
case 3: if (input_buffer[1]==0xFF)
{
ClosePWM2();
PWM=1;
}
else
{
dato=input_buffer[1]+768;
}
break;
}
SetDCPWM2(dato);
7.3.7.4.8.
void Paro(void)
Esta funcin cambia el duty cicle del PWM2 para modificar la velocidad del
coche.
void Paro(void)
{
Sentido1=0;
Sentido2=0;
}
559
7.3.7.4.9.
void Giroizq(void)
Esta funcin activa el motor Paso-Paso para que el coche gire a la izquierda.
void Giroizq(void)
{
char i;
if (!OFF)
{
for (i=0; i<=input_buffer[1];i++)
{
PaPA=1;
PaPB=1;
PaPC=0;
PaPD=0;
Delay1KTCYx(3);
//el valor del retardo entre los pulsos del motor PP tiene que ser
//entre 3 y 255
PaPA=0;
PaPB=1;
PaPC=1;
PaPD=0;
Delay1KTCYx(3);
PaPA=0;
PaPB=0;
PaPC=1;
PaPD=1;
Delay1KTCYx(3);
PaPA=1;
PaPB=0;
PaPC=0;
PaPD=1;
Delay1KTCYx(3);
}
}
}
560
7.3.7.4.10.
void Giroder(void)
Esta funcin activa el motor Paso-Paso para que el coche gire a la derecha.
void Giroder(void)
{
char i;
if (!OFF)
{
for (i=0; i<=input_buffer[1];i++)
{
PaPA=1;
PaPB=0;
PaPC=0;
PaPD=1;
Delay1KTCYx(3);
//el valor del retardo entre los pulsos del motor PP tiene que ser
//entre 3 y 255
PaPA=0;
PaPB=0;
PaPC=1;
PaPD=1;
Delay1KTCYx(3);
PaPA=0;
PaPB=1;
PaPC=1;
PaPD=0;
Delay1KTCYx(3);
PaPA=1;
PaPB=1;
PaPC=0;
PaPD=0;
Delay1KTCYx(3);
}
}
}
561
7.3.7.4.11.
void ANOpen(char c)
&
ADC_20_TAD,ADC_CH0
&
7.3.7.4.12.
void Sensores(void)
Esta funcin comprueba los sensores y enva el dato al ordenador por el USB.
void Sensores(void)
{
if (!OFF)
{
SetChanADC(ADC_CH0);
ConvertADC();
while(BusyADC());
output_buffer[0]=ReadADC();
output_buffer[1]=ADRESH;
output_buffer[2]=PORTA;
enviar(3);
}
}
7.3.7.4.13.
//Seleccionamos el canal
//Comienza la conversin del dato del sensor de distancia
//Espera a que termine la conversin
//Lee el dato y lo enva
//enva el dato de los finales de carrera
void Claxon(void)
Zumbador=0;
562
7.3.7.4.14.
void Apagado(void)
7.3.7.4.15.
void Encendido(void)
7.3.7.4.16.
void LucesON(void)
7.3.7.4.17.
void LucesOFF(void)
563
7.3.7.4.18.
void BlinkUSBStatus(void)
564
7.4.
7.4.1.
MDULO APIUSB.BAS
Los mdulos, son archivos en los que slo aparecen funciones accesibles desde
todos los form del programa.
Este mdulo contiene las funciones relativas a la comunicacin USB, que ya han
sido comentadas anteriormente.
El contenido del mdulo es:
Option Explicit
El comando Option Explicit aparece en todos los form y mdulos del programa.
Este comando indica que todas las variables que se utilicen tienen se tienen que haber
definido anteriormente.
7.4.1.1.
Funciones De La Mpusbapi.Dll
565
7.4.1.2.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any,
pSrc As Long, ByVal ByteLen As Long)
7.4.1.3.
7.4.1.4.
7.4.1.5.
7.4.1.6.
7.4.1.7.
Sub OpenMPUSBDevice()
myOutPipe = MPUSBOpen(0, vid_pid, out_pipe, 0, 0) 'como salida
myInPipe = MPUSBOpen(0, vid_pid, in_pipe, 1, 0)
'como entrada
End Sub
Con esta funcin obtenemos las pipe de entrada y de salida dependiendo del 0 o
el 1.
Con estas pipe se van a realizar todas las transacciones del puerto USB al
hardware.
566
7.4.1.8.
Sub CloseMPUSBDevice()
MPUSBClose (myOutPipe)
MPUSBClose (myInPipe)
End Sub
7.4.1.9.
Funcin Enviar
Se declara una funcin que necesita una variable con los datos SendData(), los
corchetes indican que es una matriz sin dimensiones definidas y el ByRef que el
argumento se pasa por referencia. De este modo, cualquier cambio que sufra un
parmetro en el cdigo de la funcin o del procedimiento tambin lo sufrir el
argumento correspondiente de la llamada. Aunque no aparezca la propiedad ByRef, se
presupone y la variable posee esta propiedad.
El otro argumento de entrada bytes, es el nmero de bytes que hay que enviar.
Para llamar a la funcin MPUSBWrite (comentada anteriormente), se utiliza la
funcin Call porque no se utilizan los datos devueltos por la primera funcin.
Los argumentos de MPUSBWrite son los descritos anteriormente, utilizando la
propiedad VarPtr() cuando el argumento es un puntero.
567
7.4.1.10.
Funcin Recibir
el
dato
End Function
7.4.2.
FORMULARIO INICIO
568
Nombre
CommandButton
Avanza
CommandButton
Retrocede
CommandButton
Izquierda
CommandButton
Derecha
CommandButton
Paro
CommandButton
Claxon
CommandButton
Luces
CommandButton
Propiedad
Valor
Style
Picture
Enabled
Style
Picture
Enabled
Style
Picture
Enabled
Style
Picture
Enabled
Style
Picture
Enabled
Style
Picture
Enabled
Style
Picture
Enabled
Style
Picture
Enabled
Visible
Graphical
Arriba.ico
False
Graphical
Abajo.ico
False
Graphical
Izquierda.ico
False
Graphical
Derecha.ico
False
Graphical
Stop.ico
False
Graphical
Campana.ico
False
Graphical
BombillaOff.ico
False
Off
569
Graphical
BombillaOff.ico
False
CommandButton
Lon
CommandButton
sensores
Label
Label
Label
Label
TextBox
TextBox
Label1
Label2
Label3
Label4
TextVelocidad
TextGiro
HScrollBar
ScrollGiro
HScrollBar
ScrollVelocidad
Menu
Menu
Menu
Menu
Menu
CommonDialog
Encendido
Apagado
Comandos
Ajuste
Salir
CommonDialog
7.4.2.1.
7.4.2.1.1.
Variables Globales
Style
Picture
Visible
Style
Picture
Caption
Caption
Caption
Caption
Text
Text
Max
Min
Value
Max
Min
Value
Index
Index
Index
Index
Index
Graphical
BombillaOn.ico
False
Graphical
Cono.ico
Giro:
Velocidad:
%
0
0
60
0
0
100
0
0
0
1
2
3
4
Option Explicit
Dim Send_Buf(0 To 2) As Byte
Public lucesON As Boolean
Public Angulo As Integer
Dim velocidad(0 To 1) As Byte
Las variables declaradas con Dim son vlidas para el form; y las declaradas con
Public son para todos los form.
570
7.4.2.1.2.
Funcin Avanza_Click
7.4.2.1.3.
Funcin Claxon_Click
Esta funcin se activa cuando se hace clic en el botn Claxon. Enva el cdigo 6
para que el microcontrolador active el zumbador.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
7.4.2.1.4.
Funcin Derecha_Click
Esta funcin se activa cuando se hace clic en el botn Derecha. Enva el cdigo
4 para que el microcontrolador active el motor PaP para que el coche gire a la derecha.
El otro byte que enva es el ngulo de giro. El valor introducido en el textbox
TextGiro se divide por dos porque el PaP usado en la aplicacin es de 1,8, por lo que
cada pulso gira estos grados. Al introducir un ngulo de giro de x grados habr que
decirle al micro que mande x/2 pulsos para que el motor gire, aproximadamente los
grados determinados.
Los pulsos que se han enviado los guarda en la variable Angulo para poder
enviar la orden para que el coche avance en lnea recta despus.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
571
7.4.2.1.5.
Funcin Form_Load
(myInPipe
Esta funcin se activa cuando se hace carga el form Inicio. Intenta abrir las
comunicaciones con el dispositivo, si no es posible sale un mensaje de error y no se abre
el programa.
Si la comunicacin tiene xito, se abre el from Sensor y se cargan las lecturas sel
sensor de distancia almacenadas en el archivo distancia.ghg gracias al componente
CommonDialog.
7.4.2.1.6.
Funcin Form_Unload
Esta funcin se activa cuando se hace cierra el form Inicio. Enva el cdigo 9
para que el microcontrolador apague el coche y cierra las comunicaciones.
572
7.4.2.1.7.
Funcin Izquierda_Click
Esta funcin se activa cuando se hace clic en el botn Izquierda. Es igual que la
funcin Derecha_Click pero cambiando el cdigo de giro para que lo haga a la
izquierda.
Los pulsos enviados, en este casos se restan.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
7.4.2.1.8.
Funcin Luces_Click
Esta funcin se activa cuando se hace clic en el botn Luces. Enva el cdigo 6
para que el microcontrolador active los LEDs y las bombillas.
Al hacer clic comprueba si las luces estn encendidas o apagadas. Una vez
determinado el estado de las luces, cambia el icono del botn y enva el cdigo de
instruccin determinado.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
573
7.4.2.1.9.
Menu_Click
574
End Select
End Sub
Send_Buf(0) = 9
Send Send_Buf, 1
CloseMPUSBDevice
End
'cierra comunicaciones
Esta funcin se activa cuando se hace clic en el men. Dependiendo del valor de
index, que es el ndice del elemento pulsado, hace una accin u otra:
Case 0: Encendido: enva el comando para encender el coche y activa
todos los objetos del programa.
Case 1: Apagado: enva el comando para apagar el coche y desactiva
todos los objetos del programa.
Case 2: Comandos: desactiva el temporizador utilizado para leer los
sensores y abre el form Comandos.
Case 3: Ajuste: abre el form Ajuste.
Case 4: Salir: apaga el coche y cierra las comunicaciones y el programa.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
7.4.2.1.10.
Funcin Paro_Click
Esta funcin se activa cuando se hace clic en el botn Paro. Enva el cdigo 8
para que el microcontrolador desactive los motores de CC y enva los pulso para que
gire el motor PaP para que cuando se vuelva a enviar la instruccin de avanzar, el coche
lo haga en lnea recta.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
575
7.4.2.1.11.
Retrocede_Click
Esta funcin se activa cuando se hace clic en el botn Retrocede. Es igual que la
funcin Avanza_Click pero con el cdigo de instruccin para que el coche retroceda.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
7.4.2.1.12.
Funcin ScrollGiro_Change
Esta funcin se activa cuando se hace cambia el valor del ScrollGiro. Cambia el
dato del textbox TextGiro al valor del scroll.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.
7.4.2.1.13.
Funcin ScrollVelocidad_Change
7.4.2.1.14.
Funcin sensores_Click
Esta funcin se activa cuando se hace clic en el botn sensores. Abre el form
Sensor.
576
7.4.2.1.15.
Funcin TextGiro_Change
Esta funcin se activa cuando cambia el valor del texto de TextGiro. Comprueba
que el valor introducido es vlido, si no lo es cambia su valor y el de ScrollGiro a cero y
emite un mensaje de error.
7.4.2.1.16.
Funcin TextVelocidad
577
Case 0
resHex = "0" + resHex
Case 1
resHex = "1" + resHex
Case 2
resHex = "2" + resHex
Case 3
resHex = "3" + resHex
Case 4
resHex = "4" + resHex
Case 5
resHex = "5" + resHex
Case 6
resHex = "6" + resHex
Case 7
resHex = "7" + resHex
Case 8
resHex = "8" + resHex
Case 9
resHex = "9" + resHex
Case 10
resHex = "A" + resHex
Case 11
resHex = "B" + resHex
Case 12
resHex = "C" + resHex
Case 13
resHex = "D" + resHex
Case 14
resHex = "E" + resHex
Case 15
resHex = "F" + resHex
End Select
Loop Until dato < 15
Select Case dato
Case 1
resHex = "1" + resHex
Case 2
resHex = "2" + resHex
Case 3
resHex = "3" + resHex
Case 4
resHex = "4" + resHex
Case 5
578
579
Send_Buf(1) = 0
Send_Buf(2) = 0
End If
Else
MsgBox "Velocidad incorrecta", 0 + 16, "Error"
ScrollVelocidad.Value = 0
TextVelocidad.Text = 0
Send_Buf(1) = 0
Send_Buf(2) = 0
End If
Else
MsgBox "Velocidad incorrecta", 0 + 16, "Error"
ScrollVelocidad.Value = 0
TextVelocidad.Text = 0
Send_Buf(1) = 0
Send_Buf(2) = 0
End If
Send_Buf(0) = Asc("a")
velocidad(0) = Send_Buf(1)
velocidad(1) = Send_Buf(2)
Send Send_Buf, 3
End Sub
580
7.4.2.1.17.
Funcin Form_KeyPress
581
End Select
End Sub
Esta funcin se activa cuando se pulsa una tecla al tener activo el form inicio.
Comprueba que tecla se ha pulsado, y si es una de las que ejectuan una instruccin, salta
al lugar especificado.
Las teclas que realizan funciones son:
z: Para el coche
i: activa los motores para que el coche avance
l: activa el motor PaP para que el coche gire a la derecha
j: activa el motor PaP para que el coche gire a la izquierda
k: activa los motores para que el coche retorceda
x: activa/desactiva las luces
d: activa el claxon
y: aumenta la velocidad
t: disminuye la velocidad
f: aumenta el ngulo de giro
g: disminuye el ngulo de giro
582
7.4.3.
FORM AJUSTE
En este form aparecen los botones para ajustar la direccin del coche. Si al
avanzar en lnea recta, el coche gira en algn sentido, se podr modificar desde este
form.
Form Ajuste Sin Compilar
583
Nombre
CommandButton
Izquierda
CommandButton
Derecha
CommandButton
AjDistancia
Timer
Medidas
Timer
TimerDistancia
CommonDialog
CommonDialog
7.4.3.1.
7.4.3.1.1.
Variables
Propiedad
Valor
Style
Picture
Enabled
Style
Picture
Enabled
Caption
Enabled
Interval
Enabled
Interval
Enabled
Graphical
Izquierda.ico
False
Graphical
Derecha.ico
False
Ajustar
False
50
False
10
False
Option Explicit
Private Send_Buf(0 To 2) As Byte
Dim contador As Integer
Dim i As Integer
7.4.3.1.2.
Funcin Derecha_Click
Esta funcin se activa cuando se hace clic en el botn Derecha. Enva la orden
de giro a la derecha de un pulso o (1,8) y reinicia la variable Angulo perteneciente al
form Inicio porque, se supone, que este es el ngulo 0.
584
7.4.3.1.3.
Funcin Izquierda_Click
Esta funcin se activa cuando se hace clic en el botn Izquierda. Enva la orden
de giro a la izquierda de un pulso o (1,8) y reinicia la variable Angulo perteneciente al
form Inicio porque, se supone, que este es el ngulo 0.
7.4.3.1.4.
Funcin AjDistancia_Click
7.4.3.1.5.
Funcin TimerDistancia_Timer
585
contador = contador + 1
Case 4:
MsgBox "Situe un objeto a 50cm", vbInformation + vbOKOnly, "Instrucciones"
i=4
contador = contador + 1
Case 5:
MsgBox "Situe un objeto a 60cm", vbInformation + vbOKOnly, "Instrucciones"
i=5
contador = contador + 1
Case 6:
MsgBox "Situe un objeto a 70cm", vbInformation + vbOKOnly, "Instrucciones"
i=6
contador = contador + 1
Case 7:
MsgBox "Situe un objeto a 80cm", vbInformation + vbOKOnly, "Instrucciones"
i=7
contador = contador + 1
Case 8:
Medidas.Enabled = False
TimerDistancia = False
contador = 0
'Guardamos los datos en el archivo
Open "distancia.ghg" For Output As #1
For i = 0 To 7
Print #1, DatosDistancia(0, i)
Print #1, DatosDistancia(1, i)
Next
Close #1
MsgBox "Sensor calibrado", vbExclamation + vbOKOnly, "Mensaje"
TimerDistancia.Interval = 10
End Select
End Sub
586
7.4.3.1.6.
Funcin Medidas_Timer
End Sub
587
7.4.4.
FORM SENSOR
588
Nombre
Timer
Sensores
Label
Image
Image
Distancia
Imagen
Image1
PictureBox
Derecho
PictureBox
Izquiedo
PictureBox
Trasero
PictureBox
Delantero
PictureBox
Ninguno
7.4.4.1.
7.4.4.1.1.
Declaracin De Variables
Propiedad
Valor
Interval
Enabled
Caption
Picture
Picture
Visible
Picture
Visible
Picture
Visible
Picture
Visible
Picture
Visible
Picture
50
False
Ninguno.gif
Coche.gif
False
Derecho.gif
False
Izquiedo.gif
False
Trasero.gif
False
Delantero.gif
False
Ninguno.gif
Option Explicit
Dim Send_Buf(0 To 2) As Byte
7.4.4.1.2.
Funcin Sensores_Timer
Send_Buf(0) = 5
Send Send_Buf, 1
recibir lectura, 3
'Rutina para saber a que distancia hay un objeto
If rec(1) > DatosDistancia(0, 0) Then
Distancia.Caption = "Objeto a menos de 10cm"
Else
If rec(1) = DatosDistancia(0, 0) Then
589
590
591
7.4.5.
FORM COMANDOS
592
Nombre
Propiedad
TextBox
Comandos
Text
CommandButton
EnvioComando
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Label
Label6
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
Index
Caption
593
Valor
Escriba el comando
a enviar
Enviar
0
1:Avanza
1
2:Retrocede
2
3:Giro a la izquieda
3
4:Giro a la derecha
4
5:Lectura de los
sensores activada
5
6:Claxon
7
8:Parar
8
9:Apaga el coche
9
a_Velocidad:Cambio
de velocidad, el
valor tiene que ser
entre 0 y 100
10
b:Apagar luces
11
c:Encender el coche
12
d_grados:ngulo de
giro, el valor tiene
que ser entre 0 y 60
13
e:Cerrar barra de
comandos
15
f:Ajustar direccin
izquierda
16
g:Ajustar direccin
Label
Label6
Index
Caption
Label
Label6
Index
Caption
Label
Label6
Index
Caption
Label
Label6
Index
Caption
7.4.5.1.
7.4.5.1.1.
Declaracin De Variables
derecha
14
h:Lectura de los
sensores desactivada
17
i:Mostrar la ventana
de los sensores
19
j:Ajuste Sensor de
Distancia
18
k:Cerrar aplicacin
Option Explicit
Dim contComando As Integer
Dim comando(5) As String
7.4.5.1.2.
Funcin Comandos_Click
'Reinicio variables
contComando = 0
Comandos.Text = ""
End Sub
7.4.5.1.3.
Funcin Comandos_KeyPress
'Comprueba si se ha pulsado la
tecla de borrar y borra el caracter anterior
594
If KeyAscii = 13 Then
'Comprueba si se ha pulsado la
tecla enter y activa el boton enviar
EnvioComando_Click
Else
If KeyAscii = 95 Then
comando(contComando) = Chr(KeyAscii)
'Guardo en comando la barra
baja (_)
contComando = contComando + 1
Else
If KeyAscii >= 48 Then
If KeyAscii <= 57 Then
comando(contComando) = Chr(KeyAscii) 'Guardo en comando el nmero
pulsado
contComando = contComando + 1
Else
'la tecla pulsada no es un nmero
If KeyAscii >= 97 Then
If KeyAscii <= 106 Then
comando(contComando) = Chr(KeyAscii)
'Guardo
en
comando la letra pulsada porque es una instruccin
contComando = contComando + 1
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
For i = 0 To contComando
'Reinicio variables
comando(i) = ""
Next
contComando = 0
Comandos.Text = "Escriba el comando a enviar"
KeyAscii = "0"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
For i = 0 To contComando
'Reinicio variables
comando(i) = ""
Next
contComando = 0
Comandos.Text = "Escriba el comando a enviar"
KeyAscii = "0"
End If
End If
End If
End If
End If
End If
End Sub
595
Esta funcin se activa cuando se hace pulsa una tecla en el textBox Comandos.
Comprueba que la tecla pulsada es correcta, si no emite un mensaje de error.
Si la tecla es correcta, la guarda en la variable comando en la posicin indicada
por la variable contComando. Si se ha pulsado una tecla que equivalga a un comando
incrementa el contador, si no, hace lo que le corresponda.
En la variable KeyAscii se almacena el cdigo ASCII de la tecla pulsada.
7.4.5.1.4.
Funcin EnvioComando_Click
596
Case 4:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Derecha_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case 5:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Sensor.Sensores.Enabled = True
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case 6:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Claxon_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case 7:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
If Inicio.lucesON = False Then
Inicio.Luces_Click
Else
MsgBox "Las luces ya estn encendidas", 0 + 16, "Error"
End If
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
597
598
End If
End If
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "b":
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
If Inicio.lucesON = True Then
Inicio.Luces_Click
Else
MsgBox "Las luces ya estn apagadas", 0 + 16, "Error"
End If
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "c":
If comando(1) = "" Then
Inicio.Menu_Click (0)
Inicio.Sensores.Enabled = False
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "d":
If comando(1) = "_" Then
If Inicio.Avanza.Enabled = True Then
If comando(3) = "" Then
dato = comando(2)
Else
dato = comando(2) * 10
dato = comando(3) + dato
End If
If dato <= 60 Then
Inicio.ScrollGiro.Value = dato
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
599
End If
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "e":
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Sensores.Enabled = True
End If
If Inicio.Visible = False Then
Inicio.Visible = True
End If
Me.Hide
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "f":
If comando(1) = "" Then
Ajuste.Izquierda_Click
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "g":
If comando(1) = "" Then
Ajuste.Derecha_Click
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "h":
If comando(1) = "" Then
Sensor.Sensores.Enabled = False
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
600
Case "i":
If comando(1) = "" Then
Sensor.Visible = True
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "i":
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Ajuste.AjDistancia_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "k":
If comando(1) = "" Then
Inicio.Menu_Click (4)
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case Default:
MsgBox "Comando no reconocido", 0 + 16, "Error"
End Select
For i = 0 To contComando
comando(i) = ""
Next
'Reinicio variables
contComando = 0
Comandos.Text = "Escriba el comando a enviar"
End Sub
601
7.4.5.1.5.
Funcin Form_Unload
7.5.
DRIVER COCHECITO.INF
602
[PicUSB.ClassCopyFiles]
picusbci.dll
;-----------------------------------------------------------------------------; Device Install Section
;-----------------------------------------------------------------------------[Manufacturer]
%MFGNAME%=Standard
[Standard]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_8008
[SourceDisksNames]
1 = %INSTDISK%,,,""
[SourceDisksFiles]
mchpusb.sys = 1,,
wdmstub.sys = 1,,
picusbci.dll = 1,,
;-----------------------------------------------------------------------------; Windows 2000/XP Sections
;-----------------------------------------------------------------------------[DriverInstall.NT]
CopyFiles=DriverCopyFiles
[DriverCopyFiles]
mchpusb.sys
[DriverInstall.NT.Services]
AddService = PicUSB, 2, DriverService
[DriverService]
DisplayName = %SVCDESC%
ServiceType = 1
; SERVICE_KERNEL_DRIVER
StartType = 3
; SERVICE_DEMAND_START
ErrorControl = 1
; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\mchpusb.sys
LoadOrderGroup = Extended Base
603
604
7.6.
CONTROL WIIMOTE
7.6.1.
INTRODUCCIN
7.6.2.
PROGRAMA DE CONTROL
Para que el ordenador reconozca una instruccin, hay que realizar un programa
que determine que accin realiza con cada botn.
Para realizar este programa, se utiliza el compilador GlovePIE. Es un
compilador diseado para realizar programas de control con guantes de realidad virtual.
7.6.2.1.
Programa
El programa es muy sencillo, se basa en determinar que tecla del teclado tiene
que reconocer el ordenador al pulsar un botn del WiiMote.
Keyboard.i and Keyboard.Up = Wiimote.Up
Keyboard.k and Keyboard.Down = Wiimote.Down
Keyboard.j and Keyboard.Left = Wiimote.Left
Keyboard.l and Keyboard.Right = Wiimote.Right
Keyboard.x = Wiimote.A
Keyboard.z = Wiimote.B
Keyboard.d = Wiimote.Home
Keyboard.f = wiimote.One
Keyboard.g = wiimote.Two
Keyboard.t = Wiimote.Minus
Keyboard.y = Wiimote.Plus
605
8. BIBLIOGRAFA
609
8.
BIBLIOGRAFA
8.1.
LIBROS
Enciclopedia de Microsoft Visual Basic 6. Fco. Javier Ceballos.
8.2.
APUNTES
Programacin Visual. M Araceli Snchez Snchez.
Ampliacin de programacin. M Araceli Snchez Snchez.
Tecnologa electrnica. lvaro Snchez Martn.
Programacin Avanzada. Andrs Martn Snchez.
Sistemas digitales avanzados. Jos Torreblanca Gonzlez.
8.3.
PGINAS WEB
http://www.microchip.com
http://www.todopic.com.ar/foros
http://picmania.garcia-cuervo.com
http://www.usb.org
http://www.beyondlogic.org
http://www.hobbypic.com
http://elrebujito.es/
http://www.winpic800.com
http://perso.wanadoo.es/luis_ju
http://www.frino.com.ar
http://www.roboticspot.com
http://www.alldatasheet.com
http://mundobot.com
http://www.micropik.com
http://www.superrobotica..com
http://www.pablohoffman.com/
http://sourceforge.net/projects/usbsnoop/
http://www.fujitsu.com/downloads/EU/es/soporte/escaneres/cursousb.pdf
http://www.i-micro.com/pdf/new_temarios/tem-Usb.pdf
http://www.fujitsu.com/downloads/EU/es/soporte/discosduros/UnpaseoporUSB-
2.pdf
http://server-die.alc.upv.es/asignaturas/LSED/2003-04/0.USB/
http://pic18fusb.online.fr/wiki/wikka.php?wakka=WikiHome
http://forum.microchip.com/
610
http://www.lvr.com
http://pic18fusb.online.fr/wiki/wikka.php?wakka=WikiHome
http://groups.google.com/group/pickit-devel/
http://www.sixca.com/
http://www.alanmacek.com/usb/
http://www.microchipc.com/sourcecode/#pic18f4550usb
http://www.htsoft.com/forum/all/showflat.php/Cat/0/Number/15801/an/0/page/0
#15801
http://www.cattopasto.com/download.php
http://www.varxec.net/picdem_fs_usb/
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=1960
http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
http://www.fored.co.uk/html/usb_library.html
http://www.create.ucsb.edu/~dano/CUI/
http://www.iay.org.uk/blog/2003/07/my_very_first_u.html
http://forum.microchip.com/tm.aspx?m=89669
http://pe.ece.olin.edu/ece/projects.html
http://ostry.w.szu.pl/index.php?stan=fastPICCDC
http://www.jungo.com/pr051026.html
http://libusb.sourceforge.net/
http://www.burger-web.com/Projects/PIC18F4550USB/en_PIC18UsbBoard.htm
http://www.icsharpcode.net/
http://www.piccoder.co.uk/
http://pe.ece.olin.edu/ece/projects.html
http://sourceforge.net/projects/pic18fusb
http://www.nutsvolts.com/%7Edownloads/USB.zip
http://vasco.gforge.enseeiht.fr/
http://www.philohome.com/
http://www.plazaearth.com/usr/gasperi/lego.htm#basics
http://www.akasa.bc.ca/tfm/lego.html
http://www.robots.com.es/
611
B. CLCULOS
615
1.
CLCULOS
1.1.
PWM
Las ecuaciones utilizadas son:
9 Periodo _ PWM = [( PR 2) + 1] 4 TOSC (Valor _ del _ prescaler _ de _ TMR 2)
9 Duty_ Cicle_ PWM= (CCPRXL: CCPXCON< 5 : 4 >) TOSC (Valor_ del_ prescaler_ TMR2)
FOSC
)
FPWM
bits
log(2)
log(
Resolucin_mxima_PWM =
9
9 Periodo=1/frecuencia
1.2.
CONVERSOR A/D
C. PLANOS
bombilla2
bombilla1
5V 0V
LED2
Com2
C
NA
NC
4MHz
M2
ULN
MPP
C
NA
NC
27pF
18F2455
zumbador
A
Com1
C
5V
alimentacin
USB B alimentacin
100nF
47uF
LED bi 1K
1N4007
LED1
0V
L293
1N4007
fin3
10K
10K
fin2
fin1
M1
Sensor dist
C
NA
NC
Plano: Chasis
Escala: 1:2
D. PLIEGO DE CONDICIONES
639
1. PLIEGO
DE
CONSTRUCTIVAS
1.1.
CONDICIONES
ESPECFICAS
El producto diseado es un coche que nos permitir enviar y recibir datos desde
el ordenador para controlar la velocidad, sentido y direccin. La tensin continua
aplicada al coche debe ser fija de 5V para no quemar los componentes.
Consta de un sistema electrnico formado por 1 PCB en el que se utilizarn
componentes electrnicos de tipo discreto, chips integrados y semiconductores de
potencia; y de un sistema mecnico en el que se utilizarn motores con sus reductoras y
metacrilato para la construccin del chasis del coche.
1.2.
FORMA DE EJECUCIN
La ejecucin de las placas se realizar de la siguiente manera:
Obtencin de las mscaras de impresin necesarias: el primer paso que
hay que dar para realizar un circuito impreso por mtodos
semiprofesionales es la obtencin de una mscara, patrn o fotolito que
contenga el diseo del circuito a realizar (pistas, footprints, etc.).
Para transferir el diseo del circuito deseado a la placa para
circuito impreso, el mtodo que ms nos interesa es el fotolitogrfico,
que se pasa a describir:
Utilizando un programa informtico que permita el diseo de
placas de circuito impreso, en este caso el Proteus, se imprimir el diseo
en papel vegetal, que es transparente. Se obtendr un dibujo positivo
(pistas, nodos, pads, y en general todas aquellas reas en las que se
quiere que quede posteriormente el cobre sobre la placa, en negro).
Fases para la obtencin de la placa:
a) Insolacin: Si se ha obtenido a travs de la impresora un original
positivo, se utilizar una placa presensibilizada positiva, que son
las ms comunes. En estas placas la lmina de cobre est
recubierta por una emulsin fotosensible, esto es, si incide la luz
solar sobre ellas, en aquellas partes que hayan recibido las
radiaciones se produce una reaccin qumica y se descompone la
emulsin. Las partes que se hayan tapado con material opaco no
reaccionarn qumicamente y no se debilitarn sus enlaces
qumicos.
La insolacin, por tanto, consiste en la exposicin a la luz
actnica (rica en rayos ultravioleta) de la placa presensibilizada a
640
641
642
1.3.
643
1.4.
MATERIALES
1.4.1.
MATERIALES DEL LABORATORIO NECESARIOS PARA LA PARTE
ELCTRICA
1. Software informtico Proteus Versin 6.3. Para la realizacin de placas
electrnicas, utilizndose para el trazado de pistas su librera Layout.
2. Lminas Transparentes para Impresoras Lser. Se utiliza para elaborar
esquemas de alta resolucin de PCB y otros diseos mediante cualquier
impresora lser. Sus caractersticas son:
Se obtienen diagramas de gran densidad con toda nitidez
Lmina transparente de 75 m
Recubrimiento especial de sujecin y fijacin de alta resolucin
3. Mquina insoladora. Con luz actnica y temporizador.
4. Cubeta de plstico para ataque qumico. Caractersticas:
Longitud 313mm.
Anchura 264mm.
Profundidad 58mm.
Bandejas rgidas de poliestireno adecuadas para contener soluciones de
revelado y ataque qumico (hidrxido de sodio y cloruro frrico)
empleadas en la produccin de PCBs.
644
1.4.2.
1.4.3.
MATERIALES DE LABORATORIO NECESARIOS PARA LA PARTE
MECNICA
1.
2.
3.
4.
5.
1.4.4.
Taladradora
Brocas de acero para metal
Sierra mecnica para metal
Sierra manual para metal
Gafas y guantes de proteccin
Metacrilato
Engranajes
Pegamento rpido para metacrilato
Ejes de acero
Ruedas de caucho sinttico
Arandelas de acero
Anillas de retencin
645
1.5.
646
E. PRESUPUESTO
649
1.
N de Orden
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Componentes
Diodo de potencia 1N4007
Diodo LED bicolor de tres terminales
Diodo LED rojo superbrillante
Resistencia de 1k y 1/4W
Resistencia de 10k y 1/4W
Condensador cermico de 27pF
Condensador cermico de 100nF
Condensador electroltico de 47F y 25V
Motor de CC con redutor
Motor Paso a Paso bipolar
Cristal de cuarzo de 4MHz
Circuito integrado ULN2803
Circuito integrado L293D
Microcontrolador PIC18F2455
Zumbador
Conmutador Final de Carrera
Sensor de distancia GP2Y0A02YK
Bombilla 5V
Conector 2 terminales
Conector 3 terminales
Conector USB tipo B hembra
Placa fotopositiva 80x100mm
Separadores
Cloruro Frrico
Revelador
Cable de 0,75mm de dimetro (metros)
Cable de 1,5mm de dimetro (metros)
Cable USB tipo A-B (5 metros)
Zcalo de 28 terminales
Zcalo de 18 terminales
Zcalo de 16 terminales
2.
N de Orden
1
2
3
4
5
6
7
8
9
Componentes
Juego de engranajes mdulo 0,5
Juego de ruedas de caucho sinttico
Arandelas, ejes
Anillas de retencin
Metacrilato (60x25x1cm)
Pegamento para Metacrilato
Tornillos M3
Tornillos S2
Tornillos S4
3.
TOTALIZACIONES
N de Orden
Presupuesto
1
Parte Elctrica
2
Parte Mecnica
Total sin I.V.A.
16% IVA
Total ()
650
Precio Total
128,77
68,75
197,52
31,61
229,13
79,75
F. CONCLUSIN
653
1.
CONCLUSIN