Está en la página 1de 655

UNIVERSIDAD DE SALAMANCA

E.T.S. DE INGENIERA INDUSTRIAL DE BJAR

DEPARTAMENTO DE FSICA APLICADA


REA DE TECNOLOGA ELECTRNICA
TRABAJO FIN DE CARRERA

CONEXIN AL PUERTO USB


MEDIANTE UN
MICROCONTROLADOR

AUTOR: GUILLERMO DAVID HERRERO GONZLEZ


TUTOR: JOS TORREBLANCA GONZLEZ
BJAR, JUNIO 2007

UNIVERSIDAD DE SALAMANCA
E.T.S. DE INGENIERA INDUSTRIAL DE BJAR

DEPARTAMENTO DE FSICA APLICADA


REA DE TECNOLOGA ELECTRNICA
TRABAJO FIN DE CARRERA

CONEXIN AL PUERTO USB


MEDIANTE UN
MICROCONTROLADOR

AUTOR: GUILLERMO DAVID HERRERO GONZLEZ


TUTOR: JOS TORREBLANCA GONZLEZ
BJAR, JUNIO 2007

D. Guillermo David Herrero Gonzlez, autor del presente proyecto, comparte su


autora con su tutor D. Jos Torreblanca Gonzlez, para los efectos que pudieran
derivarse de su utilizacin para posteriores trabajos o proyectos fin de carrera.
Por lo tanto, tiene toda la autorizacin para poder reproducir, copiar y modificar
dicho proyecto.
Bjar, Junio de 2007.

Fdo: D. Guillermo David Herrero Gonzlez

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.

Captulo 2: Nociones Bsicas De La Norma USB 2.0 ____________________30


Captulo 3: Microcontroladores______________________________________30
Captulo 4: Lenguaje De Programacin C18____________________________30
Captulo 5: Lenguaje De Programacin Visual Basic _____________________30
Captulo 6: Interconexin USB-PC ___________________________________31
Captulo 7: Aplicacin_____________________________________________31
Clculos________________________________________________________32
Planos _________________________________________________________32
Pliego De Condiciones ____________________________________________32
Condiciones ____________________________________________________32

Nociones Bsicas De La Norma USB 2.0________________________ 35


2.1.
2.1.1.

Introduccin ________________________________________________ 35
Motivacin _____________________________________________________35

2.2.

Vocabulario ________________________________________________ 36

2.3.

Historia ____________________________________________________ 38

2.3.1.

2.4.

Utilizacin Prevista _______________________________________________38

Arquitectura________________________________________________ 39

2.4.1. Descripcin Del Sistema USB_______________________________________39


2.4.2. Arquitectura Del Bus______________________________________________39
2.4.3. Interfaz Fsica ___________________________________________________40
2.4.3.1. Aspecto Elctrico _____________________________________________40
2.4.3.2. Alimentacin ________________________________________________40
2.4.3.3. Consumo____________________________________________________40
2.4.3.4. Control De Consumo __________________________________________41
2.4.3.5. Protocolo Del USB____________________________________________41
2.4.3.6. Robustez ____________________________________________________41
2.4.3.7. Deteccin De Errores __________________________________________42
2.4.3.8. Gestin De Errores ____________________________________________42
2.4.3.9. Configuracin Del Sistema______________________________________42
2.4.3.10. Tipos De Transferencia _______________________________________43
2.4.3.11. Tipo Control ________________________________________________43
2.4.3.12. Tipo Bulk __________________________________________________43
2.4.3.13. Tipo Interrupt _______________________________________________43
2.4.3.14. Tipo Isochronous ____________________________________________43
2.4.3.15. Asignacin De La Banda De Paso _______________________________44
2.4.3.16. USB Device ________________________________________________44
2.4.3.17. Caractersticas De Un Perifrico ________________________________44

2.5.

Formatos De Los Paquetes ____________________________________ 45

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.6.
2.6.1.
2.6.2.
2.6.3.

2.7.

3.

Estados Del USB ____________________________________________ 49


Por Defecto _____________________________________________________50
Direccionado ____________________________________________________51
Configuracin ___________________________________________________51

Enumeracin Del Bus ________________________________________ 51

Microntroladores ___________________________________________ 55
3.1.
3.1.1.
3.1.2.
3.1.3.
3.1.4.

3.2.

Introduccin A Los Microcontroladores _________________________ 55


Controlador Y Microcontrolador_____________________________________55
Diferencia Entre Microprocesador Y Microcontrolador ___________________56
Aplicaciones De Los Microcontroladores ______________________________57
El Mercado De Los Microcontroladores _______________________________58

Qu Microcontrolador Emplear?______________________________ 59

3.2.1. Recursos Comunes A Todos Los Microcontroladores ____________________61


3.2.1.1. Arquitectura Bsica ___________________________________________61
3.2.1.2. El Procesador O CPU __________________________________________62
3.2.1.3. Memoria ____________________________________________________62
3.2.1.4. ROM Con Mscara____________________________________________63
3.2.1.5. OTP _______________________________________________________63
3.2.1.6. EPROM ____________________________________________________63
3.2.1.7. EEPROM ___________________________________________________64
3.2.1.8. FLASH _____________________________________________________64
3.2.1.9. Puertos De Entrada Y Salida ____________________________________65
3.2.1.10. Reloj Principal ______________________________________________65
3.2.2. Recursos Especiales ______________________________________________65
3.2.2.1. Temporizadores O Timers ____________________________________66
3.2.2.2. Perro Guardin O Watchdog___________________________________66
3.2.2.3. Proteccin Ante Fallo De Alimentacin O Brownout _______________66
3.2.2.4. Estado De Reposo O De Bajo Consumo ___________________________66
3.2.2.5. Conversor A/D (CAD) _________________________________________67
3.2.2.6. Conversor D/A (CDA) _________________________________________67
3.2.2.7. Comparador Analgico ________________________________________67
3.2.2.8. Modulador De Anchura De Pulsos O PWM_________________________67
3.2.2.9. Puertos De E/S Digitales _______________________________________67
3.2.2.10. Puertos De Comunicacin _____________________________________68
3.2.3. Herramientas Para El Desarrollo De Aplicaciones _______________________68
3.2.3.1. Desarrollo Del Software: _______________________________________68

3.3.

La Familia De Los PIC Como Eleccin __________________________ 69

3.3.1. Caractersticas Relevantes__________________________________________70


3.3.1.1. Arquitectura _________________________________________________70
3.3.1.2. Segmentacin ________________________________________________71
3.3.1.3. Formato De Las Instrucciones ___________________________________71
3.3.1.4. Juego De Instrucciones_________________________________________71
3.3.1.5. Todas Las Instrucciones Son Ortogonales __________________________71
3.3.1.6. Arquitectura Basada En Un Banco De Registros ___________________71
3.3.1.7. Diversidad De Modelos De Microcontroladores Con
Prestaciones Y Recursos Diferentes _______________________________71
3.3.1.8. Herramientas De Soporte Potentes Y Econmicas____________________71
3.3.2. Las gamas de PIC ________________________________________________72
3.3.2.1. La Gama Enana: PIC12C(F)XXX De Terminales ____________________73
3.3.2.2. Gama Baja O Bsica: PIC16C5X Con Instrucciones De 16bits__________74
3.3.2.3. Gama Media. PIC16CXXX Con Instrucciones De 16bits ______________76

vi

GUILLERMO DAVID HERRERO GONZLEZ

3.3.2.4.
3.3.2.5.

3.4.

Gama Alta: PIC17CXXX Con Instrucciones De 16bits________________77


Gama Mejorada: PIC18FXXXX _________________________________78

Familia PIC18Fxx5x _________________________________________ 79

3.4.1. Diagrama de Pines________________________________________________79


3.4.2. Perspectiva General Del Dispositivo__________________________________81
3.4.3. Configuracin Del Oscilador________________________________________90
3.4.3.1. Control Del Oscilador _________________________________________91
3.4.3.2. Tipos De Oscilador____________________________________________91
3.4.3.2.1. Modos Del Oscilador Y Operaciones Con El USB _______________91
3.4.3.2.2. XTAL/Resonadores Cermicos ______________________________92
3.4.3.2.3. Seal De Reloj Externa_____________________________________93
3.4.3.2.4. Multiplicador De Frecuencia PLL ____________________________94
3.4.3.2.5. Bloque Interno Del Oscilador ________________________________95
3.4.3.3. Configuracin Del Oscilador Para El USB _________________________98
3.4.3.3.1. Operaciones Con Baja Velocidad (USB )_______________________99
3.4.3.3.2. Funcionamiento Diferente El Reloj Del USB Y
El Del Microcontrolador___________________________________100
3.4.3.4. Fuentes De Reloj Y Cambios De Oscilador ________________________100
3.4.3.4.1. Registros De Control Del Oscilador __________________________101
3.4.3.4.2. Transiciones Del Oscilador_________________________________102
3.4.3.5. Efecto De Los Modos De Control De Energa En Varias
Fuentes De Reloj ____________________________________________103
3.4.3.6. Retraso En El Inicio __________________________________________104
3.4.4. Modos De Control De Energa _____________________________________105
3.4.4.1. Seleccionar Los Modos De Control De Energa_____________________106
3.4.4.1.1. Fuentes Del Reloj ________________________________________106
3.4.4.1.2. Comienzo De Los Modos De Control De Energa _______________106
3.4.4.1.3. Transiciones De Reloj Y Puntero De Estado ___________________107
3.4.4.1.4. Mltiples Comandos SLEEP _______________________________107
3.4.4.2. Modos De Ejecucin _________________________________________108
3.4.4.2.1. Modo PRI_RUN _________________________________________108
3.4.4.2.2. Modo SEC_RUN ________________________________________108
3.4.4.2.3. Modo RC_RUN _________________________________________109
3.4.4.3. Modo SLEEP _______________________________________________111
3.4.4.4. Modos De Reposo ___________________________________________112
3.4.4.4.1. Modo PRI_IDLE ________________________________________112
3.4.4.4.2. MODO SEC_IDLE_______________________________________113
3.4.4.4.3. Modo RC_IDLE _________________________________________114
3.4.4.5. Salir De Los Modos SLEEP Y Reposo ___________________________114
3.4.4.5.1. Salida Por Una Interrupcin ________________________________115
3.4.4.5.2. Salida Por Desbordamiento Del WDT ________________________115
3.4.4.5.3. Salida Por Reset _________________________________________115
3.4.4.5.4. Salida Sin Un Retraso Del Inicio Del Oscilador_________________116
3.4.5. RESET________________________________________________________116
3.4.5.1. Registro RCON _____________________________________________117
3.4.5.2. Master Clear Reset (MCLR*) __________________________________119
3.4.5.3. Reset Por Subida De Tensin (POR) _____________________________119
3.4.5.4. Reset Por Cese De Tensin (BOR)_______________________________120
3.4.5.4.1. Software Que Activa El BOR_______________________________120
3.4.5.4.2. Deteccin Del BOR ______________________________________121
3.4.5.4.3. Desactivar BOR En El Modo SLEEP_________________________121
3.4.5.5. Contadores Del Reset _________________________________________121
3.4.5.5.1. Temporizador De Inicio (PWRT) ____________________________122
3.4.5.5.2. Oscilador Temporizador De Arranque (OST) __________________122

vii

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.5.5.3. Temporizador Del Control De PLL __________________________122


3.4.5.5.4. Secuencia De Retraso _____________________________________122
3.4.5.6. Estado De Los Registros En Un Reset ____________________________123
3.4.6. Organizacin De La Memoria ______________________________________123
3.4.6.1. Organizacin De La Memoria De Programa _______________________124
3.4.6.1.1. Contador De Programa ____________________________________125
3.4.6.1.2. Devolver La Direccin De La Pila ___________________________125
3.4.6.1.3. Pila De Almacenamiento Rpido ____________________________128
3.4.6.1.4. Operaciones De Bsqueda En Las Tablas De
Memoria De Programa ____________________________________129
3.4.6.2. Ciclos Instruccin En Los PIC18 ________________________________130
3.4.6.2.1. Esquema De Reloj _______________________________________130
3.4.6.2.2. Instruccin Flow/Pipelining ________________________________130
3.4.6.2.3. Instrucciones En La Memoria De Programa____________________131
3.4.6.2.4. Instrucciones De Dos Palabras ______________________________131
3.4.6.3. Organizacin De La Memoria De Datos __________________________132
3.4.6.3.1. RAM Del USB __________________________________________134
3.4.6.3.2. Registro Selector Del Banco (BSR) __________________________134
3.4.6.3.3. Acceso Al Banco ________________________________________135
3.4.6.3.4. Registro De Archivos De Propsito General ___________________136
3.4.6.3.5. Registros De Funcin Especfica ____________________________136
3.4.6.3.6. Registro STATUS________________________________________137
3.4.6.4. Modos De Direccionamiento De Los Datos________________________139
3.4.6.4.1. Direccionamiento Inherente Y Literal ________________________139
3.4.6.4.2. Direccionamiento Directo__________________________________139
3.4.6.4.3. Direccionamiento Indirecto ________________________________140
3.4.6.5. Memoria Del Programa Y El Sistema De Instrucciones Extendidas _____143
3.4.6.6. Memoria De Datos Y El Sistema De Instrucciones Extendidas _________143
3.4.6.6.1. Direccionamiento Indexado Con Literal Compensado____________144
3.4.6.6.2. Instrucciones Afectadas Por El Modo Indexado
Por Literal Compensado ___________________________________144
3.4.6.6.3. Mapeo Del Banco De Acceso En El Modo
Indexado Por Literal Compensado ___________________________146
3.4.6.6.4. BSR En El Modo Indexado Por Literal Compensado_____________147
3.4.7. Memoria Flash De Programa ______________________________________147
3.4.7.1. Escribir Y Leer En Tablas _____________________________________147
3.4.7.2. Registros De Control _________________________________________149
3.4.7.2.1. Registros EECON1 y EECON2 _____________________________149
3.4.7.2.2. Registro De Tabla Latch (TABLAT) _________________________151
3.4.7.2.3. Registro Del Puntero De Tabla (TBLPTR) ____________________151
3.4.7.2.4. Lmites Del Puntero De Tabla ______________________________151
3.4.7.3. Lectura De La Memoria De Programa Flash _______________________152
3.4.7.4. Borrado De Memoria Flash De Programa _________________________153
3.4.7.4.1. Secuencia De Borrado De La Memoria Flash De Programa _______154
3.4.7.5. Escribir En La Memoria Flash De Programa _______________________155
3.4.7.5.1. Secuencia De Escritura En La Memoria Flash De Programa _______156
3.4.7.5.2. Verificacin De La Escritura _______________________________158
3.4.7.5.3. Finalizacin Inesperada De La Operacin De Escritura ___________159
3.4.8. Memoria De Datos EEPROM ______________________________________160
3.4.8.1. Registros EECON1 Y EECON2 ________________________________160
3.4.8.2. Lectura De Los Datos De La Memoria EEPROM ___________________161
3.4.8.3. Escritura En La Memoria De Datos EEPROM _____________________161
3.4.8.4. Verificacin De La Escritura ___________________________________162
3.4.8.5. Operacin Con Cdigo De Proteccin ____________________________162

viii

GUILLERMO DAVID HERRERO GONZLEZ

3.4.8.6. Proteccin Contra Escrituras Falsas ______________________________162


3.4.8.7. Usar Los Datos EEPROM _____________________________________163
3.4.9. Multiplicador DE 8x8 Por Hardware ________________________________165
3.4.9.1. Introduccin ________________________________________________165
3.4.10. Interrupciones__________________________________________________168
3.4.10.1. Interrupciones Del USB ______________________________________169
3.4.10.2. Registros INTCON__________________________________________170
3.4.10.3. Registros PIR ______________________________________________173
3.4.10.4. Registros PIE ______________________________________________176
3.4.10.5. Registros IPR ______________________________________________178
3.4.10.6. Registro RCON ____________________________________________180
3.4.10.7. Pines De Interrupciones INTn _________________________________181
3.4.10.8. Interrupcin TMR0__________________________________________181
3.4.10.9. Interrupcin Al Cambiar PORTB_______________________________181
3.4.10.10. Almacenamiento De Datos Durante La Interrupcin _______________181
3.4.11. Puertos De Entrada-Salida ________________________________________182
3.4.11.1. Registros PORTA, TRISA Y LATA ____________________________183
3.4.11.2. Registros PORTB, TRISB Y LATB_____________________________186
3.4.11.3. Registros PORTC, TRISC Y LATC_____________________________191
3.4.11.4. Registros PORTD, TRISD Y LATD ____________________________194
3.4.11.5. Registros PORTE, TRISE Y LATE _____________________________197
3.4.11.5.1. PORTE En Los Dispositivos De 28-PIN _____________________198
3.4.12. Mdulo TIMER0 _______________________________________________201
3.4.12.1. Operaciones Del TIMER0 ____________________________________202
3.4.12.2. Lecturas Y Escrituras Del Timer0 En Modo De 16BITS _____________202
3.4.12.3. Prescaler __________________________________________________203
3.4.12.3.1. Conmutacin En La Asignacin Del Prescaler_________________203
3.4.12.4. Interrupcin Timer0 _________________________________________203
3.4.13. Mdulo Timer1 ________________________________________________205
3.4.13.1. Operaciones Del Timer1______________________________________207
3.4.13.2. Modo De Lectura/Escritura De 16-Bit Del Timer1 _________________207
3.4.13.3. Oscilador Timer1 ___________________________________________208
3.4.13.3.1. Usar Timer1 como Fuente De Reloj _________________________209
3.4.13.3.2. Opcin De Baja Potencia Timer1 ___________________________209
3.4.13.3.3. Consideraciones Del Layout Del Oscilador Timer1 _____________209
3.4.13.4. Interrupcin Timer1 _________________________________________210
3.4.13.5. Reset Del Timer1 Usando El Disparador Especial
Del Acontecimiento CCP _____________________________________210
3.4.13.6. Usar Timer1 como Reloj De Tiempo Real (RTC) __________________211
3.4.14. Mdulo Timer2 ________________________________________________213
3.4.14.1. Operaciones Del Timer2______________________________________214
3.4.14.2. Interrupcin Timer2 _________________________________________215
3.4.14.3. Salida Del TMR2 ___________________________________________215
3.4.15. Mdulo Timer3 ________________________________________________216
3.4.15.1. Operaciones Del Timer3______________________________________218
3.4.15.2. Modo De Lectura/Grabacin De 16bit ___________________________218
3.4.15.3. Usar El Oscilador Timer1 como Fuente De Reloj Timer3 ____________219
3.4.15.4. Interrupcin Timer3 _________________________________________219
3.4.15.5. Reset Del Timer3 usando El Disparador Especial
De Acontecimientos Del CCP _________________________________220
3.4.16. Mdulos Captura/Comparacin/PWM (CCP) _________________________221
3.4.16.1. Configuracin Del Mdulo CCP _______________________________222
3.4.16.1.1. Recursos De Los Mdulos CCP Y Del Temporizador ___________222
3.4.16.1.2. CCP2 Asignacin De Pin _________________________________223

ix

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.16.2. MODO CAPTURA _________________________________________224


3.4.16.2.1. Configuracin Del Pin CCP _______________________________224
3.4.16.2.2. Seleccin De Modo Timer1/Timer3 _________________________224
3.4.16.2.3. Interrupcin Por Software_________________________________224
3.4.16.2.4. CCP Prescaler __________________________________________224
3.4.16.3. Modo Comparacin _________________________________________225
3.4.16.3.1. Tipo De Conexin CCP __________________________________225
3.4.16.3.2. Seleccin De Modo Timer1/Timer3 _________________________226
3.4.16.3.3. Modo De Interrupcin Por Software ________________________226
3.4.16.3.4. Disparador De Acontecimiento Especial _____________________226
3.4.16.4. Modo PWM _______________________________________________228
3.4.16.4.1. Periodo Del PWM ______________________________________229
3.4.16.4.2. Duty Cicle PWM _______________________________________229
3.4.16.4.3. PWM Auto-Apagado (CCP1 Solamente) _____________________230
3.4.16.4.4. Configuracin Del PWM _________________________________230
3.4.17. Mdulo Mejorado De Captura/Comparacin/PWM (ECCP)______________232
3.4.17.1. Salidas Y Configuracin Del ECCP_____________________________232
3.4.17.1.1. Recursos Del Temporizador Y Mdulo ECCP _________________232
3.4.17.2. Modos Captura Y Comparacin ________________________________234
3.4.17.2.1. Disparador De Acontecimiento Especial _____________________234
3.4.17.3. El Modo Estndar De PWM___________________________________234
3.4.17.4. El Modo PWM Mejorado_____________________________________235
3.4.17.4.1. Periodo De PWM _______________________________________236
3.4.17.4.2. Duty Cicle PWM _______________________________________236
3.4.17.4.3. Configuraciones De La Salida De PWM _____________________237
3.4.17.4.4. El Modo Half-Bridge ____________________________________238
3.4.17.4.5. Modo Full-Bridge _______________________________________239
3.4.17.4.6. Retraso Programable Banda-Muerta _______________________243
3.4.17.4.7. PWM Mejorado Auto-Apagado ____________________________244
3.4.17.4.8. Consideraciones De Reinicio ______________________________247
3.4.17.4.9. Pasos Para Configurar El PWM ____________________________247
3.4.17.4.10. Operando En Los Modos De Ahorro De Energa ______________248
3.4.17.4.11. Efectos De Un Reset____________________________________249
3.4.18. Bus Serie Universal (USB) _______________________________________250
3.4.18.1. Descripcin Del Perifrico USB________________________________250
3.4.18.2. Estado Y Control Del USB____________________________________251
3.4.18.2.1. Registro De Control Del USB (UCON) ______________________251
3.4.18.2.2. Registro De Configuracin Del USB (UCFG) _________________253
3.4.18.2.3. Registro De Estado Del USB (USTAT) ______________________258
3.4.18.2.4. Control De Los Endpoints Del USB_________________________260
3.4.18.2.5. Registro De Direccin Del USB (UADDR) ___________________261
3.4.18.2.6. Registros Del Nmero Del Frame Del USB (UFRMH: UFRML) __261
3.4.18.3. RAM Del USB _____________________________________________262
3.4.18.4. Buffer Descriptor Y Tabla Del Buffer Descriptor __________________263
3.4.18.4.1. Estado Y Configuracin De Los BD ________________________264
3.4.18.4.2. Byte De Cuenta De BD___________________________________268
3.4.18.4.3. Validacin De La Direccin De BD _________________________268
3.4.18.4.4. Buffering Ping-Pong_____________________________________269
3.4.18.5. Interrupciones Del USB ______________________________________272
3.4.18.5.1. Registro De Estado De Las Interrupciones Del USB (UIR) _______274
3.4.18.5.2. Registro De Permiso De Las Interrupciones (UIE) _____________275
3.4.18.5.3. Registro De Estado De Las Interrupciones
Por Error Del USB (UEIR)________________________________277
3.4.18.5.4. Registro De Permiso De Las Interrupciones De Error (UEIE) _____278

GUILLERMO DAVID HERRERO GONZLEZ

3.4.18.6. Modos De Energa Del USB __________________________________279


3.4.18.6.1. Slo Energa En El Bus __________________________________279
3.4.18.6.2. Slo Self-Power ________________________________________279
3.4.18.6.3. Energa Dual Con Dominancia Self-Power ___________________279
3.4.18.7. Streaming Parallel Port (SPP) _________________________________280
3.4.18.8. Oscilador _________________________________________________280
3.4.18.9. Descripcin Del USB ________________________________________282
3.4.18.9.1. Esquema De Capas ______________________________________282
3.4.18.9.2. Frames _______________________________________________283
3.4.18.9.3. Transferencias__________________________________________283
3.4.18.9.4. Energa _______________________________________________283
3.4.18.9.5. Enumeracin___________________________________________284
3.4.18.9.6. Descriptores ___________________________________________284
3.4.18.9.7. Velocidad Del Bus ______________________________________285
3.4.18.9.8. Especificaciones De Clase Y Drivers ________________________285
3.4.19. Puerto Paralelo Streaming (SPP) ___________________________________286
3.4.19.1. Configuracin Del SPP_______________________________________286
3.4.19.1.1. Permitir El SPP_________________________________________287
3.4.19.1.2. Registro De Datos_______________________________________288
3.4.19.1.3. Estados De Espera ______________________________________289
3.4.19.1.4. SPP Pull-Ups __________________________________________289
3.4.19.2. Sistema Para El Control Del USB ______________________________290
3.4.19.3. Sistema Para El Control Del Microcontrolador ____________________291
3.4.19.3.1. Interrupciones SPP ______________________________________291
3.4.19.3.2. Escribir El SPP _________________________________________292
3.4.19.3.3. Lectura Del SPP ________________________________________292
3.4.20. Mdulo Convertidor De 10-Bit Analgico A Digital (A/D) ______________294
3.4.20.1. Requisitos De La Adquisicin A/D _____________________________300
3.4.20.2. Seleccionar Y Configuracin El Tiempo De Adquisicin Tiempo _____301
3.4.20.3. Seleccionar El Reloj De Conversin A/D ________________________302
3.4.20.4. Operacin En Los Modos De Ahorro De Energa __________________303
3.4.20.5. Configuracin De Los Pines De Los Puertos Analgicos ____________303
3.4.20.6. Conversiones A/D __________________________________________304
3.4.20.7. Descarga __________________________________________________304
3.4.20.8. Uso Del Disparador Del CCP2_________________________________305
3.4.21. Mdulo Comparador ____________________________________________307
3.4.21.1. Configuracin Del Comparador ________________________________309
3.4.21.2. Operaciones Del Comparador _________________________________309
3.4.21.3. Referencia Del Comparador ___________________________________309
3.4.21.3.1. Seal De Referencia Externa ______________________________310
3.4.21.3.2. Seal De Referencia Interna _______________________________310
3.4.21.4. Tiempo De Respuesta Del Comparador __________________________310
3.4.21.5. Salidas Del Comparador______________________________________310
3.4.21.6. Interrupciones Del Comparador ________________________________311
3.4.21.7. Operaciones Del Comparador Durante El Modo SLEEP _____________312
3.4.21.8. Efectos De Un Reset_________________________________________312
3.4.21.9. Consideraciones En La Conexin De Las Entradas Analgicas _______312
3.4.22. Mdulo Comparador De Tensin De Referencia_______________________314
3.4.22.1. Configuracin Del Mdulo Comparador De Tensin De Referencia____314
3.4.22.2. Exactitud/Error De La Tensin De Referencia_____________________316
3.4.22.3. Operacin En Modo SLEEP___________________________________316
3.4.22.4. Efectos De Un Reset_________________________________________316
3.4.22.5. Consideraciones De La Conexin ______________________________317
3.4.23. Detector De Alta/Baja Tensin (HLVD) _____________________________318

xi

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.23.1. Operacin _________________________________________________319


3.4.23.2. Configuracin Del HLVD ____________________________________320
3.4.23.3. Consumicin De Corriente ____________________________________321
3.4.23.4. Tiempo De Arranque De HLVD _______________________________321
3.4.23.5. Aplicaciones _______________________________________________322
3.4.23.6. Operaciones En El Modo Sleep ________________________________323
3.4.23.7. Efectos De Un Reset_________________________________________323
3.4.24. Caractersticas Especiales De La CPU_______________________________324
3.4.24.1. Bits De Configuracin _______________________________________325
3.4.24.2. Temporizador Del Perro Guardin (WDT)________________________337
3.4.24.2.1. Registro De Control _____________________________________338
3.4.24.3. Arranque A Dos Velocidades__________________________________339
3.4.24.3.1. Consideraciones Especiales Para Usar Arranque
A Dos Velocidades ______________________________________340
3.4.24.4. Monitor De Reloj A Prueba De Fallos ___________________________340
3.4.24.4.1. FSCM Y El Temporizador Perro Guardin ___________________341
3.4.24.4.2. Salir De La Operacin A Prueba De Fallos ___________________341
3.4.24.4.3. Interrupciones De FSCM Dentro De Los Modos De Ahorro
De Energa ____________________________________________342
3.4.24.4.4. POR O Reinicio Del Sleep ________________________________342
3.4.24.5. Verificacin Del Programa Y Cdigo De Proteccin________________343
3.4.24.5.1. Memoria De Programa Cdigo De Proteccin _________________345
3.4.24.5.2. Datos EEPROM Cdigo De Proteccin ______________________347
3.4.24.5.3. Configuracin Del Registro De Proteccin ___________________347
3.4.24.6. Localizaciones De Identificacin _______________________________347
3.4.24.7. Programacin Serie In-Circuit _________________________________347
3.4.24.8. Depuracin In-Circuit________________________________________347
3.4.24.9. Caractersticas Especiales De Icport (Sealando Paquetes Solamente) __348
3.4.24.9.1. Puerto Dedicado ICD/ICSP _______________________________348
3.4.24.9.2. Emulacin De 28 Pines___________________________________349
3.4.24.10. Suministro nico De La Programacin ICSP ____________________349

3.5.

Fuses De Programacin de la Familia PIC18Fxx5x _______________ 351

3.5.1. PIC18F2455 ___________________________________________________351


3.5.1.1. Bits Selectores Del Prescaler Del PLL: ___________________________351
3.5.1.2. Postcaler Del Reloj Del Sistema CPU:____________________________351
3.5.1.3. Bit Selectores Del Reloj Del USB (Modo Full-Speed; UCFG:FSEN=1)__351
3.5.1.4. Bits Selectores Del Oscilador: __________________________________352
3.5.1.5. Bit De Permiso Del Monitor De Reloj De Seguridad: ________________352
3.5.1.6. Bit De Cambio Del Oscilador Interno/Externo: _____________________352
3.5.1.7. Bit De Permiso Del Retraso En El Inicio: _________________________352
3.5.1.8. Bit De Permiso Del Reset Por Cese De Tensin (BOR): ______________353
3.5.1.9. Bits De Tensin BOR: ________________________________________353
3.5.1.10. Bit De Permiso Del Regulador De Tensin USB: __________________353
3.5.1.11. Bit De Permiso Del Temporizador Watchdog:_____________________353
3.5.1.12. Bits Selectores Del Postscaler Del Watchdog: _____________________354
3.5.1.13. Bit De Permiso Del Pin MCLR: ________________________________354
3.5.1.14. Bit De Permiso De La Potencia Del Oscilador Timer 1: _____________354
3.5.1.15. Bit De Permiso PORTB A/D:__________________________________355
3.5.1.16. CCP2 MUX Bit: ____________________________________________355
3.5.1.17. Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:__________355
3.5.1.18. Bit De Permiso Del ICSP: ____________________________________355
3.5.1.19. Bit De Permiso Del Juego De Instrucciones Extendido: _____________355
3.5.1.20. Bit De Permiso Del Debugger Oculto: ___________________________355
3.5.1.21. Bit Del Cdigo De Proteccin En El Bloque 0: ____________________356

xii

GUILLERMO DAVID HERRERO GONZLEZ

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.

Bit Del Cdigo De Proteccin En El Bloque 1: ____________________356


Bit Del Cdigo De Proteccin En El Bloque 2: ____________________356
Bit Del Cdigo De Proteccin En El Bloque De Inicio:______________356
Bit Del Cdigo De Proteccin En La EEPROM De Datos: ___________356
Bit De Proteccin Contra Escritura 0: ___________________________356
Bit De Proteccin Contra Escritura 1: ___________________________356
Bit De Proteccin Contra Escritura 2: ___________________________357
Bit De Proteccin Contra Escritura En El Bloque De Inicio:__________357
Bits De Proteccin Contra Escritura En Los Registros
De Configuracin: __________________________________________357
3.5.1.31. Bits De Proteccin Contra Escritura En La EEPROM De Datos: ______357
3.5.1.32. Bit De Proteccin De La Lectura De Tabla Del Bloque 0:____________357
3.5.1.33. Bit De Proteccin De La Lectura De Tabla Del Bloque 1:____________357
3.5.1.34. Bit De Proteccin De La Lectura De Tabla Del Bloque 2:____________358
3.5.1.35. Proteccin Contra La Lectura De Tabla Del Bloque De Inicio:________358
3.5.2. PIC18F2550 ___________________________________________________358
3.5.2.1. Bits Selectores Del Prescaler Del PLL: ___________________________358
3.5.2.2. Postcaler Del Reloj Del Sistema CPU:____________________________358
3.5.2.3. Bit Selectores Del Reloj Del USB (Modo Full-Speed; UCFG:FSEN=1)__359
3.5.2.4. Bits Selectores Del Oscilador: __________________________________359
3.5.2.5. Bit De Permiso Del Monitor De Reloj De Seguridad: ________________359
3.5.2.6. Bit De Cambio Del Oscilador Interno/Externo: _____________________359
3.5.2.7. Bit De Permiso Del Retraso En El Inicio: _________________________360
3.5.2.8. Bit De Permiso Del Reset Por Cese De Tensin (BOR): ______________360
3.5.2.9. Bits De Tensin BOR: ________________________________________360
3.5.2.10. Bit De Permiso Del Regulador De Tensin USB: __________________360
3.5.2.11. Bit De Permiso Del Temporizador Watchdog:_____________________360
3.5.2.12. Bits Selectores Del Postscaler Del Watchdog: _____________________361
3.5.2.13. Bit De Permiso Del Pin MCLR: ________________________________361
3.5.2.14. Bit De Permiso De La Potencia Del Oscilador Timer 1: _____________361
3.5.2.15. Bit De Permiso PORTB A/D:__________________________________362
3.5.2.16. CCP2 MUX Bit: ____________________________________________362
3.5.2.17. Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:__________362
3.5.2.18. Bit De Permiso Del ICSP: ____________________________________362
3.5.2.19. Bit De Permiso Del Juego De Instrucciones Extendido: _____________362
3.5.2.20. Bit De Permiso Del Debugger Oculto: ___________________________362
3.5.2.21. Bit Del Cdigo De Proteccin En El Bloque 0: ____________________362
3.5.2.22. Bit Del Cdigo De Proteccin En El Bloque 1: ____________________363
3.5.2.23. Bit Del Cdigo De Proteccin En El Bloque 2: ____________________363
3.5.2.24. Bit Del Cdigo De Proteccin En El Bloque 3: ____________________363
3.5.2.25. Bit Del Cdigo De Proteccin En El Bloque De Inicio:______________363
3.5.2.26. Bit Del Cdigo De Proteccin En La EEPROM De Datos: ___________363
3.5.2.27. Bit De Proteccin Contra Escritura 0: ___________________________363
3.5.2.28. Bit De Proteccin Contra Escritura 1: ___________________________363
3.5.2.29. Bit De Proteccin Contra Escritura 2: ___________________________364
3.5.2.30. Bit De Proteccin Contra Escritura 3: ___________________________364
3.5.2.31. Bit De Proteccin Contra Escritura En El Bloque De Inicio:__________364
3.5.2.32. Bits De Proteccin Contra Escritura En Los Registros
De Configuracin: __________________________________________364
3.5.2.33. Bits De Proteccin Contra Escritura En La EEPROM De Datos: ______364
3.5.2.34. Bit De Proteccin De La Lectura De Tabla Del Bloque 0:____________364
3.5.2.35. Bit De Proteccin De La Lectura De Tabla Del Bloque 1:____________365
3.5.2.36. Bit De Proteccin De La Lectura De Tabla Del Bloque 2:____________365
3.5.2.37. Bit De Proteccin De La Lectura De Tabla Del Bloque 3:____________365

xiii

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.2.38. Proteccin Contra La Lectura De Tabla Del Bloque De Inicio:________365


3.5.3. PIC18F4455 ___________________________________________________366
3.5.3.1. Bits Selectores Del Prescaler Del PLL: ___________________________366
3.5.3.2. Postcaler Del Reloj Del Sistema CPU:____________________________366
3.5.3.3. Bit Selectores Del Reloj Del USB (Modo Full-Speed; UCFG:FSEN=1)__366
3.5.3.4. Bits Selectores Del Oscilador: __________________________________367
3.5.3.5. Bit De Permiso Del Monitor De Reloj De Seguridad: ________________367
3.5.3.6. Bit De Cambio Del Oscilador Interno/Externo: _____________________367
3.5.3.7. Bit De Permiso Del Retraso En El Inicio: _________________________367
3.5.3.8. Bit De Permiso Del Reset Por Cese De Tensin (BOR): ______________368
3.5.3.9. Bits De Tensin BOR: ________________________________________368
3.5.3.10. Bit De Permiso Del Regulador De Tensin USB: __________________368
3.5.3.11. Bit De Permiso Del Temporizador Watchdog:_____________________368
3.5.3.12. Bits Selectores Del Postscaler Del Watchdog: _____________________369
3.5.3.13. Bit De Permiso Del Pin MCLR: ________________________________369
3.5.3.14. Bit De Permiso De La Potencia Del Oscilador Timer 1: _____________369
3.5.3.15. Bit De Permiso PORTB A/D:__________________________________370
3.5.3.16. CCP2 MUX Bit: ____________________________________________370
3.5.3.17. Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:__________370
3.5.3.18. Bit De Permiso Del ICSP: ____________________________________370
3.5.3.19. Bit De Permiso Del Debug En-Circuito/Puerto De
Programacin (ICPORT):_____________________________________370
3.5.3.20. Bit De Permiso Del Juego De Instrucciones Extendido: _____________370
3.5.3.21. Bit De Permiso Del Debugger Oculto: ___________________________370
3.5.3.22. Bit Del Cdigo De Proteccin En El Bloque 0: ____________________371
3.5.3.23. Bit Del Cdigo De Proteccin En El Bloque 1: ____________________371
3.5.3.24. Bit Del Cdigo De Proteccin En El Bloque 2: ____________________371
3.5.3.25. Bit Del Cdigo De Proteccin En El Bloque De Inicio:______________371
3.5.3.26. Bit Del Cdigo De Proteccin En La EEPROM De Datos: ___________371
3.5.3.27. Bit De Proteccin Contra Escritura 0: ___________________________371
3.5.3.28. Bit De Proteccin Contra Escritura 1: ___________________________371
3.5.3.29. Bit De Proteccin Contra Escritura 2: ___________________________372
3.5.3.30. Bit De Proteccin Contra Escritura En El Bloque De Inicio:__________372
3.5.3.31. Bits De Proteccin Contra Escritura En Los Registros
De Configuracin: __________________________________________372
3.5.3.32. Bits De Proteccin Contra Escritura En La EEPROM De Datos: ______372
3.5.3.33. Bit De Proteccin De La Lectura De Tabla Del Bloque 0:____________372
3.5.3.34. Bit De Proteccin De La Lectura De Tabla Del Bloque 1:____________372
3.5.3.35. Bit De Proteccin De La Lectura De Tabla Del Bloque 2:____________373
3.5.3.36. Proteccin Contra La Lectura De Tabla Del Bloque De Inicio:________373
3.5.4. PIC18F4550 ___________________________________________________373
3.5.4.1. Bits Selectores Del Prescaler Del PLL: ___________________________373
3.5.4.2. Postcaler Del Reloj Del Sistema CPU:____________________________373
3.5.4.3. Bit Selectores Del Reloj Del USB (Modo Full-Speed; UCFG:FSEN=1)__374
3.5.4.4. Bits Selectores Del Oscilador: __________________________________374
3.5.4.5. Bit De Permiso Del Monitor De Reloj De Seguridad: ________________374
3.5.4.6. Bit De Cambio Del Oscilador Interno/Externo: _____________________374
3.5.4.7. Bit De Permiso Del Retraso En El Inicio: _________________________375
3.5.4.8. Bit De Permiso Del Reset Por Cese De Tensin (BOR): ______________375
3.5.4.9. Bits De Tensin BOR: ________________________________________375
3.5.4.10. Bit De Permiso Del Regulador De Tensin USB: __________________375
3.5.4.11. Bit De Permiso Del Temporizador Watchdog:_____________________375
3.5.4.12. Bits Selectores Del Postscaler Del Watchdog: _____________________376
3.5.4.13. Bit De Permiso Del Pin MCLR: ________________________________376

xiv

GUILLERMO DAVID HERRERO GONZLEZ

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.

Bit De Permiso De La Potencia Del Oscilador Timer 1: _____________376


Bit De Permiso PORTB A/D:__________________________________377
CCP2 MUX Bit: ____________________________________________377
Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:__________377
Bit De Permiso Del ICSP: ____________________________________377
Bit De Permiso Del Debug En-Circuito/Puerto De
Programacin (ICPORT):_____________________________________377
Bit De Permiso Del Juego De Instrucciones Extendido: _____________377
Bit De Permiso Del Debugger Oculto: ___________________________377
Bit Del Cdigo De Proteccin En El Bloque 0: ____________________378
Bit Del Cdigo De Proteccin En El Bloque 1: ____________________378
Bit Del Cdigo De Proteccin En El Bloque 2: ____________________378
Bit Del Cdigo De Proteccin En El Bloque 3: ____________________378
Bit Del Cdigo De Proteccin En El Bloque De Inicio:______________378
Bit Del Cdigo De Proteccin En La EEPROM De Datos: ___________378
Bit De Proteccin Contra Escritura 0: ___________________________378
Bit De Proteccin Contra Escritura 1: ___________________________379
Bit De Proteccin Contra Escritura 2: ___________________________379
Bit De Proteccin Contra Escritura 3: ___________________________379
Bit De Proteccin Contra Escritura En El Bloque De Inicio:__________379
Bits De Proteccin Contra Escritura En Los Registros De
Configuracin: _____________________________________________379
Bits De Proteccin Contra Escritura En La EEPROM De Datos: ______379
Bit De Proteccin De La Lectura De Tabla Del Bloque 0:____________380
Bit De Proteccin De La Lectura De Tabla Del Bloque 1:____________380
Bit De Proteccin De La Lectura De Tabla Del Bloque 2:____________380
Bit De Proteccin De La Lectura De Tabla Del Bloque 3:____________380
Proteccin Contra La Lectura De Tabla Del Bloque De Inicio:________380

Lenguaje De Programacin C18 _____________________________ 383


4.1.

Introduccin _______________________________________________ 383

4.2.

Compilador MPLAB C18 ____________________________________ 383

4.2.1. Introduccin ___________________________________________________383


4.2.2. Tipos De Datos _________________________________________________384
4.2.2.1. Enteros ____________________________________________________384
4.2.2.2. Reales _____________________________________________________384
4.2.2.3. Estructuras _________________________________________________385
4.2.2.4. Almacenamiento_____________________________________________385
4.2.2.5. Calificadores________________________________________________386
4.2.3. Estructuras de Control ____________________________________________386
4.2.3.1. Repetitivas _________________________________________________386
4.2.3.1.1. Sentencia While _________________________________________386
4.2.3.1.2. Sentencia Do____________________________________________387
4.2.3.1.3. Sentencia For ___________________________________________387
4.2.3.1.4. Sentencia If_____________________________________________387
4.2.3.1.5. Sentencia If-Else_________________________________________387
4.2.3.1.6. Sentencia Switch_________________________________________388
4.2.3.1.7. Sentencia Break _________________________________________388
4.2.3.1.8. Sentencia Continue _______________________________________388
4.2.3.1.9. Sentencia Goto __________________________________________388
4.2.4. Punteros_______________________________________________________389
4.2.5. Cadenas De Constantes ___________________________________________389

xv

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.

Libreras Del C18___________________________________________ 390

4.3.1. Abreviaturas en las libreras de Microchip ____________________________390


4.3.2. Adc.H: Librera De Los Conversores A/D ____________________________393
4.3.2.1. Descripcin De Las Funciones __________________________________393
4.3.3. Pwm.H: Funciones Del PWM Y EPWM _____________________________397
4.3.3.1. Descripcin De Las Funciones __________________________________397
4.3.4. Timers.h: Funciones de los temporizadores ___________________________399
4.3.4.1. Descripcin de las funciones ___________________________________399
4.3.5. Delays.H: Retrasos Por Software ___________________________________404
4.3.5.1. Descripcin De Las Funciones __________________________________404
4.3.6. Libreras del USB ______________________________________________406
4.3.6.1. Usb.h _____________________________________________________406
4.3.6.2. Usbcfg.h: Configuracin ______________________________________408
4.3.6.2.1. Definiciones ____________________________________________408
4.3.6.2.2. Uso de la clase del dispositivo ______________________________408
4.3.6.2.3. Distribucin de los Endpoint _______________________________409
4.3.6.3. Usbdefs_std_dsc.h: Definiciones estndar de los descriptores: _________410
4.3.6.3.1. Incluye: ________________________________________________410
4.3.6.3.2. Definiciones ____________________________________________410
4.3.6.3.3. Estructuras _____________________________________________411
4.3.6.4. Usbdsc.h: Descriptores________________________________________413
4.3.6.4.1. Libreras que incluye _____________________________________413
4.3.6.4.2. Definiciones ____________________________________________413
4.3.6.4.3. Externas _______________________________________________413
4.3.6.5. Usbdefs_ep0_buff.h: Descripciones Del Buffer Del Endpoint 0 ________414
4.3.6.5.1. Incluye ________________________________________________414
4.3.6.6. Usbmmap.h ________________________________________________418
4.3.6.6.1. Incluye ________________________________________________418
4.3.6.6.2. Definiciones ____________________________________________418
4.3.6.6.3. Tipos __________________________________________________419
4.3.6.6.4. Externas _______________________________________________420
4.3.6.7. Usbdrv.h: Driver Del USB _____________________________________422
4.3.6.7.1. Incluye ________________________________________________422
4.3.6.7.2. Definiciones ____________________________________________422
4.3.6.7.3. Prototipos pblicos _______________________________________425
4.3.6.8. Usbctrltrf.h: Control de transferencias del USB_____________________426
4.3.6.8.1. Incluye ________________________________________________426
4.3.6.8.2. Definiciones ____________________________________________426
4.3.6.8.3. Externas _______________________________________________426
4.3.6.8.4. Prototipos pblicos _______________________________________426
4.3.6.9. Usb9.h ____________________________________________________427
4.3.6.9.1. Incluye ________________________________________________427
4.3.6.9.2. Definiciones ____________________________________________427
4.3.6.9.3. Prototipos pblicos _______________________________________427
4.3.6.10. Usbgen.h: USB Genrico _____________________________________428
4.3.6.10.1. Incluye _______________________________________________428
4.3.6.10.2. Definiciones ___________________________________________428
4.3.6.10.3. Externas ______________________________________________428
4.3.6.10.4. Prototipos Pblicos ______________________________________428
4.3.6.11. Msd.h: Almacenamiento Masivo _______________________________429
4.3.6.11.1. Incluye _______________________________________________429
4.3.6.11.2. Definiciones ___________________________________________429
4.3.6.11.3. Estructuras ____________________________________________432
4.3.6.11.4. Externas ______________________________________________436

xvi

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.11.5. Prototipos pblicos ______________________________________436


4.3.6.12. Cdc.h: Dispositivos De Comunicacin___________________________437
4.3.6.12.1. Incluye _______________________________________________437
4.3.6.12.2. Definiciones ___________________________________________437
4.3.6.12.3. Estructuras ____________________________________________440
4.3.6.12.4. Externas ______________________________________________442
4.3.6.12.5. Prototipos publicos ______________________________________442
4.3.6.13. Hid.h: Dispositivo interfaz con humanos _________________________443
4.3.6.13.1. Incluye _______________________________________________443
4.3.6.13.2. Definiciones ___________________________________________443
4.3.6.13.3. Estructuras ____________________________________________444
4.3.6.13.4. Externas ______________________________________________444
4.3.6.13.5. Prototipos pblicos ______________________________________445
4.3.6.14. Io_cfg.h __________________________________________________445
4.3.6.14.1. Incluye _______________________________________________445
4.3.6.14.2. Tris __________________________________________________445
4.3.6.14.3. USB _________________________________________________445
4.3.6.14.4. LED _________________________________________________446
4.3.6.14.5. Interruptores ___________________________________________446
4.3.6.14.6. Potencimetro__________________________________________446
4.3.6.14.7. SPI: Lneas de Chip Select ________________________________446
4.3.6.14.8. SDMMC ______________________________________________446
4.3.6.15. interrupt.h _________________________________________________447
4.3.6.15.1. Incluye _______________________________________________447
4.3.6.15.2. Definiciones ___________________________________________447
4.3.6.15.3. Prototipos _____________________________________________447
4.3.6.16. Usb_compile_time_validation.h: Validacin Del
Tiempo De Compilado _______________________________________448
4.3.6.16.1. Incluye _______________________________________________448
4.3.6.16.2. Validacin del USB _____________________________________448
4.3.7. Libreras Del Microprocesador _____________________________________448

4.4.

Macros Del Compilador C18 _________________________________ 449

4.4.1. Usbdrv.c: Drivers USB ___________________________________________449


4.4.1.1. Incluye ____________________________________________________449
4.4.1.2. Variables___________________________________________________449
4.4.1.3. Prototipos privados___________________________________________449
4.4.1.4. Declaraciones _______________________________________________449
4.4.1.4.1. void USBCheckBusStatus(void) ____________________________450
4.4.1.4.2. void USBModuleEnable(void) ______________________________451
4.4.1.4.3. void USBModuleDisable(void) _____________________________451
4.4.1.4.4. void USBSoftDetach(void)_________________________________451
4.4.1.4.5. void USBDriverService(void) ______________________________452
4.4.1.4.6. void USBSuspend(void) ___________________________________453
4.4.1.4.7. void USBWakeFromSuspend(void) __________________________453
4.4.1.4.8. void USBRemoteWakeup(void) _____________________________454
4.4.1.4.9. void USB_SOF_Handler(void) _____________________________455
4.4.1.4.10. void USBStallHandler(void) ______________________________455
4.4.1.4.11. void USBErrorHandler(void) ______________________________456
4.4.1.4.12. void USBProtocolResetHandler(void) _______________________456
4.4.1.5. Funcin auxiliar _____________________________________________457
4.4.2. Usb9.c ________________________________________________________457
4.4.2.1. Incluye ____________________________________________________457
4.4.2.2. Variables___________________________________________________457
4.4.2.3. Prototipos privados___________________________________________457

xvii

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.2.4. Declaraciones _______________________________________________457


4.4.2.4.1. void USBCheckStdRequest(void) ___________________________457
4.4.2.4.2. void USBStdGetDscHandler(void)___________________________459
4.4.2.4.3. void USBStdSetCfgHandler(void) ___________________________460
4.4.2.4.4. void USBStdGetStatusHandler(void) _________________________460
4.4.2.4.5. void USBStdFeatureReqHandler(void) _______________________461
4.4.3. Usbctrltrf.c ____________________________________________________462
4.4.3.1. Incluye ____________________________________________________462
4.4.3.2. Variables___________________________________________________462
4.4.3.3. Prototipos privados___________________________________________462
4.4.3.4. Declaraciones _______________________________________________462
4.4.3.4.1. void USBCtrlEPService(void) ______________________________462
4.4.3.4.2. void USBCtrlTrfSetupHandler(void) _________________________463
4.4.3.4.3. void USBCtrlTrfSetupHandler(void) _________________________463
4.4.3.4.4. void USBCtrlTrfOutHandler(void)___________________________464
4.4.3.4.5. void USBCtrlTrfInHandler(void) ____________________________464
4.4.3.4.6. void USBCtrlTrfTxService(void) ____________________________465
4.4.3.4.7. void USBCtrlTrfRxService(void)____________________________466
4.4.3.4.8. void USBCtrlEPServiceComplete(void) ______________________466
4.4.3.4.9. void USBPrepareForNextSetupTrf(void) ______________________468
4.4.4. Usbdsc.c: Descriptores USB _______________________________________469
4.4.4.1. Incluye ____________________________________________________471
4.4.4.2. Constantes _________________________________________________472
4.4.5. Usbmmap.c ____________________________________________________474
4.4.5.1. Incluye ____________________________________________________476
4.4.5.2. Variables globales del USB ____________________________________476
4.4.5.3. Localizaciones de variables fijas del USB _________________________476
4.4.6. usbgen.c: USB genrico __________________________________________479
4.4.6.1. Incluye ____________________________________________________479
4.4.6.2. Variables___________________________________________________479
4.4.6.3. Declaraciones _______________________________________________479
4.4.6.4. API del usuario______________________________________________479
4.4.6.4.1. void USBGenInitEP(void) _________________________________479
4.4.6.4.2. void USBGenWrite(byte *buffer, byte len) ____________________480
4.4.6.4.3. byte USBGenRead(byte *buffer, byte len)_____________________481
4.4.7. msd.c: USB Almacenamiento Masivo _______________________________482
4.4.7.1. Incluye ____________________________________________________482
4.4.7.2. Variables___________________________________________________482
4.4.7.3. Protoripos privados___________________________________________483
4.4.7.4. Declaraciones _______________________________________________483
4.4.7.5. Respuestas especficas de la clase _______________________________483
4.4.7.5.1. void USBCheckMSDRequest(void) __________________________483
4.4.7.5.2. void ProcessIO(void) _____________________________________484
4.4.7.5.3. void MSDInitEP(void) ____________________________________484
4.4.7.5.4. void SDCardInit(void) ____________________________________484
4.4.7.5.5. void MSDCommandHandler(void) __________________________484
4.4.7.5.6. void SendCSW(void) _____________________________________484
4.4.7.5.7. void SendData(byte* dataAddr, byte dataSize) _________________485
4.4.7.5.8. void MSDDataIn(void)____________________________________485
4.4.7.5.9. void IsValidCBW()_______________________________________485
4.4.7.5.10. void IsMeaningfulCBW()_________________________________485
4.4.7.5.11. void PrepareCSWData() __________________________________485
4.4.7.5.12. void MSDInquiryHandler(void) ____________________________485
4.4.7.5.13. void ResetSenseData(void)________________________________485

xviii

GUILLERMO DAVID HERRERO GONZLEZ

4.4.7.5.14. void MSDReadCapacityHandler() __________________________486


4.4.7.5.15. void MSDReadHandler(void)______________________________486
4.4.7.5.16. void MSDDataOut(void) _________________________________486
4.4.7.5.17. void MSDWriteHandler()_________________________________486
4.4.7.5.18. void MSDRequestSenseHandler(void)_______________________486
4.4.7.5.19. void MSDModeSenseHandler() ____________________________486
4.4.7.5.20. void MSDMediumRemovalHandler() _______________________487
4.4.7.5.21. void MSDTestUnitReadyHandler() _________________________487
4.4.7.5.22. void MSDVerifyHandler() ________________________________487
4.4.7.5.23. void MSDStopStartHandler() ______________________________487
4.4.8. cdc.c: USB Dispositivo de comunicacin _____________________________488
4.4.8.1. Incluye ____________________________________________________488
4.4.8.2. Variables___________________________________________________488
4.4.8.3. Declaraciones _______________________________________________488
4.4.8.4. Respuestas especficas de la clase _______________________________488
4.4.8.4.1. void USBCheckCDCRequest(void) __________________________488
4.4.8.5. Api del Usuario_____________________________________________489
4.4.8.5.1. void CDCInitEP(void) ____________________________________489
4.4.8.5.2. byte getsUSBUSART(char *buffer, byte len) __________________489
4.4.8.5.3. void putsUSBUSART(char *data) ___________________________489
4.4.8.5.4. void putrsUSBUSART(const rom char *data) __________________490
4.4.8.5.5. void CDCTxService(void) _________________________________490
4.4.9. hid.c: USB interfaz con humanos ___________________________________491
4.4.9.1. Incluye ____________________________________________________ 491
4.4.9.2. Variables___________________________________________________491
4.4.9.3. Prototipos privados___________________________________________491
4.4.9.4. Declaraciones _______________________________________________491
4.4.9.5. Respuestas especficas de la clase _______________________________491
4.4.9.5.1. void USBCheckHIDRequest(void)___________________________491
4.4.9.6. API del usuario______________________________________________491
4.4.9.6.1. void HIDInitEP(void) _____________________________________491
4.4.9.6.2. void HIDTxReport(char *buffer, byte len)_____________________492
4.4.9.6.3. byte HIDRxReport(char *buffer, byte len)_____________________492
4.4.10. main.c________________________________________________________493
4.4.10.1. Incluye ___________________________________________________493
4.4.10.2. Variables__________________________________________________493
4.4.10.3. Prototipos privados___________________________________________ 493
4.4.10.3.1. Remapeo de vectores ____________________________________ 493
4.4.10.3.2. Declaraciones __________________________________________ 493
4.4.12. interrupt.c _____________________________________________________495
4.4.12.1. Incluye ___________________________________________________495
4.4.12.2. Vectores de interrupcin______________________________________495
4.4.12.3. Declaraciones ______________________________________________495
4.4.12.3.1. void high_isr(void) ______________________________________495
4.4.12.3.2. void low_isr(void) ______________________________________495

5.

Lenguaje De Programacin Visual Basic ______________________ 499


5.1.

Introduccin _______________________________________________ 499

5.2.

Caractersticas Generales De Visual Basic ______________________ 501

5.3.

Tipos de datos______________________________________________ 502

5.3.1. Constantes _____________________________________________________502


5.3.2. Variables ______________________________________________________502
5.3.2.1. Nombre____________________________________________________502

xix

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

5.3.2.2. Tipo ______________________________________________________503


5.3.2.3. mbito ____________________________________________________504
5.3.3. Operadores ____________________________________________________504
5.3.4. Sentencias De Control ____________________________________________505
5.3.4.1. Sentencia If_________________________________________________505
5.3.4.2. Sentencia Select _____________________________________________506
5.3.4.3. Sentencia ForNext _________________________________________506
5.3.4.3.1. Funcionamiento de la Sentencia For: _________________________507
5.3.4.4. Sentencia WhileWend ______________________________________507
5.3.4.4.1. Funcionamiento de la Sentencia While...Wend _________________507
5.3.4.5. Sentencia DoLoop _________________________________________508
5.3.4.6. Sentencia Goto ______________________________________________508

5.4.

Libreras En Visual Basic ____________________________________ 509

5.4.1. Librera Del USB: MPUSBAPI.dll __________________________________509


5.4.1.1. Inroduccin_________________________________________________509
5.4.1.2. FUNCIONES _______________________________________________509
5.4.1.2.1. MPUSBGetDLLVersion(Void) _____________________________509
5.4.1.2.2. MPUSBGetDeviceCount(pVID_PID) ________________________509
5.4.1.2.3. MPUSBOpen(instance, pVID_PID, pEP, dwDir, dwReserved)_____510
5.4.1.2.4. MPUSBRead(handle, pData, dwLen, pLength, dwMilliseconds) ___511
5.4.1.2.5. MPUSBWrite(handle, pData, dwLen, pLength, dwMilliseconds) ___512
5.4.1.2.6. MPUSBReadInt(handle, pData, dwLen, pLength, dwMilliseconds) _512
5.4.1.2.7. MPUSBClose(handle) ____________________________________512
5.4.1.3. TIPOS DE TRANSFERENCIAS________________________________513
5.4.1.4. Declaracin De Constantes Y Variables __________________________513
5.4.1.5. Declaracin de las funciones ___________________________________514
5.4.1.5.1. C _____________________________________________________514
5.4.1.5.2. VB ___________________________________________________514
5.4.1.5.3. Delphi _________________________________________________515

6.

Interconexin USB-PC _____________________________________ 519


6.1.

Introduccin _______________________________________________ 519

6.2.

Arquitectura Windows ______________________________________ 519

6.3.

Carga En Windows De Un Mdulo USB ________________________ 519

6.4.

El Driver .sys ______________________________________________ 520

6.4.1. Dilogo Con La Aplicacin________________________________________520


6.4.2. Gestin De Bugs ________________________________________________521
6.4.3. Caractersticas De Un Driver ______________________________________521
6.4.3.1. Principios De Acceso _________________________________________522
6.4.3.2. Modo De Acceso ____________________________________________522
6.4.3.3. Modo De Acceso Mltiple _____________________________________522
6.4.3.4. Paso De Datos ______________________________________________522
6.4.3.5. Limitacin de 4Kbytes ________________________________________523
6.4.3.6. Mltiples Perifricos _________________________________________523
6.4.3.7. Gestin De Las Peticiones De La Aplicacin_______________________523
6.4.3.8. Gestin De Las Peticiones Del Sistema ___________________________523

6.5.

El Driver De Microchip______________________________________ 524

xx

GUILLERMO DAVID HERRERO GONZLEZ

7.

Aplicacin _______________________________________________ 527


7.1.

Introduccin _______________________________________________ 527

7.2.

Circuito Elctrico___________________________________________ 527

7.2.1. Esquema Elctrico Del Circuito ____________________________________528


7.2.2. Componentes___________________________________________________529
7.2.2.1. Microcontrolador ____________________________________________529
7.2.2.2. ULN2803 __________________________________________________529
7.2.2.3. L293D ____________________________________________________530
7.2.2.4. Sensor De Distancia __________________________________________530
7.2.2.5. Finales De Carrera ___________________________________________530
7.2.2.6. Zumbador __________________________________________________531
7.2.2.7. Bombillas Y LEDs ___________________________________________531
7.2.2.8. Conector USB ______________________________________________531
7.2.2.9. Motores De Corriente Continua _________________________________532
7.2.2.9.1. Control Del Sentido De Giro _______________________________533
7.2.2.9.2. El L293 Como Driver De Un Motor De Corriente Continua _______534
7.2.2.9.3. Control De La Velocidad __________________________________536
7.2.2.9.4. Aumento Del Par Motor ___________________________________537
7.2.2.10. Motores Paso A Paso ________________________________________538
7.2.2.10.1. Motores Bipolares_______________________________________539
7.2.2.10.2. Motores Unipolares _____________________________________540
7.2.2.10.3. Caractersticas Importantes________________________________543
7.2.3. Esquema Elctrico De La Placa Impresa______________________________544

7.3.

Firmware Del Microcontrolador ______________________________ 545

7.3.1. Main.c ________________________________________________________545


7.3.1.1. Incluye ____________________________________________________545
7.3.1.2. Variables___________________________________________________547
7.3.1.3. Prototipos privados___________________________________________547
7.3.1.4. Remapeo Del vector __________________________________________548
7.3.1.5. Declaraciones _______________________________________________548
7.3.1.5.1. void main(void) _________________________________________548
7.3.1.5.2. void InitializeSystem(void) ________________________________548
7.3.1.5.3. void USBTasks(void) _____________________________________549
7.3.2. Usbcfg.h ______________________________________________________549
7.3.2.1. Definiciones ________________________________________________549
7.3.2.2. Definicin De La Clase _______________________________________549
7.3.2.3. Localizaciones De Los Endpoints _______________________________550
7.3.2.3.1. Identificador De La Interfaz ________________________________550
7.3.2.3.2. Endpoints ______________________________________________550
7.3.3. Usbdsc.h ______________________________________________________550
7.3.3.1. Incluye ____________________________________________________550
7.3.3.2. Definiciones ________________________________________________551
7.3.3.3. Funciones Externas___________________________________________551
7.3.4. Usbdsc.c ______________________________________________________551
7.3.4.1. Incluye ____________________________________________________551
7.3.4.2. Constantes _________________________________________________551
7.3.4.2.1. Descriptor Del Dispositivo _________________________________551
7.3.4.2.2. Descriptor De La Configuracin 1 ___________________________552
7.3.5. Io_cfg.h _______________________________________________________553
7.3.5.1. Incluye ____________________________________________________553
7.3.5.2. Tris _______________________________________________________553
7.3.5.3. Puerto _____________________________________________________553

xxi

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.5.4. USB ______________________________________________________554


7.3.6. User.h ________________________________________________________554
7.3.6.1. Prototipos Pblicos___________________________________________554
7.3.7. User.c ________________________________________________________555
7.3.7.1. Incluye ____________________________________________________555
7.3.7.2. Variables___________________________________________________555
7.3.7.3. Prototipos Privados___________________________________________555
7.3.7.4. Declaraciones _______________________________________________556
7.3.7.4.1. void Inicializacion(void)___________________________________556
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) ________________________________________558
7.3.7.4.5. void Mdelante(void) ______________________________________558
7.3.7.4.6. void Mdetras(void) _______________________________________558
7.3.7.4.7. void Velocidad(void) _____________________________________559
7.3.7.4.8. void Paro(void) __________________________________________559
7.3.7.4.9. void Giroizq(void) _______________________________________560
7.3.7.4.10. void Giroder(void) ______________________________________561
7.3.7.4.11. void ANOpen(char c) ____________________________________562
7.3.7.4.12. void Sensores(void) _____________________________________562
7.3.7.4.13. void Claxon(void)_______________________________________562
7.3.7.4.14. void Apagado(void) _____________________________________563
7.3.7.4.15. void Encendido(void) ____________________________________563
7.3.7.4.16. void LucesON(void) _____________________________________563
7.3.7.4.17. void LucesOFF(void) ____________________________________ 563
7.3.7.4.18. void BlinkUSBStatus(void) ________________________________564

7.4.

Software Del Ordenador _____________________________________ 565

7.4.1. Mdulo ApiUsb.bas _____________________________________________565


7.4.1.1. Funciones De La Mpusbapi.Dll _________________________________565
7.4.1.2. Funcin De Recuperacin De Datos Almacenados __________________566
7.4.1.3. Constantes Para La WIN32 API_________________________________566
7.4.1.4. Constantes De Conectividad Con El PIC __________________________566
7.4.1.5. IN_PIPE Y OUT_PIPE Variables Pblicas ________________________566
7.4.1.6. Variables Pblicas Del Programa ________________________________566
7.4.1.7. Apertura De Las Comunicaciones _______________________________566
7.4.1.8. Cierre De Las Comunicaciones _________________________________567
7.4.1.9. Funcin Enviar ______________________________________________567
7.4.1.10. Funcin Recibir ____________________________________________568
7.4.2. Formulario Inicio________________________________________________568
7.4.2.1. Cdigo Del Form Inicio _______________________________________570
7.4.2.1.1. Variables Globales _______________________________________570
7.4.2.1.2. Funcin Avanza_Click ____________________________________571
7.4.2.1.3. Funcin Claxon_Click ____________________________________571
7.4.2.1.4. Funcin Derecha_Click ___________________________________571
7.4.2.1.5. Funcin Form_Load ______________________________________572
7.4.2.1.6. Funcin Form_Unload ____________________________________572
7.4.2.1.7. Funcin Izquierda_Click __________________________________573
7.4.2.1.8. Funcin Luces_Click _____________________________________573
7.4.2.1.9. Menu_Click ____________________________________________574
7.4.2.1.10. Funcin Paro_Click _____________________________________575
7.4.2.1.11. Retrocede_Click ________________________________________576
7.4.2.1.12. Funcin ScrollGiro_Change _______________________________576
7.4.2.1.13. Funcin ScrollVelocidad_Change __________________________576
7.4.2.1.14. Funcin sensores_Click __________________________________576

xxii

GUILLERMO DAVID HERRERO GONZLEZ

7.4.2.1.15. Funcin TextGiro_Change ________________________________577


7.4.2.1.16. Funcin TextVelocidad __________________________________577
7.4.2.1.17. Funcin Form_KeyPress _________________________________581
7.4.3. Form Ajuste____________________________________________________583
7.4.3.1. Cdigo Del Form Ajuste ______________________________________584
7.4.3.1.1. Variables_______________________________________________584
7.4.3.1.2. Funcin Derecha_Click ___________________________________584
7.4.3.1.3. Funcin Izquierda_Click __________________________________585
7.4.3.1.4. Funcin AjDistancia_Click ________________________________585
7.4.3.1.5. Funcin TimerDistancia_Timer _____________________________585
7.4.3.1.6. Funcin Medidas_Timer___________________________________587
7.4.4. Form Sensor ___________________________________________________588
7.4.4.1. Cdigo del Form Ajuste _______________________________________589
7.4.4.1.1. Declaracin De Variables __________________________________589
7.4.4.1.2. Funcin Sensores_Timer __________________________________589
7.4.5. Form Comandos ________________________________________________592
7.4.5.1. Cdigo Del Form Comandos ___________________________________594
7.4.5.1.1. Declaracin De Variables __________________________________594
7.4.5.1.2. Funcin Comandos_Click _________________________________594
7.4.5.1.3. Funcin Comandos_KeyPress ______________________________594
7.4.5.1.4. Funcin EnvioComando_Click______________________________596
7.4.5.1.5. Funcin Form_Unload ____________________________________602

7.5.

Driver Cochecito.inf_________________________________________ 602

7.6.

Control WiiMote ___________________________________________ 602

7.6.1.
7.6.2.

8.

Introduccin ___________________________________________________606
Programa de Control _____________________________________________606
7.6.2.1.
Programa _______________________________________________ 606

Bibliografa ______________________________________________ 609


8.1.

Libros ____________________________________________________ 609

8.2.

Apuntes ___________________________________________________ 610

8.3.

Pginas Web _______________________________________________ 610

B. CLCULOS
1.

Clculos _________________________________________________ 615


1.1.

PWM _____________________________________________________ 615

1.2.

Conversor A/D _____________________________________________ 615

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Plano 7: Piezas del chasis ________________________________________631


Plano 8: Montaje del chasis ______________________________________633
Plano 9: Montaje del circuito en el chasis ___________________________635

D. PLIEGO DE CONDICIONES
1.

Pliego De Condiciones Especficas Y Constructivas ______________ 639


1.1.

Descripcin Del Producto ____________________________________ 639

1.2.

Forma De Ejecucin ________________________________________ 639

1.3.

Plazos Y Orden De Ejecucin _________________________________ 643

1.4.

Materiales _________________________________________________ 644

1.4.1.
1.4.2.
1.4.3.
1.4.4.

1.5.

Materiales Del Laboratorio Necesarios Para La Parte Elctrica ____________644


Materiales Para La Realizacin De La Placa___________________________645
Materiales De Laboratorio Necesarios Para La Parte Mecnica ___________645
Materiales Para La Realizacin Del Chasis____________________________645

Realizacin De Las Pruebas __________________________________ 646

E. PRESUPUESTO
1.

Presupuesto De La Parte Elctrica ____________________________ 649

2.

Presupuesto De La Parte Mecnica ___________________________ 650

3.

Totalizaciones ____________________________________________ 650

F. CONCLUSIN
1.

Conclusin _______________________________________________ 653

xxiv

A. MEMORIA

1. INTRODUCCIN

29

1.

INTRODUCCIN

1.1.

OBJETO

Como Trabajo Final de Carrera se ha tratado la comunicacin de un


microcontrolador PIC al ordenador por medio del puerto USB. En el presente proyecto
se trata de hacer una aplicacin prctica del tipo de comunicacin antes citado.
El proyecto ha sido propuesto y tutorado dentro del departamento de Fsica
Aplicada en el rea de Tecnologa Electrnica por Jos Torreblanca Gonzlez.
Los grandes grupos en los que se divide el proyecto son:
Estudio de la norma del USB.
Estudio de la familia de microcontroladores PIC18Fxx5x.
Realizacin prctica de la aplicacin.
Como el presente proyecto se pretende que sirva como ayuda a otras personas, el
autor ha tratado el proyecto de una manera sencilla, intentado que sea de fcil
comprensin.

1.2.

DESCRIPCIN

La utilidad principal de este proyecto es el control de sensores y motores a travs


del ordenador por medio del puerto USB. El microcontrolador PIC18F2455 es el
encargado de la conexin USB y de ejecutar las rdenes recibidas desde el ordenador.
El microcontrolador realizar la conversin analgico-digital necesaria para la
lectura del sensor de distancia. Adems, de enviar los pulsos necesarios para activar el
motor paso a paso.
El micro, tambin se encarga de la modulacin de ancho de pulso y de activar
los puertos necesarios para modificar el sentido y la velocidad de los motores de
corriente continua.
Todos esto temas se han tratado de forma terica, haciendo un estudio de todos
los puntos necesarios para comprender correctamente las comunicaciones UBS la
programacin, tanto del host (ordenador) como del microcontrolador; y de forma
prctica al realizar un coche que se controle desde el ordenador por medio del puerto
USB.
A continuacin se describe el contenido de cada uno de los captulos que
componen el proyecto.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

1.2.1.

CAPTULO 2: NOCIONES BSICAS DE LA NORMA USB 2.0

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

En este captulo se realiza un estudio de la familia de microcontroladores


utilizada los PIC18Fxx5x.
Se ha descrito su arquitectura, osciladores, puertos de E/S, puertos especiales
como el USB, manejo de las memorias FLASH, EEPROM y RAM, registros de control.
En general, todo lo relativo al microcontrolador excepto el puerto USART que no se
utiliza en este proyecto.

1.2.3.

CAPTULO 4: LENGUAJE DE PROGRAMACIN C18

Para la programacin del micro se recurrir al lenguaje C18 ya que el fabricante


Microchip concede una licencia gratuita de estudiante y el uso de libreras especficas
para las distintas clases de dispositivos y los distintos tipos de comunicacin.
Resultando ste ms sencillo que el lenguaje Assambler, comnmente utilizado en la
programacin de todas las gamas de microcontroladores PIC y dsPIC de Microchip.
En este captulo, se analizan las funciones ms importantes, los tipos de datos,
punteros y las libreras utilizadas para la configuracin del microcontrolador en la
aplicacin. Haciendo especial hincapi en las relativas al puerto USB.

1.2.4.

CAPTULO 5: LENGUAJE DE PROGRAMACIN VISUAL BASIC

El siguiente tema tratado en la memoria, es la programacin del host; para ella,


se recurrir al lenguaje Visual Basic 6, ya que es un lenguaje muy extendido y muy
sencillo, con un gran nmero de libreras y mdulos.
Como en el captulo anterior, en este, se hace un anlisis de las funciones ms
importantes, tipos de datos, etc. Para poder comprender el software de control del
coche.

30

GUILLERMO DAVID HERRERO GONZLEZ

Para realizar una comunicacin con USB, no existen libreras comunes


especficas, por lo que se ha utilizado la MPUSBAPI.dll que concede gratuitamente
Microchip. En la memoria, se comentan y explican todas las funciones de esta librera.

1.2.5.

CAPTULO 6: INTERCONEXIN USB-PC

Otro tema muy importante es la realizacin de un driver. Al utilizar la librera


anterior, se necesita un driver que la reconozca, por ello Microchip ha creado uno
genrico que reconoce los comandos de la librera.
En este captulo, se analizan las caractersticas que tiene que tener un driver
comentando las del driver de Microchip.

1.2.6.

CAPTULO 7: APLICACIN

Se va a realizar un coche de radio control que mida distancias y detecte si se


golpea contra un objeto; pudiendo variar su movimiento tanto en sentido, direccin y
velocidad.
Para la variacin del sentido se ha utilizado un motor de tipo paso a paso bipolar.
Para una mayor comprensin se ha pretendido hacer un manual de los motores paso a
paso. En este, se incluyen las diferencias entre los distintos tipos y los pulsos que hay
que enviar para activar los motores.
En cuanto a la modificacin de la velocidad, se ha recurrido a la modulacin de
ancho de pulso (PWM) ya que el microcontrolador posee un puerto que, una vez
configurado correctamente, crea este tipo de onda. Para la deteccin de distancias se ha
utilizado el sensor de Sharp GP2Y0A02YK que crea una variacin de la tensin
dependiendo de la distancia a la que se encuentre el objeto. Se ha conectado a una
entrada de tipo analgico del microcontrolador para aprovechar al mximo las
caractersticas tanto del sensor como del microcontrolador.
Los sensores de choque son interruptores finales de carrera. Una vez pulsado, el
microcontrolador lee la entrada y comprueba que el coche se ha chocado en un punto
determinado.
El problema de realizar el control del sistema por medio de un microcontrolador
es que no cede la corriente necesaria para activar el componente. Hay que recurrir a
buffers, para lo que se han utilizado el integrado ULN2803 en el motor paso a paso, las
luces y el zumbador. El otro buffer es el L293D que es un driver para motores de
corriente continua en puente H, mediante el cual se puede cambiar el sentido de los
motores y reconoce la modulacin de ancho de pulso.
El siguiente punto de este captulo, es la explicacin de la adaptacin del
software que cede Microchip a la aplicacin. Se comentan todos los archivos
modificados.
Despus, se estudia el software del host, realizado en Visual Basic.
Por ltimo, el driver creado para la aplicacin.

31

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

1.2.7.

CLCULOS
Se realizan los clculos necesarios para el proyecto.

Al ser un proyecto de electrnica digital, en especial de microcontroladores, slo


se realizan los clculos relativos a los motores de corriente continua (para poder
seleccionar entre ms valores de velocidad) y al conversor A/D (para que no realice
conversiones innecesarias).

1.2.8.

PLANOS

En este captulo, se incluyen los planos tanto de la parte elctrica como de la


mecnica para la realizacin del coche.
La parte elctrica se compone de los planos: general, el de diseo de la placa en
transparencia, y de montaje de los sensores.
La parte mecnica se compone de todos los planos necesarios para reproducir el
coche.

1.2.9.

PLIEGO DE CONDICIONES

El pliego de condiciones los pasos necesarios para la reproduccin del coche,


tanto de la placa electrnica como de la parte mecnica.

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.

NOCIONES BSICAS DE LA NORMA USB 2.0

2.1.

INTRODUCCIN

Para entender el funcionamiento del USB, es necesario estudiar la especificacin


de este bus. Los fabricantes involucrados en la norma crearon un documento que
constituye la referencia. Aunque en estos momentos se est creando la versin 3.0 del
bus, en el presente captulo se va a tratar la versin 2.0 ya que es la ms rpida y es la
que posee la familia de PICs 18Fxx5x.
Ya que la norma es muy extensa, aqu se han traducido las partes que se han
credo ms importantes para una comprensin fcil y rpida de este bus.
Uno de los motivos por los que el USB se haya extendido tan velozmente es que
se ha creado mediante un convenio de grandes empresas del sector informtico:
Compac, Hewlett-Packard, Intel, Lucent, Microsoft; NEC y Philips. Adoptando las
mejores caractersticas de los diferentes tipos de comunicacin de cada empresa.

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.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.2.

VOCABULARIO

El vocabulario aqu expuesto es una lista de trminos informticos muy


utilizados en la comunicacin por USB. No se incluyen todos los que aparecen en la
norma, sino los que el autor ha credo oportunos por su dificultad o por no estar muy
difundidos.
Paced Locked Loop (PLL): Circuito que detecta la fase para poner el oscilador
en fase con una frecuencia actual.
Pipe: Una unin abstracta entre el Endpoint y el software del host.
Endpoint o Device Endpoint: La porcin direccionable de un dispositivo USB
que es la fuente o el lugar de llegada de la comunicacin entre el host y el dispositivo.
Direccin del Endpoint: Combinacin del nmero del Endpoint y del sentido
en un dispositivo USB. Cada direccin del Endpoint soporta transferencias de datos en
una direccin.
Sentido del Endpoint: Es el sentido de los datos transferidos por el USB. Puede
ser IN (entrada) u OUT (salida). IN se refiere a la transferencia del host y OUT a la
transferencia desde el host.
Nmero del Endpoint: Es un valor de 4bits de 0h a Fh incluidos, asociado a un
Endpoint de un dispositivo.
Endpoint de control: Una pareja de Device Endpoint con el mismo nmero de
Endpoint.
Direccin del dispositivo: Es un valor de 7bits que representa la direccin del
dispositivo del USB. La direccin del dispositivo tiene el valor por defecto (00H)
cuando el dispositivo USB se alimenta por primera vez o se resetea. El software del
sistema del USB asigna una nica direccin del dispositivo.
Handshake Packet: Un paquete que reconoce o rechaza una condicin
especfica.
ACK: Trama de reconocimiento positivo.
NAK: Trama de reconocimiento negativo.
Message Pipe: Un pipe bidireccional que transfiere datos usando una norma
respuesta/dato/estado. Los datos tienen una estructura impuesta que permite respuestas
correctas a la identificacin y comunicacin.
MSb: Bit ms significativo.
MSB: Byte ms significativo.
LSb: Bit menos significativo.
LSB: Byte menos significativo.

36

GUILLERMO DAVID HERRERO GONZLEZ

Protocolo: Conjunto especfico de reglas, procedimientos o conversaciones


relacionadas con el formato y el tiempo de transmisin de datos entre dos dispositivos.
Sample: Unidad ms pequea con la que puede operar un Endpoint.
Sample Rate (Fs): Nmero de samples por segundo, expresado en hercios (Hz).
Start-Of-Frame (SOF): Primera transaccin de cada frame. Un SOF permite al
Endpoint identificar el principio del frame y sincronizar el reloj interno del Endpoint
con el host.
Frame: Tiempo base de 1ms establecido en los buses de baja/media velocidad
(low/full speed).
Paquete Token: Tipo de paquete que identifica que transmisin se realiza en el
bus.
Clase: La clase indica el tipo de dispositivo USB.
Paquete ID (PID): Un campo de un paquete USB que indica el tipo de paquete,
y el formato del paquete y el tipo de error de deteccin aplicado.
Descriptor: Los dispositivos dan a conocer sus atributos por medio de los
descriptores. Un descriptor es una estructura de datos con un formato determinado.
Cada descriptor empieza con un campo de un byte de ancho que contiene el nmero de
bytes en el descriptor, seguido por otro campo de un byte de ancho que identifica el tipo
de descriptor.
Campo de direccionamiento (ADDR): la utilidad del campo de
direccionamiento es especificar la funcin, por esta direccin, que va a ser la fuente o el
destino de este paquete, dependiendo del valor del token PID.
Hay un total de 128 direcciones especificadas en ADDR<6:0>.
El campo ADDR es nico para los token IN, SETUP y OUT y para los token
especiales PING y SPLIT.
Cada valor de ADDR define una nica funcin.
En un reset o reinicio, la direccin por defecto es cero y la tiene que programar
el host durante el proceso de enumeracin. La direccin cero est reservada como
direccin por defecto y no se puede asignar para otro uso.
LSb
Addr 0

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Todas las funciones tienen que soportar un pipe de control en el Endpoint 0.


Los dispositivos de baja velocidad soportan un mximo de tres pipes por
funcin: un pipe de control con el Endpoint 0 y otras 2 adicionales (otras 2 de control,
una de control y un Endpoint interrupcin o dos Endpoint interrupcin).
Las funciones de media y alta velocidad soportan un mximo de 16 Endpoints
IN y OUT.
LSb
Endp 0

2.3.

MSb
Endp 1

Endp 2

Endp 5

HISTORIA

El USB se ha concebido como un estndar industrial de expansin para el PC, en


particular en el mbito de la telefona y productos de consumo.
Los criterios para la definicin de su arquitectura son:

2.3.1.

facilidad de uso para la expansin de un perifrico del ordenador.


bajo coste, pero soportando altas velocidades de transferencia (480Mb/s).
soporte total en tiempo real de voz, audio y video comprimido.
protocolo flexible que permite la transferencia en modo mixed sncrono
(audio, video) o asncrona (mensajes).
fcil integracin en las nuevas tecnologas de perifricos.
compatibilidad con las configuraciones del PC.
estndares de interfaz para una difusin rpida del producto.
posibilidad de crear nuevas clases de perifricos con el fin de aumentar la
capacidad del PC.

UTILIZACIN PREVISTA

En su versin de 1,5Mbits/s, el USB se sita en la zona de baja velocidad (low


speed). Las aplicaciones son, entre otras, gestin del teclado, del ratn, de los
perifricos de juegos En general, de la clase HID (dispositivos de interaccin con el
humano).
Este tipo de perifrico debe ser barato, conectable y desconectable en caliente
(en funcionamiento) y fcil de utilizar. Asimismo, se podrn conectar varios
dispositivos al mismo tiempo.
En su versin de 12Mbits/s, el USB se sita en la zona de toda velocidad (full
speed). Las aplicaciones son, entre otras, ISDN (RDSI, telfono digital), PBX
(telfono), audio
Para este tipo de perifrico, adems de las caractersticas mencionadas
anteriormente, tiene que ofrecer garantas sobre el tiempo de trnsito de la informacin
y la banda de paso. El tipo de transmisin sncrona permite garantizar estos criterios.

38

GUILLERMO DAVID HERRERO GONZLEZ

Y, en su ltima versin, 480Mbits/s, el USB se sita en la zona de alta velocidad


(high speed). Las aplicaciones son, video de calidad, imgenes, almacenamiento
masivo
Con este tipo de perifrico se necesitan todas las caractersticas anteriores ms
una ancha banda de paso, para una alta velocidad.
Como conclusin de este apartado, se incluye una lista de las principales
caractersticas del bus:

2.4.
2.4.1.

banda de paso desde algunos kilobits hasta centenas de megabits.


transferencia sncrona y asncrona en el mismo bus.
varios tipos de perifricos en el mismo bus.
posibilidad de conectar hasta 127 perifricos.
tiempo de respuesta garantizado.
flexibilidad a nivel de la banda de paso.
fiabilidad, control de errores.
perfectamente integrado en el PC, plug and play (conectar y usar).
coste reducido.
posibilidad de expansin.

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.

ARQUITECTURA DEL BUS

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.4.3.

INTERFAZ FSICA

2.4.3.1.

Aspecto Elctrico

A nivel elctrico el cable USB transfiere la seal y la alimentacin sobre cuatro


hilos.

A nivel de seal, se trata de un par tranzado con una impedancia caracterstica de


90. La velocidad puede ser de 480Mbits/s, 12Mbits/s o 1,5Mbits/s. La sensibilidad del
receptor debe ser, al menos, 200mV y debe poder admitir un buen factor de rechazo en
modo comn (CCMR, es la tensin diferencial entre la tensin comn). El reloj se
transmite en el flow de datos, la codificacin es de tipo NRZI, existiendo un dispositivo
que genera el bit e relleno (bit stuffing) que garantiza que la frecuencia del reloj
permanezca constante. Cada paquete va precedido de un campo de sincronismo.
A nivel de alimentacin, el cable proporciona la tensin nominal de 5V. Es
necesario definir bien el dimetro del hilo con el fin de que no se produzca una cada de
tensin demasiado importante en el cable. Una resistencia de terminacin instalada en la
lnea de datos permite detectar el puerto conocer su configuracin (1,5Mbits/s
12Mbits/s), si no lleva resistencia indica 480Mbits/s.
Existen dos tipos de tomas (A y B), con el fin de evitar la configuracin en
bucle. Se distinguen fcilmente: el tipo A es plano y rectangular, mientras que el tipo B
es cuadrado. La base para el tipo A se encuentra en el PC o hub, existiendo en el
perifrico una base de tipo B. Los cables son de tipo AB.
En el conector, el punto de masa est algo adelantado con respecto a los puntos
de seal, de este modo, cuando se enchufa, la masa siempre hace contacto antes.

2.4.3.2.

Alimentacin

La especificacin abarca dos aspectos de consumo: distribucin en funcin del


consumo especificado por cada perifrico USB y control de consumo integrado en la
gestin global del PC.

2.4.3.3.

Consumo

Cada seccin puede proporcionar una determinada potencia mxima siendo el


PC el encargado de suministrar la energa. Adems, el perifrico puede estar
autoalimentado (self powered).
Por otro lado, el hub puede distribuir la corriente procedente del PC a los
perifricos.

40

GUILLERMO DAVID HERRERO GONZLEZ

2.4.3.4.

Control De Consumo

El ordenador controla el consumo, teniendo capacidad de poner en reposo


(suspend) o en marcha a un perifrico USB. En reposo, ste reduce su consumo (si
puede), quedando la parte del USB siempre funcional. Esta gestin est orientada
especficamente a los equipos porttiles.

2.4.3.5.

Protocolo Del USB

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

El sistema es fiable y robusto, garantizando la integridad de los datos gracias a


las siguientes caractersticas:
seal diferencial, en donde la pantalla (blindaje) protege los hilos.
CRC (control) sobre la informacin de control y datos.
deteccin de conexin y desconexin del perifrico
recuperacin automtica en cado de error, gestin del tiempo de
recuperacin (timeout).
gestin del flujo de datos, de los buffers y del modo sncrono.
construccin que le hace independiente de las funciones, de los datos y
del control.

41

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.4.3.7.

Deteccin De Errores

La deteccin de errores se basa en el control CRC, efectuado sobre los datos y


sobre la informacin de control, de modo que un CRC incorrecto indica un error en el
paquete. El CRC permite detectar el 100% de los errores, en caso de errores simples o
dobles.
En caso de error, al tercer intento fallido de recuperacin, la informacin de
error se transfiere al nivel superior (aplicacin).

2.4.3.8.

Gestin De Errores

El protocolo puede controlar los errores por hardware o por software.


Las capas inferiores intentan tres veces la recuperacin antes de informar a la
capa superior del problema.

2.4.3.9.

Configuracin Del Sistema

Un perifrico puede ser enchufado o desenchufado en cualquier momento.


La enumeracin (bsqueda de los perifricos) no slo se hace al arrancar, sino
que est funcionando continuamente. Cuando se enchufa o retira un dispositivo, el hub
detecta el cambio y avisa al host.
Cuando se enchufa un nuevo dispositivo, el host (va hub) direcciona el
perifrico con una direccin por defecto. Mediante un paquete de control, le da su
direccin. Si se trata de un hub, el procedimiento es el mismo para el propio hub,
despus para cada uno de los perifricos conectados al hub y declarados por l al host.
En cuanto a la descripcin del hub, esta multitoma es un dispositivo activo,
que incluye un microprocesador, la memoria y todas las interfaces necesarias para la
gestin de los otros puertos (que vayan hacia un perifrico USB o hacia otro hub).
Los hubs activos proporcionan la alimentacin a partir de una fuente externa,
mientras que los hubs pasivos proporcionan la alimentacin a partir de la fuente
procedente del USB raz.

42

GUILLERMO DAVID HERRERO GONZLEZ

2.4.3.10.

Tipos De Transferencia

El enlace virtual (pipe) puede ser de cuatro tipos:


Control: modo utilizado para realizar configuraciones: existe sobre el
Endpoint 0.
Bulk: modo utilizado para la transmisin de datos voluminosos, pero con
pocas restricciones a nivel de duracin de la transmisin; por ejemplo,
durante una impresin.
Interrupt: modo utilizado para transmisiones de pequeos paquetes
rpidos, orientado a percepciones humanas (ratn, puntero)
Isochronous o flujo en tiempo real: modo utilizado para la
transferencia de audio o video. Es necesario negociar la banda de paso.
Un pipe slo soporta uno de los tipos anteriores.

2.4.3.11.

Tipo Control

Los datos de control sirven para configurar el perifrico en el momento de


conectarse al USB. Algunos drivers especficos pueden utilizar este enlace para
transmitir su propia informacin de control. Este enlace no tiene prdida de datos,
puesto que los dispositivos de deteccin de recuperacin de errores estn activos a nivel
USB.

2.4.3.12.

Tipo Bulk

Este modo se utiliza para la transmisin de importantes cantidades de


informacin. Como el tipo Control, este enlace no tiene prdida de datos. La banda de
paso otorgada a este tipo de transmisin depende de los dems perifricos, siendo la
menos prioritaria.

2.4.3.13.

Tipo Interrupt

Este tipo de transmisin garantiza la transferencia de pequeas cantidades de


datos. El tiempo de respuesta no puede ser inferior al valor especificado por la interfaz.
El ratn o cualquier otro dispositivo apuntador es una aplicacin tpica de este modo de
transmisin.

2.4.3.14.

Tipo Isochronous

Este tipo de transmisin funciona en tiempo real. La banda de paso as como el


retardo estn garantizados. Es el modo de mayor prioridad.
La transmisin de la voz es un ejemplo de esta aplicacin. Si esta no se transmite
correctamente, pueden llegar a orse parsitos (glitch) y la aplicacin puede detectar
ciertos errores de los llamados underruns.

43

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.4.3.15.

Asignacin De La Banda De Paso

La banda de paso se asigna en funcin de las pipes.


Los perifricos deben contar con memoria intermedia de datos (buffers), tanto
mayores cuanto ms grande sea el ancho de banda requerido. El objetivo es garantizar
que, a pesar de los buffers, el retardo de encaminamiento sea tan solo de unos cuantos
milisegundos.
La asignacin queda bloqueada, es decir, si una nueva asignacin pudiera llegar
a perturbar las asignaciones existentes, esta no ser autorizada (bloqueada).
Cuando finaliza un pipe, la banda de paso puede asignarse a oro perifrico.

2.4.3.16.

USB Device

Los perifricos (devices) se clasifican en funcin de las operaciones que pueden


realizar: class hub, para los perifricos de extensin; class text, para las interfaces de
texto (impresoras)

2.4.3.17.

Caractersticas De Un Perifrico

El Endpoint 0 proporciona esta informacin por medio de los descriptores. Se


encuentran clasificadas en tres grupos:
Estndar: comunes a todos los perifricos (identificacin del fabricante,
clase del producto, consumo, descripcin de los Endpoints.
Clase: especficas del tipo de perifrico.
Fabricante: especficas del producto; el fabricante puede incluir la
informacin que desee.

44

GUILLERMO DAVID HERRERO GONZLEZ

2.5.

FORMATOS DE LOS PAQUETES


En este apartado se profundiza en la descripcin del protocolo.

2.5.1.

TOKEN

Un paquete token consiste en un PID, especificando el tipo de paquete IN, OUT


o SETUP y los campos ADDR y ENDP.
El paquete token especial PING tiene los mismos campos que un token normal.
En las transacciones OUT y SETUP, los campos de direccin y de Endpoint
solamente identifican el Endpoint que recibir el paquete siguiente de datos. En las
transacciones IN, estos campos slo indican el Endpoint que transmitir el paquete de
datos. En las transacciones PING, estos campos indican el Endpoint que responder con
un paquete de protocolo de intercambio. El host es el nico que puede emitir paquetes
token.
Un PID IN define una transaccin de datos de una funcin al host. Los PIDs
OUT y SETUP definen una transaccin de datos del host a la funcin. Un PID PING
define un protocolo de intercambio de la funcin al host.

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.

TOKEN ESPECIAL: TRANSACCIN SPLIT

El USB define un token especial para las transacciones Split. Es un paquete


token de 4 bytes. Esta transaccin split proporciona tipos de transferencia y envo de
informacin adicionales. El token de transacciones Split se utiliza para que se soporte el
intercambio de archivos entre el host comunicndose con el hub que opera a high-speed
con dispositivos full-/low-speed en alguno de sus puertos. Hay dos tipos de split: una
transaccin split de inicio (start-split) (SSPLIT) y transaccin split completa (completesplit) (CSPLIT). Un campo en el token especial SPLIT, define las siguientes secciones.

45

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.5.2.1.

Transacciones Split

Una transaccin Split high-speed se utiliza solamente entre el host y el hub


cuando el hub tiene dispositivos low-/full-speed unidos. Las Split high-speed se utilizan
para inicializar el intercambio low-/full-speed a travs del hub y algn Endpoint del
dispositivo low-/full-speed. Las Split permiten que el hub reciba el estado de
transaccin completa. Con esto puede que el host comience una transaccin full-/lowspeed a travs de una high-speed sin tener que esperar a que procese/complete la de baja
velocidad.
Una transaccin high-speed tiene dos partes: una start-speed y otra completespeed. Las transacciones Split slo se definen para usarse entre el host y el hub. Ningn
otro dispositivo high-speed o low-/full-speed puede usar este tipo de intercambio.
Los paquetes genricos start-split se componen de dos paquetes en la fase token:
el token especial SPLIT y el token full-/low-speed. Dependiendo de la direccin de
transferencia de datos y de cmo est definido el protocolo de intercambio, despus de
la fase de token est, opcionalmente, un paquete de datos y otro de protocolo. La
transaccin start-split puede ser de 2, 3 4 paquetes determinados por el tipo de
transferencia especfica y la direccin de los datos.

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

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.5.2.2.

Paquetes Start-Of-Frame (SOF)

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

El token SOF comprende la transaccin token-only que distribuye un marcador


SOF y acompaa el FrameNumber con intervalos de tiempo precisos al comienzo de
cada frame. Todas las funciones high-speed y full-speed, incluyendo los hubs, reciben el
paquete SOF. El token SOF no provoca la funcin recepcin para generar un paquete de
retorno, por tanto, un envo SOF a una funcin no tiene garantas.
El paquete SOF entrega dos trozos de informacin de tiempo. Una funcin
informa que ha ocurrido un SOF cuando este detecta el PID SOF.
En el Apndice A del archivo de la norma del USB2.0 hay ms informacin
sobre el orden de transferencia de paquetes en las transmisiones USB.

48

GUILLERMO DAVID HERRERO GONZLEZ

2.6.

ESTADOS DEL USB


Los distintos pasos hasta que el dispositivo se pueda utilizar son:

49

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Unido

Alimentado

Por Defecto

Direccionado

Configurado

Reposo

No

USB no unido

Si

No

USB sin alimentacin

Si

Si

No

USB unido, con


alimentacin pero no
reseteado

Si

Si

Si

No

No tiene direccin, el
dispositivo responde
con la direccin por
defecto

Si

Si

Si

Si

No

Tiene una nica


direccin pero no se ha
configurado

Si

Si

Si

Si

Si

No

El host puede usar el


dispositivo

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

Despus de alimentar el dispositivo, puede que no responda ante una transaccin


hasta que reciba un reset por el bus. Despus del reset, el dispositivo tiene la direccin
por defecto.
Cuando se completa el reset, el dispositivo funciona con su velocidad correcta.
La eleccin de la velocidad para, low- y full-speed (baja y media velocidad), se
determina con las resistencias de terminacin.
Un dispositivo que permita operaciones a high-speed (alta velocidad), determina
que puede operar a esta velocidad en el reset.
Un dispositivo que puede funcionar a high-speed se tiene que resetear
correctamente a full-speed cuando se trabaja en un entorno full-speed. Despus del
reset, el dispositivo debe responder correctamente a la configuracin del dispositivo y a
las preguntas de los descriptores y devolver la informacin adecuada.

50

GUILLERMO DAVID HERRERO GONZLEZ

2.6.2.

DIRECCIONADO

Todos los dispositivos USB utilizan la direccin por defecto cuando se


alimentan inicialmente o despus de un reset. A cada dispositivo le asigna una nica
direccin el host al unirlo o despus de un reset. El dispositivo mantiene esta direccin
cuando se pone en reposo.
Un dispositivo USB responde por la pipe por defecto cuando se le asigna una
direccin o est en una por defecto.

2.6.3.

CONFIGURACIN

Antes de utilizar el dispositivo, se tiene que configurar. Desde el punto de vista


del dispositivo, la configuracin involucra la respuesta a un SetConfiguration() con un
valor de configuracin distinto de cero.
Al configurar o reconfigurar un dispositivo se logran todos los estados y valores
de configuracin asociados a los Endpoint en la interfaz.

2.7.

ENUMERACIN DEL BUS

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7. El host lee la informacin de configuracin del dispositivo leyendo la


configuracin de 0 hasta n-1, donde n es el nmero de configuraciones.
Este proceso puede tardar varios milisegundos.
8. Basndose en la informacin de configuracin y cmo se debe usar el
dispositivo USB, el host asigna un valor de configuracin al dispositivo.
El dispositivo est en el estado Configurado y todos los Endpoints de
esta configuracin estn como se indica en sus caractersticas. El
dispositivo USB puede que no tenga la energa que indica en sus
caractersticas. Desde el punto de vista del dispositivo, est listo para
usarse.

52

3. MICROCONTROLADORES

55

3.

MICRONTROLADORES

3.1.

INTRODUCCIN A LOS MICROCONTROLADORES

Los microcontroladores estn conquistando el mundo. Estn presentes en


nuestro trabajo, en nuestra casa y en nuestra vida, en general. Se pueden encontrar
controlando el funcionamiento de los ratones y teclados de los computadores, en los
telfonos, en los hornos microondas y los televisores de nuestro hogar. Pero la invasin
acaba de comenzar y el nacimiento del siglo XXI ser testigo de la conquista masiva de
estos diminutos computadores, que gobernarn la mayor parte de los aparatos que
fabricaremos y usamos los humanos.

3.1.1.

CONTROLADOR Y MICROCONTROLADOR

Recibe el nombre de controlador el dispositivo que se emplea para el gobierno


de uno o varios procesos. Por ejemplo, el controlador que regula el funcionamiento de
un horno dispone de un sensor que mide constantemente su temperatura interna y,
cuando traspasa los lmites prefijados, genera las seales adecuadas que accionan los
efectores que intentan llevar el valor de la temperatura dentro del rango estipulado.
Aunque el concepto de controlador ha permanecido invariable a travs del
tiempo, su implementacin fsica ha variado frecuentemente. Hace tres dcadas, los
controladores se construan exclusivamente con componentes de lgica discreta,
posteriormente se emplearon los microprocesadores, que se rodeaban con chips de
memoria y E/S sobre una tarjeta de circuito impreso. En la actualidad, todos los
elementos del controlador se han podido incluir en un chip, el cual recibe el nombre de
microcontrolador. Realmente consiste en un sencillo pero completo computador
contenido en el corazn (chip) de un circuito integrado.
Un microcontrolador es un circuito integrado, de alta escala de integracin, que
incorpora la mayor parte de los elementos que configuran un controlador.
Un microcontrolador dispone normalmente de los siguientes componentes:
Procesador o UCP (Unidad Central de Proceso).
Memoria RAM para Contener los datos.
Memoria para el programa tipo ROM/PROM/EPROM.
Lneas de E/S para comunicarse con el exterior.
Diversos mdulos para el control de perifricos (temporizadores, Puertos
Serie y Paralelo, CAD: Conversores Analgico/Digital, CDA:
Conversores Digital/Analgico, etc.).
Generador de impulsos de reloj que sincronizan el funcionamiento de
todo el sistema.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Los productos que para su regulacin incorporan un microcontrolador disponen


de las siguientes ventajas:
Aumento de prestaciones: un mayor control sobre un determinado
elemento representa una mejora considerable en el mismo.
Aumento de la fiabilidad: al reemplazar el microcontrolador por un
elevado nmero de elementos disminuye el riesgo de averas y se
precisan menos ajustes.
Reduccin del tamao en el producto acabado: La integracin del
microcontrolador en un chip disminuye el volumen, la mano de obra y
los stocks.
Mayor flexibilidad: las caractersticas de control estn programadas por
lo que su modificacin slo necesita cambios en el programa de
instrucciones.
El microcontrolador es en definitiva un circuito integrado que incluye todos los
componentes de un computador. Debido a su reducido tamao es posible montar el
controlador en el propio dispositivo al que gobierna. En este caso el controlador recibe
el nombre de controlador empotrado (embedded controller).

3.1.2.

DIFERENCIA ENTRE MICROPROCESADOR Y MICROCONTROLADOR

El microprocesador es un circuito integrado que contiene la Unidad Central de


Proceso (UCP), tambin llamada procesador, de un computador. La UCP est formada
por la Unidad de Control, que interpreta las instrucciones, y el Camino de Datos, que las
ejecuta.
Las terminales de un microprocesador sacan al exterior las lneas de sus buses de
direcciones, datos y control, para permitir conectarle con la Memoria y los Mdulos de
E/S y configurar un computador implementado por varios circuitos integrados. Se dice
que un microprocesador es un sistema abierto porque su configuracin es variable de
acuerdo con la aplicacin a la que se destine.

56

GUILLERMO DAVID HERRERO GONZLEZ

Si slo se dispusiese de un modelo de microcontrolador, ste debera tener muy


potenciados todos sus recursos para poderse adaptar a las exigencias de las diferentes
aplicaciones. Esta potenciacin supondra en muchos casos un despilfarro. En la
prctica cada fabricante de microcontroladores oferta un elevado nmero de modelos
diferentes, desde los ms sencillos hasta los ms poderosos. Es posible seleccionar la
capacidad de las memorias, el nmero de lneas de E/S, la cantidad y potencia de los
elementos auxiliares, la velocidad de funcionamiento, etc. Por todo ello, un aspecto muy
destacado del diseo es la seleccin del microcontrolador a utilizar.

3.1.3.

APLICACIONES DE LOS MICROCONTROLADORES

Cada vez existen ms productos que incorporan un microcontrolador con el fin


de aumentar sustancialmente sus prestaciones, reducir su tamao y coste, mejorar su
fiabilidad y disminuir el consumo.
Algunos fabricantes de microcontroladores superan el milln de unidades de un
modelo determinado producidas en una semana. Este dato puede dar una idea de la
masiva utilizacin de estos componentes.
Los microcontroladores estn siendo empleados en multitud de sistemas
presentes en nuestra vida diaria, como pueden ser juguetes, horno microondas,
frigorficos, televisores, computadoras, impresoras, mdems, el sistema de arranque de
nuestro coche, etc. Y otras aplicaciones con las que seguramente no estaremos tan
familiarizados como instrumentacin electrnica, control de sistemas en una nave
espacial, etc. Una aplicacin tpica podra emplear varios microcontroladores para
controlar pequeas partes del sistema. Estos pequeos controladores podran
comunicarse entre ellos y con un procesador central, probablemente ms potente, para
compartir la informacin y coordinar sus acciones, como, de hecho, ocurre ya
habitualmente en cualquier PC.

57

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.1.4.

EL MERCADO DE LOS MICROCONTROLADORES

Aunque en el mercado de la microinformtica la mayor atencin la acaparan los


desarrollos de los microprocesadores, lo cierto es que se venden cientos de
microcontroladores por cada uno de aqullos.
Existe una gran diversidad de microcontroladores. Quiz la clasificacin ms
importante sea entre microcontroladores de 4, 8, 16 32 bits. Aunque las prestaciones
de los microcontroladores de 16 y 32 bits son superiores a los de 4 y 8 bits, la realidad
es que los microcontroladores de 8 bits dominan el mercado y los de 4 bits se resisten a
desaparecer. La razn de esta tendencia es que los microcontroladores de 4 y 8 bits son
apropiados para la gran mayora de las aplicaciones, lo que hace absurdo emplear
micros ms potentes y consecuentemente ms caros. Uno de los sectores que ms tira
del mercado del microcontrolador es el mercado automovilstico. De hecho, algunas de
las familias de microcontroladores actuales se desarrollaron pensando en este sector,
siendo modificadas posteriormente para adaptarse a sistemas ms genricos. El mercado
del automvil es adems uno de los ms exigentes: los componentes electrnicos deben
operar bajo condiciones extremas de vibraciones, choques, ruido, etc. y seguir siendo
fiables. El fallo de cualquier componente en un automvil puede ser el origen de un
accidente.
En cuanto a las tcnicas de fabricacin, cabe decir que prcticamente la totalidad
de los microcontroladores actuales se fabrican con tecnologa CMOS 4
(Complementary Metal Oxide Semiconductor). Esta tecnologa supera a las tcnicas
anteriores por su bajo consumo y alta inmunidad al ruido.
La distribucin de las ventas segn su aplicacin es la siguiente:
Una tercera parte se absorbe en las aplicaciones relacionadas con los
computadores y sus perifricos.
La cuarta parte se utiliza en las aplicaciones de consumo
(electrodomsticos, juegos, TV, vdeo, etc.)
El 16% de las ventas mundiales se destin al rea de las comunicaciones.
Otro 16% fue empleado en aplicaciones industriales.
El resto de los microcontroladores vendidos en el mundo,
aproximadamente un 10% fueron adquiridos por las industrias de
automocin.
Tambin los modernos microcontroladores de 32 bits van afianzando sus
posiciones en el mercado, siendo las reas de ms inters el procesamiento de imgenes,
las comunicaciones, las aplicaciones militares, los procesos industriales y el control de
los dispositivos de almacenamiento masivo de datos.

58

GUILLERMO DAVID HERRERO GONZLEZ

3.2.

QU MICROCONTROLADOR EMPLEAR?

A la hora de escoger el microcontrolador a emplear en un diseo concreto hay


que tener en cuenta multitud de factores, como la documentacin y herramientas de
desarrollo disponibles y su precio, la cantidad de fabricantes que lo producen y por
supuesto las caractersticas del microcontrolador (tipo de memoria de programa, nmero
de temporizadores, interrupciones, etc.):
Costes. Como es lgico, los fabricantes de microcontroladores compiten
duramente para vender sus productos. Y no les va demasiado mal ya que
sin hacer demasiado ruido venden 10 veces ms microcontroladores que
microprocesadores.
Para que nos hagamos una idea, para el fabricante que usa el
microcontrolador en su producto una diferencia de precio en el
microcontrolador de algunas pesetas es importante (el consumidor
deber pagar adems el coste del empaquetado, el de los otros
componentes, el diseo del hardware y el desarrollo del software). Si el
fabricante desea reducir costes debe tener en cuenta las herramientas de
apoyo con que va a contar: emuladores, simuladores, ensambladores,
compiladores, etc. Es habitual que muchos de ellos siempre se decanten
por microcontroladores pertenecientes a una nica familia.
Aplicacin. Antes de seleccionar un microcontrolador es imprescindible
analizar los requisitos de la aplicacin:
9 Procesamiento de datos: puede ser necesario que el
microcontrolador realice clculos crticos en un tiempo limitado.
En ese caso debemos asegurarnos de seleccionar un dispositivo
suficientemente rpido para ello. Por otro lado, habr que tener
en cuenta la precisin de los datos a manejar: si no es suficiente
con un microcontrolador de 8 bits, puede ser necesario acudir a
microcontroladores de 16 32 bits, o incluso a hardware de coma
flotante. Una alternativa ms barata y quiz suficiente es usar
libreras para manejar los datos de alta precisin.
9 Entrada Salida: para determinar las necesidades de
Entrada/Salida del sistema es conveniente dibujar un diagrama de
bloques del mismo, de tal forma que sea sencillo identificar la
cantidad y tipo de seales a controlar. Una vez realizado este
anlisis puede ser necesario aadir perifricos hardware externos
o cambiar a otro microcontrolador ms adecuado a ese sistema.
9 Consumo: algunos productos que incorporan microcontroladores
estn alimentados con bateras y su funcionamiento puede ser tan
vital como activar una alarma antirrobo. Lo ms conveniente en
un caso como ste puede ser que el microcontrolador est en
estado de bajo consumo pero que despierte ante la activacin de
una seal (una interrupcin) y ejecute el programa adecuado para
procesarla.

59

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

9 Memoria: para detectar las necesidades de memoria de nuestra


aplicacin debemos separarla en memoria voltil (RAM),
memoria no voltil (ROM, EPROM, etc.) y memoria no voltil
modificable (EEPROM). Este ltimo tipo de memoria puede ser
til para incluir informacin especfica de la aplicacin como un
nmero de serie o parmetros de calibracin.
El tipo de memoria a emplear vendr determinado por el volumen
de ventas previsto del producto: de menor a mayor volumen ser
conveniente emplear EPROM, OTP y ROM. En cuanto a la
cantidad de memoria necesaria puede ser imprescindible realizar
una versin preliminar, aunque sea en seudo-cdigo, de la
aplicacin y a partir de ella hacer una estimacin de cunta
memoria voltil y no voltil es necesaria y si es conveniente
disponer de memoria no voltil modificable.
9 Ancho de palabra: el criterio de diseo debe ser seleccionar el
microcontrolador de menor ancho de palabra que satisfaga los
requerimientos de la aplicacin. Usar un microcontrolador de 4
bits supondr una reduccin en los costes importante, mientras
que uno de 8 bits puede ser el ms adecuado si el ancho de los
datos es de un byte. Los microcontroladores de 16 y 32 bits,
debido a su elevado coste, deben reservarse para aplicaciones que
requieran sus altas prestaciones (Entrada/Salida potente o espacio
de direccionamiento muy elevado).
9 Diseo de la placa: la seleccin de un microcontrolador concreto
condicionar el diseo de la placa de circuitos. Debe tenerse en
cuenta que quiz usar un microcontrolador barato encarezca el
resto de componentes del diseo.
Los microcontroladores ms populares se encuentran, sin duda, entre las mejores
elecciones:
8048 (Intel). Es el padre de los microcontroladores actuales, el primero
de todos. Su precio, disponibilidad y herramientas de desarrollo hacen
que todava sea muy popular.
8051 (Intel y otros). Es sin duda el microcontrolador ms popular. Fcil
de programar, pero potente. Est bien documentado y posee cientos de
variantes e incontables herramientas de desarrollo.
80186, 80188 y 80386 EX (Intel). Versiones en microcontrolador de los
populares microprocesadores 8086 y 8088. Su principal ventaja es que
permiten aprovechar las herramientas de desarrollo para PC.
68HC11 (Motorola y Toshiba). Es un microcontrolador de 8 bits
potente y popular con gran cantidad de variantes.
683xx (Motorola). Surgido a partir de la popular familia 68k, a la que se
incorporan algunos perifricos. Son microcontroladores de altsimas
prestaciones.

60

GUILLERMO DAVID HERRERO GONZLEZ

PIC (MicroChip). Familia de microcontroladores que gana popularidad


da a da. Fueron los primeros microcontroladores RISC.
Es preciso resaltar en este punto que existen innumerables familias de
microcontroladores, cada una de las cuales posee un gran nmero de variantes.

3.2.1.

RECURSOS COMUNES A TODOS LOS MICROCONTROLADORES

Al estar todos los microcontroladores integrados en un chip, su estructura


fundamental y sus caractersticas bsicas son muy parecidas. Todos deben disponer de
los bloques esenciales Procesador, memoria de datos y de instrucciones, lneas de E/S,
oscilador de reloj y mdulos controladores de perifricos. Sin embargo, cada fabricante
intenta enfatizar los recursos ms idneos para las aplicaciones a las que se destinan
preferentemente.
En este apartado se hace un recorrido de todos los recursos que se hallan en
todos los microcontroladores describiendo las diversas alternativas y opciones que
pueden encontrarse segn el modelo seleccionado.

3.2.1.1.

Arquitectura Bsica

Aunque inicialmente todos los microcontroladores adoptaron la arquitectura


clsica de von Neumann, en el momento presente se impone la arquitectura Harvard. La
arquitectura de von Neumann se caracteriza por disponer de una sola memoria principal
donde se almacenan datos e instrucciones de forma indistinta. A dicha memoria se
accede a travs de un sistema de buses nico (direcciones, datos y control).
La arquitectura Harvard dispone de dos memorias independientes una, que
contiene slo instrucciones y otra, slo datos. Ambas disponen de sus respectivos
sistemas de buses de acceso y es posible realizar operaciones de acceso (lectura o
escritura) simultneamente en ambas memorias.

Los microcontroladores PIC responden a la arquitectura Harvard.

61

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.2.1.2.

El Procesador O CPU

Es el elemento ms importante del microcontrolador y determina sus principales


caractersticas, tanto a nivel hardware como software.
Se encarga de direccionar la memoria de instrucciones, recibir el cdigo OP de
la instruccin en curso, su decodificacin y la ejecucin de la operacin que implica la
instruccin, as como la bsqueda de los operandos y el almacenamiento del resultado.
Existen tres orientaciones en cuanto a la arquitectura y funcionalidad de los
procesadores actuales.
CISC: Un gran nmero de procesadores usados en los
microcontroladores estn basados en la filosofa CISC (Computadores de
Juego de Instrucciones Complejo). Disponen de ms de 80 instrucciones
mquina en su repertorio, algunas de las cuales son muy sofisticadas y
potentes, requiriendo muchos ciclos para su ejecucin.
Una ventaja de los procesadores CISC es que ofrecen al
programador instrucciones complejas que actan como macros.
RISC: Tanto la industria de los computadores comerciales como la de
los microcontroladores estn decantndose hacia la filosofa RISC
(Computadores de Juego de Instrucciones Reducido). En estos
procesadores el repertorio de instrucciones mquina es muy reducido y
las instrucciones son simples y, generalmente, se ejecutan en un ciclo.
La sencillez y rapidez de las instrucciones permiten optimizar el
hardware y el software del procesador.
SISC: En los microcontroladores destinados a aplicaciones muy
concretas, el juego de instrucciones, adems de ser reducido, es
especfico, o sea, las instrucciones se adaptan a las necesidades de la
aplicacin prevista. Esta filosofa se ha bautizado con el nombre de SISC
(Computadores de Juego de Instrucciones Especfico).

3.2.1.3.

Memoria

En los microcontroladores la memoria de instrucciones y datos est integrada en


el propio chip. Una parte debe ser no voltil, tipo ROM, y se destina a contener el
programa de instrucciones que gobierna la aplicacin. Otra parte de memoria ser tipo
RAM, voltil, y se destina a guardar las variables y los datos.
Hay dos peculiaridades que diferencian a los microcontroladores de los
computadores personales:
No existen sistemas de almacenamiento masivo como disco duro o
disquetes.
Como el microcontrolador slo se destina a una tarea en la memoria
ROM, slo hay que almacenar un nico programa de trabajo.
La RAM en estos dispositivos es de poca capacidad pues slo debe contener las
variables y los cambios de informacin que se produzcan en el transcurso del programa.

62

GUILLERMO DAVID HERRERO GONZLEZ

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.

ROM Con Mscara

Es una memoria no voltil de slo lectura cuyo contenido se graba durante la


fabricacin del chip. El elevado coste del diseo de la mscara slo hace aconsejable el
empleo de los microcontroladores con este tipo de memoria cuando se precisan
cantidades superiores a varios miles de unidades.

3.2.1.5.

OTP

El microcontrolador contiene una memoria no voltil de slo lectura


programable una sola vez por el usuario. OTP (One Time Programmable). Es el
usuario quien puede escribir el programa en el chip mediante un sencillo grabador
controlado por un programa desde un PC.
La versin OTP es recomendable cuando es muy corto el ciclo de diseo del
producto, o bien, en la construccin de prototipos y series muy pequeas.
Tanto en este tipo de memoria como en la EPROM, se suele usar la encriptacin
mediante fusibles para proteger el cdigo contenido.

3.2.1.6.

EPROM

Los microcontroladores que disponen de memoria EPROM (Erasable


Programmable Read OnIy Memory) pueden borrarse y grabarse muchas veces. La
grabacin se realiza, como en el caso de los OTP, con un grabador gobernado desde un
PC. Si, posteriormente, se desea borrar el contenido, disponen de una ventana de cristal
en su superficie por la que se somete a la EPROM a rayos ultravioleta durante varios
minutos. Las cpsulas son de material cermico y son ms caros que los
microcontroladores con memoria OTP que estn hechos con material plstico.

63

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.2.1.7.

EEPROM

Se trata de memorias de slo lectura, programables y borrables elctricamente


EEPROM (Electrical Erasable Programmable Read OnIy Memory). Tanto la
programacin como el borrado, se realizan elctricamente desde el propio grabador y
bajo el control programado de un PC. Es muy cmoda y rpida la operacin de grabado
y la de borrado. No disponen de ventana de cristal en la superficie.
Los microcontroladores dotados de memoria EEPROM una vez instalados en el
circuito, pueden grabarse y borrarse cuantas veces se quiera sin ser retirados de dicho
circuito. Para ello se usan grabadores en circuito que confieren una gran flexibilidad y
rapidez a la hora de realizar modificaciones en el programa de trabajo.
El nmero de veces que puede grabarse y borrarse una memoria EEPROM es
finito, por lo que no es recomendable una reprogramacin continua. Son muy idneos
para la enseanza y la Ingeniera de diseo.
Se va extendiendo en los fabricantes la tendencia de incluir una pequea zona de
memoria EEPROM en los circuitos programables para guardar y modificar
cmodamente una serie de parmetros que adecuan el dispositivo a las condiciones del
entorno.
Este tipo de memoria es relativamente lenta.

3.2.1.8.

FLASH

Se trata de una memoria no voltil, de bajo consumo, que se puede escribir y


borrar. Funciona como una ROM y una RAM pero consume menos y es ms pequea.
A diferencia de la ROM, la memoria FLASH es programable en el circuito. Es
ms rpida y de mayor densidad que la EEPROM.
La alternativa FLASH est recomendada frente a la EEPROM cuando se precisa
gran cantidad de memoria de programa no voltil. Es ms veloz y tolera ms ciclos de
escritura/borrado.
Las memorias EEPROM y FLASH son muy tiles al permitir que los
microcontroladores que las incorporan puedan ser reprogramados en circuito, es decir,
sin tener que sacar el circuito integrado de la tarjeta. As, un dispositivo con este tipo de
memoria incorporado al control del motor de un automvil permite que pueda
modificarse el programa durante la rutina de mantenimiento peridico, compensando
los desgastes y otros factores tales como la compresin, la instalacin de nuevas piezas,
etc. La reprogramacin del microcontrolador puede convertirse en una labor rutinaria
dentro de la puesta a punto.

64

GUILLERMO DAVID HERRERO GONZLEZ

3.2.1.9.

Puertos De Entrada Y Salida

La principal utilidad de las terminales que posee la cpsula que contiene un


microcontrolador es soportar las lneas de E/S que comunican al computador interno
con los perifricos exteriores.
Segn los controladores de perifricos que posea cada modelo de
microcontrolador, las lneas de E/S se destinan a proporcionar el soporte a las seales de
entrada, salida y control.

3.2.1.10.

Reloj Principal

Todos los microcontroladores disponen de un circuito oscilador que genera una


onda cuadrada de alta frecuencia, que configura los impulsos de reloj usados en la
sincronizacin de todas las operaciones del sistema.
Generalmente, el circuito de reloj est incorporado en el microcontrolador y slo
se necesitan unos pocos componentes exteriores para seleccionar y estabilizar la
frecuencia de trabajo. Dichos componentes suelen consistir en un cristal de cuarzo junto
a elementos pasivos o bien un resonador cermico o una red R-C.
Aumentar la frecuencia de reloj supone disminuir el tiempo en que se ejecutan
las instrucciones pero lleva aparejado un incremento del consumo de energa.

3.2.2.

RECURSOS ESPECIALES

Cada fabricante oferta numerosas versiones de una arquitectura bsica de


microcontrolador. En algunas ampla las capacidades de las memorias, en otras
incorpora nuevos recursos, en otras reduce las prestaciones al mnimo para aplicaciones
muy simples, etc. La labor del diseador es encontrar el modelo mnimo que satisfaga
todos los requerimientos de su aplicacin. De esta forma, minimizar el coste, el
hardware y el software.
Los principales recursos especficos que incorporan los microcontroladores son:

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.2.2.1.

Temporizadores O Timers

Se emplean para controlar periodos de tiempo (temporizadores) y para llevar la


cuenta de acontecimientos que suceden en el exterior (contadores).
Para la medida de tiempos se carga un registro con el valor adecuado y a
continuacin dicho valor se va incrementando o decrementando al ritmo de los impulsos
de reloj o algn mltiplo hasta que se desborde y llegue a 0, momento en el que se
produce un aviso.
Cuando se desean contar acontecimientos que se materializan por cambios de
nivel o flancos en alguna de las terminales del microcontrolador, el mencionado registro
se va incrementando o decrementando al ritmo de dichos impulsos.

3.2.2.2.

Perro Guardin O Watchdog

Cuando el computador personal se bloquea por un fallo del software u otra


causa, se pulsa el botn del reset y se reinicializa el sistema. Pero un microcontrolador
funciona sin el control de un supervisor y de forma continuada las 24 horas del da. El
Perro guardin consiste en un temporizador que, cuando se desborda y pasa por 0,
provoca un reset automticamente en el sistema.
Se debe disear el programa de trabajo que controla la tarea de forma que
refresque o inicialice al Perro guardin antes de que provoque el reset. Si falla el
programa o se bloquea, no se refrescar al Perro guardin y, al completar su
temporizacin, ladrar y ladrar hasta provocar el reset.

3.2.2.3.

Proteccin Ante Fallo De Alimentacin O Brownout

Se trata de un circuito que resetea al microcontrolador cuando el voltaje de


alimentacin (VDD) es inferior a un voltaje mnimo (brownout). Mientras el voltaje de
alimentacin sea inferior al de brownout el dispositivo se mantiene reseteado,
comenzando a funcionar normalmente cuando sobrepasa dicho valor.

3.2.2.4.

Estado De Reposo O De Bajo Consumo

Son abundantes las situaciones reales de trabajo en que el microcontrolador debe


esperar, sin hacer nada, a que se produzca algn acontecimiento externo que le ponga de
nuevo en funcionamiento. Para ahorrar energa, (factor clave en los aparatos porttiles),
los microcontroladores disponen de una instruccin especial (SLEEP en los PIC), que
les pasa al estado de reposo o de bajo consumo, en el cual los requerimientos de
potencia son mnimos. En dicho estado se detiene el reloj principal y se congelan sus
circuitos asociados, quedando sumido en un profundo sueo el microcontrolador. Al
activarse una interrupcin ocasionada por el acontecimiento esperado, el
microcontrolador se despierta y reanuda su trabajo.

66

GUILLERMO DAVID HERRERO GONZLEZ

3.2.2.5.

Conversor A/D (CAD)

Los microcontroladores que incorporan un Conversor A/D (Analgico/Digital)


pueden procesar seales analgicas, tan abundantes en las aplicaciones. Suelen disponer
de un multiplexor que permite aplicar a la entrada del CAD diversas seales analgicas
desde las terminales del circuito integrado.

3.2.2.6.

Conversor D/A (CDA)

Transforma los datos digitales obtenidos del procesamiento del computador en


su correspondiente seal analgica que saca al exterior por una de las terminales de la
cpsula. Existen muchos efectores que trabajan con seales analgicas.

3.2.2.7.

Comparador Analgico

Algunos modelos de microcontroladores disponen internamente de un


Amplificador Operacional que acta como comparador entre una seal fija de referencia
y otra variable que se aplica por una de las terminales de la cpsula. La salida del
comparador proporciona un nivel lgico 1 0 segn una seal sea mayor o menor que
la otra.
Tambin hay modelos de microcontroladores con un mdulo de tensin de
referencia que proporciona diversas tensiones de referencia que se pueden aplicar en los
comparadores.

3.2.2.8.

Modulador De Anchura De Pulsos O PWM

Son circuitos que proporcionan en su salida impulsos de anchura variable, que se


ofrecen al exterior a travs de las terminales del encapsulado.

3.2.2.9.

Puertos De E/S Digitales

Todos los microcontroladores destinan algunas de sus terminales a soportar


lneas de E/S digitales. Por lo general, estas lneas se agrupan de ocho en ocho
formando Puertos.
Las lneas digitales de los puertos pueden configurarse como Entrada o como
Salida cargando un 1 un 0 en el bit correspondiente de un registro destinado a su
configuracin.

67

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.2.2.10.

Puertos De Comunicacin

Con objeto de dotar al microcontrolador de la posibilidad de comunicarse con


otros dispositivos externos, otros buses de microprocesadores, buses de sistemas, buses
de redes y poder adaptarlos con otros elementos bajo otras normas y protocolos.
Algunos modelos disponen de recursos que permiten directamente esta tarea, entre los
que destacan:
UART, adaptador de comunicacin serie asncrona.
USART, adaptador de comunicacin serie sncrona y asncrona
Puerto paralela esclava para poder conectarse con los buses de otros
microprocesadores.
USB (Universal Serial Bus), que es un moderno bus serie para los PC.
Bus I2C, que es un interfaz serie de dos hilos desarrollado por Philips.
CAN (Controller Area Network), para permitir la adaptacin con redes
de conexionado multiplexado desarrollado conjuntamente por Bosch e
Intel para el cableado de dispositivos en automviles. En EE.UU. se usa
el J185O.

3.2.3.

HERRAMIENTAS PARA EL DESARROLLO DE APLICACIONES

Uno de los factores que ms importancia tiene a la hora de seleccionar un


microcontrolador entre todos los dems es el soporte tanto software como hardware de
que dispone. Un buen conjunto de herramientas de desarrollo puede ser decisivo en la
eleccin, ya que pueden suponer una ayuda inestimable en el desarrollo del proyecto.
Las principales herramientas de ayuda al desarrollo de sistemas basados en
microcontroladores son:

3.2.3.1.

Desarrollo Del Software:

Ensamblador. La programacin en lenguaje ensamblador puede resultar un


tanto ardua para el principiante, pero permite desarrollar programas muy eficientes, ya
que otorga al programador el dominio absoluto del sistema. Los fabricantes suelen
proporcionar el programa ensamblador de forma gratuita y en cualquier caso siempre se
puede encontrar una versin gratuita para los microcontroladores ms populares.
Compilador. La programacin en un lenguaje de alto nivel (como el C) permite
disminuir el tiempo de desarrollo de un producto. No obstante, si no se programa con
cuidado, el cdigo resultante puede ser mucho ms ineficiente que el programado en
ensamblador. Las versiones ms potentes suelen ser muy caras, aunque para los
microcontroladores ms populares pueden encontrarse versiones demo limitadas e
incluso compiladores gratuitos.
Depuracin. Debido a que los microcontroladores van a controlar dispositivos
fsicos, los desarrolladores necesitan herramientas que les permitan comprobar el buen
funcionamiento del microcontrolador cuando es conectado al resto de circuitos.

68

GUILLERMO DAVID HERRERO GONZLEZ

Simulador. Son capaces de ejecutar en un PC programas realizados para el


microcontrolador. Los simuladores permiten tener un control absoluto sobre la
ejecucin de un programa, siendo ideales para la depuracin de los mismos. Su gran
inconveniente es que es difcil simular la entrada y salida de datos del microcontrolador.
Tampoco cuentan con los posibles ruidos en las entradas, pero, al menos, permiten el
paso fsico de la implementacin de un modo ms seguro y menos costoso, puesto que
ahorraremos en grabaciones de chips para la prueba in-situ.
Placas de evaluacin. Se trata de pequeos sistemas con un microcontrolador
ya montado y que suelen conectarse a un PC desde el que se cargan los programas que
se ejecutan en el microcontrolador. Las placas suelen incluir visualizadores LCD,
teclados, LEDs, fcil acceso a los pines de E/S, etc. El sistema operativo de la placa
recibe el nombre de programa monitor. El programa monitor de algunas placas de
evaluacin, aparte de permitir cargar programas y datos en la memoria del
microcontrolador, puede permitir en cualquier momento realizar ejecucin paso a paso,
monitorizar el estado del microcontrolador o modificar los valores almacenados los
registros o en la memoria.
Emuladores en circuito. Se trata de un instrumento que se coloca entre el PC
anfitrin y el zcalo de la tarjeta de circuito impreso donde se alojar el
microcontrolador definitivo. El programa es ejecutado desde el PC, pero para la tarjeta
de aplicacin es como si lo hiciese el mismo microcontrolador que luego ir en el
zcalo. Presenta en pantalla toda la informacin tal y como luego suceder cuando se
coloque la cpsula.

3.3.

LA FAMILIA DE LOS PIC COMO ELECCIN

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Los detalles ms importantes que vuelven locos a los profesionales de la


microelectrnica y microinformtica y las razones de la excelente acogida que tienen los
PIC son los siguientes:
Sencillez de manejo: Tienen un juego de instrucciones reducido; 35 en la
gama media.
Buena informacin, fcil de conseguir y econmica.
Precio: Su coste es comparativamente inferior al de sus competidores.
Poseen una elevada velocidad de funcionamiento. Buen promedio de
parmetros: velocidad, consumo, tamao, alimentacin, cdigo
compacto, etc.
Herramientas de desarrollo fciles y baratas. Muchas herramientas
software se pueden recoger libremente a travs de Internet desde
Microchip (http://www.microchip.com).
Existe una gran variedad de herramientas hardware que permiten grabar,
depurar, borrar y comprobar el comportamiento de los PIC.
Diseo rpido.
La gran variedad de modelos de PIC permite elegir el que mejor
responde a los requerimientos de la aplicacin.
Una de las razones del xito de los PIC se basa en su utilizacin. Cuando se
aprende a manejar uno de ellos, conociendo su arquitectura y su repertorio de
instrucciones, es muy fcil emplear otro modelo.

3.3.1.

CARACTERSTICAS RELEVANTES
Descripcin de las caractersticas ms representativas de los PIC:

3.3.1.1.

Arquitectura

La arquitectura del procesador sigue el modelo Harvard. En esta arquitectura, la


CPU se conecta de forma independiente y con buses distintos con la memoria de
instrucciones y con la de datos.
La arquitectura Harvard permite a la CPU acceder simultneamente a las dos
memorias. Adems, propicia numerosas ventajas al funcionamiento del sistema como se
irn describiendo.

70

GUILLERMO DAVID HERRERO GONZLEZ

3.3.1.2.

Segmentacin

Se aplica la tcnica de segmentacin (pipe-line) en la ejecucin de las


instrucciones.
La segmentacin permite al procesador realizar al mismo tiempo la ejecucin de
una instruccin y la bsqueda del cdigo de la siguiente. De esta forma se puede
ejecutar cada instruccin en un ciclo (un ciclo de instruccin equivale a cuatro ciclos de
reloj).
Las instrucciones de salto ocupan dos ciclos al no conocer la direccin de la
siguiente instruccin hasta que no se haya completado la de bifurcacin.

3.3.1.3.

Formato De Las Instrucciones

El formato de todas las instrucciones es de la misma longitud


Todas las instrucciones de los microcontroladores de la gama baja tienen una
longitud de 12 bits. Las de la gama media tienen 14 bits y ms las de la gama alta. Esta
caracterstica es muy ventajosa en la optimizacin de la memoria de instrucciones y
facilita enormemente la construccin de ensambladores y compiladores.

3.3.1.4.

Juego De Instrucciones

Procesador RISC (Computador de Juego de Instrucciones Reducido).


Los modelos de la gama baja disponen de un repertorio de 33 instrucciones, 35
los de la gama media y casi 60 los de la alta.

3.3.1.5.

Todas Las Instrucciones Son Ortogonales

Cualquier instruccin puede manejar cualquier elemento de la arquitectura como


fuente o como destino.

3.3.1.6.

Arquitectura Basada En Un Banco De Registros

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

La gran variedad de modelos de microcontroladores PIC permite que el usuario


pueda seleccionar el ms conveniente para su proyecto.

3.3.1.8.

Herramientas De Soporte Potentes Y Econmicas

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

La arquitectura Harvard y la tcnica de segmentacin son los principales


recursos en los que se apoya el elevado rendimiento que caracteriza estos dispositivos
programables, mejorando dos caractersticas esenciales:
Velocidad de ejecucin.
Eficiencia en la compactacin del cdigo.

3.3.2.

LAS GAMAS DE PIC

Una de las labores ms importantes del ingeniero de diseo es la eleccin del


microcontrolador que mejor satisfaga las necesidades del proyecto con el mnimo
presupuesto.
Para resolver aplicaciones sencillas se precisan pocos recursos, en cambio, las
aplicaciones grandes requieren numerosos y potentes. Siguiendo esta filosofa
Microchip construye diversos modelos de microcontroladores orientados a cubrir, de
forma ptima, las necesidades de cada proyecto. As, hay disponibles
microcontroladores sencillos y baratos para atender las aplicaciones simples y otros
complejos y ms costosos para las de mucha envergadura.
Microchip dispone de cuatro familias de microcontroladores de 8 bits para
adaptarse a las necesidades de la mayora de los clientes potenciales.
En la mayor parte de la bibliografa encontrareis tan solo tres familias de
microcontroladores, con lo que habrn despreciado la llamada gama enana, que es en
realidad una subfamilia formada por componentes pertenecientes a las otras gamas. En
nuestro caso hemos preferido comentarla dado que los PIC enanos son muy apreciados
en las aplicaciones de control de personal, en sistemas de seguridad y en dispositivos de
bajo consumo que gestionan receptores y transmisores de seales. Su pequeo tamao
los hace ideales en muchos proyectos donde esta cualidad es fundamental.

72

GUILLERMO DAVID HERRERO GONZLEZ

3.3.2.1.

La Gama Enana: PIC12C(F)XXX De Terminales

Se trata de un grupo de PIC de reciente aparicin que ha acaparado la atencin


del mercado. Su principal caracterstica es su reducido tamao, al disponer todos sus
componentes de 8 terminales. Se alimentan con un voltaje de corriente continua
comprendido entre 2,5 V y 5,5 V, y consumen menos de 2 mA cuando trabajan a 5 V y
4MHz. El formato de sus instrucciones puede ser de 12 o de 14 bits y su repertorio es de
33 o 35 instrucciones, respectivamente. En la figura se muestra el diagrama de
conexionado de uno de estos PIC.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.3.2.2.

Gama Baja O Bsica: PIC16C5X Con Instrucciones De 16bits

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.

Al igual que todos los miembros de la familia PIC16/17, los componentes de la


gama baja se caracterizan por poseer los siguientes recursos: (en la tabla se presentan las
principales caractersticas de los modelos de esta familia).
Sistema POR (Power On Reset)
Todos los PIC tienen la facultad de generar una autoreinicializacin o
autoreset al conectarles la alimentacin.
Perro guardin (Watchdog o WDT)
Existe un temporizador que produce un reset automticamente si no es
recargado antes que pase un tiempo prefijado. As se evita que el sistema
quede colgado dado en esa situacin el programa no recarga dicho
temporizador y se genera un reset.
Cdigo de proteccin
Cuando se procede a realizar la grabacin del programa, puede
protegerse para evitar su lectura. Tambin disponen los PIC de
posiciones reservadas para registrar nmeros de serie, cdigos de
identificacin, prueba, etc.
Lneas de E/S de alta corriente
Las lneas de E/S de los PIC pueden proporcionar o absorber una
corriente de salida comprendida entre 20 y 25 mA, capaz de excitar
directamente ciertos perifricos.
Modo de reposo (Bajo consumo o sleep)
Ejecutando una instruccin (SLEEP), la CPU y el oscilador principal se
detienen y se reduce notablemente el consumo.

74

GUILLERMO DAVID HERRERO GONZLEZ

Para terminar el comentario introductorio sobre los componentes de la gama baja


conviene nombrar dos restricciones importantes:
La pila o stack slo dispone de dos niveles lo que supone no poder
encadenar ms de dos subrutinas.
Los microcontroladores de la gama baja no admiten interrupciones.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.3.2.3.

Gama Media. PIC16CXXX Con Instrucciones De 16bits

Es la gama ms variada y completa de los PIC. Abarca modelos con encapsulado


desde 18 terminales hasta 68, cubriendo varias opciones que integran abundantes
perifricos. Dentro de esta gama se halla el fabuloso PIC16x84 y sus variantes. En la
figura se muestra el diagrama de conexionado de uno de estos PIC.

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

GUILLERMO DAVID HERRERO GONZLEZ

Encuadrado en la gama media tambin se halla la versin PIC14C000, que


soporta el diseo de controladores inteligentes para cargadores de bateras, pilas
pequeas, fuentes de alimentacin ininterrumpibles y cualquier sistema de adquisicin y
procesamiento de seales que requiera gestin de la energa de alimentacin. Los
PIC14C000 admiten cualquier tecnologa de las bateras como Li-Ion, NiMH, NiCd, Ph
y Zinc.
El temporizador TMR1 que hay en esta gama tiene un circuito oscilador que
puede trabajar asncronamente y que puede incrementarse aunque el microcontrolador
se halle en el modo de reposo (sleep), posibilitando la implementacin de un reloj en
tiempo real.
Las lneas de E/S presentan una carga pull-up activada por software.

3.3.2.4.

Gama Alta: PIC17CXXX Con Instrucciones De 16bits

Se alcanzan las 58 instrucciones de 16 bits en el repertorio y sus modelos


disponen de un sistema de gestin de interrupciones vectorizadas muy potente. Tambin
incluyen variados controladores de perifricos, puertos de comunicacin serie y paralelo
con elementos externos, un multiplicador hardware de gran velocidad y mayores
capacidades de memoria, que alcanza los 8 k palabras en la memoria de instrucciones y
454 bytes en la memoria de datos.
Quizs la caracterstica ms destacable de los componentes de esta gama es su
arquitectura abierta, que consiste en la posibilidad de ampliacin del microcontrolador
con elementos externos. Para este fin, las terminales sacan al exterior las lneas de los
buses de datos, direcciones y control, a las que se conectan memorias o controladores de
perifricos. Esta facultad obliga a estos componentes a tener un elevado nmero de
terminales comprendido entre 40 y 44. Esta filosofa de construccin del sistema es la
que se empleaba en los microprocesadores y no suele ser una prctica habitual cuando
se emplean microcontroladores.

77

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.3.2.5.

Gama Mejorada: PIC18FXXXX

La nueva familia PIC18F se present como una nueva gama de


microcontroladores RISC de 8bits con arquitectura Harvard que inclua los ltimos
avances y la mayora de los perifricos para potenciar miles de aplicaciones centradas
en las reas de automocin, comunicaciones, ofimticas, productos de gran consumo y
control industrial.
El objetivo del fabricante era facilitar a sus usuarios la transicin a dispositivos
modernos, que con una relacin precio/prestaciones muy competitiva, integraban la
mayora de los recursos necesarios para implementar desarrollos eficientes, de mayor
rendimiento y complejidad.
Con la nueva familia Microchip ha resuelto dos grandes metas:
Compatibilidad: con los PIC16F y sus perifricos; soportando
Ensamblador y C.
Elevado rendimiento: mxima eficacia del compilador C; elevada
productividad que alcanza un rendimiento de 10MIPS a 10MHz.
A principios del 2006 Microchip dispona de una gama de 80modelos y una
previsin de 41 nuevos.
Aportaciones especficas de la gama mejorada:
Tecnologa nanoWatt: reduce el consumo de energa.
Espacio de direccionamiento lineal: desaparecen los bancos.
Compatibilidad de software.
Compatibilidad de hardware.
Orientacin al lenguaje C.
Autoprogramabilidad: Pueden escribir su memoria de programa
internamente.
Diversidad de perifricos integrados.

Actualmente Microchip dispone de la familia PIC24F de 16bits y la dsPIC.

78

GUILLERMO DAVID HERRERO GONZLEZ

3.4.

FAMILIA PIC18FXX5X

Se va a hacer especial hincapi en esta familia ya que es con la que se va a


realizar el proyecto porque tiene un puerto USB integrado.
Todo lo que se comenta en la memoria son traducciones de la informacin del
fabricante.

3.4.1.

DIAGRAMA DE PINES

79

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

80

GUILLERMO DAVID HERRERO GONZLEZ

3.4.2.

PERSPECTIVA GENERAL DEL DISPOSITIVO

TABLA 2-1: Caractersticas Del Dispositivo

81

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 2-1: Diagrama De Bloques Del PIC18F2455/2550 28 pines

82

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 2-2: Diagrama De Bloques Del PIC18F4455/4550 44 Pines

83

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 2-2: Descripcin De Los Pines E/S Del PIC18F2455/2550

84

GUILLERMO DAVID HERRERO GONZLEZ

85

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

86

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 2-3: Descripcin De Los Pines Del PIC18F4455/4550

87

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

88

GUILLERMO DAVID HERRERO GONZLEZ

89

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.3.

CONFIGURACIN DEL OSCILADOR

El microcontrolador necesita un reloj estable para proporcionar una fuente de


reloj separada.
FIGURA 3-1: Diagrama Del Reloj

90

GUILLERMO DAVID HERRERO GONZLEZ

3.4.3.1.

Control Del Oscilador

El oscilador se controla mediante dos registros de configuracin y otros dos de


control.
En CONFIG1L y CONFIG1H se elige el oscilador y las opciones de los
escaladores del USB (prescaler y postscaler).
Los bits de configuracin se seleccionan al programarlos y permanecern hasta
que se vuelvan a programar.
El registro OSCCON selecciona el modo activo de reloj.
El registro OSCTUNE se utiliza para recortar frecuencia de la fuente INTRC.

3.4.3.2.

Tipos De Oscilador

Hay que programar los bits de configuracin FOSC3:FOSC0 para seleccionar un


modo de estos:
XT: XTAL/ circuito resonante.
XTPLL: XTAL/ circuito resonante con PLL activo.
HS: XTAL/ circuito resonante muy rpido.
HSPLL: XTAL/ circuito resonante muy rpido con PLL activo.
EC: Reloj externo con Fosc/4 como salida en RA6.
ECIO: Reloj externo con RA6 como E/S.
ECPLL: Reloj externo con Fosc/4 como salida en RA6 y PLL activo.
ECPIO: Reloj externo con RA6 como E/S y PLL activo.
INTHS: Oscilador interno usado como reloj del microcontrolador y HS
como reloj del USB.
INTXT: Oscilador interno usado como reloj del microcontrolador y XT
como reloj del USB.
INTIO: Oscilador interno usado como reloj del microcontrolador y EC
como reloj del USB con RA6 como E/S.
INTCKO: Oscilador interno usado como reloj del microcontrolador y
EC como reloj del USB con Fosc/4 como salida en RA6.

3.4.3.2.1.

Modos Del Oscilador Y Operaciones Con El USB

En la familia PIC18F2455/PIC18F2550/PIC18F4455/PIC18F4550 el oscilador


primario forma parte del mdulo USB y no se puede asociar a ninguna otra fuente de
reloj.
El mdulo USB tiene que ser controlado por la fuente primaria y los otros
dispositivos o el microcontrolador se pueden controlar por fuentes secundarias u
osciladores internos como en el resto de microcontroladores PIC.
Al utilizar el USB necesitamos un reloj interno de 6MHz 48MHz, el resto del
sistema puede funcionar con cualquier otro oscilador.

91

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.3.2.2.

XTAL/Resonadores Cermicos

En HS, HSPLL, XT y XTPLL el XTAL o el circuito resonador se conectan a


OSC1 y OSC2.
Un postscaler interno permite elegir una frecuencia distinta a la del reloj de
entrada. La divisin de la frecuencia se elige con el bit de configuracin CPUDIV y se
puede seleccionar a 1/2, 1/3 1/4 de la frecuencia de entrada.
Se puede utilizar un reloj externo cuando el microcontrolador est en modo HS.
En este caso el pin OSC2/CLK0 est abierto.
FIGURA 3-2: XTAL/Resonador Cermico (Configuracin XT, HS O HSPLL)

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

El valor de los condensadores es slo como gua en el diseo.


Estos condensadores se han probado con los osciladores de la lista de debajo en
operaciones bsicas de inicio. Estos valores no estn optimizados.
Se puede necesitar otros condensadores de distinto valor para conseguir una
oscilacin aceptable en una determinada operacin. El usuario tiene que probar la forma
de la onda conseguida con una determinada VDD y un rango de temperaturas en la cual
trabaje la aplicacin.

92

GUILLERMO DAVID HERRERO GONZLEZ

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

El valor de los condensadores es slo como gua en el diseo.


Estos condensadores se han probado con los osciladores de la lista de debajo en
operaciones bsicas de inicio. Estos valores no estn optimizados.
Se puede necesitar otros condensadores de distinto valor para conseguir una
oscilacin aceptable en una determinada operacin. El usuario tiene que probar la forma
de la onda conseguida con una determinada VDD y un rango de temperaturas en la cual
trabaje la aplicacin.
Xtal utilizado:
4MHz
8MHz
20MHz

3.4.3.2.3.

Seal De Reloj Externa

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 3-3: Seal De Reloj Externa (Configuracin HS)

FIGURA 3-4: Seal De Reloj Externa (Configuracin EC Y ECPLL)

FIGURA 3-5: Seal De Reloj Externa (Configuracin ECIO Y ECPIO)

3.4.3.2.4.

Multiplicador De Frecuencia PLL

Esta familia de dispositivos incluye un circuito PLL (Paced Locked Loop). Se


utiliza en aplicaciones USB con velocidad baja de oscilacin y como fuente de reloj
para el microcontrolador.
El PLL est activo en los modos HSPLL, XTPLL, ECPLL y ECPIO. Est
diseado para producir una seal de referencia de 96MHz de una seal de entrada de
4MHz. La salida se puede dividir y utilizar para el USB y el reloj del microcontrolador
porque el PLL tiene una seal de entrada y salida fijas. Tiene ocho opciones de
prescaler para elegir la frecuencia de entrada al PLL.
Hay un postscaler para elegir la velocidad del microcontrolador, para que el
USB y el microcontrolador tengan una entrada de reloj y funcionen a velocidades
diferentes. El postscaler tiene las opciones de 1/2, 1/4 y 1/6 de la salida del PLL.
Los modos HSPLL, ECPLL y ECPIO utilizan el modo del oscilador HS para
frecuencias superiores a 48MHz. El prescaler divide la seal de entrada por 12 para
producir 4MHz para el PLL. El modo XTPLL slo utiliza la frecuencia de entrada de
4MHz que dirige el PLL directamente.

94

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 3-6: Diagrama Del Bloque PLL (Configuracin HS)

3.4.3.2.5.

Bloque Interno Del Oscilador

En la familia PIC18F2455/PIC18F2550/PIC18F4455/PIC18F4550 tienen un


oscilador interno que genera dos seales diferentes; cualquiera se puede utilizar como
reloj del microcontrolador. Si el USB no est utilizado, el oscilador interno puede
eliminar el oscilador externo de los pines OSC1 y/o OSC2.
La salida principal (INTOSC) es una fuente de reloj de 8MHz que se puede
utilizar para dirigir el reloj directamente. Esto tambin gobierna el postscaler de
INTOSC, el cual puede proporcionar un rango de frecuencias de 31kHz a 4MHz. La
salida INTOSC est activa cuando se selecciona una frecuencia de reloj de 125kHz a
8MHz.
La otra seal interna de reloj es el oscilador RC (INTRC) que da una salida
nominal de 31kHz. INTRC est activo si se selecciona como fuente de reloj; se activa
automticamente cuando alguno de los siguientes est activo:

Temporizador de encendido
Monitor de reloj de seguridad
Temporizador perro guardin
Dos velocidades de inicio

La frecuencia se elige configurando el bit IRCF del registro OSCCON.

95

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Modos Del Oscilador Interno


Cuando el oscilador interno funciona como reloj del microcontrolador, uno de
los otros modos debe utilizarse como reloj del USB. La eleccin del USB se determina
dependiendo del modo de funcionamiento interno.
Hay cuatro modos distintos:
INTHS: Da la seal el oscilador en modo HS.
INTXT: Da la seal el oscilador en modo XT.
INTCKO: La seal la da un oscilador externo conectado al OSC1; en el
OSC2 podemos obtener Fosc/4.
INTIO: La seal la da un oscilador externo conectado al OSC1; en el
OSC2 tenemos un pin E/S (RA6).

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.

Frecuencia Del Oscilador Interno Y Cambios


El oscilador interno est calibrado para dar 8MHz. Sin embargo, esta frecuencia
se puede modificar cuando VDD o la temperatura cambian, puede afectar el control de
una operacin de muchas formas.
La baja frecuencia del oscilador INTRC funciona independientemente de la
fuente INTOSC. Cualquier cambio en INTOSC por tensin o temperatura no tiene
porqu reflejarse en INTRC y viceversa.

96

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 3-1. OSCTUNE: Registro selector del oscilador


BIT 7

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

INTSRC: Bit selector de la baja frecuencia del oscilador interno.


1= 31,25kHz producido por los 8MHz de INTOSC
(activa el divisor por 256)
0= 31kHz producido por el oscilador interno INTRC
No implementados, se leen 0
TUN4:TUN0: Selectores de frecuencia:
01111: Mxima frecuencia
.
.
00001
00000: Frecuencia media. Funciona con la
velocidad calibrada.
11111
.
.
10000: Mnima frecuencia.

Compensacin Por Los Cambios En INTOSC


Es posible ajustar la frecuencia del INTOSC modificando el registro OSCTUNE.
Esto no producir ningn cambio en la frecuencia de INTRC.
El ajuste de INTOSC debe hacerse dependiendo de la aplicacin. Por ejemplo, si
necesitamos la EUSART, debemos ajustar la frecuencia para evitar fallos de recepcin o
de cuadrar los pulsos. Los errores por no cuadrar los pulsos indican que la frecuencia de
reloj es muy alta, para ajustarla decrementamos el valor del OSCTUNE. Los errores en
datos puedes ocurrir porque la velocidad del reloj es muy baja, para compensarlo
aumentamos el OSCTUNE.
Es posible comparar la velocidad del reloj con un reloj de referencia. Se pueden
usar dos temporizadores: un reloj externo, y el otro es un reloj de referencia como el
oscilador Timer1. Ambos temporizadores se borran pero el reloj tomado como
referencia genera interrupciones. Cuando ocurre una interrupcin, se lee el reloj interno
y los dos temporizadores borrados. Si el valor del temporizador interno es demasiado
alto, el bloque del oscilador interno funciona muy deprisa. Para ajustarlo, hay que
decrementar el registro OSCTUNE.
Se puede utilizar un mdulo CCP libremente en el Timer1 o el Timer3, ajustado
por el bloque oscilador interno y un evento externo con un periodo conocido (por
ejemplo, una corriente alterna). El periodo del primer evento se captura en los registros
CCPRxH:CCPRxL y se graba para poder utilizarlo posteriormente. Cuando ocurre un
segundo evento, se resta al tiempo del segundo el del primero. Como se conoce el
periodo externo, se puede calcular la diferencia entre los dos eventos.

97

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Configuracin Del Oscilador Para El USB

Cuando el PIC18F4550 se utiliza en una conexin por USB, necesitamos un


reloj de 6MHz 48MHz dependiendo de si usamos alta o baja velocidad. Debemos
preverlo al seleccionar la frecuencia y al programar el microcontrolador.
TABLA 3-3: Opciones De Configuracin Del Oscilador Con El USB
Frecuencia de
entrada del Osc.
48MHz

48MHz

40MHz

24MHz

20MHz

16MHz

Divisor PILL
(PLLDIV2:PLLDIVO)
N/A(1)

12(111)

10(110)

6(101)

5(100)

4(011)

Modo del reloj


(FOSC3:FOSCO)
EC, ECIO

Divisin del reloj MCU


(CPUDIV1:CPUDIVO)
None(00)
2(01)
3(10)
4(11)
EC, ECIO
None(00)
2(01)
.
3(10)
4(11)
ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
EC, ECIO
None(00)
2(01)
3(10)
4(11)
ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
HS, EC, ECIO
None(00)
2(01)
3(10)
4(11)
HSPLL, ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
HS, EC, ECIO
None(00)
2(01)
3(10)
4(11)
HSPLL, ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
HS, EC, ECIO
None(00)
2(01)

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

GUILLERMO DAVID HERRERO GONZLEZ

Frecuencia de
entrada del Osc.

12MHz

8MHz

4MHz

Divisor PILL
(PLLDIV2:PLLDIVO)

3(010)

2(001)

1(000)

Modo del reloj


(FOSC3:FOSCO)

Divisin del reloj MCU


(CPUDIV1:CPUDIVO)
3(10)
4(11)
HSPLL, ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
HS, EC, ECIO
None(00)
2(01)
3(10)
4(11)
HSPLL, ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
HS, EC, ECIO
None(00)
2(01)
3(10)
4(11)
HSPLL, ECPLL, ECPIO
2(00)
3(01)
4(10)
6(11)
XT, HS, EC, ECIO
None(00)
2(01)
3(10)
-4(11)
HSPLL, ECPLL, XTPLL,
2(00)
ECPIO
3(01)
4(10)
6(11)

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

Nota: (1) Slo es vlido si el bit USBDIV est borrado.


Todas las frecuencias, excepto las de 24MHz, se utilizan en el USB 2.0. Las
frecuencias de 24MHz se utilizan en el USB1.0.

3.4.3.3.1.

Operaciones Con Baja Velocidad (USB )

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Fuentes De Reloj Y Cambios De Oscilador

En la familia PIC18F2455/PIC18F2550/PIC18F4455/PIC18F4550 se incluye


una opcin para alternar la fuente de reloj con dos fuentes alternativas de menor
frecuencia. Cuando activamos una fuente alternativa, tenemos disponibles varios modos
de control de energa.
Hay tres fuentes de reloj en estos dispositivos:
oscilador primario
oscilador secundario
bloque interno de oscilacin
Los osciladores primarios incluyen los XTAL, los circuitos resonadores, los
modos externos de reloj y el bloque interno de oscilacin. El modo particular se elige
con los bits de configuracin FOSC3:FOSC0.
Los osciladores secundarios son las fuentes externas que no se conectan en los
pines OSC1 u OSC2. Estas fuentes pueden seguir funcionando incluso cuando el
microcontrolador se pone en modo control de energa.
Los micros PIC18F2455/PIC18F2550/PIC18F4455/PIC18F4550 ofrecen el
Timer1 como oscilador secundario. Este oscilador es, a menudo, el temporizador base
en las aplicaciones basadas en tiempo real en todos los modos de control de energa.
Ms comnmente, se conecta un XTAL de 32,768kHz en los pines
RC0/T1OSO/TI3CKI y RC1/T10SI/UOE* junto con un condensador e cada pin a masa.
El bloque interno de oscilacin se puede usar como reloj en los modos control
de energa. La fuente INTRC se utiliza en varias opciones especiales como el perro
guardin o el monitor del reloj de seguridad.

100

GUILLERMO DAVID HERRERO GONZLEZ

3.4.3.4.1.

Registros De Control Del Oscilador

El registro OSCCON maneja distintos aspectos de las operaciones del reloj en


todos los modos de energa.
Los bits de seleccin de la fuente del reloj son SCS1:SCS0. Las fuentes de reloj
disponibles son el reloj primario (definido por los bits FOSC3:FOSC0), el reloj
secundario (oscilador Timer1) y el bloque del oscilador interno. La fuente de reloj
cambia inmediatamente despus de haber escrito el bit o los bits en un pequeo
intervalo de reloj. Los bits SCS se borran en cualquier tipo de reset.
Los bits de seleccin de la frecuencia del oscilador interno son IRCF2:IRCF0, se
elige la frecuencia de salida del bloque del oscilador interno. La eleccin se hace sobre
la fuente INTRC, la fuente INTOSC o una de las frecuencias obtenidas de aplicar el
postscaler. Si el bloque del oscilador interno aplica la seal de reloj, al cambiar los
estados de estos bits obtendremos un cambio inmediato en la salida del oscilador. En un
reset del dispositivo, la frecuencia del oscilador interno se configura como 1MHz.
Cuando elegimos una frecuencia de 31kHz (IRC2:IRC0=000), el usuario puede
elegir que oscilador interno funciona como fuente. Esto se hace mediante el bit INTSRC
del registro OSCTUNE. Activando este bit elegimos la fuente de reloj como INTOSC
con una frecuencia de 31,25kHz activando el divisor por 256 en el postscaler del
INTOSC. Desactivando este bit ponemos como fuente INTRC con una frecuencia
nominal de 31kHz.
Esta opcin permite a los usuarios seleccionar la fuente de reloj ms precisa con
INTOSC que mantiene el ahorro de energa con una baja velocidad de reloj.
INTRC siempre mantiene la seal de reloj en eventos como el perro guardin o
el monitor de seguridad del reloj.
Los bits OSTS, IOFS y T1RUN indican cual es el reloj que proporciona la seal
principal. El bit OSTS indica que el tiempo de arranque ha terminado y que el reloj
primario proporciona el reloj en modo primario. El bit IOFS indica cuando se ha
estabilizado el bloque del oscilador interno y que el reloj est en modo RC. El bit
T1RUN indica cuando el Timer1 proporciona la seal secundaria de reloj. En los modos
de control de energa, slo se puede seleccionar uno de estos tres bits a la vez. Si no
se han activado ninguno de estos tres bits, el reloj INTRC da la seal o el bloque interno
el oscilador ha empezado y no est todava listo.
El bit IDLEN determina si el dispositivo est en modo sleep o uno de los modos
de ahorro, cuando se ha ejecutado la instruccin SLEEP.

101

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.3.4.2.

Transiciones Del Oscilador

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:

Bit puntero del modo reposo


1= El dispositivo entra en modo reposo con la
instruccin SLEEP
0= El dispositivo entra en modo sleep con la instruccin
SLEEP
IRCF2:IRCF0: Selectores de la frecuencia interna del oscilador:
111=8MHz (INTOSC directamente)
110=4MHz
101=2MHz
100=1MHz (Por defecto en un reset)
011=500kHz
010=250kHz
001=125kHz
000=31kHz (INTOSC/256 o INTRC directamente. Se
selecciona con el bit INTSRC del registro OSCTUNE)
OSTS:
Bit de estado del desbordamiento de oscilador de inicio
(depende del estado del bit de configuracin IESO)
1= El tiempo de inicio ha terminado, el oscilador
primario est activo.
0= El tiempo de inicio no ha acabado, el oscilador
primario no est activado.
IOFS:
Bit de frecuencia estable
1= La frecuencia de INTOSC es estable
0= La frecuencia de INTOSC no es estable
SCS1:SCS0:
Bits de seleccin del reloj del sistema
1x= Oscilador interno
01= Oscilador Timer1
00= Oscilador primario

102

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.3.6.

Retraso En El Inicio

Los retrasos en el inicio se controlan por medio de dos temporizadores por lo


que, en la mayora de las aplicaciones, no se necesitan reset externos. Los retrasos
mantienen el dispositivo apagado hasta que la tensin es estable en circunstancias
normales y el reloj primario es estable y est funcionando.
La primera vez es el Temporizador de inicio (PWRT), el cual proporciona un
retraso fijo en el arranque. Se activa borrando en bit de configuracin PWRTEN*.
El segundo temporizador es el oscilador-temporizador de arranque (OST),
mantiene el chip apagado hasta que el oscilador es estable (en los modos XT y HS). El
OST cuenta 1024 ciclos y despus activa el micro.
Cuando elegimos el modo de oscilador HSPLL, el dispositivo permanece en
reset 2ms ms despus del retraso del OST, para que el PLL pueda detectar la
frecuencia de entrada.
Hay un intervalo de retraso TCSD despus del POR, cuando el controlador
empieza a ejecutar una instruccin. Este retraso se ejecuta cuando estn otros retrasos
activos. Este es el nico retraso que ocurre cuando se activan los modos de oscilador
primario EC y el modo interno.
TABLA 3-4: Estado De Los Pines OSCY OSCEN El Modo SLEEP
Modo del Oscilador
INTCKO
INTIO
ECIO, ECHO
EC
XT and HS

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.4.

MODOS DE CONTROL DE ENERGA

Los dispositivos PIC18F2455/2550/4455/4550 ofrecen un total de siete modos


de funcionamiento para controlar la energa. Estos modos proporcionan una variedad de
opciones para la conservacin selectiva en las aplicaciones donde los recursos pueden
ser limitados (es decir, los dispositivos con pilas).
Hay tres categoras de modos de control de energa:
Modo ejecucin.
Modo reposo
Modo sleep.
Estas categoras definen qu porciones del dispositivo se utilizan y a veces, qu
velocidad. Los modos ejecucin y reposo pueden utilizar cualquiera de los tres relojes
disponibles (primario, secundario o bloque interno); el modo sleep no utiliza una fuente
del reloj.
Los modos de control de energa incluyen varias caractersticas de ahorro de
energa que se ofrecieron en los microcontroladores antiguos. Una es la caracterstica de
la conmutacin del reloj, ofrecida en otros dispositivos PIC18, permitiendo que el
regulador utilice el oscilador Timer1 en lugar del oscilador primario. Tambin se
incluye el modo sleep, ofrecido en todos los dispositivos PICmicro, donde se paran
todos los relojes del dispositivo.
TABLA 4-1: Modos De Control De Energa
MODO
IDLEN(1)
Sleep

Bits OSCCON
SCS1:SCS0
CPU

Modulo que controla


Perifricos

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

Fuente de reloj y oscilador


disponible
Nada los relojes estn
desactivados
Primario-todos los modos del
oscilador. Este es el modo de
ejecucin normal.
Secundario-Como oscilador los
Timer
Bloque interno del oscilador(2)
Primario- todos los modos de
oscilador
Secundario-Como oscilador los
Timer
Bloque interno del oscilador(2)

Nota: 1: IDLEN devuelve este valor cuando se ha ejecutado la instruccin


SLEEP.
2: Incluye INTOSC y los postscaler INTOSC as como la fuente INTRC

105

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.4.1.

Seleccionar Los Modos De Control De Energa

Seleccionar un modo de control de energa requiere dos decisiones: si la CPU


est controlada o no y la seleccin de una fuente del reloj. El bit IDLEN
(OSCCON<7>) controla la CPU, mientras que los bits SCS1:SCS0 (OSCCON<1: 0>)
seleccionan el reloj fuente.

3.4.4.1.1.

Fuentes Del Reloj

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.

Comienzo De Los Modos De Control De Energa

El cambio de un modo de control de energa a otro comienza cargando el


registro OSCCON. Los bits SCS1:SCS0 seleccionan la fuente del reloj y se determinan
cules funcionan en los modos ejecucin y reposo. Cambiar estos bits provoca un
cambio inmediato al reloj seleccionado. El cambio puede estar sometido a retrasos en
las transiciones del reloj.
La entrada a los modos de control de energa reposo o sleep se provoca por la
ejecucin de una instruccin SLEEP. El modo que se activa depende del estado del bit
IDLEN.
Dependiendo del modo actual y del modo al cual vamos a cambiar, un cambio
de un modo de control de energa no tiene por que requerir seleccionar todos los bits.
Muchas transiciones se pueden hacer cambiando los bits de seleccin del oscilador, o
cambiando el bit IDLEN, antes de ejecutar una instruccin SLEEP. Si el bit IDLEN est
configurado correctamente, puede ser necesario realizar una instruccin SLEEP para
cambiar al modo deseado.

106

GUILLERMO DAVID HERRERO GONZLEZ

3.4.4.1.3.

Transiciones De Reloj Y Puntero De Estado

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.

Mltiples Comandos SLEEP

El modo control de energa que se invoca con la instruccin SLEEP se determina


en el ajuste del bit IDLEN cuando se ejecuta la instruccin. Si se ejecuta otra
instruccin del SLEEP, el dispositivo entrar en el modo de control de energa
especificado por el bit IDLEN en ese momento. Si IDLEN ha cambiado, el dispositivo
entrar en el nuevo modo de control de energa especificado por el nuevo ajuste.

107

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

El modo de PRI_RUN es la ejecucin de la potencia normal del


microcontrolador. ste tambin es el modo por defecto sobre un dispositivo reseteando
a menos que el arranque a dos velocidades est activo. En este modo, se activa el bit
OSTS. El bit IOFS puede activarse si el bloque del oscilador interno es la fuente
primaria de reloj.

3.4.4.2.2.

Modo SEC_RUN

El modo de SEC_RUN es el modo compatible a cambio de reloj ofrecido en


otros PIC18. En este modo, la CPU y los perifricos se controlan con el oscilador
Timer1. Esto da a los usuarios la opcin de un consumo de energa ms bajo mientras
que todava se use una alta fuente estable de reloj.
Se pone el modo SEC_RUN fijando los bits SCS1:SCS0 con 01. La fuente de
reloj del dispositivo se cambia al oscilador Timer1, el oscilador primario se desactiva, el
bit T1RUN (T1CON<6>) se activa y el bit OSTS borra.
Nota: El oscilador Timer1 debe estar funcionamiento antes de poner el modo
SEC_RUN. Si el bit T1OSCEN no se activa cuando se ponen los bits SCS1:SCS0 a
01, no se activar el modo SEC_RUN. Si El oscilador Timer1 est activado pero no
funcionando, se provocar un retraso en los relojes del dispositivo hasta que el oscilador
comience. En tal situacin, la operacin inicial del oscilador ser inestable e
imprevisible.
En transiciones entre los modos SEC_RUN a PRI_RUN, los perifricos y la
CPU continan siendo controlados por el oscilador Timer1 mientras que se enciende el
reloj primario. Cuando el reloj primario est listo, se cambian los relojes. Cuando
cambio de reloj se completa, el bit T1RUN se borra, y se activa el bit OSTS y el reloj
primario est proporcionando la seal. A los bits IDLEN y SCS no les afecta el
arranque; el oscilador Timer1 contina funcionando.

108

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 4-1: Tiempos De Transicin Para Entrar En El Modo SEC_RUN

FIGURA 4-2: Tiempos De Transicin Al Cambiar Del Modo SEC_RUN Al PRI_RUN


(HSPLL)

3.4.4.2.3.

Modo RC_RUN

En el modo RC_RUN, la CPU y los perifricos se estn controlando por el


bloque del oscilador interno usando el multiplexor INTOSC; se desactiva el reloj
primario. Este modo proporciona la mejor conservacin de energa de todos los modos
cuando se ejecuta cdigo. Trabaja bien cuando no se requiere medir el tiempo de una
forma precisa ni alta velocidad. Si la fuente primaria del reloj es el bloque del oscilador
interno (INTRC o INTOSC), no existen diferencias en la ejecucin entre el PRI_RUN y
RC_RUN. Sin embargo, un cambio en el reloj provocar un retraso durante la entrada y
la salida del modo de RC_RUN. Por lo tanto, si la fuente primaria del reloj es el bloque
interno del oscilador, no se recomienda el uso de RC_RUN.
Se activa este modo fijando SCS1 a 1. Se recomienda que SCS0 tambin est
borrado; esto es para mantener la compatibilidad de software con dispositivos futuros.
Cuando la fuente del reloj se cambia al multiplexor de INTOSC, el oscilador primario
se desactiva y el bit OSTS se borra. Los bits IRCF se pueden modificar en cualquier
momento y cambiar inmediatamente la velocidad de reloj.
Nota: Cuidado al modificar un solo bit de IRCF. Se puede provocar un error si
se violan las especificaciones de VDD/FOSC.

109

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Si los bits IRCF e INTSRC estn borrados, la salida de INTOSC est


desactivada y el bit IOFS seguir a 0; no habr indicacin de la fuente actual del reloj.
La fuente INTRC ser el reloj del dispositivo.
Si los bits IRCF se activan (permitiendo la salida INTOSC), o si se fija INTSRC,
el bit IOFS se activar despus de que la salida INTOSC sea estable. Las seales del
dispositivo continan mientras que la fuente de INTOSC se estabiliza despus de un
intervalo TIOBST.
Si los bits IRCF estaban previamente en un valor diferente a cero o si INTSRC
fue activado antes que SCS1 y la fuente INTOSC era estable, el bit IOFS seguir activo.
En transiciones del modo RC_RUN al modo PRI_RUN, el dispositivo contina
siendo controlado por el multiplexor INTOSC mientras se activa el reloj primario.
Cuando el reloj primario est listo, se produce un cambio a este. Cuando se completa el
cambio de reloj, el bit IOFS se borra, se activa el bit OSTS y el reloj primario est
proporcionando el reloj del dispositivo. A los bits IDLEN y de SCS no les afecta el
cambio. La fuente de INTRC continuar funcionando si se permite el WDT o el monitor
del reloj de seguridad.
FIGURA 4-3: Tiempo De Transicin Al Modo RC_RUN

FIGURA 4-4: Tiempo De Transicin En El Cambio Del Modo RC_RUN Al PRI_RUN

110

GUILLERMO DAVID HERRERO GONZLEZ

3.4.4.3.

Modo SLEEP

El modo de control de energa SLEEP en los dispositivos


PIC18F2455/2550/4455/4550 es idntico al modo SLEEP del resto de dispositivos de
PICmicro. Se activa borrando el bit IDLEN (estado por defecto en el dispositivo) y
ejecutndose la instruccin SLEEP. Esto desactiva el oscilador. Se borran todos los bits
de estado de la fuente del reloj.
Cambiar de un modo cualquiera al modo SLEEP no requiere un cambio de seal
de reloj. Esto es porque no se necesitan relojes cuando el microcontrolador entra en el
modo sleep. Si se activa el WDT, la fuente de INTRC empezar a funcionar. Si se
permite el oscilador Timer1, tambin continuar funcionando.
Cuando ocurre un acontecimiento (una interrupcin, un reset o el
desbordamiento del WDT) en modo sleep, el dispositivo no funcionar hasta que la
fuente del reloj seleccionada por los bits SCS1:SCS0 no est lista, o se controlar por el
bloque del oscilador interno si estn activos el monitor del reloj de seguridad o el
arranque con dos velocidades. En cualquier caso, se activa el bit OSTS cuando el reloj
primario es el reloj del dispositivo. A los bits IDLEN y SCS no les afecta el arranque.
FIGURA 4-5: Tiempo De Transicin Para Entrar En El Modo SLEEP

FIGURA 4-6: Tiempo De Transicin Del Reinicio De Un SLEEP (HSPLL)

111

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.4.4.2.

MODO SEC_IDLE

En modo de SEC_IDLE, la CPU se desactiva pero los perifricos continan


funcionando gracias al Timer1. Se cambia del modo SEC_RUN al SEC_IDLE
activando el bit IDLEN y ejecutando una instruccin SLEEP. Si el dispositivo est en
otro modo de funcionamiento, se activa primero el bit IDLEN, despus se fijan los bits
SCS1:SCS0 a 01 y se ejecuta el comando SLEEP. Cuando la fuente del reloj se
cambia al oscilador Timer1, se desactiva el oscilador primario, el bit OSTS se borra y se
activa el bit T1RUN.
Cuando ocurre un acontecimiento de reinicio, los perifrico continan
funcionando con el oscilador Timer1. Despus de un intervalo TCSD que sigue a la
interrupcin, la CPU comienza a ejecutar cdigo gracias al oscilador Timer1. A los bits
IDLEN y SCS no les afecta el reset; el oscilador Timer1 contina funcionando.
Nota: El oscilador Timer1 debe estar en funcionamiento antes de entrar en el
modo SEC_IDLE. Si el bit T1OSCEN no se activa cuando se ejecuta la instruccin
SLEEP, se ignorar esta instruccin y no cambiara al modo SEC_IDLE. Si el oscilador
Timer1 est activo pero no funciona todava, se provocarn retrasos en los relojes de los
perifricos hasta que el oscilador comience a contar. En tales situaciones, tenemos un
oscilador imprevisible.
FIGURA 4-7: Tiempo De Transicin Para Entrar En El Modo IDLE

FIGURA 4-8: Tiempo De Transicin El Reinicio Del Modo IDLE Al RUN

113

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.4.4.3.

Modo RC_IDLE

En modo de RC_IDLE, la CPU se desactiva pero los perifricos continan


activos con el bloque del oscilador interno usando el multiplexor INTOSC. Este modo
permite la conservacin controlada de energa durante los perodos de reposo.
El paso del modo RC_RUN, a ste modo se realiza activando el bit IDLEN y
ejecutando una instruccin SLEEP. Si el dispositivo est en otro modo de
funcionamiento, primero se activa el bit IDLEN, despus el bit SCS1 y por ltimo, una
instruccin SLEEP. Aunque no importa su valor, se recomienda que se borre el bit
SCS0; esto es por mantener la compatibilidad de software con dispositivos futuros. El
multiplexor INTOSC se puede utilizar para seleccionar una frecuencia de reloj ms alta
modificando los bits IRCF antes de ejecutar la instruccin SLEEP. Cuando la fuente del
reloj se cambia al multiplexor INTOSC, se desactiva el oscilador primario y el bit OSTS
se borra.
Si los bits IRCF se ponen a cualquier valor diferente a cero, o se activa el bit
INTSRC, se permite la salida INTOSC. El bit IOFS se activa cuando la salida INTOSC
est estable, despus de un intervalo TIOBST. Los relojes de los perifricos continan
hasta que la fuente de INTOSC se estabiliza. Si los bits IRCF estaban previamente en
un valor diferente a cero, o INTSRC fue fijado antes de ejecutar la instruccin SLEEP y
la fuente INTOSC es estable, el bit IOFS seguir activo. Si los bits IRCF e INTSRC
estn todos borrados, la salida INTOSC no se permitir, el bit IOFS seguir borrado y
no habr indicacin de la fuente actual de reloj.
Cuando ocurre un acontecimiento de reinicio, los perifricos continan
funcionando por el multiplexor INTOSC. Despus del retraso TCSD sigue la
interrupcin, la CPU comienza ejecutando el cdigo que se controla con el multiplexor
INTOSC. A los bits IDLEN y SCS no les afecta el reset. La fuente INTRC continuar
funcionando si el WDT o el monitor de reloj de seguridad estn activos.

3.4.4.5.

Salir De Los Modos SLEEP Y Reposo

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.4.5.1.

Salida Por Una Interrupcin

Cualquier interrupcin puede provocar el cambio del modo de reposo o del


modo sleep al modo ejecucin. Para permitir esta funcionalidad, se debe activar una
fuente de interrupcin activando su bit en uno de los registros INTCON o PIE. Se inicia
la secuencia de la salida cuando se activa el flag correspondiente a la interrupcin.
En todas las salidas de modos reposo o sleep por una interrupcin, el programa
salta al vector interrupcin si el bit GIE/GIEH (INTCON<7>) est activo. Si no, la
ejecucin de cdigo contina o se reanuda sin saltos.
Se necesita un retraso TCSD despus de la interrupcin para que el sistema salga
del modo reposo o sleep. Este retraso se provoca para que la CPU se prepare para la
ejecucin. La ejecucin de la instruccin se reanuda en el primer ciclo de reloj que sigue
a este retraso.

3.4.4.5.2.

Salida Por Desbordamiento Del WDT

La salida por el WDT causar diversas acciones dependiendo del modo de


ahorro de energa que est activo cuando se desborde.
Si el dispositivo no est ejecutando cdigo (en cualquier modo reposo o en el
modo sleep), el desbordamiento dar lugar a una salida del modo ahorro de energa. Si
el dispositivo est ejecutando cdigo (cualquiera de los modos de ejecucin), el
desbordamiento dar lugar a un reset del WDT.
El contador de tiempo y el postscaler del WDT se borran una instruccin SLEEP
o CLRWDT, la prdida de la fuente de reloj seleccionada (si se permite el monitor de
reloj de seguridad) y la modificacin de los bit IRCF en el OSCCON si el bloque del
oscilador interno es la fuente del reloj del dispositivo.

3.4.4.5.3.

Salida Por Reset

Normalmente, el dispositivo se resetea con el contador de inicio (OST) hasta que


el reloj primario est listo. En ese momento, el bit OSTS se activa y el dispositivo
comienza a ejecutar cdigo. Si el bloque del oscilador interno es la nueva fuente del
reloj, el bit IOFS se activa en lugar de otro.
El retraso entre el reset hasta que comienza la ejecucin de cdigo depende de
las fuentes de reloj de antes y despus del reinicio y del tipo de oscilador si la nueva
fuente de reloj es el oscilador primario.
La ejecucin del cdigo puede comenzar antes de que el reloj primario este listo.
Si el inicio con dos velocidades o el monitor de reloj de seguridad estn activos, el
dispositivo puede comenzar la ejecucin tan pronto como la fuente del reset haya
desaparecido. La ejecucin se controla con el multiplexor INTOSC conducido por
bloque del oscilador interno. La ejecucin la controla por el bloque del interno oscilador
hasta que el reloj primario est listo o entre en un modo de ahorro de energa antes de
que el reloj primario est listo; el reloj primario se desactiva.

115

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.4.5.4.

Salida Sin Un Retraso Del Inicio Del Oscilador

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

Los dispositivos PIC18F2455/2550/4455/4550 distinguen entre las distintas


clases de reset:
a)
b)
c)
d)
e)
f)
g)
h)

Reset por fallo de energa (POR)


Reset por MCLR* durante la operacin normal
Reset de MCLR* durante modos ahorro de energa
Reset por el perro guardin (WDT) (durante ejecucin)
Reset por cese de energa (BOR)
Instruccin RESET
Reset por desbordamiento la Pila
Reset por vaciado de la Pila

Esta seccin discute los resets generados por MCLR*, POR y BOR y cubre la
operacin de los varios contadores de tiempo inicio.

116

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 5-1: Diagrama Simplificado Del Circuito De Reset Del Chip

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 5-1. RCON: Registro De Control De Reset


BIT 7

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*:

Bit activador de la prioridad de las interrupciones


1= Activa los niveles de prioridad de en las
interrupciones
0= Desactiva los niveles de prioridad de en las
interrupciones (Modo compatible con PIC16CXXX)
Bit activador de reset por BOR
(En un reset SBOREN=1)
Si BOREN1:BOREN0=01
1=BOR activo
0=BOR desactivado
Si BOREN1:BOREN0=00, 10 11
Bit desactivado, se lee 0
Bit de la instruccin RESET
1=no se ha ejecutado una instruccin RESET (se activa
por firmware)
0=se ha ejecutado una instruccin RESET (se tiene que
activar por software)
Bit de desbordamiento del WDT:
1= Se activa por reinicio, CLRWDT,
o una instruccin SLEEP
0= El WDT se ha desbordado
Bit de deteccin de una cada de tensin:
1= Se activa por reinicio o CLRWDT
0=se borra por una instruccin SLEEP
Bit de estado de reset por subida de tensin (el valor
actual de POR* depende del tipo de reset)
1= No ha ocurrido (se activa por firmware)
0= Ha ocurrido (se tiene que activar por software)
Bit de estado de reset por cese de energa
1= No ha ocurrido (se activa por firmware)
0= Ha ocurrido (se tiene que activar por software)

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.5.2.

Master Clear Reset (MCLR*)

El pin MCLR* proporciona un mtodo para accionar un reset externo del


dispositivo. El reset se genera poniendo el pin a 0. Estos dispositivos tienen un filtro
antirruidos en la trayectoria del reset de MCLR* que detecta y no hace caso de pulsos
pequeos. El pin MCLR* no se pone a cero con ningn reset interno, incluyendo el
WDT. En los dispositivos PIC18F2455/2550/4455/4550, la entrada MCLR* se puede
inhabilitar con la configuracin del bit MCLRE. Cuando MCLR* est desactivado, el
pin se convierte en una entrada digital.

3.4.5.3.

Reset Por Subida De Tensin (POR)

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*.

Nota: 1: Se necesita este circuito slo


si VDD sube lentamente.
El diodo D se necesita para descargar C
en las bajadas de VDD.

119

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.5.4.

Reset Por Cese De Tensin (BOR)

Los dispositivos PIC18F2455/2550/4455/4550 tienen un circuito BOR en


ejecucin que provee al usuario un nmero de opciones de configuracin y de ahorro de
energa. El BOR se controla con los bits BORV1:BORV0 y BOREN1:BOREN0. Hay
un total de cuatro configuraciones del BOR
El umbral del BOR se fija con los bits BORV1:BORV0. Si se permite BOR
(cualquier valor de BOREN1:BOREN0 excepto el 00), cualquier tensin VDD por
debajo de VBOR durante un tiempo mayor que TBOR resetea el dispositivo. Un reset
puede o no puede ocurrir si VDD baja por debajo de VBOR durante un tiempo menor que
TBOR. El chip permanece en reset hasta que VDD vale ms que VBOR.
Si se permite el contador de tiempo de inicio, se invocar despus de que VDD
sea mayor que VBOR; entonces mantendr el chip en reset durante un retraso adicional,
TPWRT. Si VDD cae por debajo de VBOR mientras que el contador de tiempo de inicio est
funcionando, el chip volver a un nuevo reset por cese de tensin y el contador de
tiempo de inicio se inicializar. Una vez que VDD se levante sobre VBOR, El contador de
tiempo de inicio ejecutar un retraso.
BOR y el contador de inicio (PWRT) se configuran independientemente.
Permitir el reset BOR no permite automticamente el PWRT.

3.4.5.4.1.

Software Que Activa El BOR

Cuando BOREN1:BOREN0 = 01, el BOR puede activarse o inhabilitarse por el


usuario mediante software. Esto se consigue con el bit del control, SBOREN
(RCON<6>). Activar SBOREN permite al BOR funcionar como se ha descrito
previamente. Borrar SBOREN inhabilita el BOR totalmente. El bit SBOREN funciona
solamente en este modo; si no, se lee como 0.
La colocacin del BOR bajo control por software da al usuario la flexibilidad
adicional de adaptar la aplicacin sin tener que reprogramar el dispositivo para cambiar
la configuracin del BOR. Tambin permite al usuario adaptar el consumo de energa
del dispositivo mediante software eliminando la corriente incremental que consume el
BOR. Mientras que la corriente de BOR es muy pequea, puede tener cierto impacto en
usos de baja potencia.
Nota: Aun cuando el BOR est bajo control por software, el nivel voltaico del
reset BOR todava se fija con los bits BORV1:BORV0. No se puede cambiar por
software.

120

GUILLERMO DAVID HERRERO GONZLEZ

3.4.5.4.2.

Deteccin Del BOR

Cuando se permite el BOR, el bit BOR* se resetean en cualquier acontecimiento


de BOR o de POR. Esto hace que sea difcil determinar si ha ocurrido un reset BOR por
la lectura el estado del bit BOR*. Un mtodo de mayor confianza es comprobar
simultneamente el estado de los bits POR* y BOR*. Esto asume que el bit POR* se
pone a 1 por software inmediatamente despus de cualquier reset POR. SI BOR es 0
mientras que POR es 1, se puede asegurar que ha ocurrido un reset BOR.

3.4.5.4.3.

Desactivar BOR En El Modo SLEEP

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.

Operaciones del BOR


BOR desactivado; para activarlo reprogramar el bit de configuracin
BOR activo en software; se controlan las operaciones por SBOREN.
BOR activo en hardware en los modos RUN e IDLE, desactivado en
el modo SLEEP
BOR activo en hardware; para desactivarlo reprogramar el bit de
configuracin.

Contadores Del Reset

Los dispositivos PIC18F2455/2550/4455/4550 incorporan tres contadores de


tiempo separados en el chip que ayudan a regular el proceso de puesta en marcha del
reset. Su funcin principal es asegurarse de que el reloj del dispositivo es estable antes
de que se ejecute el cdigo. Estos contadores de tiempo son:
Temporizador de inicio (PWRT)
Oscilador temporizador de arranque (OST)
Temporizador de control del PLL

121

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.5.5.1.

Temporizador De Inicio (PWRT)

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.

Oscilador Temporizador De Arranque (OST)

El oscilador temporizador de arranque (OST) proporciona un ciclo de 1024


oscilaciones (de la entrada OSC1) se inicia despus del retraso PWRT. Esto asegura que
el oscilador XTAL o el resonador hayan comenzado y se haya estabilizado.
El desbordamiento de OST ocurre solamente en los modos XT, HS y HSPLL y
solamente en un inicio o al salir de un modo de ahorro de energa.

3.4.5.5.3.

Temporizador Del Control De PLL

Con el PLL permitido en su modo PLL, el retraso que sigue al inicio es


levemente diferente de otros modos del oscilador. Un contador de tiempo proporciona
un retraso fijo que es suficiente para que el PLL detecte la frecuencia principal del
oscilador. Este retraso (TPLL) es tpicamente de 2ms y sigue al retraso del inicio del
oscilador.

3.4.5.5.4.

Secuencia De Retraso

En ciclo inicial, la secuencia del retraso es:


1. Despus de que la condicin de POR haya desaparecido, se invoca el
retraso PWRT (si est permitido).
2. Entonces, se activa el OST.
El retraso total variar basado en la configuracin del oscilador y el estado del
PWRT. En los dispositivos en modo RC y con el PWRT inhabilitado, no habr retraso.
Puesto que los retrasos ocurren por pulsos POR, si MCLR* permanece activo
suficiente tiempo, en todos los retrasos se activar. El MCLR* comenzar a ejecutarse
inmediatamente. Esto es til para pruebas o a sincronizar ms de un PIC18FXXXX
funcionando en paralelo.

122

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 5-2: Retraso En Distintas Situaciones


Configuracin del
Oscilador
HS, XT
HSPLL, XTPLL
EC, ECIO
ECPLL, ECHO
INTIO, INTCKO
INTHS, INTXT

Aumento(2) y cese de tensin


PWRTEN=0
PWRTEN=1
66ms(1) + 1024TOSC
66ms(1)+1024TOSC+2ms(2)
66ms(1)
66ms(1)+2ms(2)
66ms(1)
66ms(1)+1024TOSC

Salida del
Modo de ahorro de energa

1024TOSC
1024TOSC+2ms(2)
2ms(2)
1024TOSC

1024TOSC
1024TOSC+2ms(2)
2ms(2)
1024TOSC

Nota: 1: 66ms (65,5ms) es el retraso nominal de reinicio (PWRT)


2: 2ms es el tiempo nominal requerido para que el PLL reconozca una
frecuencia.

3.4.5.6.

Estado De Los Registros En Un Reset

A la mayora de los registros no les afectan los resets. Su estado se desconoce en


un POR y sin cambios por cualquier otro reset. Los otros registros se fuerzan a un
estado de reset dependiendo del tipo de reset ocurrido.
A la mayora de los registros no les afecta un reinicio por WDT, puesto que esto
se ve como la reanudacin a la operacin normal. Los bits estado RCON, RI*, TO*,
PD*, POR* y BOR*, se activan o se borran diferentemente en los distintos resets. Estos
bits se utilizan en software para determinar la naturaleza del reset.

3.4.6.

ORGANIZACIN DE LA MEMORIA
Hay tres tipos de memoria en los PIC18:
Memoria de programa
RAM de datos
EEPROM de datos

Como dispositivos de arquitectura Harvard, los buses la memoria de datos y del


programa estn separados; esto permite el acceso a la vez en las dos memorias. La
EEPROM de datos, en la prctica, se puede utilizar como un dispositivo perifrico,
puesto que se maneja a travs de un sistema de registros de control.

123

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 6-1: Mapa De Memoria De Programa Y De La Pila

3.4.6.1.

Organizacin De La Memoria De Programa

Los microcontroladores PIC18 implementan un contador de programa de 21bits


que es capaz de tratar 2Mb memoria de programa. Accediendo a una localizacin en
medio el lmite superior de la memoria implementada fsicamente y los 2Mb
direccionables se leer todo 0 (una instruccin NOP).
Los PIC18F2455 y los PIC18F4455 cada uno tienen 24kb de memoria flash y
pueden almacenar hasta 12.288 instrucciones de palabra nica. El PIC18F2550 y
PIC18F4550 cada uno tienen 32kb de la memoria flash y puede almacenar hasta 16.384
instrucciones de palabra nica. Los dispositivos PIC18 tienen dos vectores de
interrupcin. En un reset, la direccin del vector est en 0000h y los vectores de
interrupcin estn en las direcciones 0008h y 0018h.

124

GUILLERMO DAVID HERRERO GONZLEZ

3.4.6.1.1.

Contador De Programa

El contador de programa (PC) especifica la direccin de la instruccin que se va


a ejecutar. El PC es de 21bits de ancho separados en tres registros de 8bits. El byte bajo,
conocido como registro PCL, es legible y escribible. El byte alto, o registro PCH,
contiene los bits<15:8> del PC; no es directamente ni legible ni escribible. Las
actualizaciones del registro PCH se realizan a travs del registro de PCLATH. El byte
superior se llama PCU. Este registro contiene los bits<20:16> del PC; no es
directamente ni legible ni escribible. Las actualizaciones del registro PCU se realizan a
travs del registro PCLATU.
El contenido de PCLATH y de PCLATU se transfiere al contador de programa
por cualquier operacin que escriba el PCL. Semejantemente, los dos bytes superiores
del contador de programa se transfieren al PCLATH y al PCLATU por cualquier
operacin que lea el PCL.
El PC trata bytes en la memoria del programa. Para evitar que el PC no se alinee
bien con la instruccin, el bit menos significativo de PCL est fijado a un valor de 0.
El PC se incrementa de 2 en 2 para tratar instrucciones secuenciales en la memoria de
programa.
Las rutinas de salto CALL, los RCALL y GOTO escriben en el contador de
programa directamente. Con estas instrucciones, el contenido de PCLATH y PCLATU
no se transfieren al contador de programa.

3.4.6.1.2.

Devolver La Direccin De La Pila

La pila almacena la direccin de hasta 31 saltos. El PC se posiciona sobre la pila


cuando se ejecuta una instruccin CALL o RCALL o una llamada a una interrupcin. El
contenido de la pila se devuelve al CP con las instrucciones RETURN, RETLW o una
instruccin RETFIE. A los registros PCLATU y PCLATH no les afectan las
instrucciones CALL ni RETURN.
La pila funciona como 31 palabras por 21bits de RAM y 5bits de Stack Pointer,
STKPTR. El espacio de la pila no es parte de la memoria de programa o de datos. La
pila es legible y escribible y la ltima direccin de la pila es legible y escribible con
Registros especiales de TOP-of-Stack. Los datos se pueden guardar, o utilizarlos en la
pila, usando stos registros.
Un tipo instruccin que guarda una direccin en la pila es CALL. El puntero de
la pila se incrementa y la localizacin que sealaba por el puntero de la pila se escribe
con el contenido del PC (que seala ya a la instruccin que sigue a CALL). Con la
instruccin RETURN se utiliza el contenido de la pila. El contenido de la localizacin
sealado por el STKPTR se transfieren al PC y entonces el stack pointer decrementa.
El stack pointer se inicializa con 00000 despus de cada reset. No hay RAM
asociado a la localizacin que corresponde con un valor del stack pointer de 00000;
esto slo es un valor de reset. Los bits de estado indican si la pila est llena, ha
desbordado o tiene est vaca y tiene que devolver una direccin (underflow).

125

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 6-2: Devolucin De La Direccin De La Pila Y Los Registros Asociados

Acceso Al ltimo Valor De La Pila


Solamente el ltimo valor de la pila (TOS) es legible y escribible. Un sistema de
tres registros, TOSU:TOSH:TOSL, llevan a cabo el contenido de la localizacin de la
pila sealado por el registro STKPTR. Esto permite que los usuarios pongan una
direccin en la pila mediante software en caso de necesidad. Despus de que una CALL,
un RCALL o una interrupcin, el software puede guardar el valor en la pila escribiendo
los registros TOSU:TOSH:TOSL. Una vez ejecutada la rutina, por software, se puede
devolver los valores de TOSU:TOSH:TOSL y regresar al lugar del salto en el programa.
El usuario debe inhabilitar las interrupciones globalmente y permitir los bits que
tengan acceso a la pila para prevenir errores incontrolados en la pila.

Retorno Del Stack Pointer (STKPTR)


El registro STKPTR (registro 6-1) contiene el valor del stack pointer, el bit de
estado STKFUL (la pila est completa) y el bit de estado STKUNF (desbordamiento de
capacidad inferior de la pila). El valor del stack pointer puede ser de 0 a 31. Se
incrementa el stack pointer antes de que los valores se almacenen en pila y se
decrementa despus de que los valores de la pila se utilicen. En reset, el valor del stack
pointer ser cero. El usuario puede leer y escribir el valor del stack pointer. Esta
caracterstica se puede utilizar por un sistema operativo en tiempo real (RTOS) para
controlar la pila.
Cuando el PC se almacene en la pila 31 veces (sin hacer utilizar ninguno de los
valores de la pila), se activa el bit STKFUL. El bit STKFUL se borra por software o por
un POR.
La accin que ocurre cuando se llene la pila depende por completo del estado del
bit de configuracin STVREN (permite el desbordamiento de la pila). Si se activa
STVREN (defecto), el 31 almacenaje incrementar (PC + 2) el valor sobre de la pila,
activar el bit STKFUL y resetear el dispositivo. El bit STKFUL seguir siendo 1 y
el stack pointer se borrar.
Si STVREN es cero, el bit STKFUL se activar en el 31 almacenamiento y el
stack pointer incrementar a 31. Ningn dato adicional sobrescribir el dato 31 y el
STKPTR permanecer en 31.

126

GUILLERMO DAVID HERRERO GONZLEZ

Cuando la pila se ha liberado, el siguiente almacenaje devolver un cero al PC y


activa el bit STKUNF, mientras que el stack pointer permanece en cero. Seguir activo
el bit STKUNF hasta que se borre por software u ocurra un POR.
Nota: Devolver un valor de cero al PC en un underflow tiene el efecto de dirigir
al programa al vector de reset, donde las condiciones de la pila se pueden verificar y se
pueden tomar las acciones apropiadas. Esto es no igual que un reset, no les afecta al
contenido de los SFRs.

Instrucciones Push Y Pop


Puesto que el TOP-of-Stack es legible y escribible, tiene la capacidad de
almacenar valores sobre la pila y quitarlos, sin que afecte a la ejecucin de programa
normal, es una caracterstica deseable. El sistema de instruccin PIC18 incluye dos
instrucciones, PUSH y POP, que permiten manipular la TOS por software. TOSU,
TOSH y TOSL se pueden modificar poniendo datos o devolvindolos a la pila.
La instruccin PUSH pone el valor actual del PC en la pila. Este incrementa el
stack pointer y carga el valor actual del PC sobre la pila.
La instruccin POP desecha la TOS actual decrementando el stack pointer. El
valor que se almacen anteriormente en la pila convierte en el valor de la TOS.
REGISTRO 6-1. STKPTR: Registro Del Stack Pointer
BIT 7

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:

Bit sealizador del llenado de la pila: (Borrado por


software)
1= La pila est llena o sobresaturada
0= La pila no est llena ni sobresaturada
Bit sealizador del underflow: (Borrado por software)
1= Ha ocurrido un underflow
0= No ha ocurrido un underflow
Bits de localizacin del stack pointer

Resets Por Llenado De La Pila Y Por Underflow


Los reset por desbordamiento y por underflow de la pila se activan activando el
bit STVREN del registro de configuracin 4L. Cuando se activa STVREN, un llenado o
vaciado de la pila activar el bit apropiado STKFUL o STKUNF y despus har un reset
en el dispositivo. Cuando STVREN est borrado, al llenar o vaciar la pila se activar el
bit apropiado STKFUL o STKUNF pero no se resetear el dispositivo. Los bits
STKFUL o STKUNF se borran por software o en un reinicio.

127

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.6.1.3.

Pila De Almacenamiento Rpido

Un almacenamiento rpido en la pila se proporciona con los registros ESTADO,


WREG y BSR para lograr una vuelta rpida al lugar del salto. Cada pila es de un nivel
de profundidad y no es ni legible ni escribible. Se carga con el valor actual del registro
correspondiente cuando se ejecuta una interrupcin. Todas las fuentes de la interrupcin
almacenarn valores en los registros de la pila. Los valores cargan nuevamente dentro
de sus registros se utiliza la instruccin RETFIE o FAST para volver de la interrupcin.
Si se permiten las interrupciones bajas y prioritarias, los registros de la pila no se
pueden utilizar fiablemente para volver de las interrupciones de prioridad baja. Si ocurre
una interrupcin prioritaria mientras que se mantiene una interrupcin de baja prioridad,
los valores del registro de la pila almacenados por la interrupcin de prioridad baja ser
eliminados y se almacenarn los de la alta. En estos casos, el usuario debe almacenar los
datos de los registros en memoria.
Si las interrupciones de alta prioridad no se utilizan, todas las interrupciones
pueden utilizar la pila almacenamiento rpido para volver de la interrupcin. Si no se
utilizan las interrupciones, la pila de almacenamiento rpido se puede usar para
restaurar los registros ESTADO, WREG y BSR al final de una llamada de un
subprograma. Para utilizar la pila de almacenamiento rpido en una llamada de un
subprograma, hay que usar una instruccin CALL LABEL, FAST donde LABEL es el
nombre de la subrutina se debe utilizar para guardar los registros de ESTADO, WREG
y BSR en la pila de almacenamiento rpido. Para restaurar estos registros hay que
utilizar una instruccin RETURN, FAST.
EJEMPLO 6-1: Cdigo De Ejemplo De Acceso A La Pila De Almacenamiento Rpido
CALL

SUB1, FAST

SUB1

..
..
..
..
RETURN, FAST

;Se guardan en el registro de la pila de acceso rpido los


;registros ESTADO, WREG y BSR

;Devolvemos los valores guardados en la pila de acceso


;rpido

128

GUILLERMO DAVID HERRERO GONZLEZ

3.4.6.1.4.
Programa

Operaciones De Bsqueda En Las Tablas De Memoria De

Puede haber programas que en determinadas situaciones requieran la creacin de


estructuras de datos, o tablas con bsqueda, dentro de la memoria del programa. En los
dispositivos PIC18, las operaciones de bsqueda en tablas se puede implementar de dos
maneras:
GOTO controlado
Lectura de la tabla

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

Lectura Y Escritura En Las Tablas


Un mtodo mejor de almacenar datos en la memoria del programa permite que
dos bytes de datos sean almacenados en cada localizacin de la instruccin.
Las operaciones de bsqueda en tabla de datos pueden almacenar dos bytes por
palabra usando la lectura y la escritura en tabla. El registro puntero de la tabla
(TBLPTR) especifica el byte de direccin y el registro de latch de la tabla (TABLAT)
contiene los datos que se leen o se escriben en la memoria del programa. Los datos se
transfieren a o desde la memoria del programa de byte en byte.

129

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.6.2.

Ciclos Instruccin En Los PIC18

3.4.6.2.1.

Esquema De Reloj

La entrada de reloj del microcontrolador, si es una fuente interna o externa, se


divide por cuatro internamente para generar cuatro relojes sin desfase (Q1, Q2, Q3 y
Q4). Internamente, el contador de programa se incrementa en cada Q1; en Q4 se trae la
instruccin de la memoria del programa y almacenado en el registro de la instruccin
(IR). Se descifra la instruccin y se ejecuta durante los siguientes Q1 hasta Q4.
FIGURA 6-3: Ciclo Reloj/Instruccin

3.4.6.2.2.

Instruccin Flow/Pipelining

Un ciclo de instruccin consiste en cuatro ciclos de Q: de Q1 hasta Q4. La


instruccin trae y se ejecuta es controlada de manera que traer tome un ciclo de la
instruccin, mientras que el descifrar y ejecutar tome los otros ciclos de la instruccin.
Sin embargo, debido al pipelining, cada instruccin se ejecuta con eficacia en un ciclo.
Si una instruccin provoca que el contador de programa cambie (Ej., GOTO), entonces
se requieren dos ciclos para terminar la instruccin. El ciclo de traer comienza con el
contador de programa (el PC) incremento en Q1. En el ciclo de la ejecucin, la
instruccin trada se guarda en el registro de la instruccin (IR) en el ciclo Q1. Esta
instruccin despus se descifra y se ejecuta durante Ciclos Q2, Q3 y Q4. La memoria de
los datos se lee durante Q2 (operando ledo) y escrito durante Q4 (destinacin escribir).
EJEMPLO 6-3: Instruccin Pipeline Flow

130

GUILLERMO DAVID HERRERO GONZLEZ

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.

Instrucciones En La Memoria De Programa

A la memoria de programa se dirige en bytes. Las instrucciones se almacenan en


dos o cuatro bytes en la memoria de programa. El byte menos significativo de una
instruccin se almacena siempre en una posicin de memoria del programa con una
direccin (LSb = 0). Para mantener la alineacin con lmites de la instruccin, el PC se
incrementa en mltiplos de 2 y el LSb siempre se leer 0.
Las instrucciones CALL y GOTO tienen la direccin de programa fija en la
instruccin. Puesto que las instrucciones se almacenan siempre en direcciones de
memoria, los datos contenidos en la instruccin son una direccin. La direccin de la
instruccin se escribe en PC<20:1>, que tiene acceso a la direccin deseada del byte en
la memoria del programa. Funciona de manera semejante las instrucciones de brinco del
programa, que codifican la direccin. El valor almacenado en una instruccin de brinco
representa el nmero de instrucciones de una palabra que el PC brincar.
FIGURA 6-4: Instrucciones En La Memoria De Programa

3.4.6.2.4.

Instrucciones De Dos Palabras

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 6-4: Instrucciones De Dos Palabras


CASO 1:
Cdigo mquina:

Cdigo fuente:

0110011000000000 TSTFSZ
1100000100100011 MOVFF
1111010001010110
0010010000000000 ADDWF

REG1
REG1,REG2
REG3

;La RAM est en la localizacin 0?


;No, salta esta instruccin
;ejecuta esta otra como NOP
;Continua el cdigo

CASO 2:
0110011000000000 TSTSZ
1100000100100011 MOVFF
1111010001010110
0010010000000000 ADDWF

3.4.6.3.

REG1
REG1,REG2
REG3

;La RAM est en la localizacin 0?


;Si, ejecuta la instruccin
;2 palabra de la instruccin
;Continua el cdigo

Organizacin De La Memoria De Datos

Nota: La operacin de algunos aspectos de la memoria de datos se cambia


cuando el PIC18 permite el sistema de instruccin extendida.
La memoria de datos en los dispositivos PIC18 se implementa como RAM
esttica. Cada registro en la memoria de datos tiene una direccin de 12 bits,
permitiendo hasta 4096 bytes de memoria de los datos. La memoria se divide en 16
bancos
que
contienen
256
bytes
cada
uno.
Los
dispositivos
PIC18F2455/2550/4455/4550 ponen ocho bancos completos en ejecucin, para un total
de 2048 bytes.
La memoria de datos contiene los registros de funcin especial (SFRs) y los
registros de fines generales (GPRs). Los SFRs se utilizan para el control y el estado del
regulador y de las funciones perifricas, mientras que los GPRs se utilizan para el
almacenaje de datos y las operaciones para salvar datos del usuario. Cuando se lee una
localizacin no implementada aparecern 0s.
El sistema y la arquitectura de la instruccin permiten operaciones a travs de
todos los bancos. Se puede tener acceso a la memoria entera de datos por modos de
direccionamiento directo, indirecto o puestos en un ndice.
Para asegurarse de que los registros de uso general (SFRs y elegido GPRs) se
puede alcanzar en un solo ciclo, los dispositivos PIC18 tienen un banco de acceso en
ejecucin. ste es una memoria de 256 bytes que proporciona el acceso rpido a SFRs y
la parte ms baja del banco 0 de GPR sin usar BSR.

132

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 6-5: MAPA DE LA MEMORIA DE DATOS

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.6.3.1.

RAM Del USB

Los bancos 4 a 7 de la memoria de datos estn mapeados a un puerto dual


especial de RAM. Cuando el mdulo USB est desactivado, los GPRs en estos bancos
se utilizan como cualquier otro GPR en la memoria de datos.
Cuando se permite el mdulo USB, la memoria en stos bancos se asigna como
RAM de almacenamiento intermedio para las operaciones del USB. Esta rea se
comparte entre el ncleo del microcontrolador y el motor de la interfaz en serie (SIE)
del USB y se utiliza para transferir datos directamente entre los dos.
En teora, se pueden utilizar las reas de la RAM del USB que no se asignan
como Buffers del USB para almacenar variables. En la prctica, la naturaleza dinmica
de la asignacin del almacenamiento intermedio hace que sea peligroso. Adems, el
banco 4 se utiliza para controlar el almacenamiento intermedio del USB cuando se
permite el mdulo y no se debe utilizar para otros propsitos durante ese tiempo.

3.4.6.3.2.

Registro Selector Del Banco (BSR)

Las reas grandes de la memoria de datos requieren un eficiente esquema de


direccin para hacer el acceso rpido a cualquier direccin posible. Idealmente, esto
significa que no se tiene que proporcionar una direccin entera para cada operacin de
lectura o escritura. En los dispositivos PIC18, esto se logra con un esquema de los
bancos de la RAM. Esto divide la memoria en 16 bancos contiguos de 256 bytes.
Dependiendo de la instruccin, cada localizacin puede tratar directamente una
direccin completa de 12 bits, o una direccin de orden inferior de 8 bits y un puntero
del banco de 4 bits.
La mayora de las instrucciones en el sistema del PIC18 hacen uso del puntero
de banco, conocido como el registro selector del banco (BSR). Este SFR controla los 4
bits ms significativos de la direccin de localizacin; la instruccin incluye los ocho
bits menos significativos. Solamente los cuatro bits ms bajos del BSR estn
implementados (BSR3:BSR0). No se utilizan los cuatro bits altos; leern 0 y no se
pueden escribir. El BSR se puede cargar directamente usando la instruccin MOVLB.
El valor del BSR indica el banco en la memoria de datos. Los ocho bits de la
instruccin muestran la localizacin en el banco y se pueden conocer como el lmite
bajo del banco.
Como hasta diecisis registros pueden compartir la misma direccin de orden
inferior, el usuario debe tener cuidado de asegurarse de que est seleccionado el banco
apropiado antes de leer o escribir datos. Por ejemplo, escribiendo que los datos del
programa de una direccin de 8 bits son F9h, mientras que el BSR es 0Fh, resetear el
contador de programa.
Mientras que cualquier banco se puede seleccionar, slo esos bancos que se
ponen en ejecucin se pueden leer o escribir. Cuando se escriba en los bancos no
implementados no ocurrir nada, mientras que cuando se lean se devolvern 0s. Sin
embargo, al registro ESTADO le afecta como si la operacin fuera correcta.

134

GUILLERMO DAVID HERRERO GONZLEZ

En el ncleo del sistema de instrucciones de los PIC18, solamente la instruccin


MOVFF especifica completamente la direccin de 12 bits de los registros de la fuente y
del blanco. Con esta instruccin se ignora el BSR cuando se ejecuta. El resto de las
instrucciones incluyen solamente la direccin de orden inferior como operando y deben
utilizar el BSR o el banco del acceso para localizar sus registros del blanco.
FIGURA 6-6: Uso Del Banco Seleccionando El Registro (Direccionamiento Directo)

Nota: 1: El bit de acceso a RAM de la instruccin se puede usar para invalidar


el banco seleccionado (BSR<3:0>) del registro de acceso al banco.
2: La instruccin MOVFF inserta los 12bit de direccin en la instruccin.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Registro De Archivos De Propsito General

En los dispositivos PIC18 se pudo depositar memoria en el rea GPR. ste es la


RAM de datos disponible para el uso de todas las instrucciones. GPRs empieza en el
fondo del banco 0 (direccin 000h) y crece hasta la ltima rea de SFR. GPRs no se
inicializa por un reinicio y no cambia en ningn otro reset.

3.4.6.3.5.

Registros De Funcin Especfica

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

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 6-1: Mapa De Los Registros De Funcin Especfica

Nota: 1: No es un registro fsico.


2: Registros no implementados se leen como 0.
3: Estos registros se implementan el los micros de 40/44 pines.

3.4.6.3.6.

Registro STATUS

El registro ESTADO, contiene el estado aritmtico de la ALU. Como con


cualquier otro SFR, se puede modificar con cualquier instruccin.
Si el registro ESTADO es el destino de una instruccin que afecte a los bits Z,
C.C., C, OV o N, no escribir el resultado de la instruccin, en vez de eso, el registro
ESTADO se actualiza segn la instruccin realizada. Por lo tanto, el resultado de una
instruccin con el registro ESTADO como destino puede ser diferente que de lo
previsto. Por ejemplo, CLRF STATUS activar el bit Z y el resto de los bits no cambian
(000u u1uu).

137

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 6-2. STATUS: Registro Status


BIT 7

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:

Bit negativo. Este bit se utiliza en el complemento a 2.


Indica cuando el resultado ha asido negativo.
1= Resultado negativo
0= Resultado no negativo
Bit de desbordamiento. Este bit se utiliza en el
complemento a 2. Indica que una operacin de 7bits
se ha desbordado.
1= Ha ocurrido un desbordamiento
0= No ha ocurrido un desbordamiento
Bits de cero
1= El resultado de una operacin aritmtica es 0
0= El resultado de una operacin aritmtica no es 0
Dgito de acarreo/Bit BORROW*
En BORROW*, se invierte la polaridad. Una se
ejecuta una substraccin agregando el complemento a
2 del segundo operando. En las instrucciones de rotar
(RRF, RLF), este bit se carga con el bit 4 3 del
registro fuente.
Con las instrucciones ADDWF, ADDLW, SUBLW y
SUBWF
1= Ocurri un acarreo en los 4 bits de menos peso
0= No ocurri un acarreo en los 4 bits de menos peso
Bit de acarreo/Bit BORROW*
En BORROW*, se invierte la polaridad. Una se
ejecuta una substraccin agregando el complemento a
2 del segundo operando. En las instrucciones de rotar
(RRF, RLF), este bit se carga con el bit de menos peso
u orden inferior registro fuente.
Con las instrucciones ADDWF, ADDLW, SUBLW y
SUBWF
1= Ocurri un acarreo en los bits de mayor peso
0= No ocurri un acarreo en los bits de mayor peso

138

GUILLERMO DAVID HERRERO GONZLEZ

3.4.6.4.

Modos De Direccionamiento De Los Datos

Nota: La ejecucin de algunas instrucciones en el ncleo del PIC18 cambia


cuando se activan las instrucciones extendidas.
Mientras que la memoria de programa se puede tratar en una sola direccin (a
travs del contador de programa) la informacin en la memoria de datos se puede tratar
de varias maneras. En la mayora de las instrucciones, el modo de direccin es fijo.
Otras instrucciones pueden utilizar hasta tres modos, dependiendo de cuales utilizan los
operandos y si o no el sistema de instruccin extendida est permitido.
Los modos de direccionamiento son:

Inherente
Literal
Directo
Indirecto

Hay otro modo de direccionamiento, indexacin del literal compensado, est


disponible cuando se permiten las instrucciones extendidas (configuracin del bit
XINST=1).

3.4.6.4.1.

Direccionamiento Inherente Y Literal

Muchas instrucciones de control del PIC18 no necesitan todos los argumentos;


pueden realizan una operacin global, que afecte al dispositivo o funcionar
implcitamente en un registro. Se conoce este modo de direccin como Direccin
inherente. Los ejemplos incluyen SLEEP, RESET y DAW.
Otras instrucciones trabajan de una manera similar pero requieren un argumento
explcito adicional en el cdigo mquina. Esto se conoce como modo de
direccionamiento literal porque requieren un cierto valor literal como argumento. Los
ejemplos incluyen ADDLW y MOVLW, que respectivamente, suman o mueven un
valor literal al registro W. Los otros ejemplos incluyen CALL y GOTO, que incluyen
20bits para la direccin de memoria de programa.

3.4.6.4.2.

Direccionamiento Directo

El modo de direccionamiento directo especifica el todo o una parte de la fuente


y/o de la direccin de destino de la operacin dentro del cdigo de programa. Las
opciones son especificadas por los argumentos que acompaan la instruccin.
En las instrucciones bit-orientadas y byte-orientadas del sistema de instruccin
del ncleo de los PIC18, utilizan una cierta versin de direccionamiento directo por
defecto. Todas estas instrucciones incluyen una cierta direccin literal de 8 bits como su
byte menos significativo. Esta direccin especifica una direccin en uno de los bancos
de la RAM o una localizacin en el banco de acceso como el cdigo de la instruccin.
El bit de acceso a RAM la a determina cmo es la direccin interpretada.
Cuando la a es el 1, el contenido del BSR se utiliza con la direccin para determinar
los 12bit completos de la direccin del registro. Cuando la a es 0, la direccin se

139

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

interpreta como si fuese un registro en el banco de acceso. El direccionamiento que


utiliza el acceso a RAM se conoce como MODO DE DIRECCIONAMIENTO
DIRECTO FORZOSO.
Algunas instrucciones, tales como MOVFF, incluyen la direccin de 12 bits
(fuente o destinacin) entera en su cdigo mquina. En estos casos, el BSR se ignora
completamente.
El destino de los resultados de la operacin se determina por el bit de destino
d. Cuando el d es 1, los resultados se almacenan en el registro fuente,
sobrescribiendo su original contenido. Cuando el d el 0, los resultados se almacenan
dentro del registro W. Las instrucciones sin la d tienen un destino implcito en la
instruccin; su destino es cualquier registro del blanco que funciona o el registro W.

3.4.6.4.3.

Direccionamiento Indirecto

El direccionamiento indirecto permite que el usuario tenga acceso a una


localizacin en la memoria de datos sin dar una direccin fija en la instruccin. Esto se
hace usando los registros selectores del archivo (FSRs) como punteros a las
localizaciones que se leern o se escribirn. Puesto que los FSRs estn situados en la
RAM como registros de funcin especfica, slo se pueden manipular directamente bajo
control de programa. Esto hace que los FSRs sean muy tiles en estructuras de datos,
tales como tablas y rdenes en memoria de datos.
Los registros para el direccionamiento indirecto estn puestos con los operandos
de archivo indirectos (INDFs) esa manipulacin automtica del permiso en ejecucin
del valor del puntero con auto-incremento, auto-decremento o compensando con otro
valor. Esto permite un cdigo eficiente, usando lazos.
EJEMPLO 6-5: Como Borrar RAM (Banco 1) Utilizando El Direccionamiento
Indirecto
LFSR
NEXT CLRF
BTFSS
BRA
CONTINUE

FSR0,100h
POSTINC0
FSR0H,1
NEXT

;Borrar el registro INDF e incrementar el puntero


;Todo el banco 1 en blanco?
;No, borrar el siguiente
;Si, continua

140

GUILLERMO DAVID HERRERO GONZLEZ

Registros FSR Y El Operando INDF


En el ncleo del direccionamiento indirecto hay tres sistemas de registros: FSR0,
FSR1 y FSR2. Cada uno representa un par de registros de 8 bit: FSRnH y FSRnL. Los
cuatro bits superiores del registro FSRnH no se utilizan, as que cada par de FSR tiene
un valor de 12 bits. Esto representa un valor que puede direccionar la gama entera de
memoria de datos de una manera lineal. Los pares del registro FSR sirven como
punteros de las posiciones de memoria de datos.
El direccionamiento indirecto se logra con un sistema de Operandos de archivo
indirectos, INDF0 con INDF2. stos se pueden tomar como registros virtuales; estn
mapeados en el espacio de SFR pero no se ponen en ejecucin fsicamente. En la lectura
o escritura de un registro INDF particular se accede a su par correspondiente. Leer en
INDF1, por ejemplo, lee los datos de la direccin indicada por FSR1H:FSR1L. Las
instrucciones utilizan los registros INDF mientras que los operandos utilizan el
contenido del FSR correspondiente como puntero de la instruccin. El operando de
INDF es una manera conveniente de usar los punteros.
Como el direccionamiento indirecto utiliza una direccin completa de 12 bits,
las actividades bancarias de la RAM de datos no son necesarias. As, el contenido actual
del BSR y del bit de acceso a RAM no tiene efecto sobre la determinacin de la
direccin objetivo.
FIGURA 6-7: Direccionamiento Indirecto

Usando una instruccin de los registros de direccionamiento indirecto como


operando
utiliza los 12bit de direccionamiento guardados en el par FSR asociado con
este registro

141

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

para determinar la localizacin de la memoria de datos que se usar en esta


operacin.
En este caso, la pareja FSR1 contiene ECCh. Gracias a esto, el contenido de la
localizacin ECCh se asocia al registro W y se guarda en ECh.

Registros FSR Y POSTINC, POSTDEC, PREINC Y PLUSW


Adems del operando INDF, cada par de registros FSR tambin tiene cuatro
operandos indirectos adicionales. Como INDF, stos son los registros virtuales a los
cuales no se puede leer o escribir indirectamente. Al acceder a estos registros se accede
realmente al par asociado del registro FSR, pero tambin realiza una accin especfica
que almacena valor. Son:
POSTDEC: tiene acceso al valor de FSR, entonces automticamente lo
decrementa en 1 despus
POSTINC: tiene acceso al valor de FSR, entonces automticamente lo
incrementa en 1 despus
PREINC: incrementa el valor de FSR en 1, despus lo utilizan en la
operacin
PLUSW: suma el valor del registro W (gama de -127 a 128) al del FSR
y utiliza el nuevo valor en la operacin.
En este contexto, al tener acceso a un registro INDF se utiliza el valor en el FSR
sin cambiarlo. Semejantemente, tener acceso a un registro PLUSW da el valor de FSR
compensado de este en el registro W; ninguno de los dos valores se cambian realmente
en la operacin. Tener acceso a los otros registros virtuales cambia el valor de los
registros de FSR.
Operaciones en el FSRs con POSTDEC, POSTINC y PREINC afectan el par de
registros; es decir, los resets del FSRnL se colocan, de FFh a 00h, lo transportan al
registro FSRnH. Por otra parte, los resultados de estas operaciones no cambian el valor
de los flags del registro ESTADO (Ej., Z, N, OV, etc.).
El registro PLUSW se puede utilizar para implementar una forma de
direccionamiento indexado en la memoria de datos. Manipulando el valor del registro,
los usuarios pueden conseguir direcciones fijando el puntero de direcciones. En algunos
casos, esto se puede utilizar para poner un control estructurado del programa, por
ejemplo pilas del software, dentro de la memoria de datos.

142

GUILLERMO DAVID HERRERO GONZLEZ

Operaciones De FSRs En FSRs


Las operaciones de direccionamiento indirecto que apuntan otro FSRs o
registros virtuales representan casos especiales. Por ejemplo, usar un FSR para sealar
uno de los registros virtuales no dar lugar a operaciones acertadas. Como caso
especfico, asumir que FSR0H:FSR0L contiene FE7h, la direccin de INDF1. Las
tentativas de leer el valor de INDF1, usando INDF0 como operando, devolvern 00h.
Tentativas de escribir a INDF1, usando INDF0 como operando, resultar en un NOP.
Por otra parte, usar los registros virtuales para escribir un par de FSR puede no
ocurrir tal y como se ha planteado. En estos casos, el valor se escribir al par de FSR
pero sin el incremento o el decremento. As, escribiendo en INDF2 o en POSTDEC2
escribir el mismo valor a FSR2H:FSR2L.
Puesto que los FSRs son registros fsicos mapeados en el espacio de SFR, se
pueden manipular con todas las operaciones directas. Los usuarios deben trabajar
proceder cautelosamente en estos registros, particularmente si su cdigo utiliza el
direccionamiento indirecto.
Semejantemente, las operaciones por el direccionamiento indirecto se permiten
generalmente en el resto de los SFRs. Los usuarios deben tener la precaucin de no
cambia inadvertidamente los ajustes que puedan afectar la operacin del dispositivo.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.6.6.1.

Direccionamiento Indexado Con Literal Compensado

Al permitir el sistema de instrucciones extendidas de los PIC18 cambia el


comportamiento de direccionamiento indirecto usando el par de registros FSR2 y sus
operandos de archivos asociados. Bajo las condiciones apropiadas, las instrucciones que
utilizan el acceso a banco, -o sea, las instrucciones bit-orientadas y byte-orientadaspueden invocar una forma de direccionamiento indexado usando una instruccin
compensada especfica. Este modo de direccionamiento especial se conoce como
indexacin del literal compensado o modo indexado por literal compensado.
Al usar el sistema de instrucciones extendidas, este modo de direccionamiento
requiere lo siguiente:
Se fuerza el uso del banco de acceso (a=0);
El argumento de direccin es menor o igual a 5Fh.
Bajo estas condiciones, el direccionamiento de las instrucciones no se interpreta
como el byte ms bajo de una direccin (utilizando el BSR en direccionamiento
directo), o como una direccin de 8 bits en el banco de acceso. En lugar, el valor es
interpretado como un valor compensado a un puntero de la direccin especificada por
FSR2. La compensacin y el contenido de FSR2 se suman para obtener la direccin de
objetivo de la operacin.

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

GUILLERMO DAVID HERRERO GONZLEZ

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)

Cuando a=0 y f=60h: La


instruccin se ejecuta en el modo
directo forzado. Se interpreta f como
un localizacin en el acceso a RAM
entre 060h y 0FFh. ste es igual que el
SFRs o las localizaciones F60h a 0FFh
(banco 15) de la memoria datos.
Las localizaciones debajo de 60h
no estn disponibles en este modo de
direccionamiento.
Cuando a=0 y f=5Fh: La
instruccin se ejecuta en el Modo
indexado por literal compensado. f se
interpreta como compensacin del valor
de direccin en FSR2. Los dos se suman
para obtener la direccin objetivo para
la instruccin. La direccin puede estar
dondequiera dentro la memoria de
datos.
Observar que en este modo, la
sintaxis correcta es: ADDWF [k], d
donde k es lo mismo que f.
Cuando a = 1 (cualquier valor
de f): La instruccin se ejecuta en el
modo directo (tambin conocido como
Modo largo directo). Se interpreta la f
como localizacin en uno de los 16
bancos de la memoria de datos. El
banco se elige con el registro BSR. La
direccin puede estar en cualquier
banco implementado en la memoria de
datos.

145

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Las posiciones de la regin del


puntero FSR2 (120h) a las del puntero
mas (17Fh) estn mapeadas con la parte
de arriba de RAM (000h-05Fh).
Los registros de funciones
especiales de F60h a FFFh estn
mapeadas de 60h a FFh como es
normal.
Las direcciones del banco 0 por
debajo de 5Fh no estn disponibles en
este modo. Se pueden direccionar
usando el BSR

146

GUILLERMO DAVID HERRERO GONZLEZ

3.4.6.6.4.

BSR En El Modo Indexado Por Literal Compensado

Aunque el banco de acceso est remapeado cuando se permite el sistema de


instrucciones extendidas, las operaciones del resto de BSR no cambian. El
direccionamiento directo, utiliza el BSR para seleccionar el banco de memoria de datos,
funciona en la misma manera segn lo descrito previamente.

3.4.7.

MEMORIA FLASH DE PROGRAMA

La memoria flash de programa es legible, escribible y borrable, durante la


operacin normal sobre la gama entera de VDD.
La lectura en la memoria de programa se ejecuta de byte en byte. Al escribir en
la memoria de programa se ejecuta en bloques de 32 bytes a la vez. La memoria de
programa se borra en bloques de 64 bytes. No se pueden borrar grandes cantidades con
el cdigo del usuario.
Escribir o borrar memoria de programa parar las bsquedas de instrucciones
hasta que se complete la operacin. No se puede acceder a la memoria de programa al
escribir o borrar, por lo tanto, cdigo no se puede ejecutar. Un contador interno de la
memoria de programa termina las operaciones de escribir y borrar.
No siempre se va a escribir una instruccin vlida en la memoria de programa.
Ejecutar una localizacin de la memoria de programa que no sea instruccin vlida dar
lugar a un NOP.

3.4.7.1.

Escribir Y Leer En Tablas

Para leer y escribir en la memoria de programa, hay dos operaciones que


permiten que el procesador mueva bytes entre la memoria de programa y la RAM de
datos:
Leer tabla (TBLRD)
Escribir tabla (TBLWT)
La memoria de programa es de 16 bits de ancho, mientras que el espacio de la
RAM de datos es de 8 bits de ancho. La lectura y escritura de datos en tabla mueve
entre estas dos memorias a travs de un registro de 8 bits (TABLAT).
Las operaciones de lectura de la tabla recuperan datos de la memoria de
programa y lo coloca en el espacio de la RAM de datos.
La escritura en tabla almacena los datos en la memoria de datos en los registros
bloqueados de la memoria de programa.
Un bloque de la tabla contiene datos, ms que instrucciones de programa, no se
necesita ser una palabra-alineada. Por lo tanto, un bloque de la tabla puede comenzar
y terminar en cualquier byte de direccin. Si en una tabla se escribe cdigo ejecutable
en la memoria de programa, las instrucciones de programa necesitarn ser palabraalineadas.

147

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 7-1: Operacin De Lectura En Tabla

Nota: 1: Registros de puntero de tabla a un byte de la memoria de programa.


FIGURA 7-2: Operacin De Escritura En Tabla

Nota: 1: El puntero de tabla direcciona uno de los 32 registros bloqueados, la


direccin de cada uno determina con TBLPTRL<4:0>.

148

GUILLERMO DAVID HERRERO GONZLEZ

3.4.7.2.

Registros De Control

Los registros de control que se utilizan conjuntamente con las instrucciones


TBLRD y TBLWT. Son:

3.4.7.2.1.

Registro EECON1
Registro EECON2
Registro TABLAT
Registros TBLPTR

Registros EECON1 y EECON2

El registro EECON1 es el registro de control para los accesos a la memoria. El


registro EECON2 no es un registro fsico; se utiliza exclusivamente en la memoria para
escribir y borrar secuencias. Al leer EECON2 leer todo 0s.
El bit de control EEPGD determina si el acceso es un acceso de memoria de
programa o de datos EEPROM. Al borrarlo, cualquier operacin posterior funcionar en
la memoria de datos EEPROM. Cuando se activa, las operaciones funcionarn sobre la
memoria de programa.
El bit de control CFGS determina si el acceso es a los registros de la
configuracin o de calibracin o a la memoria de programa o a la memoria de los datos
EEPROM. Cuando est activo, las operaciones siguientes funcionarn seteando los
registros de configuracin sin importar EEPGD. Cuando est borrado, el acceso de
seleccin de la memoria se determina por EEPGD.
El bit FREE, cuando se activa, permitir borrar una instruccin de la memoria de
programa. Cuando FREE est activo, la operacin de borrado se ejecuta en el siguiente
comando WR. Cuando FREE est borrado, slo se permite escribir.
El bit WREN, cuando est activo, permitir una operacin de escritura. Al
iniciar, el bit WREN est borrado. El bit WRERR se activa por hardware cuando se
setea y se resetea al finalizar el contador de tiempo de programacin interno y se
completa la operacin de escritura.
Nota: En una operacin normal el bit WRERR se lee 1. Esto puede indicar que
la operacin de lectura ha terminado demasiado pronto por un reset o que no se ha
escrito bien.
El bit de control WR inicializa la operacin de escritura. El bit no se puede
borrar, slo activar, por software; se borra por hardware al terminar la operacin de
escritura.
Nota: Se fija el flag de la interrupcin EEIF (PIR2<4>) cuando se completa la
escritura. Debe borrarse por software.

149

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 7-1: EECON1: Registro De Control De Los Datos De La EEPROM


BIT 7

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:

Bit selector de la memoria flash o de la EEPROM:


1= Memoria de programa flash
0= Memoria de datos EEPROM
Bit selector de Flash/EEPROM o configuracin:
1= Acceso a los registros de configuracin
0= Acceso a la memoria flash o EEPROM
Bit de borrado serie de la flash
1= Borra la memoria de programa con direccionamiento
serie con TBLPTR en el prximo comando WR. (Se
borra al completar la operacin de borrado)
0= Slo escritura
Flag de error de la memoria flash/EEPROM(1)
1= Una operacin de escritura ha terminado
bruscamente
0= La operacin de escritura se ha completado
Bit activador de la escritura en la flash/EEPROM
1= Permite ciclos de escritura en la flash/EEPROM
0= No permite ciclos de escritura
Bit de control de la escritura:
1= Inicia un ciclo de borrado/escritura en la EEPROM
o en la memoria de programa. (El bit se borra por
hardware despus del ciclo)
0= Ha completado el ciclo de escritura en la EEPROM
Bit de control de lectura:
1= Inicia una lectura en la EEPROM. Se borra por
hardware, no se puede activar cuando EEPGD=1 o
CFGS=1
0= No se inicia una operacin de lectura de la EEPROM

Nota 1: Cuando ocurre un WRERR, los bits EEPGD y CFGS no se borran. Esto
permite determinar la condicin de error.

150

GUILLERMO DAVID HERRERO GONZLEZ

3.4.7.2.2.

Registro De Tabla Latch (TABLAT)

El TABLAT es un registro de 8 bits mapeados en el espacio de SFR. El registro


de tabla latch se utiliza para almacenar 8 bits de datos durante las transferencias de
datos entre la memoria de programa y la RAM de datos.

3.4.7.2.3.

Registro Del Puntero De Tabla (TBLPTR)

El registro del puntero de tabla (TBLPTR) direcciona un byte dentro de la


memoria de programa. El TBLPTR abarca tres registros de SFR: Byte superior del
puntero de tabla, byte alto del puntero de tabla y byte bajo del puntero de tabla
(TBLPTRU:TBLPTRH:TBLPTRL). Estos tres registros se ensamblan para formar un
puntero de 22 bits de ancho. Los 21 bits inferiores permiten que el dispositivo
direccione hasta 2Mbytes de memoria de programa. El 22 bit permite el acceso a la
identificacin del dispositivo, a la identificacin del usuario y a los bits de la
configuracin.
El puntero de la tabla, TBLPTR, se controla por las instrucciones TBLRD y
TBLWT. Estas instrucciones pueden actualizar el TBLPTR en una de las cuatro
maneras basadas en la operacin de tabla. Estas operaciones en el TBLPTR afectan
solamente los 21 bits de orden inferior.
TABLA 7-1: Operaciones Del Puntero De Tabla Con Las Instrucciones TBLRD Y
TBLWT

3.4.7.2.4.

Ejemplo

Operaciones en el puntero de tabla

TBLRD*
TBLWT*

No modifica TBLPTR

TBLRD*+
TBLWT*+

Se incrementa TBLPTR despus de la lectura/escritura

TBLRD*TBLWT*-

Se decrementa TBLPTR despus de la lectura escritura

TBLRD+*
TBLWT+*

Se incrementa TBLPTR antes de la lectura/escritura

Lmites Del Puntero De Tabla

TBLPTR se utiliza en operaciones de lectura, escritura y borrado de la Memoria


flash de programa.
Cuando se ejecuta un TBLRD, los 22 bits del TBLPTR determinan que byte se
lee de la memoria de programa a TABLAT.
Cuando se ejecuta un TBLWT, los cinco bits menos significativos del registro de
puntero de la tabla (TBLPTR<4:0>) determinan cules de los 32 registros bloqueados
de la memoria de programa se escriben. Cuando empieza el tiempo de escritura en la
memoria de programa (por el bit WR), los 16bits ms significativos del TBLPTR
(TBLPTR<21: 6>) determinan que bloque de la memoria de programa de 32 bytes se
escribe.

151

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Cuando se ejecuta una instruccin borrar en la memoria de programa, los 16 bits


ms significativos del registro de puntero de tabla (TBLPTR<21:6>) selecciona el
bloque de 64 bytes que ser borrado. Lo Bits menos significativos (TBLPTR<5:0>) se
ignoran.
FIGURA 7-3: Lmites Del Puntero De Tabla Basado En Las Operaciones

3.4.7.3.

Lectura De La Memoria De Programa Flash

Se utiliza la instruccin TBLRD para recuperar datos de la memoria de


programa y los posiciona en la RAM de datos. Slo se lee un bit cada vez en una
operacin de lectura de tabla.
TBLPTR seala un byte de direccin en el espacio del programa. Al ejecutar
TBLRD se pone el byte sealado en TABLAT. Adems, TBLPTR se puede modificar
automticamente en la siguiente operacin de lectura de la tabla.
La memoria interna del programa se organiza en palabras. El bit menos
significativo de la direccin selecciona entre los bytes altos y bajos de la palabra.
FIGURA 7-4: Lecturas De La Memoria De Programa

152

GUILLERMO DAVID HERRERO GONZLEZ

EJEMPLO 7-1: Lectura De Una Palabra De La Memoria De Programa Flash


MOVLW
MOVLW
MOVWF
MOVLW
MOVWF
READ_WORD
TBLRD*+
MOVF
MOVWF
TBLRD*+
MOVF
MOVF

3.4.7.4.

CODE_ADDR_UPPER
TBLPTRU
CODE_ADDR_HIGH
TBLPTRH
CODE_ADDR_LOW
TBLPTRL

TABLAT, W
WORD_EVEN
TABLAT, W
WORD_ODD

;Carga TBLPTR con


;direccin de la palabra

la

base

MOVWF

;lee en TABLAT e incrementa


;consigue los datos
;lee en TABLAT e incrementa
;consigue los datos

Borrado De Memoria Flash De Programa

El mnimo bloque de borrado es de 32 palabras 64 bytes. Solamente con el uso


de un programador externo, o con control ICSP, se podrn borrar bloques ms grandes.
No se pueden borrar palabras en la matriz flash.
Cuando el micro inicia una secuencia de borrado se borra un bloque de 64 bytes
de memoria de programa. Se borran los 16 bits ms significativos del TBLPTR<21:6>
hasta el bloque. Se ignoran los bits TBLPTR<5:0>.
El registro EECON1 ordena la operacin de borrado. El bit EEPGD se debe
activar para sealar la memoria flash de programa. El bit WREN se debe activar para
permitir las operaciones de escritura. El bit FREE se activa para seleccionar una
operacin de borrado.
Por proteccin, se debe utilizar la secuencia de inicio de escritura en EECON2.
Se necesita una escritura larga para borrar la flash interna. Se para la ejecucin
de instrucciones mientras que dure el ciclo de escritura. La escritura la finalizar el
contador de tiempo de programacin interno.

153

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.7.4.1.

Secuencia De Borrado De La Memoria Flash De Programa

La secuencia de eventos para borrar un bloque de la memoria interna del


programa es:
1. Carga el registro del puntero de tabla con la direccin de la fila que se va
a borrar.
2. Activa el registro EECON1 para la operacin de borrado:

3.
4.
5.
6.
7.

Activa el bit EEPGD para dirigirse a la memoria de programa;


Borra el bit CFGS para tener acceso a memoria de programa;
Activa el bit WREN para permitir la escritura;
Activa el bit FREE para permitir el borrado.

Inhabilita las interrupciones.


Escribe 55h en EECON2.
Escribe 0AAh en EECON2.
Activa el bit WR. Esto comenzar el ciclo de borrado de la fila.
La CPU se parar durante el borrado (cerca de 2ms usando el contador de
tiempo interno).

8. 8. Permite las interrupciones.


EJEMPLO 7-2: Borrar Una Fila De La Memoria Flash De Programa
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
ERASE_ROW
BSF
BCF
BSF
BSF
BCF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
BSF

CODE_ADDR_UPPER
TBLPTRU
CODE_ADDR_HIGH
TBLPTRH
CODE_ADDR_LOW
TBLPTRL

;carga TBLPTR con la base


;direccin del bloque de memoria

EECON1, EEPGD
EECON1, CFGS
EECON1, WREN
EECON1, FREE
INTCON, GIE
55h
EECON2
0AAh
EECON2
EECON1, WR
INTCON, GIE

;seleccin de la memoria FLASH


;acceso a la memoria flash
;permite escribir en la memoria
;permite la operacin de borrado
;inhabilitar las interrupciones
;escribir 55h
;escribir 0AAh
;comienza a borrar
;volver a permitir las interrupciones

154

GUILLERMO DAVID HERRERO GONZLEZ

3.4.7.5.

Escribir En La Memoria Flash De Programa

El bloque de programacin mnimo es de 16 palabras 32 bytes. No se puede


programar una palabra o un byte.
Se utiliza internamente la escritura en tabla para cargar los registros necesarios
para programar la memoria flash. Se utilizan 32 registros en la escritura en tabla para
programar.
Puesto que el latch de tabla (TABLAT) es solamente un byte, la instruccin
TBLWT se tiene que ejecutar 32 veces para cada operacin de programacin. Toda la
tabla escribe operaciones cortas porque slo se escriben los registros bloqueados. Al
final de la actualizacin de los 32 registros, el registro EECON1 debe estar escrito para
comenzar la operacin de programacin con una escritura larga.
Se necesita la escritura larga para programar la flash interna. Se para la
ejecucin de instrucciones mientras dure la escritura larga. La escritura larga finalizar
con el contador interno de programacin.
El contador de tiempo de la EEPROM controla el tiempo de escritura. Las
tensiones de escritura/borrado las genera el chip con una bomba de carga, ajustada para
funcionar sobre la gama de la tensin del dispositivo.
Nota: El valor prefijado de los registros bloqueados en un reset y antes de una
operacin de escritura es FFh. Al escribir FFh en un registro de este tipo, no modifica
ese byte. Esto significa que los bytes individuales de memoria de programa se pueden
modificar, siempre que el cambio no sea modificar un bit de 0 a 1. Al modificar
bytes individuales, no es necesario cargar los 32 registros antes de ejecutar una
operacin de escritura.
FIGURA 7-5: La Escritura De Tabla En La Memoria Flash De Programa

155

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.7.5.1.

Secuencia De Escritura En La Memoria Flash De Programa

La secuencia para programar una posicin interna de memoria de programa es:


1. Leer 64 bytes en RAM.
2. Actualizar los valores de los datos en RAM cuando sea necesario.
3. Cargar el registro del puntero de tabla con la direccin que se borre.
4. Ejecutar el procedimiento de borrar fila.
5. Cargar el registro del puntero de tabla con la direccin del primer byte
que se escriba.
6. Escribir 32 bytes en los registros bloqueados con EL auto incremento.
7. Activar el registro EECON1 para la operacin de escritura:
Activar el bit EEPGD para que apunte a la memoria a
programar;
Borrar el bit CFGS para tener acceso a memoria de
programa;
Activar el bit WREN para permitir escribir.

8. Inhabilitar las interrupciones.


9. Escribir 55h en EECON2.
10. Escribir 0AAh en EECON2.
11. Activar el bit WR. Con esto comenzar el ciclo de escritura.
12. La CPU se parar durante la escritura (cerca de 2 ms usando el
contador de tiempo interno).
13. Volver a permitir las interrupciones.
14. Repetir los pasos 6 a 14 una vez ms para escribir 64 bytes.
15. Verificar la memoria (leer tabla).
Este procedimiento requerir cerca de 8ms para actualizar una fila de 64 bytes de
memoria.
Nota: Antes de activar el bit WR, el puntero de tabla tiene que estar dentro del
radio de accin de las direcciones previstas de 32 bytes dentro el registro bloqueado.

156

GUILLERMO DAVID HERRERO GONZLEZ

EJEMPLO 7-3: Escribir En La Memoria Flash Del Programa


MOVLW D'64
MOVWF COUNTER
MOVLW BUFFER_ADDR_HIGH
MOVWF FSR0H
MOVLW BUFFER_ADDR_LOW
MOVWF FSR0L
MOVLW CODE_ADDR_UPPER
MOVWF TBLPTRU
MOVLW CODE_ADDR_HIGH
MOVWF TBLPTRH
MOVLW CODE_ADDR_LOW
MOVWF TBLPTRL
READ_BLOCK
TBLRD*+
MOVF TABLAT, W
MOVWF POSTINC0
DECFSZ COUNTER
BRA READ_BLOCK

;n de bytes en el bloque a borrar


; puntero al buffer

;Cargar TBLPTR con la direccin base


;del bloque de memoria

; leer en TABLAT, e incrementar


; coger datos
; guardar datos
; correcto?
; repetir

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

;Cargar TBLPTR con la direccin base


;del bloque de memoria

;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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

;n de bytes en los registros bloqueados

;coger el byte bajo del buffer


;llevar dato al lacht de tabla
;escribir dato (escritura corta)
;repetir hasta que el buffer se llene

;Puntero a la memoria flash


;Acceso a la memoria flash
;Activar escritura en memoria
;Desactivar interrupciones
;Escribir 55h
;Escribir 0AAh
;Comienzo del programa

;Activa las interrupciones


;Desactiva la escritura en memoria

Verificacin De La Escritura

Dependiendo del uso, en una buena programacin se puede necesitar que el


valor escrito en la memoria se verifique con el valor original. Esto se debe utilizar en
usos donde excesivas escrituras pueden provocar que los bits estn cerca del lmite de la
especificacin.

158

GUILLERMO DAVID HERRERO GONZLEZ

3.4.7.5.3.

Finalizacin Inesperada De La Operacin De Escritura

Si una escritura termina por un acontecimiento imprevisto, tal y como la prdida


de energa o un reset inesperado, las localizaciones de la memoria programadas se
deben verificar y reprogramar si se necesita. Si se interrumpe la operacin de escritura
por un reset MCLR* o un desbordamiento del WDT durante la operacin normal, el
usuario puede comprobar el bit WRERR y reescribir las localizaciones segn se
necesite.
TABLA 7-2: Registros Asociados Con La Memoria Flash
Nombre

Bit 7

Bit 6

Bit 5

TBLPTRU

bit 21(1)

Bit 4

Bit 3

Bit 2

Bit 1

Byte superior del puntero de tabla de la memoria de


programa (TBLPTR<20:16>)

TBLPTRH

Byte alto del puntero de tabla de la memoria de programa (TBLPTR<15:8>)

TBLPTRL

Byte bajo del puntero de tabla de la memoria de programa (TBLPTR<7:0>)

TABLAT

Match de tabla de la memoria de programa

INTCON

GIE/GIEH

EECON2

PEIE/GIEL

TMR0IE

Bit 0

INT0IE

RBIE

TMR0IF

INT0IF

RBIF

Registro de control 2 EEPROM (no es un registro fsico)

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

Leyenda: - = no implementado, se lee 0. Las celdas sombradas no se utilizan


en el acceso a la Flash/EEPROM
Nota: 1: El bit 21 de TBLPTRU permite el acceso a los bits de configuracin
del dispositivo.

159

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.8.

MEMORIA DE DATOS EEPROM

La EEPROM es una matriz de memoria permanente, separada de la RAM de


datos y de la memoria de programa, se utiliza en almacenamientos de larga duracin de
los datos del programa. No est mapeada directamente en los registros de archivo o en
la memoria del programa, sino que se trata indirectamente a travs de los registros
especiales de la funcin (SFRs). La EEPROM es legible y escribible durante la
operacin normal sobre la gama entera de VDD.
Cuatro SFRs se utilizan para leer y para escribir los datos en la EEPROM as
como la memoria del programa. Son:

EECON1
EECON2
EEDATA
EEADR

Los datos EEPROM permiten la lectura y escritura de bytes. Cuando se conecta


al bloque de la memoria de datos, el EEDATA sostiene los 8bits de datos para la
lectura/escritura y el registro EEADR lleva a cabo el direccionamiento de la
localizacin de la EEPROM.
La memoria de datos EEPROM se clasifica como muy resistente a los ciclos de
escritura/borrado. Un byte escribe y automticamente borra la localizacin y escribe los
datos nuevos (borrar-antes-escribir). El tiempo de escritura se controla por un contador
de tiempo en el chip; variar con la tensin y la temperatura as como de chip a chip.

3.4.8.1.

Registros EECON1 Y EECON2

El acceso a los datos EEPROM se controla con dos registros: EECON1 y


EECON2. stos son iguales que los del acceso de control a la memoria del programa y
se utilizan de una manera similar para los datos EEPROM.
El registro EECON1 es el registro de control para el acceso a memoria de datos
y de programa. Controlando el bit, EEPGD, se determina si el acceso es a la memoria de
programa o a la memoria de datos EEPROM. Cuando est borrado, las operaciones se
hacen a la memoria de datos EEPROM. Cuando est activado, se dirige a la memoria de
programa. Controlando el bit, CFGS, se determina si el acceso es a los registros de
configuracin o a la memoria del programa/EEPROM. Cuando est activado, las
operaciones siguientes tienen acceso a los registros de configuracin. Cuando CFGS
est borrado, el bit EEPGD selecciona la flash o la memoria EEPROM. El bit WREN,
cuando est activado, permitir una operacin de escritura. En ciclo inicial, el bit
WREN est borrado. El bit WRERR se activa por hardware cuando se activa y se borra
el bit WREN cuando finaliza el contador de tiempo de programacin interno y se
completa la operacin de escritura.
Nota: Durante la operacin normal, el WRERR se lee como 1. Esto puede
indicar que ha finalizado una operacin de escritura prematuramente cerca de un reset o
una operacin de escritura finaliza incorrectamente.

160

GUILLERMO DAVID HERRERO GONZLEZ

El bit de control WR inicia operaciones de escritura. El bit no se puede borrar,


slo est activo, en software; se borra en hardware al terminar la operacin de escritura.
Nota: Se activa el flag de la interrupcin EEIF (PIR2<4>) cuando la escritura se
completa. Debe desactivarse por software.
Controlando los bits, RD y WR, comienzan las operaciones leer y
borrar/escribir, respectivamente. Estos bits se activa por firmware y se desactiva por
hardware al terminar la operacin.
El bit RD no se puede activar al tener acceso a la memoria de programa
(EEPGD=1).
El registro EECON2 no es un registro fsico. Se utiliza exclusivamente en las
secuencias de escribir y borrar en la memoria. La lectura EECON2 leer todo 0s.

3.4.8.2.

Lectura De Los Datos De La Memoria EEPROM

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.

Escritura En La Memoria De Datos EEPROM

;Bits bajos de la direccin de memoria a leer


;Puntero a la memoria de datos
;Acceso a la memoria EEPROM
;Lectura en EEPROM
;W=EEDATA

Para escribir una localizacin de la EEPROM, se tiene que escribir la direccin


en el registro EEADR y los datos al registro EEDATA. La escritura no comenzar si no
se ejecuta la secuencia: escribir 55h en EECON2, escribir 0AAh en EECON2, despus
activar el bit WR; para cada byte. Se recomienda que las interrupciones estn
desactivadas durante esto segmento de cdigo.

161

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 8-2: Escritura De Datos En La EEPROM


MOVLW
MOVWF
MOVLW
MOVWF
BCF
BCF
BSF
BCF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
BSF
BCF

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

;Bits bajos de la direccin de memoria a escribir


;Valor de la memoria de datos a escribir
;Puntero a la memoria de datos
;Acceso a la EEPROM
;Activa escritura
;Desactivacin de las interrupciones

;Activa WR para empezar a escribir


;Activa las interrupciones
;Desactiva la escritura cuando se complete

Verificacin De La Escritura

Dependiendo de la aplicacin, se puede necesitar que se verifiquen los datos


despus de escribirlos en la memoria comparndolos con el valor original. Se tiene que
utilizar esto en los casos en los que haya muchas operaciones de escritura y los bits
trabajen cercanos a los lmites de las especificaciones.

3.4.8.5.

Operacin Con Cdigo De Proteccin

La memoria de datos EEPROM tiene los bits de los cdigos de proteccin en


palabras de configuracin. Las operaciones de lectura y escritura externas se desactivan
si se permite el cdigo de proteccin.
El microcontrolador puede leer y escribir en la EEPROM sin importar el estado
del bit de configuracin del cdigo de proteccin.

3.4.8.6.

Proteccin Contra Escrituras Falsas

Hay casos en los que el dispositivo no puede escribir en la memoria EEPROM.


Para proteger la EEPROM contra estas falsas escrituras, se ponen varios mecanismos en
ejecucin. En un ciclo de inicio, el bit WREN est borrado. Adems, se bloquea la
escritura en la EEPROM durante el perodo de ciclo inicial del contador de tiempo. La
secuencia de inicio de la escritura y el bit WREN ayudan a prevenir una escritura
accidental durante un cese de tensin, fallo en la energa o malfuncionamiento del
software.

162

GUILLERMO DAVID HERRERO GONZLEZ

3.4.8.7.

Usar Los Datos EEPROM

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

;Lee la direccin actual

;Activa WR para empezar a escribir


;Espera que se complete la escritura
;Incrementa la direccin
;Si no es cero lo repite
;Desactiva la escritura
;Activa interrupciones

163

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 8-1: Registros Asociados Con La Memoria EEPROM


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

EEADR

Registro de direccionamiento de la EEPROM

EEDATA

Registro de datos de la EEPROM

EECON2

2 Registro de control de la EEPROM (no es un registro fsico)

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

Leyenda:- = no implementado, se lee 0. Las casillas sombreadas no se utilizan


en el acceso a la Flash/EEPROM.

164

GUILLERMO DAVID HERRERO GONZLEZ

3.4.9.
3.4.9.1.

MULTIPLICADOR DE 8X8 POR HARDWARE


Introduccin

Todos los dispositivos PIC18 incluyen un multiplicador de 8x8 por hardware


como parte de la ALU. El multiplicador realiza una operacin sin signo y devuelve un
resultado que se almacene en el par de registros del producto, PRODH:PRODL de
16bits. La operacin del multiplicador no afecta ningn flag en el registro ESTADO.
La fabricacin de la operacin multiplicacin por hardware permite que se
termine en un solo ciclo de instruccin. Esto tiene ventajas, un rendimiento de cmputo
ms alto y un tamao de cdigo reducido para los algoritmos de multiplicacin y
permite que los dispositivos PIC18 sean utilizados en muchos usos reservados
previamente para los procesadores de la seal numrica.
EJEMPLO 9-1: Rutina De Multiplicacin Sin Signo De 8x8
MOVF
MULWF

ARG1,W
ARG2

;ARG1*ARG2=PRODH:PRODL

EJEMPLO 9-2: Rutina De Multiplicacin Con Signo De 8x8


MOVF
ARG1,W
MULWF
ARG2
BTFSC ARG2,SB
SUBWF
PRODH,F
MOVF
ARG2,W
BTFSC ARG1,SB
SUBWF
PRODH,F

;ARG1*ARG2=PRODH:PRODL
;Bit test del signo
;PRODH=PRODH-ARG1
;Bit test del signo
;PRODH=PRODH-ARG2

ECUACIN 9-1: Algoritmo De Multiplicacin 16x16 Sin SIGNO


RES3:RES0=ARG1H:ARG1L*ARG2H:ARG2l=
=(ARG1H*ARG2H*216)+(ARG1H*ARG2L*28)+
+(ARG1L*ARG2H*28)+(ARG1L*ARG2L)

165

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 9-3: Rutina De Multiplicacin De 16x16 Sin Signo


MOVF
ARG1L,W
MULWF
ARG2L
MOVFFPRODH,RES1
MOVFFPRODL,RES0
MOVF
ARG1H,W
MULWF
ARG2H
MOVFFPRODH,RES3
MOVFFPRODH,RES2
MOVF
ARG1L,W
MULWF
ARG2H
MOVF
PRODL,W
ADDWF
RES1,F
MOVF
PRODH,W
ADDWFC
RES2,F
CLRF
WREG
ADDWFC
RES3,F
MOVF
ARG1H,W
ADDWF
RES1,F
MOVF
PRODH,W
ADDWFC
RES2,F
CLRF
WREG
ADDWFC
RES3,F

ECUACIN 9-2: Algoritmo De Multiplicacin 16x16 Con Signo


RES3:RES0=ARG1H:ARG1L*ARG2H:ARG2l=
=(ARG1H*ARG2H*216)+(ARG1H*ARG2L*28)+
+(ARG1L*ARG2H*28)+(ARG1L*ARG2L)+
+(-1*ARG2H<7>*ARG1H:ARG1L*216)+
+(-1*ARG1H<7>*ARG2H:ARG2L*216)

166

GUILLERMO DAVID HERRERO GONZLEZ

EJEMPLO 9-4: Rutina De Multiplicacin 16x16 Con Signo


MOVF
MULWF
MOVFF
MOVFF
MOVF
MULWF
MOVFF
MOVFF
MOVF
MULWF
MOVF
ADDWF
MOVF
ADDWFC
CLRF
ADDWFC
MOVF
ADDWF
MOVF
ADDWFC
CLRF
ADDWFC
BTFSS
BRA
MOVF
SUBWF
MOVF
SUBWFB
SIGN_ARG1
BTFSS
BRA
MOVF
SUBWF
MOVF
SUBWFB
CONT_CODE

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.10.

INTERRUPCIONES

Los dispositivos PIC18F2455/2550/4455/4550 tienen fuentes mltiples de


interrupcin y una prioridad de interrupcin que permite que cada fuente de interrupcin
se le asigne un nivel prioritario o un nivel bajo de prioridad. El puntero de alta prioridad
est en 000008h y el puntero de interrupcin de baja prioridad est en 000018h. Los
acontecimientos prioritarios de interrupcin pararn cualquier interrupcin de prioridad
baja que pueda estar en marcha.
Hay diez registros que se utilizan para controlar las operaciones de interrupcin.
Estos registros son:

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

GUILLERMO DAVID HERRERO GONZLEZ

Cuando se responde una interrupcin, el bit de permiso de las interrupciones


globales est borrado para inhabilitar las otras. Si el bit IPEN est reseteado, ste es el
bit GIE. Si se utilizan los niveles de prioridad de interrupcin, ste ser el bit GIEH o
GIEL. Las fuentes de interrupcin prioritarias pueden interrumpir una interrupcin de
baja prioridad. Las interrupciones de prioridad bajas no se procesan mientras que las
interrupciones prioritarias estn en marcha.
La direccin de retorno se pone en la pila y el PC se carga con la direccin del
puntero de interrupcin (000008h 000018h). Una vez en la rutina de la interrupcin,
las fuentes de interrupcin se pueden determinar interrogando los flags de interrupcin.
Los flags de interrupcin se tienen que despejar por software antes de volver a permitir
las interrupciones para evitar interrupciones recurrentes.
La instruccin para volver de la interrupcin, RETFIE, devuelve de la rutina
de interrupcin y activa el bit GIE (GIEH o GIEL si se utilizan los niveles de prioridad)
que vuelve a permitir las interrupciones.
Para los acontecimientos externos de interrupcin, tales como los pines INT o la
interrupcin por cambio de la entrada PORTB, el estado latente de la interrupcin es de
tres a cuatro ciclos de instruccin. El exacto el estado latente es igual para instrucciones
de uno o dos ciclos. Los flags individuales de interrupcin se activan sin importar el
estado de su bit de permiso correspondiente o el bit GIE.
Nota: No utilizar la instruccin MOVFF para modificar registros de control de
interrupcin mientras que se permita cualquier interrupcin. Al hacerlo puede provocar
un comportamiento errtico del microcontrolador.

3.4.10.1.

Interrupciones Del USB

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 10-1: Lgica De Interrupcin

3.4.10.2.

Registros INTCON

Los registros INTCON son legibles y escribibles y contienen varios bits de


permiso, prioridad y flags.
Nota: Se fijan los flags cuando ocurre una condicin de interrupcin sin
importar el estado del bit de permiso correspondiente o del bit de permiso global. El
usuario debe asegurarse de que el flag de la interrupcin est a cero antes de habilitar
dicha interrupcin.

170

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 10-1: INTCON: Registro De Control De Interrupcin


BIT 7

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:

Bit activador del permiso global de interrupcin:


Cuando IPEN=0
1= Activa interrupciones enmascarables
0= Desactiva todas las interrupciones
Cuando IPEN=1
1= Activa interrupciones de prioridad alta
0= Desactiva interrupciones de prioridad alta
Bit activador de las interrupciones de perifricos:
Cuando IPEN=0
1= Activa interrupciones enmascarables
0= Desactiva todas las interrupciones
Cuando IPEN=1
1= Activa interrupciones de prioridad baja
0= Desactiva interrupciones de prioridad baja
Bit de permiso de interrupcin por desbordamiento del
TMR0:
1= Activa la interrupcin
0= Desactiva la interrupcin
Bit de permiso de la interrupcin externa INT0:
1= Activa la interrupcin
0= Desactiva la interrupcin
Bit de permiso de la interrupcin por cambio del
PORTB:
1= Activa la interrupcin
0= Desactiva la interrupcin
Flag de la interrupcin por desbordamiento del TMR0:
1= Se ha activado la interrupcin
0= No se ha activado la interrupcin
Flag de la interrupcin externa INT0:
1= Se ha activado la interrupcin
0= No se ha activado la interrupcin
Flag de la interrupcin del cambio de PORTB(1):
1= Uno de los pines RB7:RB4 ha cambiado
(se tiene que borrar por software)
0= No ha cambiado ningn pin

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 10-2: INTCON2: Registro De Control De Interrupcin 2


BIT 7

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:

Bit activador de pull-up del PORTB:


1= Desactivado
0= Activado por valores individuales de latch
Bit selector del flaco de la interrupcin 0:
1= Flanco de subida
0= Flanco de bajada
Bit selector del flanco de la INT1:
1= Flanco de subida
0= Flanco de bajada
Bit selector del flanco de la INT2:
1= Flanco de subida
0= Flanco de bajada
Bit de prioridad del desbordamiento del TMR0:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad del cambio de PORTB:
1= Alta prioridad
0= Baja prioridad

172

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 10-3: INTCON3: Registro de control de interrupcin 3


BIT 7

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 de prioridad de la INT2:


1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la INT1:
1= Alta prioridad
0= Baja prioridad
Bit de permiso de la interrupcin externa INT2:
1= Activa la interrupcin
0= Desactiva la interrupcin
Bit de permiso de la interrupcin externa INT1:
1= Activa la interrupcin
0= Desactiva la interrupcin
Flag de la interrupcin externa INT2:
1= Se ha activado la interrupcin
0= No se ha activado la interrupcin
Flag de la interrupcin externa INT1:
1= Se ha activado la interrupcin
0= No se ha activado la interrupcin

BIT 6

INT1IP:

BIT 4

INT2IE:

BIT 3

INT1IE:

BIT 1

INT2IF:

BIT 0

INT1IF:

3.4.10.3.

Registros PIR

Los registros PIR contienen los flags individuales de las interrupciones


perifricas. Debido al nmero de fuentes de interrupcin perifricas hay dos registros de
respuesta de las interrupciones perifricas (PIR1 y PIR2).

173

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 10-4: PIR1: Registro De Respuesta De Las Interrupciones Perifricas 1


BIT 7

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:

Flag de acceso al puerto paralelo lectura/escritura(1):


1= Ocurre una lectura/escritura (borrado por software)
0= No ocurre lectura/escritura
Flag del conversor A/D:
1= Conversin A/D completa (borrado por software)
0= Conversin A/D no completa
Flag de recepcin por la EUSART:
1= Buffer de recepcin lleno (borrado por software)
0= Buffer de recepcin vaco
Flag de transmisin por la EUSART:
1= Buffer de transmisin vaco (borrado por software)
0= Buffer de transmisin lleno
Flag del puerto serie sncrono:
1= Transmisin/recepcin completa
(borrado por software)
0= Esperando transmisin/recepcin
Flag del CCP1:
Modo captura:
1= Ha ocurrido una captura en el TMR1
(borrado por software)
0= No ha ocurrido una captura
Modo comparacin:
1= Ha ocurrido una comparacin en el TMR1
(borrado por software)
0= No ha ocurrido una captura
Modo PWM:
No se utilizan
Flag de interrupcin al igualar TMR2 y PR2:
1= Se han igualado (borrado por software)
0= No se han igualado
Flag de desbordamiento del TMR1:
1= Desbordamiento del TMR1 (borrado por software)
0= No se ha desbordado el TMR1

Nota 1: Este pin est reservado en los micros de 28 pines; mantenerlo siempre
borrado.

174

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 10-5: PIR2: Registro De Respuesta De Las Interrupciones Perifricas 2


BIT 7

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:

Flag de fallo del oscilador:


1= Ha ocurrido un fallo (borrado por software)
0= No ha ocurrido ningn fallo
Flag del comparador:
1= La entrada del comparador ha cambiado
(borrado por software)
0= La entrada no ha cambiado
Flag del USB:
1= El USB pide una interrupcin (borrado por software)
0= El USB no necesita interrupcin
Flag de escritura en la EEPROM/Flash:
1= Se ha completado la escritura (borrado por software)
0= No se ha completado la escritura
Flag del colisin en el bus:
1= Ha ocurrido una colisin (borrado por software)
0= No ha ocurrido colisin
Flag de deteccin de alta tensin:
1= Ha ocurrido una condicin de alta tensin
(borrado por software)
0= No ha ocurrido una condicin de AT
Flag de desbordamiento del TMR3:
1= Se ha desbordado el TMR3 (borrado por software)
0= No se ha desbordado
Flag del CCP2:
Modo captura:
1= Ha ocurrido una captura en TMR1 o TMR3
(borrado por software)
0= No ha ocurrido ninguna captura
Modo comparacin:
1= Ha ocurrido una comparacin en el TMR1 o TMR3
(borrado por software)
0= No ha ocurrido una comparacin
Modo PWM:
No se utiliza

175

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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:

Bit de permiso de interrupcin de SPP(1):


1= Interrupcin por una lectura/escritura permitida
0= No se permite la interrupcin
Bit de permiso de interrupcin por el conversor A/D:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por recepcin
por la EUSART:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de la interrupcin por transmisin
por la EUSART:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por el MSSP:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por el CCP1:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin al igualar TMR2 y PR2:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de la interrupcin por desbordamiento
del TMR1:
1= Interrupcin activada
0= Interrupcin desactivada

Nota 1: Este pin est reservado en los micros de 28 pines; mantenerlo siempre
borrado.

176

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 10-7: PIE2: Registro De Permiso De Las Interrupciones Perifricas 2


BIT 7

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:

Bit de permiso de interrupcin por fallo del oscilador:


1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin del comparador:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin del USB:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por escribir en
EEPROM/Flash:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por colisin en el bus:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por deteccin de
alta tensin:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin por desbordamiento
del TMR3:
1= Interrupcin activada
0= Interrupcin desactivada
Bit de permiso de interrupcin del CCP2:
1= Interrupcin activada
0= Interrupcin desactivada

177

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.10.5.

Registros IPR

Los registros IPR contienen los bits de prioridad de las interrupciones


perifricas. Debido al nmero de fuentes de interrupcin perifricas, hay dos registros
(IPR1 e IPR2). Al usar los bits de la prioridad requieren que la prioridad de la
interrupcin est permita (IPEN activado).
REGISTRO 10-8: IPR1: Registro De Prioridad De Las Interrupciones Perifricas
BIT 7

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:

Bit de prioridad de la interrupcin de SPP(1):


1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por el conversor A/D:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por recepcin
por la EUSART:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por transmisin
por la EUSART:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por el MSSP:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por el CCP1:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin al igualar
TMR2 y PR2:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por desbordamiento
del TMR1:
1= Alta prioridad
0= Baja prioridad

Nota 1: Este pin est reservado en los micros de 28 pines; mantenerlo siempre
borrado

178

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 10-9: IPR2: Registro De Prioridad De Las Interrupciones Perifricas 2


BIT 7

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:

Bit de prioridad de la interrupcin por fallo


del oscilador:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin del comparador:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin del USB:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por escribir en
EEPROM/Flash:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por colisin
en el bus:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por deteccin de
alta tensin:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin por desbordamiento
del TMR3:
1= Alta prioridad
0= Baja prioridad
Bit de prioridad de la interrupcin del CCP2:
1= Alta prioridad
0= Baja prioridad

179

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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:

Bit activador de las prioridades de las interrupciones:


1= Niveles de prioridad permitidos
0= Niveles de prioridad no permitidos
Bit activador de BOR(1):
Ver registro 5-1
Flag de reset por instruccin:
Ver registro 5-1
Flag de desbordamiento del Watchdog:
Ver registro 5-1
Flag de deteccin de la cada de tensin:
Ver registro 5-1
Bit de estado de reset por aumento de tensin(2):
Ver registro 5-1
Bit de estado de reset por cese de tensin:
Ver registro 5-1

Nota 1: Si se permite SBOREN, su estado en el reset es 1; si no, es 0. Ver


el registro 5-1 para la informacin adicional.
2: El valor real en el reset del POR se determina por el tipo de reset del
dispositivo. Ver el registro 5-1 para adicional informacin.

180

GUILLERMO DAVID HERRERO GONZLEZ

3.4.10.7.

Pines De Interrupciones INTn

Las interrupciones externas de los pines RB0/AN12/INT0/FLT0/SDI/SDA,


RB1/AN10/INT1/SCK/SCL y RB2/AN8/INT2/VMO son activas por flanco. Si el bit
correspondiente INTEDGx en el registro INTCON2 se activa (= 1), la interrupcin se
acciona por un flanco de subida; si el bit est borrado, el disparo ocurre en el flanco de
bajada. Cuando ocurre un flanco vlido en el pin RBx/INTx, el flag el correspondiente
se activa, INTxIF. Esta interrupcin se puede inhabilitar borrando el bit INTxIE. El flag,
INTxIF, debe borrarse por software antes de volver a permitir la interrupcin.
Todas las interrupciones externas (INT0, INT1 e INT2) pueden despertar al
procesador de los modos de ahorro de energa si se activa el bit, INTxIE antes de entrar
en ellos. Si se permiten las interrupciones globales, se activa GIE, el procesador saltar
al puntero de la interrupcin despus del reinicio.
La prioridad de la interrupcin para INT1 e INT2 se determina con el valor
contenido en los bits de prioridad de la interrupcin, el INT1IP (INTCON3<6>) y el
INT2IP (INTCON3<7>). No hay un bit de prioridad asociado a la interrupcin INT0.
Siempre es una fuente de interrupcin prioritaria.

3.4.10.8.

Interrupcin TMR0

En el modo de 8 bits (que est por defecto), un desbordamiento en el registro


TMR0 (FFh => 00h) activar el flag, TMR0IF. En modo de 16 bits, un desbordamiento
en el par de registros TMR0H:TMR0L (FFFFh => 0000h) activar TMR0IF. La
interrupcin se puede permitir/inhabilitar activando/borrando el bit de permiso,
TMR0IE (INTCON<5>). La prioridad de la interrupcin para Timer0 se determina por
el valor contenido en el bit de prioridad de la interrupcin, TMR0IP (INTCON2<2>).

3.4.10.9.

Interrupcin Al Cambiar PORTB

Un cambio en la entrada en PORTB<7:4> activa el flag, RBIF (INTCON<0>).


La interrupcin se puede permitir/inhabilitar activando/borrando el bit de permiso,
RBIE (INTCON<3>). La prioridad de la interrupcin para la interrupcin se
determinada con el valor contenido en el bit de la prioridad de la interrupcin, RBIP
(INTCON2<0>).

3.4.10.10.

Almacenamiento De Datos Durante La Interrupcin

Durante las interrupciones, la direccin del PC de retorno se almacena en la pila.


Adems, los registros WREG, ESTADO y BSR se guardan en la pila de acceso rpido.
Si no se utiliza un retorno rpido de la interrupcin, el usuario puede necesitar guardar
los registros WREG, ESTADO y BSR en entrada a la rutina de la interrupcin.
Dependiendo de la aplicacin, tambin se puede necesitar guardar otros registros.

181

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 10-1: Almacenamiento De Los Registros ESTADO, WREG y BSR En RAM


MOVWF W_TEMP
MOVFF STATUS,STATUS_TEMP
MOVFF BSR, BSR_TEMP
;
;CDIGO DEL USUARIO
;
MOVFF BSR_TEMP, BSR
MOVF W_TEMP, W
MOVFF STATUS_TEMP, STATUS

3.4.11.

;W_TEMP est en el banco virtual


;STATUS_TEMP direccionado en
;cualquier sitio
;BSR_TMEP direccionado en
;cualquier sitio

;Restaura BSR
;Restaura WREG
;Restaura ESTADO

PUERTOS DE ENTRADA-SALIDA

Dependiendo del dispositivo seleccionado y de las caractersticas permitidas,


hay hasta cinco puertos disponibles. Algunos pines de los puertos de entrada-salida se
multiplexan con una funcin alternativa de las caractersticas perifricas del dispositivo.
Generalmente cuando se activa un perifrico, ese pin no se puede utilizar como pin de
entrada-salida.
Cada puerto tiene tres registros para operar. Estos registros son:
Registro TRIS (registro de la direccin de los datos)
Registro POR (lee los niveles en los pines del dispositivo)
Registro LAT (latch de salida)
El registro del latch de datos (LATA) es til para leer-modificar-escribir las
operaciones en el valor de los pines de entrada-salida.

182

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 11-1: Puerto Genrico De Operaciones De Entrada-Salida

Nota 1: Los puertos de E/S tienen un diodo de proteccin para VDD y VSS.

3.4.11.1.

Registros PORTA, TRISA Y LATA

El PORTA es un puerto bidireccional de 8bits de ancho. El registro de la


direccin de los datos es TRISA. Activar el bit TRISA (=1) har que el pin
correspondiente de PORTA sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISA (=0)
hace que el pin correspondiente de PORTA sea una salida (es decir, pone el contenido
del latch de salida en el pin seleccionado).
Leyendo el registro PORTA se lee el estado de los pines; escribiendo en l, se
graba el latch.
El registro del latch de datos (LATA) slo es memoria mapeada. Las
operaciones de lectura-modificacin-escritura en el registro LATA lee y escribe el valor
del latch de salida del PORTA.
El pin RA4 se multiplexa con la entrada de reloj del mdulo Timer0 para
hacerse el pin RA4/T0CKI. El pin RA6 se multiplexa con el pin principal del oscilador;
se permite como un oscilador o pin de entrada-salida al seleccionar el oscilador
principal en el registro 1H de la configuracin. Cuando no est utilizado como un
puerto, RA6 y su TRIS asociado y los bits del LAT se leen como 0.
El RA4 tambin se multiplexa con el mdulo del USB; sirve como una entrada
receptora de un transmisor-receptor externo del USB.
Varios pines de PORTA se multiplexan con las entradas analgicas, las entradas
analgicas de VREF+ y de VREF- y la salida de referencia de la tensin del

183

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

;Inicializar PORTA borrando los latch de salida


;Otro mtodo para borrar los latch
;Configurar A/D
;para entradas digitales
;Configurar los comparadores
;para entrada digital
;Valor usado para inicializar las direcciones de los datos
;Activar RA<3:0> como entradas y RA<5:4> como salidas

184

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 11-1: Resumen De Entradas-Salidas Del PORTA


Pin

Configuracin
Del TRIS

E/S

Tipo de E/S

Descripcin

salida

salida digital

LATA<0> salida de datos; no le afectan las entradas


analgicas

entrada

Buffer de
entrada TTL

PORTA<0> entradas de datos; desactivada cuando se


activen las entradas analgicas

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

PORTA<3> entrada de datos; desactivado cuando las


entradas analgicas estn activas.

AN3

entrada

analgica

Canal 3 de entrada A/D y del comparador C1+.


Configuracin por defecto en un POR.

VREF+

entrada

analgica

salida

salida digital

entrada

T0CKI

entrada

C1OUT

salida

salida digital

Salida del comparador 1; tiene prioridad sobre el puerto de


datos.

RCV

entrada

Buffer de
entrada TTL

Entrada externa del transmisor RCV del USB.

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

Canal 0 de entrada A/D y entrada del comparador C1-.


Configuracin por defecto en POR; no le afectan salidas
digitales.
LATA<1> salida de datos; no le afectan las entradas
analgicas
PORTA<1> entrada de datos; se lee 0 en POR.
Canal 1 de entrada A/D y entrada del comparador C2-.
Configuracin por defecto en POR; no le afectan salidas
digitales.
LATA<2> salida de datos; no le afectan las entradas
analgicas. Desactivado cuando la salida CVREF est
activa.
PORTA<2> entrada de datos. Desactivado cuando las
funciones analgicas estn activas; desactivado cuando la
salida CVREF est activa.
Canal 2 de entrada A/D y entrada del comparador C2+.
Configuracin por defecto en un POR; no le afectan las
salidas analgicas.
Tensin baja de referencia de entrada para el A/D y el
comparador.
Tensin de referencia de salida. Activando esto se
desactiva las E/S digitales.
LATA<3> salida de datos; no le afectan las entradas
analgicas

Tensin de referencia alta de entrada para el A/D y el


comparador.
LATA<4> salida de datos; no le afectan las entradas
analgicas
PORTA<4> entrada de datos; desactivado cuando las
entradas analgicas estn activas.
Entrada del reloj Timer0.

LATA<5> salida de datos; no le afectan las entradas


analgicas
PORTA<5> entrada de datos; desactivado cuando las
entradas analgicas estn activas.
Canal 4 de entrada A/D. Por defecto en un POR.
Entrada selectora de esclavo para SSP (Mdulo MSSP).
Detector de tensin Alta/Baja externa.
Salida del comparador 2; tiene prioridad sobre el puerto de
datos.
Conexin de regreso del oscilador (todos los modos XT y
HS).

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CLKO

salida

salida digital

salida

salida digital

entrada

Buffer de
entrada TTL

RA6

Salida del sistema del reloj (FOSC/4); disponible en los


modos EC, ECPLL e INTCKO.
LATA<6> salida de datos. Disponible en los modos ECIO,
ECPIO e INTIO; en otro caso, se lee 0.
PORTA<6>entrada de datos. Disponible en los modos
ECIO, ECPIO e INTIO; en otro caso se lee 0.

TABLA 11-2: Sumario De Registros Asociados Al PORTA


Nombre

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

Leyenda: = no implementado, se lee 0. Las celdas sombreadas no las usa el


PORTA.
Nota 1: El RA6 y sus bits de direcciones y latch asociados se activan como
pines de E/S basndose en la configuracin del oscilador; en otro caso, se leen como
0.

3.4.11.2.

Registros PORTB, TRISB Y LATB

El PORTB es un puerto bidireccional de 8bits de ancho. El registro de la


direccin de los datos es TRISB. Activar el bit TRISB (=1) har que el pin
correspondiente de PORTB sea una entrada (es decir, pone el conductor correspondiente
de la salida en un modo alta impedancia). Borrar un bit de TRISB (=0) hace que el pin
correspondiente de PORTB sea una salida (es decir, pone el contenido del latch de
salida en el pin seleccionado).
El registro del latch de datos (LATB) slo es memoria mapeada. Las
operaciones de lectura-modificacin-escritura en el registro LATB lee y escribe el valor
del latch de salida del PORTB.
Cada uno de los pines de PORTB tiene un pull-up interno. Un solo bit de control
puede cambiar todo el pull-up. Esto se realiza borrando el bit, RBPU* (INTCON2<7>).
El pull-up cambia automticamente cuando el pin se configura como salida. Se
inhabilita el pull-up en un reinicio.

186

GUILLERMO DAVID HERRERO GONZLEZ

Nota: En reinicio, RB4:RB0 se configuran como entradas analgicas por defecto


y se leen como 0; Se configuran los bits RB7:RB5 como entradas digitales.
Programando el bit de configuracin, PBADEN (CONFIG3H<1>), RB4:RB0 se
configuran alternativamente como entradas digitales en POR.
Cuatro de los pines de PORTB (RB7: RB4) tienen una interrupcin al
cambiar. Solamente los pines configurados como entradas pueden provocar esta
interrupcin. Cualquier pin RB7:RB4 configurado como salida se excluye de la
interrupcin al cambiar. Los pines se comparan con el ltimo valor ledo en el
PORTB.
La interrupcin se puede utilizar para despertar al dispositivo del sleep. El
usuario, en la rutina del servicio de la interrupcin, puede inhabilitar la interrupcin de
la manera siguiente:
a) Una lectura o escritura en el PORTB (excepto con la instruccin
MOVFF x, PORTB). Esto terminar la condicin de error de
conexin.
b) Borrar el flag, RBIF.
Al leer el PORTB finalizar la condicin de error de conexin y permitir que el
flag, RBIF, sea borrado.
La interrupcin por cambio se recomienda para despertar el dispositivo
cuando se presiona una tecla y operaciones en las que el PORTB se utiliza solamente
por su interrupcin. No es recomendable interrogar el PORTB cuando estamos usando
la interrupcin por cambio.
Los pines, RB2 y RB3, se multiplexan con el USB y sirven como las salidas para
un transmisor-receptor externo USB (configuracin TRIS).
RB4 se multiplexa con CSSPP, el chip selecciona funcionar con puerto paralelo
(SPP) ajustando el TRIS.
EJEMPLO 11-2: Inicializacin De PORTB
CLRF PORTB
CLRF LATB
MOVLW 0Eh
MOVWF ADCON1
MOVLW 0CFh
MOVWF TRISB

;Inicializar PORTB borrando los latch de salida de datos


;Otra mtodo para borrar los latch de salida
;Activar RB<4:0> como pines digitales de entrada-salida
; (requerido si el bit PBADEN est activo)
;Valor usado para inicializar las direcciones de los datos
;Activa RB<3:0> como entradas
;RB<5:4> como salidas
;RB<7:6> como entradas

187

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 11-3: Resumen De Entradas-Salidas Del PORTB


Pin

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)

GUILLERMO DAVID HERRERO GONZLEZ

KBI0

entrada

salida

salida

entrada

KBI1

entrada

PGM

entrada

Buffer de
entrada Schmitt

Modo de programacin de suministro nico (ICSP).


Activo por el bit LVP; todas las funciones de los dems
pines desactivadas.

salida

salida digital

LATB<6> salida de datos.

entrada

Buffer de
entrada TTL

PORTB<6> entrada de datos; cuando el bit RBPU se


borre, poca resistencia.

KBI2

entrada

Buffer de
entrada TTL

Interrupcin al cambiar.

PGC

entrada

Buffer de
entrada Schmitt

Reloj de entrada serie para operaciones ICSP e ICD.(3)

salida

salida digital

LATB<7> salida de datos.

entrada

Buffer de
entrada TTL

PORTB<7> entrada de datos; cuando el bit RBPU se


borre, poca resistencia.

entrada

Buffer de
entrada TTL

Interrupcin al cambiar.

salida

salida digital

Salida serie de datos para operaciones ICSP e ICD.(3)

entrada

Buffer de
entrada Schmitt

Entrada serie de datos para operaciones ICSP e ICD.(3)

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.

Nota 1: Configuracin en el POR determinada por el bit PBADEN. Los pines


se configuran como entradas analgicas cuando el bit PBADAN est activo y entradas
digitales cuando est borrado.
2: Seleccin de pin alternativo de CCP2 cuando CCP2MX = 0. La
seleccin natural es RC1.
3: Todas las funciones de los pines estn desactivadas cuando ICSP o
ICD se activan.
4: Slo en los dispositivos de 40/44-pines.

189

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 11-4: Resumen De Los Registros Asociados Al PORTB


Nombre

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

Leyenda: = no implementado, se lee como 0. Las celdas sombreadas no se


utilizan para el PORTB.
Nota: Estos registro son solo para los dispositivos de 28pines.

190

GUILLERMO DAVID HERRERO GONZLEZ

3.4.11.3.

Registros PORTC, TRISC Y LATC

El PORTC es un puerto bidireccional de 7bits de ancho. El registro de la


direccin de los datos es TRISC. Activar el bit TRISC (=1) har que el pin
correspondiente de PORTC sea una entrada (es decir, pone el conductor correspondiente
de la salida en un modo alta impedancia). Borrar un bit de TRISC (=0) hace que el pin
correspondiente de PORTC sea una salida (es decir, pone el contenido del latch de
salida en el pin seleccionado).
En los dispositivos PIC18F2455/2550/4455/4550, el pin RC3 no est
implementado.
El registro del latch de datos (LATC) slo es memoria mapeada. Las
operaciones de lectura-modificacin-escritura en el registro LATC lee y escribe el valor
del latch de salida del PORTC.
PORTC se multiplexa sobre todo con los mdulos de comunicacin serie,
incluyendo el EUSART, el mdulo MSSP y el mdulo USB. A excepcin de RC4 y
RC5, el PORTC utiliza buffer de disparo de entrada Schmitt.
Los pines RC4 y RC5 se multiplexan con el mdulo USB. Dependiendo de la
configuracin del mdulo, pueden servir como las lneas de datos diferenciales para el
transmisor-receptor del USB del chip, o las entradas de datos del transmisor-receptor
del USB externo. RC4 y RC5, el PORTC tiene buffer de entrada TTL en lugar de los
buffer Schmitt de los otros pines.
RC4 y RC5 no tienen bits de TRISC asociados a ellos. Como puertos digitales,
slo pueden funcionar como entradas digitales. Cuando se configura para operaciones
con USB, la direccin de los datos se determina por la configuracin y el estado del
mdulo USB en ese momento. Si se utiliza un transmisor-receptor externo, siempre
funcionarn RC4 y RC5 como entradas del transmisor-receptor. Si se utiliza el
transmisor-receptor del chip, la direccin de los datos se determina por la operacin que
se realiza por el mdulo en el momento.
Cuando se permite el transmisor-receptor externo, RC2 sirve como la salida de
control del transmisor-receptor.
Al permitir funciones perifricas en los pines de PORTC con excepcin de RC4
y de RC5, hay que tener cuidado al definir los bits de TRIS. Algunos perifricos
eliminan el bit TRIS para configurar un pin como salida, mientras que otros perifricos
activan el bit TRIS para configurar un pin como entrada.
Nota: En un reset por subida de tensin, estos pines, excepto RC4 y RC5, se
configuran como entradas digitales. Para utilizar los pines RC4 y RC5 como entradas
digital, el mdulo USB debe desactivarse (UCON<3>=0) y en el chip el transmisorreceptor del USB debe desactivarse tambin (UCFG<3>=1).
El contenido del registro de TRISC afectado por el perifrico se elimina. La
lectura de TRISC siempre devuelve el contenido actual, aun cuando un dispositivo
perifrico puede eliminar uno o ms pines.

191

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 11-3: Inicializacin Del PORTC


CLRF PORTC
CLRF LATC
MOVLW 07h
MOVWF TRISC

;Inicializar PORTC borrando los latch de salida de datos


;Otra mtodo para borrar los latch de salida
;Valor usado para inicializar las direcciones de los datos
;Activa RC<5:0> como salidas
;RC<7:6> como entradas

TABLA 11-5: Resumen De Entradas-Salidas Del PORTC


Pin

RC0/T1OS
O/
T13CKI

Funcin

Ajustes
del TRIS

E/S

Tipo de E/S

Descripcin

RC0

LATC<0> salida de datos.

salida digital
Buffer de
entrada Schmitt

T1OSO

T13CKI

seal analgica

Entrada del oscilador Timer1; activo cuando se active el oscilador Timer1.


Desactiva las E/S digitales.

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

Entrada del contador Timer1/Timer3.


LATC<1> salida de datos.
PORTC<1> entrada de datos.

Buffer de
entrada Schmitt
salida digital

Entrada de captura CCP2.

S
S

salida digital

Salida del comparador ECCP1 y del PWM output; tiene prioridad sobre el
puerto de datos.

Buffer de
entrada Schmitt

Entrada de captura ECCP1.

P1A(3)

salida digital

Salida ECCP1 y PWM mejorado, canal A; tiene prioridad sobre el puerto


de datos. Tiene que configurarse como triestado durante los eventos de
cada del PWM mejorado.

RC4

(2)

Buffer de
entrada TTL

PORTC<4> entrada de datos; desactivado cuando el modulo transmisor


del USB del chip est activo.

(2)

transmisor USB

(2)

transmisor USB

VM

(2)

Buffer de
entrada TTL

Entrada del USB VM externo.

RC5

(2)

Buffer de
entrada TTL

PORTC<5> entrada de datos; desactivado cuando el modulo transmisor


del USB del chip est activo.

(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 del transmisor OE externo del USB.

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

PORTC<0> entrada de datos.

LATC<2> salida de datos.


PORTC<2> entrada de datos.

Lnea de salida del bus USB diferencial negativo USB (transmisor


interno).
Lnea de entrada del bus USB diferencial negativo USB (transmisor
interno).

Buffer de
entrada TTL
salida digital
Buffer de
entrada Schmitt

Entrada del USB VP externo.


LATC<6> salida de datos.
PORTC<6> entrada de datos.

192

GUILLERMO DAVID HERRERO GONZLEZ

TX

salida digital

Salida de transmisin serie asncrona (mdulo EUSART); tiene prioridad


sobre el puerto de datos. El usuario tiene que configurarla como salid.

salida digital

Salida de transmisin serie sncrona (mdulo EUSART); tiene prioridad


sobre el puerto de datos.

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

Entrada del reloj serie sncrono (Mdulo EUSART).


PORTC<7> salida de datos
PORT<7> entrada de datos
Entrada de datos del receptor serie asncrono (mdulo EUSART).
Salida serie de datos sncrona (modulo EUSART); tiene prioridad sobre
SPI y el puerto de datos.
Entrada de datos serie sncrona (mdulo EUSART). El usuario tiene que
configurarla como entr.
Salida de datos SPI (mdulo MSSP); tiene prioridad sobre el puerto de
datos.

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

Leyenda: = no implementado, se lee como 0. Las celdas sombreadas no se


utilizan para el PORTC.
Nota 1: RC5 y RC4 estn solamente disponibles como puertos cuando el
mdulo del USB est desactivado (UCON<3> = 0).

193

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.11.4.

Registros PORTD, TRISD Y LATD

Nota: El PORTD solamente est disponible en dispositivos de 40/44pines.


El PORTD es un puerto bidireccional de 8bits de ancho. El registro de la
direccin de los datos es TRISD. Activar el bit TRISD (=1) har que el pin
correspondiente de PORTD sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISD (=0)
hace que el pin correspondiente de PORTD sea una salida (es decir, pone el contenido
del latch de salida en el pin seleccionado).
El registro del latch de datos (LATD) slo es memoria mapeada. Las
operaciones de lectura-modificacin-escritura en el registro LATD lee y escribe el valor
del latch de salida del PORTD.
Todos los pines del PORTD estn implementados con buffer de entrada de
disparadores Schmitt. Cada pin se puede configurar independientemente como entrada o
salida.
Cada uno de los pines de PORTD tiene un pull-up interno. Un solo bit de control
puede cambiar todo el pull-up. Esto se realiza borrando el bit, RDPU (PORTE<7>). El
pull-up cambia automticamente cuando el pin se configura como salida. Se inhabilita
el pull-up en un reinicio.
Tres de los pines de PORTD se multiplexan con salidas, P1B, P1C y P1D, del
mdulo CCP.
Nota: En un reset por subida de tensin estos pines se configuran como entrada
de datos digital.
El PORTD tambin se puede configurar como un puerto paralelo (SPP) de 8bits
de ancho. En este modo, los Buffers de entrada son TTL.
Nota: Cuando se utiliza el modo PWM mejorado con salidas dobles o
cudruples, las funciones del MSSP en el PORTD se desactivan automticamente.
EJEMPLO 11-4: Inicializacin Del PORTD
CLRF PORTD
CLRF LATD
MOVLW 0C7h
MOVWF TRISD

; Inicializar PORTD borrando los latch de salida de datos


;Otra mtodo para borrar los latch de salida
;Valor usado para inicializar las direcciones de los datos
;Activa RD<3:0> como entradas
;RD<5:4> como salidas
;RD<7:6> como entradas

194

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 11-7: Resumen De Entradas-Salidas Del PORTD


Pin

Funcin

RD0
RD0/SPP0

Ajustes
del TRIS

E/S

Tipo de E/S

Descripcin

salida

LATD<0> salida de datos.

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

PORTD<1> entrada de datos.


SPP<1> salida de datos; tiene prioridad sobre el puerto de
datos.
SPP<1> entrada de datos.
LATD<2> salida de datos.
PORTD<2> entrada de datos.
SPP<2> salida de datos; tiene prioridad sobre el puerto de
datos.
SPP<2> entrada de datos.
LATD<3> salida de datos.
PORTD<3> entrada de datos.
SPP<3> salida de datos; tiene prioridad sobre el puerto de
datos.

entrada

salida

entrada

salida

entrada

salida

entrada

salida

Salida digital

SPP<5> salida de datos; tiene prioridad sobre el puerto de


datos.

entrada

Buffer de
entrada TTL

SPP<5> entrada de datos.

salida

Salida digital

Salida ECCP1 y PWM mejorado, canal B; tiene prioridad


sobre el puerto de datos. (1)

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

SPP<3> entrada de datos.


LATD<4> salida de datos.
PORTD<4> entrada de datos.
SPP<4> salida de datos; tiene prioridad sobre el puerto de
datos.
SPP<4> entrada de datos.
LATD<5> salida de datos
PORTD<5> entrada de datos

LATD<6> salida de datos.


PORTD<6> entrada de datos.

salida

Salida digital

SPP<6> salida de datos; tiene prioridad sobre el puerto de


datos.

entrada

Buffer de
entrada TTL

SPP<6> entrada de datos.

salida

Salida digital

Salida ECCP1 y PWM mejorado, canal C; tiene prioridad


sobre el puerto de datos. (1)

salida

entrada

Salida digital
Buffer de
entrada Schmitt

SPP6

P1C

Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt

LATD<1> salida de datos.

SPP5

P1B

Salida digital

SPP<0> entrada de datos.

salida

SPP4

RD5

Buffer de
entrada TTL
Salida digital
Buffer de
entrada Schmitt

1
SPP3

RD4

Salida digital

PORTD<0> entrada de datos.


SPP<0> salida de datos; tiene prioridad sobre el puerto de
datos.

195

LATD<7> salida de datos.


PORTD<7> entrada de datos.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

salida

Salida digital

SPP<7> salida de datos; tiene prioridad sobre el puerto de


datos.

entrada

Buffer de
entrada TTL

SPP<7> entrada de datos.

salida

Salida digital

Salida ECCP1 y PWM mejorado, canal D; tiene prioridad


sobre el puerto de datos. (1)

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

Leyenda: = no implementado, se lee como 0. Las celdas sombreadas no se


utilizan para el PORTD.
Nota 1: Implementado solamente cuando la funcin Master Clean est
desactivada (configuracin del bit MCLRE=0).
2: RE3 es el nico bit PORTE implementado en los dispositivos de 28 y
40/44pines. El resto de los bits se implementan cuando lo est el PORTE (es decir, en
los dispositivos 40/44pines).
3: Estos registros y/o bits no estn implementados en los dispositivos de
28pines.

196

GUILLERMO DAVID HERRERO GONZLEZ

3.4.11.5.

Registros PORTE, TRISE Y LATE

Dependiendo del PIC18F2455/2550/4455/4550 seleccionado, el PORTE se pone


en ejecucin en dos maneras diferentes.
Para los dispositivos 40/44pines, el PORTE es un puerto de 4bits de ancho. Tres
pines (RE0/AN5/CK1SPP, RE1/AN6/CK2SPP y RE2/AN7/OESPP) se configuran
individualmente como entradas o salidas. Estos pines tienen buffer de entrada tipo
disparador Schmitt. Cuando se seleccionan como entrada analgica, stos pines se
leern como 0s.
El registro de direccin de los datos es TRISE. Activar el bit TRISE (=1) har
que el pin correspondiente de PORTE sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISE (=0)
hace que el pin correspondiente de PORTE sea una salida (es decir, pone el contenido
del latch de salida en el pin seleccionado).
Adems de los datos del puerto, el registro PORTE tambin contiene el bit de
control RDPU (PORTE<7>); esto permite o inhabilita el pull-up del PORTD.
TRISE controla la direccin de los pines RE, incluso cuando se utilizan como
entradas analgicas. El usuario debe cerciorarse de mantener los pines configurados
como entradas cuando use las analgicas.
Nota: En un reset por subida de tensin, RE2:RE0 se configuran como entradas
analgicas.
El registro del latch de datos (LATE) slo es memoria mapeada. Las operaciones
de lectura-modificacin-escritura en el registro LATE lee y escribe el valor del latch de
salida del PORTE.
El cuarto pin PORTE (MCLR*/VPP/RE3) slo es un pin de entrada. Su
operacin se controlada con el bit de configuracin MCLRE. Cuando se selecciona
como puerto (MCLRE = 0), funciona como una entrada digital; como tal, no tiene bits
TRIS o LAT asociados. Si no, funciona como entrada Master Clear del dispositivo. En
cualquier configuracin, RE3 tambin funciona como entrada de tensin de
programacin.
Nota: En un reset de subida de tensin, se activa RE3 como una entrada digital
solamente si la funcin de Master Clear est desactivada.

197

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 11-5: Inicializacin De PORTE


CLRF PORTE
CLRF LATE
MOVLW 0Ah
MOVWF ADCON1
MOVLW 03h
MOVLW 07h
MOVWF CMCON
MOVWF TRISE

3.4.11.5.1.

;Inicializar PORTE borrando los latch de salida de datos


;Otra mtodo para borrar los latch de salida
;Configura A/D como entradas digitales
;Valor usado para inicializar las direcciones de los datos
;Desactiva los comparadores
;Activa RE<0> como entradas
;RE<1> como salidas
;RE<2> como entradas

PORTE En Los Dispositivos De 28-PIN

En los dispositivos de 28pines, el PORTE slo est disponible cuando el Master


Clear est desactivado (MCLRE = 0). En stos los casos, PORTE son de un solo bit,
puerto de entrada de RE3 solamente. El pin funciona segn lo descrito previamente.
REGISTRO 11-1: Registro PORTE
BIT 7

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:

Bit activador del pull-up del PORD:


1= Pull-up activado
0= Pull-up desactivado
Bits de entrada de datos del PORTE(1,2,3)

Nota 1: puesto en ejecucin solamente cuando la funcionalidad clara principal


es lisiada (configuracin de MCLRE mordida = 0); si no, leer como `0'.
2: RE3 es el nico bit de PORTE implementado todos los dispositivos. El
resto de los bits slo se implementan en los dispositivos de 40/44pines.
3: No implementado en los dispositivos de 28pines; se lee 0.

198

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 11-9: Resumen De Entradas-Salidas Del PORTE


Pin

Ajustes
del TRIS

E/S

Tipo de E/S

salida

Salida digital

entrada

Buffer de
entrada
Schmitt

PORTE<0> entrada de datos; desactivado cuando se activan las


entradas analgicas.

AN5

entrada

Seal
analgica

Entrada A/D canal 5; configuracin por defecto en un POR.

CK1SPP

salida

Salida digital

Salida SPP reloj 1 (SPP activo).

salida

Salida digital

LATE<1> salida de datos; no le afectan las entradas analgicas.

entrada

Buffer de
entrada
Schmitt

PORTE<1> entrada de datos; desactivado cuando se activan las


entradas analgicas.

AN6

entrada

Seal
analgica

Entrada A/D Canal 6; configuracin por defecto en un POR.

CK2SPP

salida

Salida digital

Salida SPP reloj 2 (SPP activo).

salida

Salida digital

LATE<2> salida de datos; no le afectan las entradas analgicas.

entrada

Buffer de
entrada
Schmitt

PORTE<2> entrada de datos; desactivado cuando se activan las


entradas analgicas.

AN7

entrada

Seal
analgica

Entrada A/D canal 7; configuracin por defecto en un POR.

OESPP

salida

Salida digital

MCLR*

(1)

entrada

Buffer de
entrada
Schmitt

Entrada externa Clear; activa cuando el bit MCLRE est activo.

VPP

(1)

entrada

Seal
analgica

Deteccin de alta tensin, utilizado en el modo de deteccin de


entrada ICSP. Siempre disponible sin importar el modo del pin.

RE3

(1)

entrada

Buffer de
entrada
Schmitt

PORTE<3> entrada de datos; activo cuando el bit de configuracin


MCLRE est borrado.

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.

Salida active SPP (SPP activo).

Nota 1: RE3 no tiene un bit correspondiente TRISE<3>. Este pin es siempre


una entrada sin importar modo.

199

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 11-10: El Resumen De Registros Asociados Al PORTE


Nombre

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

Leyenda: = no implementado, se lee como 0. Las celdas sombreadas no se


utilizan para el PORTE.
Nota 1: Implementado slo cuando la funcin Master Clear est desactivada
(configuracin del bit MCLRE=0).
2: RE3 es el nico bit de PORTE implementado en todos los
dispositivos. Se implementan el resto de los bits solamente cuando se pone en ejecucin
PORTE (es decir, los dispositivos 40/44-pin).
3: Estos registros o bits no estn implementados en los dispositivos de 28
el pin.

200

GUILLERMO DAVID HERRERO GONZLEZ

3.4.12.

MDULO TIMER0

El mdulo Timer0 incorpora las siguientes caractersticas:

Contador de 8bits 16bits seleccionable por software


Registros legibles y escribibles
8 bits dedicados al prescaler programable por software
Fuente de reloj (interno o externo) seleccionable
Flanco seleccionable del reloj externo
Interrupcin por desbordamiento

El registro de T0CON controla todos aspectos de operacin del mdulo,


incluyendo seleccin del prescaler. Es legible y escribible.
REGISTRO 12-1: T0CON: Registro De Control TIMER0
BIT 7

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:

Bit de control para activar el Timer0


1 = permite Timer0
0 = no permite Timer0
T08BIT:
Bit de seleccin del Timer0 de 8-Bit/16-Bit
1 = Timer0 se configura como contador de 8 bits
0 = Timer0 se configura como contador de 16 bits
T0CS:
Bit selector de la fuente del reloj Timer0
1 = reloj en el pin T0CKI
0 = reloj interno del ciclo de la instruccin (CLKO)
T0SE:
Bit selector del flanco de la fuente Timer0
1 = incremento en el flanco de bajada del pin T0CKI
0 = incremento en el flanco de subida del pin T0CKI
PSA:
Bit de la asignacin del prescaler del Timer0
1 = el prescaler Timer0 no se asigna.
0 = se asigna el prescaler Timer0
T0PS2:T0PS0: Bits selectores del prescaler del Timer0
111 = valor de 1:256
110 = valor de 1:128
101 = valor de 1:64
100 = valor de 1:32
011 = valor de 1:16
010 = valor de 1:8
001 = valor de 1:4
000 = valor de 1:2

201

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.12.1.

Operaciones Del TIMER0

Timer0 puede funcionar como un temporizador o contador; el modo se


selecciona borrando el bit T0CS (T0CON<5>). En modo temporizador, el mdulo se
incrementa en cada pulso del reloj a menos que se seleccione un prescaler. Si el registro
TMR0 se escribe, se inhibe el incremento en los dos ciclos siguientes de la instruccin.
El usuario puede trabajar con esto escribiendo un valor al registro TMR0.
El modo contador se selecciona activando el bit T0CS (=1). En este modo, el
Timer0 se incrementa en cualquier flanco de subida o de bajada del pin RA4/T0CKI. El
flanco se determina por el pin T0SE (T0CON<4>); borrando este bit se selecciona el
flanco de subida.
Se puede utilizar una fuente de reloj externa para controlar el Timer0; sin
embargo, debe cumplir ciertos requisitos para asegurarse que el reloj externo se
sincronice con reloj interno de fase (TOSC). Hay un retraso en la sincronizacin y el
inicio del incremento del temporizador/contador.

3.4.12.2.

Lecturas Y Escrituras Del Timer0 En Modo De 16BITS

TMR0H no es el byte alto real del Timer0 en el modo de 16 bits. Realmente, es


una versin protegida del verdadero byte alto del Timer0 que no se puede leer ni
escribir directamente. TMR0H se actualiza con el contenido del byte alto de Timer0
durante la lectura del TMR0L. Esto proporciona la capacidad de leer los 16 bits de
Timer0 sin tener que verificar que la lectura del byte alto y del bajo son correctas,
debido a las lecturas sucesivas del byte bajo y del alto.
El byte alto del Timer0 se escribe a travs del registro intermediario del
TMR0H. El byte alto se actualiza con el contenido del TMR0H cuando se escribe el
TMR0L. Esto permite que los 16 bits del Timer0 se actualicen inmediatamente.
FIGURA 12-1: Diagrama Del Timer0 (Modo 8-Bit)

Nota: En el reset, Timer0 se activa en modo de 8 bits con la entrada de reloj


T0CKI y el prescaler al mximo.

202

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 12-2: Diagrama Del Timer0 (Modo 16-Bit)

Nota: En el reset, Timer0 se activa en modo de 8 bits con la entrada de reloj


T0CKI y el prescaler al mximo.

3.4.12.3.

Prescaler

Estos micros disponen de un contador de 8bit como prescaler para el mdulo


Timer0. El prescaler no se puede leer o escribir directamente; su valor se fija con los
bits PSA y T0PS2:T0PS0 (T0CON<3: 0>), los cules determinan el divisor del
prescaler y la asignacin del prescaler.
Borrar el bit PSA asigna el prescaler al Mdulo Timer0. Cuando se activa, los
valores del prescaler van de 1:2 a 1:256, con incrementos de potencias de 2.
Cuando est activo el mdulo Timer0, todas las instrucciones que escriben en l
(ej., CLRF TMR0, MOVWF, TMR0, BSF TMR0, etc.) se borra el prescaler.
Nota: Al escribir el TMR0 cuando el prescaler est asignado al Timer0 lo
despejar pero no cambiar su asignacin.

3.4.12.3.1.

Conmutacin En La Asignacin Del Prescaler

La asignacin del prescaler se controla completamente bajo software y se puede


cambiar en marcha durante la ejecucin del programa.

3.4.12.4.

Interrupcin Timer0

Se genera la interrupcin TMR0 cuando se desborda de FFh a 00h en modo de 8


bits, o de FFFFh a 0000h en modo de 16 bits. Este desbordamiento activa el flag
TMR0IF. La interrupcin se puede enmascarar al borrar el bit TMR0IE (INTCON<5>).
Antes de volver a permitir la interrupcin, el bit TMR0IF debe borrarse por software en
la rutina de la interrupcin.
Como el Timer0 se desconecta en el modo sleep, su interrupcin no puede
despertar el dispositivo.

203

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 12-1: Registros Asociados Al Timer0


Nombre

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

TMR0L

Timer0 Register Low Byte

TMR0H

Timer0 Register High Byte

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

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con Timer0.
Nota 1: Se configura RA6 como un puerto basado en varios modos primarios
del oscilador. Cuando el puerto se desactiva, todos los bits asociados leen 0.

204

GUILLERMO DAVID HERRERO GONZLEZ

3.4.13.

MDULO TIMER1

El mdulo
caractersticas:

temporizador/contador

Timer1

incorpora

las

siguientes

Temporizador/contador de 16bits seleccionable por software.


Registros legibles y escribibles de 8 bits (TMR1H y TMR1L)
Fuente seleccionable de reloj (interna o externa) con opciones del reloj o
del oscilador interno Timer1 del dispositivo
Interrupcin por desbordamiento
El mdulo reset en un evento especial de disparo del CCP
Flag de estado del reloj del dispositivo (T1RUN)
El mdulo incorpora su propio oscilador de baja potencia para proporcionar una
opcin de registro adicional. El oscilador Timer1 se puede utilizar como fuente de baja
potencia de reloj para el microcontrolador en las operaciones de ahorro de energa.
El Timer1 se puede utilizar para proporcionar la funcionalidad del reloj en
tiempo real (RTC) en las aplicaciones con un mnimo de componentes externos y de
cdigo.
El Timer1 se controla con el registro T1CON. Tambin contiene el bit de
permiso del oscilador Timer1 (T1OSCEN). El Timer1 puede permitirse o inhabilitarse
activando o borrando el bit de control, TMR1ON (T1CON<0>).

205

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 13-1: T1CON: Registro De Control Del Timer1


BIT 7

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:

Bit de permiso de la lectura/escritura en el modo de 16-Bit


1 = permite la lectura/escritura del Timer1 en una operacin
de 16bits
0 = permite lectura/escritura del Timer1 en dos operaciones
de 8bits
T1RUN:
Bit de estado del reloj del sistema Timer1
1 = reloj del dispositivo se deriva del oscilador Timer1
0 = reloj del dispositivo se deriva de otra fuente
T1CKPS1: T1CKPS0: Bits de seleccin del prescaler del Timer1
11 = valor de 1:8
10 = valor de 1:4
01 = valor de 1:2
00 = valor de 1:1
T1OSCEN: Bit de permiso del oscilador Timer1
1 = se permite el oscilador Timer1
0 = se desconecta el oscilador Timer1
El inversor del oscilador y la resistencia de regeneracin
se apagan para eliminar la energa de drenaje.
T1SYNC*:
Bit de seleccin de la sincronizacin externa con el Timer1
Cuando TMR1CS = 1:
1 = no sincroniza la entrada de reloj externa
0 = sincroniza la entrada de reloj externa
Cuando TMR1CS = 0:
Se no hace caso este bit. Timer1 utiliza el reloj interno
cuando TMR1CS = 0.
TMR1CS:
Bit de seleccin de la fuente del reloj del Timer1
1 = reloj externo en el pin RC0/T1OSO/T13CKI (en el flanco
de subida)
0 = reloj interno (FOSC/4)
TMR1ON:
Bit de activacin del Timer1
1 = permite Timer1
0 = para el Timer1

206

GUILLERMO DAVID HERRERO GONZLEZ

3.4.13.1.

Operaciones Del Timer1

Timer1 puede funcionar en uno de estos modos:


Temporizador
Contador sncrono
Contador asincrnico
El modo de funcionamiento se determina con el bit de seleccin TMR1CS
(T1CON<1>). Cuando se borra TMR1CS (=0), incrementos del Timer1 en cada
instruccin interna (FOSC/4). Cuando se activa el bit, los incrementos Timer1 en cada
flanco de subida de la entrada del reloj externa Timer1 o del oscilador Timer1, si est
activo.
Cuando se permite el Timer1, los pines RC1/T1OSI/UOE y
RC0/T1OSO/T13CKI se convierten en entradas. Esto significa que se ignoran los
valores de TRISC<1:0> y los pines se leen como 0.
FIGURA 13-1: Diagrama Del Timer1

Nota 1: Cuando el bit de permiso, T1OSCEN, se borra, el inversor del oscilador


y la resistencia de regeneracin se apagan para eliminar la energa de drenaje.

3.4.13.2.

Modo De Lectura/Escritura De 16-Bit Del Timer1

Timer1 se puede configurar para lecturas/escrituras de 16bits. Cuando el bit de


control RD16 (T1CON<7>) se activa, la direccin del TMR1H se mapea con un
registro del almacenamiento intermedio del byte alto del Timer1. Al leer el TMR1L
cargar el contenido del byte alto del Timer1 en el byte alto del Buffer del Timer1. Esto
proporciona al usuario la capacidad de leer exactamente los 16 bits de Timer1 sin tener
que determinar si lee el byte alto, seguido del byte bajo, se volver invlido debido a las
lecturas redundantes.
Al escribir el byte alto del Timer1 debe pasar a travs del registro de
almacenamiento intermedio de TMR1H. El byte alto del Timer1 se actualiza con el
contenido de TMR1H cuando se escribe el TMR1L. Esto permite que el usuario escriba
los 16 bits a los bytes altos y bajos del Timer1 inmediatamente.

207

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

No se puede leer o escribir el byte alto de Timer1 directamente en este modo.


Toda lectura y escritura debe hacerse a travs del registro de almacenamiento
intermedio. Al escribir el TMR1H no se borra el prescaler del Timer1. El prescaler se
borra solamente escribiendo el TMR1L.
FIGURA 13-2: Diagrama Del Timer1 (Modo De Lectura/Escritura De 16-Bit)

Nota 1: Cuando el bit de permiso, T1OSCEN, se borra, el inversor del oscilador


y la resistencia de regeneracin se apagan para eliminar la energa de drenaje.

3.4.13.3.

Oscilador Timer1

Se incorpora un circuito oscilador de XTAL en el chip entre los pines T1OSI


(entrada) y T1OSO (amplificador de salida). Se permite el oscilador Timer1 activando
el bit, T1OSCEN (T1CON<3>). El oscilador es un circuito de baja potencia para
cristales de 32kHz. Continua funcionando en cualquier modo de ahorro energa.
El usuario debe proporcionar por software el retraso para asegurar el inicio
apropiado del oscilador Timer1.
FIGURA 13-3: Componentes Externos Del Oscilador De Timer1

208

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 13-1: Seleccin Del Condensador Del Oscilador Del Temporizador

3.4.13.3.1.

Osc

Freq

C1

C2

LP

32 kHz

27 pF

27 pF

Usar Timer1 como Fuente De Reloj

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.

Opcin De Baja Potencia Timer1

El oscilador Timer1 puede funcionar en dos niveles distintos de consumo de


energa basado en la configuracin de dispositivo. Cuando se setea el bit de
configuracin LPT1OSC, el oscilador Timer1 funciona en un modo de baja potencia.
Cuando LPT1OSC no se activa, el Timer1 funciona en un nivel de energa ms alto. El
consumo de energa para un modo particular es relativamente constante, sin importar el
modo del dispositivo. La configuracin por defecto del Timer1 es el modo de energa
ms alto.
Como el modo de baja potencia Timer1 tiende a ser ms sensible a las
interferencias, los ambientes con mucho de ruido pueden causar una cierta inestabilidad
del oscilador. La opcin de baja potencia es, por tanto, ms adecuada en aplicaciones de
poco ruido donde la conservacin de energa es una consideracin de diseo importante.

3.4.13.3.3.

Consideraciones Del Layout Del Oscilador Timer1

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 13-4: Circuito Del Oscilador De Puesta A Tierra

Nota: No est dibujado a escala.

3.4.13.4.

Interrupcin Timer1

El par de registros TMR1 (TMR1H:TMR1L) incrementan de 0000h a FFFFh y


vuelve a 0000h. La interrupcin Timer1, si est permitida, se genera en el
desbordamiento que activa el flag de la interrupcin, TMR1IF (PIR1<0>). Esta
interrupcin se puede permitir o inhabilitar activando o borrando el bit, TMR1IE
(PIE1<0>).

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.13.6.

Usar Timer1 como Reloj De Tiempo Real (RTC)

Aadiendo un oscilador externo al Timer1 da a los usuarios la opcin de incluir


aplicaciones en tiempo real. Esto se logra con un cristal de reloj para proporcionar una
frecuencia exacta de base y varias lneas de cdigo de la aplicacin para calcular el
tiempo. Al funcionar en modo sleep y con batera o sper condensador como fuente de
energa, puede eliminar la necesidad de un RTC separado y una batera de reserva.
La rutina del cdigo, RTCisr, demuestra un mtodo simple para incrementar un
contador en intervalos de un segundo usando una rutina de interrupcin. Incrementando
el par de registros TMR1 para desbordarlo y provocar la llamada de la interrupcin, que
incrementa el segundo contador en uno. Los contadores adicionales para minutos y
horas se incrementan al desbordar el contador anterior.
Puesto que el par del registro es de 16 bits de ancho, contando hasta que se
desborde el registro directamente con un reloj de 32,768kHz tardara 2s. Para forzar el
desbordamiento en intervalos de un segundo, es necesario cargar el temporizador. El
mtodo ms simple es fijar el MSb TMR1H con una instruccin BSF. Observar que el
registro TMR1L nunca se carga o se altera; el hacerlo, puede introducir un error
acumulativo sobre muchos ciclos.
Para que este mtodo sea exacto, el Timer1 debe funcionar en modo asncrono y
la interrupcin del desbordamiento Timer1 debe estar permitida (PIE1<0>=1) segn las
indicaciones de rutina, RTCinit. El oscilador Timer1 tiene que estar permitido y
funcionando siempre.

211

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

EJEMPLO 13-1: Poner Un Reloj En Ejecucin En Tiempo Real Usando La


Interrupcin Timer1
RTCinit

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

;Carga del par de registros TMR1


;para desbordamiento en 1 segundo
;Configurar el reloj externo,
;Operacin asncrono, oscilador externo
;Inicializar los registros para la puntualidad

;Permitir la interrupcin Timer1

;Carga para desbordamiento de 1s


;Flag de interrupcin borrado
;Incremento de segundos
;Transcurrieron 60 segundos?
;No
;Si, Borrar segundos
;Incremento minutos
;Transcurrieron 60 minutos?
;No
;Si, borrado de minutos
;Incremento de horas
;Transcurrieron 24 horas?
;No
;Si, Reset de las horas a 1
;Hecho

212

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 13-2: Registros Asociados Al Timer1 Como Temporizador/Contador


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

T1SYNC*

TMR1CS

TMR1ON

TMR1L

Timer1 Register Low Byte

TMR1H

Timer1 Register High Byte

T1CON

RD16

T1RUN

T1CKPS1

T1CKPS0

T1OSCEN

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con Timer0.
Nota 1: Estos bits no estn implementados en los dispositivos de 28pines;
mantenerlos siempre borrados.

3.4.14.

MDULO TIMER2

El temporizador Timer2 incorpora las siguientes caractersticas:


Registros temporizador y perodo de 8bit (TMR2
respectivamente)
Legible y escribible (ambos registros)
Prescaler programable por software (1: 1, 1:4 y 1:16)
Postscaler programable por software (1: 1 a 1:16)
Interrupcin en TMR2 unida al PR2
Uso opcional como reloj del cambio para el mdulo MSSP

PR2,

El mdulo se controla a travs del registro T2CON que permite o inhabilita el


temporizador y configura el prescaler y el postscaler. El Timer2 se puede apagar
borrando el bit de control, TMR2ON (T2CON<2>), para reducir al mnimo el consumo
de energa.

213

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 14-1: Diagrama De Bloques Del Timer2

3.4.14.1.

Operaciones Del Timer2

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

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 14-1: T2CON: Registro De Control Timer2


BIT 7

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

1111 = 1:16 Postscaler


TMR2ON:
Bit de activacin del Timer2
1 = Timer2 est encendido
0 = Timer2 est apagado
T2CKPS1:T2CKPS0:
Bits selectores del Prescaler del reloj
00 = Prescaler de 1
01 = Prescaler de 4
1x = Prescaler de 16

Interrupcin Timer2

Timer2 puede generar una interrupcin opcional en el dispositivo. La seal de


salida Timer2 (TMR2 unida con PR2) proporciona la entrada para el
contador/postscaler de salida de 4 bits. Este contador genera el flag de interrupcin del
TMR2 que est en TMR2IF (PIR1<1>). La interrupcin se permite activando el bit de la
interrupcin, TMR2IE (PIE1<1>). Una gama de 16 postscaler (de 1:1 a 1:16 inclusivo)
puede seleccionarse con los bits de control, T2OUTPS3:T2OUTPS0 (T2CON<6:3>).

3.4.14.3.

Salida Del TMR2

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 14-1: Los Registros


Temporizador/Contador

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

Timer2 Period Register

Leyenda: - = no implementado, se lee como 0. Las celdas sombreadas no las


utiliza por mdulo Timer2.
Nota 1: Estos bits no estn implementados en los dispositivos de 28pines;
mantenerlos siempre borrados.

3.4.15.

MDULO TIMER3

El mdulo
caractersticas:

Timer3

temporizador/contador

incorpora

las

siguientes

Temporizador de 16bits o contador seleccionable por software


Registros legibles y escribibles de 8bits (TMR3H y TMR3L)
Fuente seleccionable de reloj (interna o externa) con opciones internas
del reloj o del oscilador Timer1
Interrupcin del dispositivo al desbordarse
El mdulo de reset en un disparo especial del CCP
El mdulo Timer3 es controlado con el registro T3CON. Tambin selecciona la
fuente del reloj opciones para los mdulos de CCP.

216

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 15-1: T3CON: Registro De Control Del Timer3


BIT 7

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:

Bit de permiso del modo de lectura/escritura de 16Bits


1 = permite la lectura/escritura del Timer3 en una
operacin de 16 bits
0 = permite la lectura/escritura del Timer3 en dos
operaciones de 8 bits
T3CCP2:T3CCP1: Bits de permiso del Timer3 y Timer1 al CCPx
1x = Timer3 es la fuente del reloj para los mdulos CCP
01 = Timer3 es la fuente del reloj para CCP2; y el
Timer1 para CCP1
00 = Timer1 es la fuente del reloj para ambos CCP
T3CKPS1:T3CKPS0: Bits selectores del Prescaler del reloj de entrada
11 = Prescaler de 1:8
10 = Prescaler de 1:4
01 = Prescaler de 1:2
00 = Prescaler de 1:1
T3SYNC*:
Bit de control de la sincronizacin del reloj externo
(No se puede usar cuando el reloj del dispositivo
es Timer1/Timer3.)
Cuando TMR3CS = 1:
1 = no sincroniza la entrada de reloj externa
0 = sincroniza la entrada de reloj externa
Cuando TMR3CS = 0:
Se ignora este bit. Timer3 utiliza el reloj.
TMR3CS:
Bit selector de la fuente de reloj del Timer3
1 = entrada de reloj externa del oscilador Timer1 o de
T13CKI (en el flanco de subida)
0 = reloj interno (FOSC/4)
TMR3ON:
Bit de encendido del Timer3
1 = permite Timer3
0 = parado Timer3

217

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.15.1.

Operaciones Del Timer3

El Timer3 puede funcionar en uno de estos modos:


Temporizador
Contador sncrono
Contador asincrnico
El modo de funcionamiento se determina con el bit, TMR3CS (T3CON<1>).
Cuando TMR3CS est borrado (=0), el Timer3 incrementa en cada instruccin interna
ciclo (FOSC/4). Cuando se activa el bit, los incrementos de Timer3 en cada flanco de
subida de la entrada de reloj externa Timer1 o el oscilador Timer1, si est permitido.
Como el Timer1, los pines RC1/T1OSI/UOE RC0/T1OSO/T13CKI se
convierten en entradas cuando el oscilador Timer1 se permite. Esto significa se ignoran
los valores de TRISC<1:0> y los pines se leen 0.
FIGURA 15-1: Diagrama De Bloques Del Timer3

Nota 1: Cuando el bit de permiso, T1OSCEN, se borra, el inversor y la


resistencia de regeneracin se apagan para eliminar la energa de drenaje.

3.4.15.2.

Modo De Lectura/Grabacin De 16bit

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

GUILLERMO DAVID HERRERO GONZLEZ

No se puede leer o escribir el byte alto de Timer3 directamente en este modo.


Toda lectura y escritura debe hacerse a travs del registro de almacenamiento
intermedio. Al escribir el TMR3H no se borra el prescaler del Timer3. El prescaler se
borra solamente escribiendo el TMR3L.
FIGURA 15-2: Diagrama Del Timer3 (Modo De Lectura/Escritura De 16-Bit)

Nota 1: Cuando el bit de permiso, T1OSCEN, se borra, el inversor y la


resistencia de regeneracin se apagan para eliminar la energa de drenaje.

3.4.15.3.

Usar El Oscilador Timer1 como Fuente De Reloj Timer3

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

El par de registros TMR3 (TMR3H:TMR3L) incrementa de 0000h a FFFFh y se


desborda a 0000h. La interrupcin Timer3, si est permitida, se genera en el
desbordamiento y activa en el flag de interrupcin, TMR3IF (PIR2<1>). Esta
interrupcin puede permitirse o inhabilitarse activando o borrando el bit de interrupcin
del Timer3, TMR3IE (PIE2<1>).

219

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Timer3 Register Low Byte

TMR3H

Timer3 Register High Byte

T1CON

RD16

T1RUN

T1CKPS1

T1CKPS0

T1OSCEN

T1SYNC*

TMR1CS

TMR1ON

T3CON

RD16

T3CCP2

T3CKPS1

T3CKPS0

T3CCP1

T3SYNC*

TMR3CS

TMR3ON

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con Timer3.

220

GUILLERMO DAVID HERRERO GONZLEZ

3.4.16.

MDULOS CAPTURA/COMPARACIN/PWM (CCP)

Los dispositivos PIC18F2455/2550/4455/4550 tienen dos mdulos CCP


(Captura/Comparacin/PWM). Cada mdulo contiene un registro de 16 bits, que puede
funcionar como registro de captura de 16bit, registro de comparacin de 16bit o un
registro PWM maestro/esclavo.
En dispositivos de 28pines, los dos mdulos estndares CCP (CCP1 y CCP2)
funcionan segn lo descrito en este captulo. En los dispositivos 40/44pines, CCP1 se
implementa como mdulo CCP mejorado, con los modos de captura y comparacin
estndar y PWM mejorado.
Las operaciones captura y comparacin descritas en este captulo se aplican a los
mdulos CCP estndares y al mejorado.
REGISTRO 16-1: CCPxCON: Registro De Control Estndar De CCPx
BIT 7

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:

Bit 1 y 0 del Duty Cicle PWM del mdulo CCPx


Modo de captura: No utilizado.
Modo comparacin: No utilizado.
Modo PWM:
Estos bits son los dos LSbs (bit 1 y 0 bit) de
los10bits del PWM. Los ocho MSbs se
encuentran en CCPR1L.
CCPxM3:CCPxM0: Bits selectores del modo del mdulo CCPx
0000= CCPX inhabilitado (CCPx en los resets)
0001= reservado
0010= modo comparacin: salida activa al igualarse
(se activa el bit CCPxIF)
0011= reservado
0100= Modo captura: cada flanco de bajada
0101= Modo captura: cada flanco de subida
0110= Modo captura: cada 4 flanco de subida
0111= Modo captura: cada 16 flanco de subida
1000= modo comparacin: inicializa el pin bajo de
CCPx; al igualar, se fuerza el pin alto de CCPx
(Se activa el bit CCPxIF)
1001= modo comparacin: inicializa el pin alto de
CCPx; al igualar, se fuerza el pin bajo de CCPx
(Se activa el bit CCPxIF)
1010= modo comparacin: genera interrupcin por

221

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

software al igualar (se activa el bit CCPxIF, el pin


CCPx refleja el estado de la entrada-salida)
1011= modo comparacin: accionar el
acontecimiento especial, resetea el contador de
tiempo, comienza la conversin A/D al igualar
CCP2 (Se activa el bit de CCPxIF)
11xx = modo PWM

3.4.16.1.

Configuracin Del Mdulo CCP

A cada mdulo Captura/Comparacin/PWM se le asocia un registro de control


(genricamente, CCPxCON) y registro de datos (CCPRx). El registro de datos,
alternadamente, abarca dos registros de 8bit: CCPRxL (byte bajo) y CCPRxH (byte
alto). Todos los registros son legibles y escribibles.

3.4.16.1.1.

Recursos De Los Mdulos CCP Y Del Temporizador

Los mdulos CCP utilizan los temporizadores 1, 2 3, dependiendo del modo


seleccionado. Timer1 y Timer3 estn disponibles en los mdulos de los modos captura o
comparacin, mientras que Timer2 est disponible para los mdulos en modo PWM.
La asignacin de un temporizador particular a un mdulo se determina con el bit
de permiso del temporizador a CCP del registro T3CON. Ambos mdulos pueden
activarse en cualquier momento y pueden compartir el mismo recurso del temporizador
si se configuran para funcionar en el mismo modo (la captura/comparacin o PWM) al
mismo tiempo. La captura no estar disponible con el Timer1 en modo asncrono.
TABLA 16-1: Recursos De Los Modos CPP Y Temporizador
Modo CCP/ECCP

Recurso temporizador

Captura

Timer1 o Timer3

Comparacin

Timer1 o Timer3

PWM

Timer2

222

GUILLERMO DAVID HERRERO GONZLEZ

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

CCP1 se configure para resetear TMR1 o TMR3 en el disparo de un evento especial


(dependiendo de la base de tiempos utilizada). Puede afectar a las operaciones de CCP2 si
tienen la misma base de tiempos.

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

Ambos PWMs tendrn la misma frecuencia y ratio de actualizacin (interrupcin TMR2).

Nota 1: Incluye las operaciones PWM estndar y mejorado.

3.4.16.1.2.

CCP2 Asignacin De Pin

La asignacin de pines para el CCP2 (la entrada de captura, salida de


comparacin y PWM) puede cambiar, basado en la configuracin del dispositivo. El bit
de configuracin CCP2Mx determina qu pin CCP2 se multiplexa. Por defecto, est
asignado a RC1 (CCP2Mx=1). Si el bit de configuracin se borra, CCP2 se multiplexa
con RB3. Cambiar la asignacin del CCP2 no cambia automticamente los requisitos
del puerto del pin. Los usuarios deben verificar siempre que el registro TRIS se
configura correctamente con la operacin CCP2, sin importar donde se localiza.

223

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.16.2.

MODO CAPTURA

En el modo captura, el par de registros CCPRxH:CCPRxL capturan el valor de


16bits del TMR1 o del TMR3 cuando ocurre un acontecimiento en el pin
correspondiente CCPx. Un acontecimiento se define como:

cada flanco de bajada


cada flanco de subida
cada 4 flanco de subida
cada 16 flanco de subida

El acontecimiento se selecciona con los bits de seleccin del modo,


CCPxM3:CCPxM0 (CCPxCON<3:0>). Cuando se hace una captura, el flag de peticin
de la interrupcin, CCPxIF, se activa; se debe borrar por software. Si ocurre otra captura
antes de que el valor en el registro CCPRx se lea, el valor anterior capturado se
sobrescribe con el valor nuevo.

3.4.16.2.1.

Configuracin Del Pin CCP

En el modo captura, el pin apropiado CCPx debe configurarse como entrada


activando el bit correspondiente del TRIS.
Nota: Si se configura RB3/CCP2 o RC1/CCP2 como salida, al escribir en el
puerto puede causar una condicin de captura.

3.4.16.2.2.

Seleccin De Modo Timer1/Timer3

Los temporizadores que se deben utilizar con la caracterstica de captura


(Timer1 y/o Timer3) deben funcionar en modo temporizador o modo contador sncrono.
En el modo contador asncrono, la captura no funcionar. El temporizador que se utilice
con cada mdulo CCP se selecciona en el registro T3CON.

3.4.16.2.3.

Interrupcin Por Software

Cuando se cambia el modo captura, se puede generar una interrupcin falsa de


captura. El usuario debe mantener el bit de permiso de interrupcin CCPxIE borrado
para evitar falsas interrupciones. El flag de interrupcin, CCPxIF, tiene que borrarse
despus de cualquier modo de funcionamiento.

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

GUILLERMO DAVID HERRERO GONZLEZ

EJEMPLO 16-1: Cambio Entre Prescalers De Captura (Mostrado CCP2)


CLRF
MOVLW

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

FIGURA 16-1: Diagrama De Bloques De Las Operaciones Del Modo Captura

3.4.16.3.

Modo Comparacin

En el modo comparacin, el valor del registro CCPRx de 16 bits se compara


constantemente con el valor del par de registros de TMR1 o de TMR3. Cuando se
igualan, el pin de CCPx:

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.

Tipo De Conexin CCP

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.16.3.2.

Seleccin De Modo Timer1/Timer3

Timer1 y/o Timer3 deben funcionar en modo temporizador, o modo contador


sncrono, si el mdulo CCP usa la caracterstica de comparacin. En modo contador
asncrono, no funciona la comparacin.

3.4.16.3.3.

Modo De Interrupcin Por Software

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.

Disparador De Acontecimiento Especial

Ambos mdulos CCP se equipan con un disparador de acontecimiento especial.


Es una seal interna del hardware generada en el modo comparacin para disparar
acciones de otros mdulos. El disparador de acontecimiento especial se activa
seleccionando el modo del disparador de acontecimiento especial de comparacin
(CCPxM3:CCPxM0=1011).
Para cualquier mdulo CCP, el disparador de acontecimiento especial resetea el
par de registros del temporizador en cualquier recurso de temporizador asignado como
base de tiempo. Esto permite que los registros CCPRx sirvan como un registro de
perodo programable para cualquier temporizador.
El disparador de acontecimiento especial del CCP2 puede comenzar una
conversin A/D. Para hacer esto, el convertidor A/D tiene que estar activado.
FIGURA 16-2: Diagrama De Bloques De Las Operaciones Del Mdulo Comparacin

226

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 16-3: Registros Asociados A La Captura Y A La Comparacin, Timer1 y


Timer3
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

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

Timer1 Register Low Byte

TMR1H

Timer1 Register High Byte

T1CON

RD16

T1RUN

T1CKPS1

T1CKPS0

T1OSCEN

TMR3H

Timer3 Register High Byte

TMR3L

Timer3 Register Low Byte

T3CON

RD16

T3CCP2

T3CKPS1

T3CKPS0

T3CCP1

CCPR1L

Capture/Compare/PWM Register 1 Low Byte

CCPR1H

Capture/Compare/PWM Register 1 High Byte

CCP1CON

P1M1(2)

P1M0(2)

DC1B1

DC1B0

CCP1M3

CCP1M2

CCPR2L

Capture/Compare/PWM Register 2 Low Byte

CCPR2H

Capture/Compare/PWM Register 2 High Byte

CCP2CON

DC2B1

DC2B0

CCP2M3

CCP2M2

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con Captura/Comparacin, Timer1 o Timer3.
Nota 1: El bit SBOREN slo est disponible cuando BOREN<1:0>=01; en
otro caso, se lee 0.

227

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2: Este bit no se implementa en los dispositivos de 28pines; mantenerlo


siempre a 0.

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.16.4.1.

Periodo Del PWM

El periodo se especifica escribiendo el registro PR2. El periodo se calcula con la


frmula:
ECUACIN 16-1:
Periodo _ PWM = [( PR 2) + 1] 4 TOSC (Valor _ del _ presaler _ de _ TMR 2)

La frecuencia de PWM se define como 1/[perodo de PWM].


Cuando TMR2 es igual a PR2, ocurren los tres acontecimientos siguientes en el
siguiente ciclo de incremento:
TMR2 se borra
Se activa el pin CCPx (excepcin: si el duty cicle de PWM=0%, el pin
CCPx no se activa)
El duty cicle de PWM se asigna de CCPRxL a CCPRxH
Nota: Los postscalers Timer2 no se utilizan para calcular la frecuencia de PWM.
El postscaler se poda utilizar para tener una frecuencia de salida diferente.

3.4.16.4.2.

Duty Cicle PWM

El ciclo trabajo de PWM se especifica escribiendo en el registro CCPRxL y los


bits CCPxCON<5:4>. Tiene una resolucin de 10bits. El CCPRxL contiene los ocho
MSbs y los bits CCPxCON<5:4> los dos LSbs. Este valor de 10bits se representa con
CCPRxL:CCPxCON<5:4>. La ecuacin siguiente se utiliza para calcular el ciclo de
trabajo:
ECUACIN 16-2:
Duty _ Cicle _ PWM = (CCPRXL : CCPXCON < 5 : 4 >) TOSC (Valor _ del _ prescaler _ TMR 2)

CCPRxL y CCPxCON<5:4> se pueden escribir en cualquier momento, pero el


valor del duty cicle no se grabar en CCPRxH hasta despus de que se igualen PR2 y
TMR2 (es decir, se complete el perodo). En modo PWM, CCPRxH es un registro
inalterable.
El registro CCPRxH y un latch interno de 2bits se utilizan como buffer doble del
ciclo de trabajo de PWM. El buffer doble es esencial en los problemas tcnicos del
PWM.
Cuando se igualan los 2bits del latch de TMR2 y CCPRxH, se concatenan con
un reloj interno de 2bits Q o 2bits del prescaler de TMR2, el pin de CCPx se borra.
La mxima resolucin de PWM (bits) para una frecuencia PWM dada se calcula
con la ecuacin:

229

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Timer Prescaler (1, 4, 16)

16

PR2 Valor

FFh

FFh

FFh

3Fh

1Fh

17h

Resolucin mxima (bits)

10

10

10

6,58

3.4.16.4.3.

PWM Auto-Apagado (CCP1 Solamente)

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.

Configuracin Del PWM

Hay que seguir los siguientes pasos para configurar el PWM:


a. Fijar el perodo de PWM escribiendo el registro PR2.
b. Fijar el ciclo trabajo de PWM escribiendo el registro CCPRxL y los bits
CCPxCON<5:4>.
c. Configurar el pin CCPx como salida borrando el bit del TRIS.
d. Fijar el valor del prescaler TMR2, despus permitir el Timer2
escribiendo el T2CON.
e. Configurar el mdulo CCPx para la operacin PWM.

230

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 16-5: Registros Asociados Al PWM Y Al Timer2


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

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

Timer2 Period Register

T2CON

T2OUTPS3

T2OUTPS2

T2OUTPS1

T2OUTPS0

CCPR1L

Capture/Compare/PWM Register 1 Low Byte

CCPR1H

Capture/Compare/PWM Register 1 High Byte

CCP1CON

P1M1(2)

P1M0(2)

DC1B1

DC1B0

CCP1M3

CCP1M2

CCPR2L

Capture/Compare/PWM Register 2 Low Byte

CCPR2H

Capture/Compare/PWM Register 2 High Byte

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)

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con PWM o Timer2.
Nota 1: El bit SBOREN slo est disponible cuando BOREN<1:0>=01; en
otro caso, se lee 0.
2: Este bit no se implementa en los dispositivos de 28pines; mantenerlo
siempre a 0.

231

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.17. MDULO
(ECCP)

MEJORADO

DE

CAPTURA/COMPARACIN/PWM

Nota: El mdulo de ECCP se implementa en los dispositivos de 40/44pines.


En los dispositivos PIC18F4455/4550, CCP1 se implementa como mdulo
estndar CCP con capacidades mejoradas de PWM. Incluyen la disposicin para 2 4
canales de salida, la polaridad seleccionable por el usuario, el control de banda-muerta y
la parada automtica y el reinicio. La captura, comparacin y las funciones de salida
simple de PWM del mdulo ECCP son iguales al mdulo estndar CCP.
El registro de control para el mdulo mejorado diferencia de los registros
CCPxCON de los dispositivos PIC18F2255/2550 en que los dos bits ms significativos
estn implementados para controlar el PWM.
Adems de la gama mejorada de los modos disponibles a travs del registro de
CCP1CON, el mdulo ECCP tiene dos registros adicionales asociados a las
caractersticas de las operaciones mejoradas y de la auto-parada de PWM. Son:
ECCP1AS (configuracin de la banda-muerta)
ECCP1DEL (Configuracin de la auto-parada)

3.4.17.1.

Salidas Y Configuracin Del ECCP

El mdulo mejorado de CCP puede tener hasta cuatro salidas PWM,


dependiendo del modo de funcionamiento seleccionado. Estas salidas, sealadas P1A a
P1D, se multiplexan con los pines de entrada-salida de PORTC y PORTD. Las salidas
activas dependen del modo de funcionamiento del CCP seleccionado.
Para configurar los pines de entrada-salida como salidas PWM, se debe
seleccionar el modo apropiado PWM activando los bits P1M1:P1M0 y
CCP1M3:CCP1M0. Se tienen que activar los bits apropiados de TRISC y de TRISD
para configurarlos como salidas.

3.4.17.1.1.

Recursos Del Temporizador Y Mdulo ECCP

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

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 17-1: CCP1CON: Registro De Control Del ECCP


BIT 7

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:

Bits de configuracin del PWM mejorado


Si CCP1M3:CCP1M2=00, 01, 10:
xx= P1A se asigna como E/S de
Captura/Comparacin; P1B, P1C, P1D puertos
Si CCP1M3:CCP1M2=00, 01, 10:
00= Salida simple: P1A modula, el resto pines
01= Salida Full-Bridge: P1D modula, P1A activa y
P1B y P1C inactivas
10= Salida Half_Bridge: P1A y P1B modulan con
control de banda-muerta; P1C y P1D puertos
11= Salida Full-Bridge inversa: P1B modula, P1C
activa y P1A y P1D inactivas
DC1B1:DC1B0:
Bit 1 y 0 del Duty Cicle PWM del mdulo CCP1
Modo de captura: No utilizado.
Modo comparacin: No utilizado.
Modo PWM:
Estos bits son los dos LSbs (bit 1 y 0 bit) de
los10bits del PWM. Los ocho MSbs se
encuentran en CCPR1L.
CCP1M3:CCP1M0: Bits selectores del modo del mdulo CCP1
0000= CCPx inhabilitado (resetea ECCP)
0001= reservado
0010= modo comparacin: salida activa al igualarse
(se activa el bit CCP1IF)
0011= reservado
0100= Modo captura: cada flanco de bajada
0101= Modo de captura: cada flanco de subida
0110= Modo de captura: cada 4 flanco de subida
0111= Modo de captura: cada 16 flanco de subida
1000= modo comparacin: inicializa el pin bajo de
CCP1; al igualar, se fuerza el pin alto de CCP1
(Se activa el bit CCP1IF)
1001= modo comparacin: inicializa el pin alto de
CCP1; al igualar, se fuerza el pin bajo de CCP1
(Se activa el bit CCP1IF)
1010= modo comparacin: genera interrupcin por
software al igualar (se activa el bit CCP1IF, el pin
CCP1 refleja el estado de la entrada-salida)
1011= modo comparacin: accionar el
acontecimiento especial, resetea el contador de
tiempo, comenzar la conversin A/D al igualar
CCP2 (Se activa el bit de CCP1IF)

233

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

1100 = modo PWM: P1A, P1C activo-alto, P1B,


P1D activo-alto
1101 = modo PWM: P1A, P1C activo-alto, P1B,
P1D activo-bajo
1110 = modo PWM: P1A, P1C activo-bajo, P1B,
P1D activo-alto
1111 = modo PWM: P1A, P1C activo-bajo, P1B,
P1D activo-bajo

3.4.17.2.

Modos Captura Y Comparacin

Los modos captura y comparacin, a excepcin de la operacin del disparador


de acontecimiento especial, del mdulo ECCP son idnticos a los del CCP.

3.4.17.2.1.

Disparador De Acontecimiento Especial

La salida del disparador del acontecimiento especial de ECCP resetea el par de


registros TMR1 o TMR3, dependiendo de cual es la fuente de tiempo seleccionada. Los
registros CCPR1H:CCPR1L permiten programar un periodo de 16bits fcilmente para
Timer1 o Timer3.

3.4.17.3.

El Modo Estndar De PWM

Cuando est configurado en un solo modo de salida, el mdulo ECCP funciona


igual que el mdulo estndar CCP en modo PWM. Esto tambin se llama modo CCP
compatible.
TABLA 17-1: Asignacin De Pines Para Varios ECCP1
Modo ECCP

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

Leyenda: x = no ocurre. Las celdas sombreadas no se utilizan con ECCP.

234

GUILLERMO DAVID HERRERO GONZLEZ

3.4.17.4.

El Modo PWM Mejorado

El modo PWM mejorado proporciona opciones adicionales de salida PWM para


ampliar las aplicaciones de control. El mdulo es una versin compatible del mdulo
estndar CCP y ofrece hasta cuatro salidas, sealadas de P1A a P1D. Los usuarios
pueden seleccionar la polaridad de la seal (activo-alto o activo-bajo). El modo y la
polaridad de la salida del mdulo se configuran determinando los bits P1M1:P1M0 y
CCP1M3:CCP1M0 del registro CCP1CON.
Todos los registros de control tienen un doble buffer y se cargan al principio de
un nuevo ciclo de PWM (el lmite del perodo cuando se resetea Timer2) para prevenir
interferencias en las salidas. La excepcin es el registro de retraso banda-muerta
PWM, ECCP1DEL, que se carga en el lmite del duty cicle o en el lmite del perodo (el
que llegue primero). Debido al buffer, el mdulo espera hasta los resets asignados del
temporizador en vez de comenzar inmediatamente. Esto significa que las formas de
onda de PWM mejorado no son exactamente las formas de onda estndares PWM, pero
se compensa con un ciclo completo de la instruccin (4TOSC).
Como antes, el usuario debe configurar manualmente los bits apropiados de
TRIS como salida.
FIGURA 17-1: Diagrama De Bloques Simplificado Del Mdulo PWM Mejorado

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.17.4.1.

Periodo De PWM

El periodo se especifica escribiendo el registro PR2. El periodo se calcula con la


frmula:
ECUACIN 17-1:
Periodo _ PWM = [( PR 2) + 1] TOSC (Valor _ del _ presaler _ de _ TMR 2)

La frecuencia de PWM se define como 1/[perodo de PWM].


Cuando TMR2 es igual a PR2, ocurren los tres acontecimientos siguientes en el
siguiente ciclo de incremento:
TMR2 se borra
Se activa el pin CCP1 (excepcin: si el duty cicle de PWM=0%, el pin
CCP1 no se activa)
El duty cicle de PWM se asigna de CCPR1L a CCPR1H
Nota: Los postscalers Timer2 no se utilizan para calcular la frecuencia de PWM.
El postscaler se poda utilizar para tener una frecuencia de salida diferente.

3.4.17.4.2.

Duty Cicle PWM

El ciclo trabajo de PWM se especifica escribiendo en el registro CCPR1L y los


bits CCP1CON<5:4>. Tiene una resolucin de 10bits. El CCPR1L contiene los ocho
MSbs y los bits CCP1CON<5:4> los dos LSbs. Este valor de 10 bits se representa con
CCPR1L:CCP1CON<5:4>. La ecuacin siguiente se utiliza para calcular el ciclo de
trabajo:
ECUACIN 17-2:
Duty _ Cicle _ PWM = (CCPR1L : CCP1CON < 5 : 4 >) TOSC (Valor _ del _ prescaler _ TMR 2)

CCPR1L y CCP1CON<5:4> se pueden escribir en cualquier momento, pero el


valor del duty cicle no se grabar en CCPR1H hasta despus de que se igualen PR2 y
TMR2 (es decir, se complete el perodo). En modo PWM, CCPR1H es un registro
inalterable.
El registro CCPR1H y un latch interno de 2 bits se utilizan como buffer doble
del ciclo de trabajo de PWM. El buffer doble es esencial en los problemas tcnicos del
PWM. Cuando se igualan los 2bits del latch de TMR2 y CCPR1H, se concatenan con
un reloj interno de 2 bits Q o 2 bits del prescaler de TMR2, el pin de CCP1 se borra.
La mxima resolucin de PWM (bits) para una frecuencia PWM dada se calcula
con la ecuacin:

236

GUILLERMO DAVID HERRERO GONZLEZ

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

Timer Prescaler (1, 4, 16)

16

PR2 Valor

FFh

FFh

FFh

3Fh

1Fh

17h

Resolucin mxima (bits)

10

10

10

6,58

3.4.17.4.3.

Configuraciones De La Salida De PWM

Los bits P1M1:P1M0 del registro CCP1CON permiten una de cuatro


configuraciones:

Salida simple
Salida half-bridge (medio-puente)
Salida full-bridge (puente-completo); modo directo
Salida full-bridge; modo inverso

FIGURA 17-2: Relaciones De La Salida PWM (Estado Activo-Alto)

237

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 17-3: Relaciones De La Salida PWM (Estado Activo-Bajo)

3.4.17.4.4.

El Modo Half-Bridge

En el modo de salida half-bridge, dos pines se utilizan como salidas para


controlar cargas en dos sentidos. La seal de salida PWM sale por el pin P1A, mientras
que la seal de salida complementaria sale por el pin P1B. Este modo se puede utilizar
para aplicaciones de half-bridge, o en aplicaciones full-bridge donde cuatro
interruptores se modulan con dos seales PWM.
En modo de salida half-bridge, el retraso programable banda-muerta se puede
utilizar para prevenir los picos de corriente. El valor de los bits PDC6:PDC0 determinan
el nmero de ciclos de la instruccin antes de que la salida se active. Si el valor es
mayor que el ciclo de trabajo, la salida correspondiente no se activa durante el ciclo
entero.
Como las salidas P1A y P1B se multiplexan con los latch PORTC<2> y
PORTD<5>, los bits TRISC<2> y TRISD<5> se tienen que borrar para configurar P1A
y P1B como salidas.

238

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 17-4: Salidas Del Half-Bridge

td= Retraso banda-muerta


Nota 1: En este momento el registro TMR2 es igual al registro PR2
2: Las salidas se muestran en activo-alto
FIGURA 17-5: Ejemplos De Los Modos De Aplicacin Del Half-Bridge

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 17-6: Salida Full-Bridge

Nota 1: En este momento el registro TMR2 es igual al registro PR2


2: Las salidas se muestran en activo-alto

240

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 17-7: Ejemplo De Aplicacin Full-Bridge

Cambio De Direccin En El Modo Full-Bridge


En el modo Full-Bridge, el bit P1M1 del registro CCP1CON permite que el
usuario controle la direccin directa/inversa. Cuando el firmware cambia este bit de
control de direccin, el mdulo asumir la nueva direccin en el siguiente ciclo PWM.
Momentos antes del final del perodo actual de PWM, las salidas moduladas
(P1B y P1D) se ponen en estado inactivo, mientras que las salidas no moduladas (P1A y
P1C) se cambian a la direccin opuesta. Esto ocurre en un intervalo del tiempo de
(4TOSC*(valor de Timer2 Prescaler)) antes de que comience el prximo perodo de
PWM. El prescaler del Timer2 ser 1, 4 16, dependiendo del valor de los bits
T2CKPS1:T2CKPS0 (T2CON<1:0>). Durante el intervalo del cambio de las salidas no
moduladas al principio del siguiente perodo, las salidas moduladas (P1B y P1D) siguen
estando inactivas.
Observar que en el modo de salida Full-Bridge, el mdulo ECCP no proporciona
ningn retraso banda-muerta. Generalmente, porque slo modula una salida, y no se
necesita el retraso. Sin embargo, hay una situacin donde si se necesita. Esta situacin
ocurre cuando las condiciones siguientes son verdaderas:
1. La direccin de la salida PWM cambia cuando el ciclo de trabajo de la
salida est cerca o es el 100%.
2. El momento del apagado, incluyendo el circuito del dispositivo y del
conductor de energa, es mayor que el tiempo de encendido.

241

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Nota 1: el bit de direccin del registro de control CCP1 (CCP1CON<7>) se


escribe en cualquier momento del ciclo PWM.
2: Cuando se cambian las direcciones, las seales P1A y P1C cambian
antes del final del ciclo PWM en intervalos de 4TOSC, 16TOSC o 64TOSC, dependiendo
del valor del prescaler de Timer2. Las seales de modulacin de P1B y P1D estn
inactivas.
FIGURA 17-9: Cambio De Direccin Con Un Duty Cicle Cerca Del 100%

242

GUILLERMO DAVID HERRERO GONZLEZ

Nota 1: Todas las seales se muestran como activa-alto


2: tON es el retraso del cambio de QC
3: tOFF es el retraso del cambio de QD

3.4.17.4.6.

Retraso Programable Banda-Muerta

Nota: El retraso programable banda-muerta no se implementa en los


dispositivos de 28pin con los mdulos CCP estndares.
En las aplicaciones Half-Bridge donde todos los conmutadores se modulan con
la frecuencia de PWM, los conmutadores, normalmente, necesitan ms tiempo para
apagarse. Si los conmutadores cambian al mismo tiempo (uno se activa y el otro se
apaga), ambos pueden estar activos en un perodo de tiempo corto hasta que un
conmutador se apague. Durante este breve intervalo, puede haber un pico muy grande
de corriente en ambos conmutadores, poniendo en cortocircuito la fuente del puente.
Para evitar este pico destructivo, primero se apaga el conmutador activo y, despus de
un retraso, se activa el otro.
En el modo de salida Half-Bridge, existe un retraso digital programable bandamuerta para evitar los picos de los cambios. El retraso ocurre en la transicin de la
seal del estado inactivo al estado activo. Los bits PDC6:PDC0 del registro ECCP1DEL
determinan el periodo del retraso en trminos de ciclos de instruccin del
microcontrolador (TCY o 4 TOSC). Estos bits no estn disponibles en los dispositivos de
28pines, pues el mdulo estndar CCP no soporta la operacin Half-Bridge.
REGISTRO 17-2: ECCP1 del: Registro Del Retraso Banda-Muerta
BIT 7

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:

Bit de permiso de reinicio de PWM


1 = sobre el auto-apagado, los bits ECCPASE se
borran automticamente cuando se ejecuta el
evento de apagado; el PWM reinicia
automticamente
0 = sobre el auto-apagado, los ECCPASE se tienen
que borrar por software para reiniciar el PWM
Bits de cuenta del retraso(1)
Tiempo de retraso, en ciclos FOSC/4 (4*TOSC), entre
la programacin y el tiempo actual de una seal de
PWM de la transicin a activo.

Nota 1: Reservado en los dispositivos de 28pines; mantener estos bits borrados.

243

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.17.4.7.

PWM Mejorado Auto-Apagado

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

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 17-3: ECCP1AS: Registro De Control Del Auto-Apagado Del ECCP


Mejorado
BIT 7

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

Bit de estado del evento auto-apagado del ECCP


1= A ocurrido un acontecimiento de apagado; las
salidas del ECCP estn en estado de apagado
0= las salidas del ECCP estn funcionando
ECCPAS2:ECCPAS0:
Bits selectores de la fuente del
Auto-apagado del ECCP
111= FLT0 o comparador 1 o comparador 2
110= FLT0 o comparador 2
101= FLT0 o comparador 1
100= FLT0
011= cualquier comparador 1 2
010= salida del comparador 2
001= salida del comparador 1
000= Auto-apagado desactivado
PSSAC1:PSSAC0: Bits de control del estado de los pines A y C en un
apagado
1x= los pines A y C en un tercer estado
01= los pines A y C a 1
00= los pines A y C a 0
PSSBD1:PSSBD0: Bits de control del estado de los pines B y D en un
apagado(1)
1x= pin B y D tercer estado
01= los pines B y D a 1
00= los pines B y D a 0

Nota 1: Reservado en los dispositivos de 28pines; mantener estos bits borrados.

245

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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)

FIGURA 17-11: Auto-Apagado (PRSEN=0, Auto-Reinicio Desactivado)

246

GUILLERMO DAVID HERRERO GONZLEZ

3.4.17.4.8.

Consideraciones De Reinicio

Cuando el mdulo ECCP se utiliza en el modo PWM, el hardware de la


aplicacin debe utilizar las resistencias apropiadas pull-up y/o pull-down en los pines de
salida del PWM. Cuando el microcontrolador se reinicia, todos los pines de E/S estn en
el estado de alta impedancia. Los circuitos externos deben mantener los componentes de
potencia apagados hasta que el microcontrolador conduzca los pines de E/S con los
niveles apropiados de seal o activar las salidas del PWM.
Los bits CCP1M1:CCP1M0 (CCP1CON<1:0>) permiten que el usuario elija si
las seales de salida de PWM sean activa-alto o activa-bajo para cada par de pines de
salida (P1A/P1C y P1B/P1D). Las polaridades de la salida de PWM deben seleccionarse
antes de que los pines de PWM se configuren como salidas. Cambiar la configuracin
de la polaridad mientras que los pines de PWM estn como salidas no se recomiendan,
puesto que puede dar lugar a dao a los circuitos de la aplicacin.
Los latch de salida P1A, P1B, P1C y P1D pueden no estar en el estado
apropiados al iniciarse el mdulo PWM. Activar los pines del PWM como salida al
mismo tiempo que el mdulo ECCP puede causar dao al circuito de la aplicacin. El
mdulo ECCP debe permitirse en el modo de salida apropiado y terminar un ciclo
completo antes de configurar los pines como salidas. El final de un ciclo completo se
indica con el bit TMR2IF que permanece activo cuando el segundo periodo comienza.

3.4.17.4.9.

Pasos Para Configurar El PWM

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

9 Selecciona los estados de parada de los pines de salida usando los


bits PSSAC1:PSSAC0 y PSSBD1:PSSBD0.
9 Activar el bit ECCPASE (ECCP1AS<7>).
9 Configurar los comparadores con el registro CMCON.
9 Configurar las entradas del comparador como entradas
analgicas.
8. Si se necesita el auto-reinicio, activar el bit PRSEN (ECCP1DEL<7>).
9. Configurar y comenzar TMR2:
9 Borrar el flag de interrupcin de TMR2 borrando el bit TMR2IF
(PIR1<1>).
9 Determinar el valor del prescaler de TMR2 cargando los bits
T2CKPS (T2CON<1:0>).
9 Permitir el Timer2 activando el bit TMR2ON (T2CON<2>).
10. Permitir las salidas del PWM despus de que un nuevo ciclo de PWM
haya comenzado:
9 Esperar hasta que se desborda TMRn (bit TMRnIF permitido).
9 Activar los pines de salidas CCP1/P1A, P1B, P1C y/o P1D
borrando los bits respectivos de TRIS.
9 Borrar el bit ECCPASE (ECCP1AS<7>).

3.4.17.4.10. Operando En Los Modos De Ahorro De Energa


En el modo sleep, todas las fuentes del reloj estn desactivadas. El Timer2 no se
incrementar y el estado del mdulo no cambiar. Si el pin de ECCP est conduciendo
un valor, continuar conduciendo ese valor. Cuando el dispositivo despierta, continuar
en este estado. Si se permiten el reinicio a dos velocidades, la frecuencia inicial de
reinicio del INTOSC y del postscaler puede que no sean estables inmediatamente.
En el modo PRI_IDLE, el reloj primario continuar registrando el mdulo ECCP
sin cambios. En el resto de los modos de ahorro de energa, el reloj del ahorro de
energa seleccionado gobernar el Timer2. Los relojes de otros modos de ahorro de
energa tendrn una frecuencia diferente a la del reloj primario.

La Operacin Con El Monitor De Reloj A Prueba De Fallos


Si el monitor de reloj a prueba de fallos est activo, un fallo del reloj forzar al
dispositivo al modo RC_RUN y el bit OSCFIF (PIR2<7>) se activar. Al ECCP lo
controlar la fuente del oscilador interno de reloj, que puede tener diversas frecuencias
de reloj.

248

GUILLERMO DAVID HERRERO GONZLEZ

3.4.17.4.11. Efectos De Un Reset


Los resets por aumento de energa y por resets sucesivos forzarn a los puertos
al modo entrada y el CCP a su estado de reset.
Esto fuerza el mdulo CCP mejorado a resetear a un estado compatible con el
mdulo CCP estndar.
TABLA 17-3: Registros Asociados A Los Mdulos ECCP, Timer1 y Timer3
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

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

Timer1 Register Low Byte

TMR1H

Timer1 Register High Byte

T1CON

RD16

T1RUN

T1CKPS1

TMR2
T2CON

T1CKPS0

T1OSCEN

Timer2 Module Register

T2OUTPS3

T2OUTPS2

PR2

T2OUTPS1

T2OUTPS0

Timer2 Period Register

TMR3L

Timer3 Register Low Byte

TMR3H

Timer3 Register High Byte

T3CON

RD16

T3CCP2

CCPR1L

T3CKPS0

T3CCP1

Capture/Compare/PWM Register 1 (LSB)

CCPR1H
CCP1CON

T3CKPS1

Capture/Compare/PWM Register 1 (MSB)


P1M1

(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)

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con ECCP.
Nota 1: El bit SBOREN slo est disponible cuando BOREN<1:0>=01
2: Este bit no se implementa en los dispositivos de 28pines.

249

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.
3.4.18.1.

BUS SERIE UNIVERSAL (USB)


Descripcin Del Perifrico USB

La familia de dispositivos PIC18FX455/X550 contiene una interfaz serie


compatible con el SIE (serial interface engine, mquina con comunicacin serie) USB
full-speed (2.0) y de poca velocidad (1.0) que permite la comunicacin rpida entre
cualquier dispositivo USB y el microcontrolador PIC.
El SIE puede interconectarse directamente al USB, utilizando el transmisorreceptor interno, o puede conectarse a travs un transmisor-receptor externo. El PIC
tiene un regulador interno de 3,3V para accionar el transmisor-receptor interno en
aplicaciones de 5V.
Se han incluido algunas caractersticas especiales en el hardware para mejorar el
funcionamiento. Se proporciona memoria de puerto dual en la memoria de datos del
dispositivo (RAM del USB) para tener acceso directo a la memoria desde el ncleo del
microcontrolador y desde el SIE. Tambin se proporcionan unos buffer para que el
programador elija libremente el final de la memoria dentro del espacio de la RAM del
USB. Existe un puerto paralelo para transmitir datos grandes, por ejemplo datos al
puerto paralelo, se ha proporcionado la ayuda de transferencia ininterrumpida de
volmenes de datos grandes, por ejemplo datos sncronos, a los buffer de memoria
externos.
FIGURA 18-1: Perifrico Y Opciones Del USB

250

GUILLERMO DAVID HERRERO GONZLEZ

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.

Estado Y Control Del USB

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.

Registro de control del USB (UCON)


Registro de configuracin del USB (UCFG)
Registro de estado de la transferencia del USB (USTAT)
Registro de direccin de dispositivo USB (UADDR)
Registros del nmero del frame (UFRMH: UFRML)
Registros activadores de los Endpoints de 0 a 15 (UEPn)

Registro De Control Del USB (UCON)

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:

Permiso del perifrico principal del USB


Reset de los punteros tipo ping-pong
Control del modo al suspender
Desactivar la transferencia de paquetes

Adems, el registro de control del USB contiene un bit de estado, SE0


(UCON<5>), que se utiliza para indicar el estado del bus, si slo se manda un cero.
Cuando se permite el mdulo USB, este bit debe supervisarse para determinar si las
lneas de datos han salido de una condicin de single-ended cero (slo se manda cero).
Esto ayuda a distinguir el estado de ciclo inicial de la seal de reset del USB.
La operacin total del mdulo USB se controla con el bit USBEN (UCON<3>).
Activar este bit setea el mdulo y resetea todos los bits PPBI en el Buffer a 0. Este bit
tambin activa el regulador de tensin del chip y conecta las resistencias pull-up, si se
permiten. As, este bit puede utilizarse como una unin/separacin al USB. Aunque se
ignoran todos los estados y bits de control si este bit est borrado, el mdulo necesita
preconfigurarse antes de activar este bit.
El bit PPBRST (UCON<6>) controla el estado del reset cuando se utiliza el
modo del Doble-Buffering (buffer ping-pong). Cuando se activa el bit PPBRST, todos
los buffers ping-pong se fijan a los buffers intermedios. El PPBRST tiene que borrarse
por firmware. Este bit se ignora en los modos de buffer que no usen el buffer ping-pong.
El bit PKTDIS (UCON<4>) es un flag que indica si el SIE ha inhabilitado la
transmisin y la recepcin de paquetes. Este lo bit activa el SIE cuando recibe un

251

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

SETUP para permitir su procesamiento. Este bit no lo puede activar el


microcontrolador, slo borrar; al despejarlo el SIE continua la transmisin y/o
recepcin. Cualquier acontecimiento pendiente dentro de buffer intermedio todava
estar disponible, indicado dentro del registro USTAT en el buffer FIFO.
El bit RESUME (UCON<2>) permite al perifrico realizar un reinicio
ejecutando la seal resume. Para generar un reinicio vlido, por firmware se debe
activar el RESUME durante 10ms y entonces borrar el bit.
El bit SUSPND (UCON<1>) coloca el mdulo y soporte del circuito (es decir,
regulador de tensin) en un modo de baja potencia. El reloj de entrada al SIE se
desactiva. Este bit debe activarse por software dentro de la respuesta a una interrupcin
IDLEIF. Debe borrarse por firmware despus de observar una interrupcin ACTVIF.
Cuando este bit est activo, sigue estando el dispositivo unido al bus pero las salidas del
transmisor-receptor permanecen en reposo. La tensin en el pin VUSB puede variar
dependiendo del valor de este bit. Activar este bit antes de un IDLEIF dar lugar a
comportamiento imprevisible del bus.
Nota: Cuando est en el modo de suspensin, el bus del dispositivo USB se
limita al 500A de corriente. sta es la corriente completa cedida por el dispositivo PIC
y su circuito de soporte. Hay que tener cuidado de ceder la corriente mnima cuando el
dispositivo entre en el modo de suspensin.
REGISTRO 18-1: UCON: Registro De Control Del USB
BIT 7

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:

Bit de proteccin contra el ping-pong de datos:


1 = Reset todos los punteros del buffer ping-pong
0 = Buffer ping-pong no se resetean
Flag de Single-Ended cero:
1 = Single-ended cero activo en el bus USB
0 = No se ha detectado single-ended
Bit de inhabilitacin de transferencias de paquetes:
1 = SIE y procesamiento de paquetes desactivado, se
activa automticamente cuando recibe un SETUP
0 = SIE y procesamiento de paquetes permitido
Bit de permiso del mdulo USB
1 = mdulo USB y soporte del circuito activados
(dispositivo unido)
0 = mdulo USB y soporte del circuito desactivados
(dispositivo separado)
Bit de permiso de la seal RESUME
1 = Seal RESUME activada

252

GUILLERMO DAVID HERRERO GONZLEZ

0 = Seal RESUME desactivada


Bit para suspender el USB
1 = mdulo del USB y el soporte del circuito estn en
el modo de conservacin de energa, reloj SIE inactivo
0 = mdulo USB y el soporte del circuito estn
operando normalmente, reloj SIE controlado con el
ratio asignado

BIT 1

SUSPND:

3.4.18.2.2.

Registro De Configuracin Del USB (UCFG)

Antes de comunicarse con el USB, se tiene que configurar el mdulo del


hardware interno y/o externo. La mayor parte de la configuracin se realiza con el
registro UCFG. El regulador de tensin del USB se maneja con la configuracin de los
registros.
El registro UFCG contiene la mayor parte de los bits que dirigen el
comportamiento del mdulo USB. stos incluyen:

Velocidad del bus (velocidad completa contra poca velocidad)


Permiso de las resistencias pull-up del chip
Permiso del transmisor del chip
Uso del buffer ping-pong

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 18-2: UCFG: Registro De Configuracin Del USB


BIT 7

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:

Bit de permiso del test patrn de ojo del USB


1 = prueba del patrn de ojo permitido
0 = prueba del patrn de ojo inhabilitado
Bit de permiso del monitor OE* del USB(1)
1 = seal del UOE* activa; indica los intervalos durante
los cuales las lneas D+/D- estn conduciendo
0 = seales del UOE* inactivas
Bit de permiso del pull-up del chip(2,3)
1 = Pull-up del chip permitido (pull-up en D+ con
FSEN=1 o en D- con FSEN=0)
0 = Pull-up del chip desactivado
Bit inhabilitador del transmisor del chip(2)
1 = Transmisor del chip inhabilitado; la interfaz digital
del transmisor permitida
0 = transmisor del chip activo
Bit de permiso del Full-Speed(2)
1 = dispositivo Full-speed: controla los flancos del
transmisor; requiere un reloj de 48MHz
0 = dispositivo de poca velocidad: controla los flancos
del transmisor; requiere un reloj de 6MHz
Bits de configuracin de los buffer ping-pong
11 = buffers ping-pong permitidos en los End-Points
1 a 15
10 = buffers ping-pong permitidos en todos los EndPoints
01 = buffer ping-pong permitido en los End-Points
de salida 0
00 = buffers ping-pong inhabilitados

Nota 1: Si se activa UTRDIS, la seal UOE* estar activa independiente del


ajuste del bit UOEMON.
2: Los bits UPUEN, UTRDIS y FSEN no deben cambiarse mientras el mdulo
USB est permitido. Estos valores se deben preconfigurar antes de permitir el mdulo.
3: Este bit solamente es vlido cuando el transmisor del chip est activo
(UTRDIS = 0); si no, se ignora.

254

GUILLERMO DAVID HERRERO GONZLEZ

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

Hay 6 seales en el mdulo para comunicar y controlar un transmisor externo:

VM: Entrada de la lnea single-ended DVP: Entrada de la lnea single-ended D+


RCV: La entrada del receptor diferencial
VMO: Salida a la lnea diferencial del conductor
VPO: Salida a la lnea diferencial del conductor
UOE: Salida permitida

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Estado del bus

Single-Ended Cero

Diferencial 0

Diferencial 1

Condicin Ilegal

TABLA 18-2: Entradas Single-Ended Del Transmisor


VP

VM

Estado del Bus

Single-Ended Cero

Baja velocidad

Toda velocidad

Error

Resistencias Internas Pull-Up


Los dispositivos PIC18FX455/X550 tienen unas resistencias pull-up internas
diseadas para conocer los requerimientos del USB baja velocidad y toda
velocidad. El bit UPUEN (UCFG<4>) activa las pull-up internas.

Resistencias Externas Pull-Up


Se pueden necesitar resistencias externas pull-up. El pin VUSB se puede utilizar
para aumentar D+ o D-. La resistencia pull-up tiene que ser de 15k.

256

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 18-3: Circuito Externo


El diseo muestra una aplicacin con USB a toda velocidad utilizando el
regulador interno y una resistencia pull-up externa.

Permiso De La Salida Del Monitor Del USB


El monitor del USB OE* proporciona informacin de la operacin del SIE si
est escuchando el bus o est conduciendo por el bus. Esto se permite por defecto al
usar un transmisor externo o cuando UCFG<6>=1. La supervisin del USB OE* es til
para el eliminar errores del sistema inicial.

Permiso Del Test Patrn De Ojo


Se genera una prueba automtica al activar el bit UCFG<7> del patrn de ojo.
La salida del patrn de ojo depender de los ajustes del mdulo, significando que el
usuario es el primer responsable de configurar los ajustes del reloj SIE, las resistencias
pull-up y el modo transmisor. Adems, el mdulo tiene que estar permitido.
Una vez que se active UTEYE, el mdulo emula un cambio a una recepcin para
transmitir el estado y comenzar a transmitir una secuencia de bits J-K-J-K (K-J-K-J en
velocidad completa). La secuencia se repetir indefinidamente mientras que el test
patrn de ojo est permitido.
Observar que este bit no se debe activar mientras que el mdulo est conectado
con un sistema real USB. Este modo de prueba se utiliza para ayudar con las
verificaciones internas de las pruebas de certificacin USB. Se utiliza para depurar los
fallos obtenidos por el ruido de las seales que pueden afectar los flancos del sistema,
uniones de impedancias mal hechas y proximidad a otros componentes. No comprueba
correctamente la transicin de un estado de recepcin a uno de transmisin. Aunque el
patrn de ojo no significa que se sustituya la prueba ms compleja de certificacin del
USB, pero ayuda durante el primer test para eliminar errores del sistema.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Registro De Estado Del USB (USTAT)

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

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 18-4: USAT FIFO

REGISTRO 18-3: USTAT: Registro De Estado Del USB


BIT 7

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

ENDP3:ENDP0: Bits de actividad del nmero codificado del ltimo


Endpoint (representa el nmero del BDT actualizado
por la ltima transferencia del USB)
1111 = Endpoint 15
1110 = Endpoint 14
.
0001 = Endpoint 1
0000 = Endpoint 0
DIR:
Bit puntero de la ltima direccin BD
1 = la ltima transaccin era de entrada
0 = la ltima transaccin era de salida o de SETUP
PPBI:
Bit puntero del puntero ping-pong BD(1)
1 = la transaccin pasada estaba al banco Odd de BD
0 = la transaccin pasada estaba al banco Even de BD

Nota 1: Este bit es solamente vlido para los Endpoints con registros Even y
Odd BD disponibles.

259

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.2.4.

Control De Los Endpoints Del USB

Cada uno de los 16 Endpoints bidireccionales posibles tiene un registro de


control independiente, UEPn (donde n representa el nmero del Endpoint). Cada
registro tiene los mismos bits de control.
El bit EPHSHK (UEPn<4>) controla el protocolo de intercambio de los
Endpoints; activar este bit permite el protocolo de intercambio del USB. Tpicamente,
este bit se setea siempre excepto al usar Endpoints sncronos.
El bit EPCONDIS (UEPn<3>) se utiliza para permitir o inhabilitar las
operaciones de control del USB (SETUP) con Endpoint. Borrar este bit permite las
transacciones SETUP. Observar que los bits EPINEN y EPOUTEN se deben activar
para permitir las transacciones de entrada y de salida. Para el Endpoint 0, este bit debe
estar siempre borrado por que las especificaciones del USB identifican el Endpoint 0
como el Endpoint de control por defecto.
El bit EPOUTEN (UEPn<2>) se utiliza para permitir o para inhabilitar las
transacciones de salida del anfitrin. Activar este bit permite transacciones de salida.
Semejantemente, el bit EPINEN (UEPn<1>) permite o inhabilita las transacciones de
entrada al anfitrin.
El bit EPSTALL (UEPn<0>) se utiliza para indicar la condicin STALL para el
Endpoint. Si se ejecuta una STALL en un Endpoint particular, el bit EPSTALL para ese
Endpoint lo activar el SIE. Este bit permanece hasta que se borre por software o hasta
que ocurra un reset del SIE.

260

GUILLERMO DAVID HERRERO GONZLEZ

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:

Bit de permiso del protocolo de intercambio


1= se permite el protocolo de intercambio del Endpoint
0= se inhabilita (utilizado con los Endpoints sncronos)
Bit bidireccional de control del Endpoint
Si EPOUTEN=1 y EPINEN=1:
1= inhabilita las transferencias de control del
Endpoint n; slo permite las de entrada y las de salida
0= permite las transferencias de control (SETUP) y las
de entrada y salida del Endpoint n
Bit de permiso de la salida del Endpoint
1= la salida del Endpoint n permitida
0= la salida del Endpoint n inhabilitada
Bit de permiso de la entrada del Endpoint
1= la entrada del Endpoint n permitida
0= la entrada del Endpoint n inhabilitada
Bit de permiso de la parada del Endpoint(1)
1= se puede parar el Endpoint n
0= el Endpoint n no se puede parar

Nota 1: Vlido solamente si se permite el Endpoint n; si no, se ignora el bit.

3.4.18.2.5.

Registro De Direccin Del USB (UADDR)

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)

Registros Del Nmero Del Frame Del USB (UFRMH:

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.3.

RAM Del USB

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

GUILLERMO DAVID HERRERO GONZLEZ

3.4.18.4.

Buffer Descriptor Y Tabla Del Buffer Descriptor

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):

BDnSTAT: Registro de estado de BD


BDnCNT: Registro del byte de cuenta de BD
BDnADRL: Registro bajo de la direccin de BD
BDnADRH: Registro alto de la direccin de BD

BDs ocurre siempre como bloque de cuatro bytes en la secuencia,


BDnSTAT:BDnCNT:BDnADRL:BDnADRH. La direccin de BDnSTAT es siempre
una compensacin de (4n-1) (en hexadecimal) de 400h, con n como el nmero del
Buffer descriptor.
Dependiendo de la configuracin del buffering utilizada, hay 32, 33 64
sistemas de Buffer descriptores. El BDT debe ser por lo menos 8 bytes de largo. Esto se
debe a que la especificacin del USB asigna que por mandato debe tener cada
dispositivo el Endpoint0 configurado como entrada y salida en la disposicin inicial.
Dependiendo del Endpoint y de la configuracin buffering, el BDT puede ser de 256
bytes de largo.
Aunque se puede creer que los buffers descriptores y los registros de direccin
son registros de funciones especiales que no estn mapeados en hardware, como lo estn
los SFRs convencionales en el banco 15 del microcontrolador. Si el Endpoint
correspondiente a un BD particular no est permitido, sus registros no se utilizan. En
vez de aparecer como direcciones no implementadas, aparecen como RAM disponible.
Solamente cuando un Endpoint est permitido, activando el bit UEPn<1>, se consigue
que la memoria de esas direcciones funcione como BD. Como los registros BD tienen
cualquier direccin en la memoria de datos en un reset, tambin tienen un valor
indeterminado.
Un sistema particular de los registros BD son solamente vlidos si el Endpoint
correspondiente est permitido usando el registro UEPn. Todos los registros BD estn
disponibles en la RAM del USB. El BD para cada Endpoint debe configurarse antes de
permitirlo.

263

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 18-6: Ejemplo De Un Buffer Descriptor

3.4.18.4.1.

Estado Y Configuracin De Los BD

Los Buffer descriptores no slo definen el tamao de un Buffer Endpoint, sino


tambin determina su configuracin y control. La mayor parte de la configuracin se
hace con el registro de estado del BD, BDnSTAT. Cada BD tiene su propio registro
correspondientemente numerado BDnSTAT.
No como otros registros de control, la configuracin de los bits del registro
BDnSTAT depende del contexto. Hay dos configuraciones distintas, dependiendo de si
el microcontrolador o el mdulo del USB est modificando el BD y Buffer en un
momento dado. Solamente se comparten tres definiciones de bit entre los dos.

Propiedad Del Buffer


Porque los Buffers y su BDs los comparten la CPU y el mdulo del USB, se
utiliza un semforo para distinguir el BD y los Buffers asociados en memoria que se
permiten actualizar.
Esto se logra con el bit UOWN (BDnSTAT<7>). UOWN es el nico bit
compartido entre las dos configuraciones BDnSTAT.
Cuando UOWN est borrado, la entrada de BD la dirige por el ncleo del
microcontrolador. Cuando se activa el bit UOWN, la entrada del BD y la memoria del
Buffer los controla por el perifrico USB. El ncleo no debe modificar el BD o su
Buffer correspondiente en este momento. Observar que el ncleo del microcontrolador
puede leer BDnSTAT mientras que el SIE controla el Buffer y viceversa.
Los Buffer descriptores tienen varios significados dependiendo de la fuente de
actualizacin del registro. Antes de poner en sus manos el perifrico del USB, el usuario
puede configurar las operaciones bsicas del perifrico con los bits BDnSTAT. Durante
este tiempo, el byte de control de la cuenta y los registros de direccionamiento del
Buffer tambin pueden fijarse.
Cuando se activa UOWN, el usuario puede depender de los valores escritos en
los BDs. El SIE actualiza el BDs cuanto es necesario, sobrescribiendo los valores

264

GUILLERMO DAVID HERRERO GONZLEZ

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.

Registro BDnSTAT (Modo CPU)


Cuando UOWN=0, el ncleo del microcontrolador posee BD. En este punto, los
otros siete bits del registro toman las funciones de control.
El bit, KEN (BDnSTAT<5>), determina si un BD permanece activo. Si se setea
el bit, una vez que el bit UOWN est activo, seguir controlado el SIE independiente de
la actividad del Endpoint. Esto previene a la FIFO USTAT de actualizarse, as como
activar la interrupcin de transaccin completa para el Endpoint. Esta caracterstica se
debe permitir solamente cuando el puerto paralelo se selecciona como canal de entradasalida de datos en lugar de la RAM del USB.
El bit inhabilita el incremento de la direccin, INCDIS (BDnSTAT<4>), que
controla el direccionamiento automtico por incremento del SIE. Activar INCDIS
inhabilita el auto incremento de la direccin del Buffer por el SIE para cada byte
transmitido o recibido. Esta caracterstica slo se tiene que utilizar con el puerto
paralelo, donde cada byte de datos se procesa a/desde la misma posicin de memoria.
El bit de permiso de la sincronizacin de palabras, DTSEN (BDnSTAT<3>), se
encarga de comprobar la paridad de los datos. Activar DTSEN permite la sincronizacin
con el SIE. Cuando est permitido, comprueba la paridad del paquete de los datos contra
el valor de DTS (BDnSTAT<6>). Si un paquete llega con una sincronizacin incorrecta,
los datos se ignoran. No se escriben en la RAM del USB y el flag de interrupcin de
transferencia completa del USB no se activar. Sin embargo, el SIE enviar un ACK al
anfitrin para reconocer el recibo.
E bit del buffer de parada, BSTALL (BDnSTAT<2>), proporciona ayuda en el
control de las transferencias, generalmente una parada en el Endpoint 0. Tambin
proporciona ayuda con los comandos SET_FEATURE/CLEAR_FEATURE;
tpicamente, paradas continuas en cualquier Endpoint con excepcin del Endpoint de
control por defecto.
El bit BSTALL tambin permite las paradas del Buffer. Activar BSTALL hace
que el SIE devuelva un STALL al anfitrin si el smbolo recibido utilizara el BD en esa
localizacin. Cuando se activa el bit EPSTALL en el registro de control correspondiente
UEPn se genera una interrupcin STALL cuando se manda la STALL al anfitrin. El bit
UOWN activado y el BDs no se cambia a menos que se reciba un SETUP. En este caso,

265

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

la condicin de la STALL se borra y la propiedad del BD se devuelve al ncleo del


microcontrolador.
Los bits BD9:BD8 (BDnSTAT<1:0>) guardan los dos dgitos ms significativos
del byte de la cuenta del SIE; los 8 dgitos ms bajos se almacenan en el registro
correspondiente BDnCNT.
TABLA 18-3: Efecto Del Bit DTSEN En La Recepcin De Paquetes Pares/Impares
(Data0/Data1)
Salida del paquete
del Host

Configuracin
BDnSTAT

Respuesta del dispositivo despus de recibir el paquete

DTSEN

DTS

Protocolo

UOWN

TRNIF

BDnSTAT y USTAT Estado

DATA0

ACK

Actualizado

DATA1

ACK

No Actualizado

DATA0

ACK

Actualizado

DATA1

ACK

No Actualizado

Otro

ACK

Actualizado

Otro, con error

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:

Bit de posesin del USB(1)


0 = el ncleo del microcontrolador posee el BD y su
Buffer correspondiente
Bit de sincronizacin de los datos(2)
1 = paquete de datos 1
0 = paquete de datos 0
Bit de permiso de la subsistencia de BD
1 = USB guardar el BD indefinidamente una vez que
UOWN se active (requerido en la configuracin de los
Endpoint del SPP)
0 = USB guardar el ltimo smbolo procesado
Bit de inhabilitacin del incremento de la direccin
1 = el incremento de la direccin inhabilitado (requerido
en la configuracin de los Endpoint del SPP)

266

GUILLERMO DAVID HERRERO GONZLEZ

BIT 3

DTSEN:

BIT 2

BSTALL:

BIT 1-0

BC9:BC8:

0 = incremento de la direccin permitido


Bit de permiso de la sincronizacin
1 = sincronizacin de los datos permitida; los paquetes
de los datos con valor incorrecto de la sinc. se ignoran
excepto un SETUP, que se acepta
0 = ninguna sincronizacin de los datos
Bit de permiso de paradas en el Buffer
1 = parada del Buffer permitida; el protocolo de la
STALL publica si se recibe un smbolo que utilizara
el BD en la localizacin dada (UOWN se activa, el
resto sin cambios)
0 = parada del Buffer inhabilitado
Bits del byte de cuenta 9 y 8
Los bits de cuenta del byte representan el nmero de
bytes que se transmitirn con un smbolo IN o
recibidos durante un smbolo OUT. Junto con
BC<7:0>, las cuentas de byte vlidas son 0-1023.

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.

Registros BDnSTAT (Modo SIE)


Cuando los BDs y su Buffer los gobierna el SIE, la mayora de los bits de
BDnSTAT toman distintos significados. Al activarse UOWN, cualquier dato o ajuste de
control escritos por el usuario se sobrescriben con datos del SIE.
El registro BDnSTAT lo actualiza el SIE con el identificador del paquete (PID)
se almacena en BDnSTAT<5:3>. Se actualiza la cuenta de la transferencia en el registro
BDnCNT correspondiente. Los valores que desbordan el registro de 8 bits se
transportan a los dos dgitos ms significativos de la cuenta, almacenados en
BDnSTAT<1:0>.

267

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 18-6: BDnSTAT: Registro De Estado Del Buffer Descriptor N (BD0STAT A


BD63STAT), Modo SIE (Datos Devueltos Por El Lado Del Microcontrolador)
BIT 7

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 de posesin del USB


1= el SIE gobierna el BD y el buffer correspondiente
Bits identificadores del paquete
El valor recibido del smbolo PID de la ltima
transferencia (slo IN, OUT o SETUP)
Bits del byte de cuenta 9 y 8
Esto bits los actualiza el SIE para reflejar al nmero de
bytes recibidos en una transferencia OUT y el nmero
de bytes transmitidos en una IN.

BIT 5-2

PID3:PID0:

BIT 1-0

BC9:BC8:

3.4.18.4.2.

Byte De Cuenta De BD

El byte de cuenta representa el nmero total de bytes que se transmitirn durante


una IN. Despus de la transferencia IN, el SIE devolver el nmero de bytes enviados al
anfitrin.
Para una transferencia OUT, el byte de cuenta representa nmero mximo de los
bytes que se pueden recibir y almacenar en la RAM del USB. Despus de una
transferencia OUT, el SIE devolver el nmero real de bytes recibidos. Si este nmero
excede el byte de cuenta correspondiente, el paquete de datos se rechazar y se generar
un protocolo de intercambio NAK. Cuando sucede esto, el byte de cuenta no se
actualiza.
El byte de cuenta de 10 bits se distribuye sobre dos registros. Los 8 bits ms
bajos de la cuenta residen en el registro BDnCNT. Los dos altos en BDnSTAT<1:0>.
Esto representa una gama vlida para el byte de 0 a 1023.

3.4.18.4.3.

Validacin De La Direccin De BD

El par de registros de direccin de BD contiene la direccin de comienzo de la


RAM para el Buffer del Endpoint correspondiente. Para que una localizacin que
comienza en el Endpoint sea vlida, debe estar en la gama de la RAM del USB, 400h a
7FFh. No hay ningn mecanismo por hardware para comprobar la direccin del BD.
Si el valor de la direccin de BD no seala a una direccin de la RAM del USB,
o si seala a una direccin dentro del Buffer de otro Endpoint, es probable que se
pierdan los datos o que se sobrescriban. Semejantemente, solapando un Buffer de
recepcin (Endpoint de salida) con una localizacin de BD en uso se obtienen
resultados inesperados. Cuando se desarrollan aplicaciones USB, el usuario puede
incluir software para validar las direcciones en el cdigo.

268

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 18-7: Tablas Del Buffer Descriptor Mapeadas Para Los Modos De Los Buffer

270

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 18-4: Asignacin De Los Buffers Descriptores A Los Diferentes Modos De


Buffering
BDs asignados a Endpoint
Endpoint

Modo 0(No PingPong)

Modo 1(Ping-Pong en
EP0 OUT)

Modo 2(Ping-Pong en todos


EPs)

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Leyenda: (E) =Buffer de transaccin par, (O) = Buffer de transaccin impar


TABLA 18-5: Sumario De Los Registros De Los BDT Del USB
Nombre

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)

Buffer direccin bajo

BDnADRH(1)

Buffer direccin alto

Nota 1: En los registros de los BD, la n es un valor de 0 a 63. Los 64 registros


son semejantes. Todos tienen valores indeterminados en los reset.
2: Del bit 5 al 2 del BDnSTAT lo utiliza el SIE para devolver los valores
PID3:PID0 una vez el registro haya cambiado al SIE (Activar el bit UOWN). Cuando
los registros estn bajo el control del SIE, los valores de KEN, DTSEN, INCDIS y
BSTALL no tienen validez.
3: Antes de activar el bit UOWN, los bits 5 al 2 del BDnSTAT
configuran KEN, DTSEN, INCDIS y BSTALL.
4: Se ignora este bit a menos que DTSEN=1

3.4.18.5.

Interrupciones Del USB

El mdulo USB puede generar condiciones de interrupcin mltiples. Para


acomodar todas estas fuentes de interrupcin, el mdulo proporciona su propia lgica de
estructura de interrupcin, similar a la del microcontrolador. Las interrupciones del
USB se activan con un sistema de registros de control y registradas con un sistema
separado de flags. Todas las fuentes se concentran en una sola peticin de interrupcin
del USB, USBIF (PIR2<5>).
Hay dos capas de registros de interrupcin en el mdulo USB. El nivel superior
consiste en todas las interrupciones de estado del USB; stos se permiten y se sealan
por medio de un flag en los registros UIE y UIR, respectivamente. El segundo nivel
consiste en las condiciones de error del USB, se permiten y sealan por medio de un
flag en los registros UEIR y UEIE. Ninguna condicin de interrupcin en estos provoca
la activacin del flag de interrupcin por error del USB (UERRIF) en el nivel superior.
Las interrupciones se pueden utilizar para detectar acontecimientos rutinarios en
una transaccin USB.

272

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 18-8: Embudo De La Lgica De La Interrupcin Del USB

FIGURA 18-9: Ejemplo De Los Eventos Transaccin E Interrupcin

Nota 1: La transferencia de control mostrada es slo un ejemplo que muestra los


eventos que ocurren en cada transaccin. El control tpico de la transferencia se puede
extender a varios frames.

273

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.5.1.

Registro De Estado De Las Interrupciones Del USB (UIR)

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:

Bit de interrupcin del smbolo START-OF-FRAME


1= START-OF-FRAME recibido por el SIE
0= ningn START-OF-FRAME recibido por el SIE
Bit de interrupcin del protocolo de STALL
1= protocolo de STALL enviado por el SIE
0= protocolo de intercambio STALL no se ha enviado
Bit de interrupcin detector de reposo(1)
1= Reposo detectado (estado de reposo de 3ms o ms)
0= ninguna condicin de reposo detectada
Bit de interrupcin de transaccin completa(2)
1= transaccin pendiente completa; leer el registro
USTAT para informacin del Endpoint
0= transaccin pendiente no completada o no hay
Bit de interrupcin de deteccin de la actividad del
1= actividad detectada en las lneas D+/D0= ninguna actividad detectada en las lneas D+/DBit de interrupcin de la condicin de error del USB(4)
1= ha ocurrido una condicin de error desenmascarada
0= no ha ocurrido ninguna condicin de error.
Bit de interrupcin de reset del USB
1= Ha ocurrido un reset en el USB, 00h se carga en el
registro UADDR
0= no ha ocurrido ningn reset del USB

Nota 1: Una vez que se detecte un estado de reposo, el usuario puede colocar
al mdulo USB en este modo.

274

GUILLERMO DAVID HERRERO GONZLEZ

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.

Bit De Interrupcin De Deteccin De La Actividad Del Bus (ACTVIF)


El bit ACTVIF no se puede ser borrar inmediatamente despus de despertar al
mdulo USB del modo reposo o cuando se suspende. Se necesita un retraso para
sincronizar el estado interno del hardware antes de que el bit ACTVIF pueda borrarse
por firmware. Borrar el bit ACTVIF antes de sincronizar el hardware puede que no
cause efecto. Adems, si el mdulo USB utiliza una fuente de reloj de 96MHz PLL,
despus se borra el bit SUSPND, el mdulo del USB puede ser operacional
inmediatamente mientras que espera los 96MHz PLL.
EJEMPLO 18-1: Borrado Del Bit ACTVIF (UIR<2>)
Ensamblador:
LOOP:

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.

Registro De Permiso De Las Interrupciones (UIE)

El registro de permiso de la interrupcin del USB contiene los bits de permiso


del estado de las fuentes de interrupcin USB. No fijar ninguno de estos bits permitir la
interrupcin elegida en el registro UIR.
Los valores en este registro afectan solamente la propagacin de una condicin
de interrupcin a la lgica de interrupcin del microcontrolador. Los flags todava estn
activados por su condicin de interrupcin, permite que sean interrogados y se
mantienen sin realmente la interrupcin.

275

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 18-8: UIE: Registro De La Interrupcin Del USB


BIT 7

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:

Bit de permiso de la interrupcin del


START-OF-FRAME
1 = interrupcin permitida
0 = interrupcin inhabilitada
Bit de permiso de la interrupcin del protocolo STALL
1 = interrupcin permitida
0 = interrupcin inhabilitada
Bit de permiso de la interrupcin de reposo
1 = interrupcin permitida
0 = interrupcin inhabilitada
Bit de permiso de la interrupcin de transaccin
completa
1 = interrupcin permitida
0 = interrupcin inhabilitada
Bit de permiso de la interrupcin de deteccin de la
actividad del bus
1 = interrupcin permitida
0 = interrupcin inhabilitada
Bit de permiso de la interrupcin de error del USB
1 = interrupcin permitida
0 = interrupcin inhabilitada
Bit de permiso de la interrupcin del reset del USB
1 = interrupcin permitida
0 = interrupcin inhabilitada

276

GUILLERMO DAVID HERRERO GONZLEZ

3.4.18.5.3. Registro De Estado De Las Interrupciones Por Error Del


USB (UEIR)
El registro de estado de las interrupciones de error del USB contiene los flags
para cada fuente de error del perifrico USB. Cada una de estas fuentes se controla con
el bit de permiso de interrupcin correspondiente del registro UEIE. Todas los flags de
error de USB se suman para generar el flag de interrupcin de error del USB (UERRIF)
en el nivel superior de la lgica de interrupcin.
Cada bit de error se activa cuando se detecta la condicin de interrupcin. As, la
interrupcin normalmente no corresponde con el final de un smbolo que se acaba de
procesar.
Una vez que un bit de interrupcin haya activado el SIE, tiene que borrarse por
software escribiendo un 0.
REGISTRO 18-9: UEIR: Registro De Estado De Las Interrupciones De Error Del USB
BIT 7

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:

Flag de error del bit mercanca


1= Error detectado
0= No se ha detectado error
Flag de error de espera en el procesamiento del bus
1= error detectado (han llegado ms de 16bits de reposo
antes de un EOP)
0= error no detectado
Flag de error del tamao de los datos
1= error detectado (no era un nmero entero de bytes)
0= error no detectado
Flag de fallo CRC16
1= error detectado
0= error no detectado
Flag de error del anfitrin CRC5
1= error detectado (paquete simblico rechazado)
0= error no detectado
Flag de prueba de fallo de PID
1= error detectado
0= error no detectado

277

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.5.4.

Registro De Permiso De Las Interrupciones De Error (UEIE)

El registro de permiso de las interrupciones de error (UEIE) contiene los bits de


activacin para cada fuente de interrupcin de error del USB. Activando cualquiera de
estos bits se activa la fuente de la interrupcin respectiva.
Como el registro UIE, los bits activos slo afectan la propagacin de la
condicin de la interrupcin. Los flags se activan cuando se cumplen sus condiciones.
REGISTRO 18-10: UEIE: Registro De Permiso De La Interrupcin De Error Del USB
BIT 7

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:

Bit de permiso de interrupcin del error del bit


mercanca
1= Interrupcin permitida
0= Interrupcin no permitida
Bit de permiso de interrupcin del error de espera en
el procesamiento del bus
1= Interrupcin permitida
0= Interrupcin no permitida
Bit de permiso de interrupcin del error del tamao
de los datos
1= Interrupcin permitida
0= Interrupcin no permitida
Bit de permiso de interrupcin del fallo CRC16
1= Interrupcin permitida
0= Interrupcin no permitida
Bit de permiso de interrupcin del error del anfitrin
CRC5
1= Interrupcin permitida
0= Interrupcin no permitida
Bit de permiso de interrupcin del prueba de fallo de
PID
1= Interrupcin permitida
0= Interrupcin no permitida

278

GUILLERMO DAVID HERRERO GONZLEZ

3.4.18.6.

Modos De Energa Del USB

Las aplicaciones USB tendrn diferentes requisitos y configuracin de energa.


Los casos ms comunes son los presentados aqu.

3.4.18.6.1.

Slo Energa En El Bus

En modo de slo energa en el bus. Es el mtodo ms simple de energa para el


dispositivo.
FIGURA 18-10: Slo Energa En El Bus

3.4.18.6.2.

Slo Self-Power

En modo slo SELF-POWER, el uso del USB proporciona su propia energa,


con la energa muy pequea cedida por el USB. Observar que indica cuando el USB ha
estado conectado.
FIGURA 17-11: Slo Self-Power

3.4.18.6.3.

Energa Dual Con Dominancia Self-Power

Algunas aplicaciones necesitan una opcin con dos energas. La aplicacin


utiliza la fuente de energa interna como primaria, pero cambia a la energa del USB
cuando no se dispone de una fuente lineal.

279

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 18-12: Energa Dual Con Dominancia Self-Power

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.

Streaming Parallel Port (SPP)

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

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 18-6: Registros Asociados A Las Operaciones Del Mdulo USB(1)


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

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

Leyenda: - = las localizaciones no estn implementadas. Las celdas sombreadas


no se utilizan con el mdulo USB.
Nota 1: Esta tabla incluye solamente las localizaciones SFRs mapeadas en el
banco 15 de la memoria de datos. Los registros de los BD, que estn mapeados en el
banco 4 y no son SFRs verdaderos, estn en la tabla 18-5.

281

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.9.

Descripcin Del USB

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

La funcionalidad del dispositivo del USB se estructura en un esquema de capas.


Cada nivel se asocia a un nivel funcional dentro del dispositivo. La capa ms alta, con
excepcin del dispositivo, es la de configuracin. Un dispositivo puede tener
configuraciones mltiples. Por ejemplo, un dispositivo particular puede tener requisitos
de energa mltiples basados en Self-Power o modos de energa slo del bus.
Para cada configuracin, puede haber mltiple interfaces. Cada interfaz poda
apoyar un modo particular de esa configuracin.
Debajo del interfaz estn los Endpoints. Los datos se mueven directamente a este
nivel. Puede haber 16 Endpoints bidireccionales. El Endpoint 0 es siempre el Endpoint
de control por defecto; cuando el dispositivo est en el bus, el Endpoint 0 debe estar
disponible para configurarlo.
FIGURA 18-13: Capas Del USB

282

GUILLERMO DAVID HERRERO GONZLEZ

3.4.18.9.2.

Frames

La informacin que se comunica en el bus se agrupa en ranuras de 1ms,


designadas frames. Cada frame puede contener muchas transacciones a varios
dispositivos y Endpoints.

3.4.18.9.3.

Transferencias

Hay cuatro tipos de transferencias definidas en las especificaciones del USB.


Sncrona: Este tipo proporciona un mtodo de transferencia para
cantidades de datos grandes (hasta 923 bytes) con la entrega puntual
asegurada; sin embargo, la integridad de los datos no se asegura. Es
bueno en aplicaciones donde los datos son pequeos y la prdida no es
crtica, por ejemplo audio.
Bulk: Este mtodo de transferencia permite grande cantidades de datos
que se transferirn asegurando la integridad de los datos; sin embargo, la
puntualidad de la entrega no se asegura.
Interrupcin: Este tipo de transferencia prev la entrega puntual
asegurada para bloques pequeos de datos, se asegura la integridad de los
datos.
Control: Este tipo prev la disposicin de dispositivo control.
Mientras que los dispositivos full-speed soportan todos los tipos de
transferencia, los dispositivos de poca velocidad se limitan a las transferencias
interrupcin y control.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.18.9.5.

Enumeracin

Cuando el dispositivo se une al bus, el anfitrin crea un proceso de enumeracin


en un intento por identificar el dispositivo. Esencialmente, el anfitrin interroga al
dispositivo, recopila informacin tal como el consumo de energa, tarifas y tamaos de
los datos, protocolo y otra informacin descriptiva, que contienen los descriptores. El
proceso de enumeracin sera:
1. Reset del USB: Resetear el dispositivo. As, el dispositivo no se
configura y no tiene una direccin (direccin 0).
2. Conseguir el descriptor del dispositivo: El anfitrin solicita una pequea
parte del descriptor del dispositivo.
3. Reset del USB: Resetear el dispositivo otra vez.
4. Fijar la direccin: El anfitrin asigna una direccin al dispositivo.
5. Conseguir el descriptor del dispositivo: El anfitrin recupera el descriptor
del dispositivo, recolectando la informacin, por ejemplo fabricante, tipo
de dispositivo, control mximo del tamao de los paquetes.
6. Conseguir los descriptores de configuracin.
7. Conseguir cualquier otro descriptor.
8. Fijar una configuracin.
El proceso exacto de enumeracin depende del anfitrin.

3.4.18.9.6.

Descriptores

Hay ocho estndares del descriptor de cul cinco son los ms importantes para
este dispositivo.

Descriptor Del Dispositivo


El descriptor del dispositivo proporciona la informacin de carcter general, por
ejemplo fabricante, nmero del producto, nmero de serie, la clase del dispositivo y el
nmero de configuraciones. Hay solamente un descriptor del 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

GUILLERMO DAVID HERRERO GONZLEZ

Descriptor Del Endpoint


El descriptor del Endpoint identifica el tipo de transferencia y direccin, tambin
algunos otros especficos del Endpoint. Puede haber muchos Endpoints en un
dispositivo y los Endpoints pueden compartirse en diversas configuraciones.

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.

Velocidad Del Bus

Cada dispositivo USB debe indicar su presencia del bus y su velocidad al


anfitrin. Esto se logra con una resistencia de 1,5k que se conecta al bus en el
momento del acoplamiento.
Dependiendo de la velocidad del dispositivo, la resistencia une la lnea D+ o Da 3,3V. En dispositivos de poca velocidad, la resistencia se conecta a la lnea D-. En los
dispositivos full-speed, la resistencia se conecta a la lnea D+.

3.4.18.9.8.

Especificaciones De Clase Y Drivers

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.19.

PUERTO PARALELO STREAMING (SPP)

Nota: El puerto paralelo streaming est solamente disponible en los dispositivos


de 40/44-pines.
Los dispositivos USB PIC18F4455/4550 proporcionan un Puerto Paralelo
Streaming como interfaz de alta velocidad para mover datos a y desde un sistema
externo. Este puerto paralelo funciona como puerto principal, completo con un chip
select y salidas de reloj para controlar el movimiento de los datos a los dispositivos
auxiliares. Los datos se pueden dirigir directamente al SIE del USB o al ncleo del
microprocesador.
FIGURA 19-1: Trayectoria De Datos Del SPP

Adems, el SPP puede proporcionar tiempo multiplexado tratando la


informacin junto con los datos usando segunda salida estroboscopia. As, el nmero
del Endpoint del USB se puede escribir conjuntamente con los datos en ese Endpoint.

3.4.19.1.

Configuracin Del SPP

La operacin del SPP se controla con dos registros: SPPCON y SPPCFG. El


registro SPPCON dirige la operacin total del puerto paralelo y determina si funciona
bajo el control del USB o del microcontrolador. El registro SPPCFG controla la
configuracin del tiempo y los pines de salida.

286

GUILLERMO DAVID HERRERO GONZLEZ

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:

Bit de permiso de la salida del Endpoint


1= la salida del Endpoint n permitida
Bit de propiedad del SPP
1= El perifrico USB controla el SPP
0= El microcontrolador controla directamente el SPP
Bit de permiso del SPP
1 = se permite
0 = se desactiva

287

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 19-2: SPPCFG: Registro De La Configuracin Del SPP


BIT 7

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

El SPP tiene cuatro salidas del control:


Dos salidas de reloj separadas (CK1SPP y CK2SPP)
Salida permitida (OESPP)
Chip select (CSSPP)
Despus, permiten diversas configuraciones para controlar el flujo de datos a los
dispositivos auxiliares. Cuando se utilizan todas las salidas de control, las tres opciones
principales son:
CLK1 controla la informacin del Endpoint direccionado cuando CLK2
controla los datos.
CLK1 controla las operaciones de escritura mientras que CLK2 controla
las de lectura.

288

GUILLERMO DAVID HERRERO GONZLEZ

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

El SPP se disea con la capacidad de agregar estados de espera para las


operaciones de lectura y de escritura. Esto permite el acceso paralelo a los dispositivos
que requieren ms tiempo para acceder.
Registrar el estado de espera se basa en el reloj de la fuente de datos. Si el SPP
se configura para funcionar como Endpoint del USB, entonces los estados de espera se
basan en el reloj del USB. Asimismo, si el SPP se configura para funcionar desde el
microcontrolador, entonces los estados de espera se basa en el ratio de instruccin
(FOSC/4).
Los bits WS3:WS0 activaron los estados de espera utilizados por el SPP, con
una gama de ningunos estado de espera a 30 estados de espera, en mltiplos de dos. Los
estados de espera se agregan simtricamente en todas las transacciones, con una mitad
aadida a cada uno de los dos ciclos de reloj requeridos para la transaccin.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 19-3: Sincronizacin Para El USB Escribe Direccin Y Datos (Estados De


Espera)

FIGURA 19-4: Sincronizacin Para El USB Escribe Direccin Y Lee Datos (Estados
De Espera)

3.4.19.2.

Sistema Para El Control Del USB

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

GUILLERMO DAVID HERRERO GONZLEZ

5. Activar el bit INCDIS (BDnSTAT<4>) para inhabilitar el incremento


automtico de la direccin del buffer.
6. Activar el bit SPPEN para permitir el mdulo.
Nota: Si un Endpoint del USB se configura para utilizar el SPP, el tipo de la
transferencia de datos de ese Endpoint debe ser sncrona.
FIGURA 19-5: Transferencia De Datos Entre USB SIE Y SPP

3.4.19.3.

Sistema Para El Control Del Microcontrolador

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

Cuando lo controla el ncleo del microcontrolador, el control puede generar una


interrupcin para notificar la aplicacin cuando termina cada operacin de lectura y
escritura. El flag de interrupcin es SPPIF (PIR1<7>) y se permite con el bit SPPIE
(PIE1<7>). Como el resto de prioridades de interrupciones del microcontrolador, se
puede fijar a un nivel bajo o prioritario. Esto se hace con el bit SPPIP (IPR1<7>).

291

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Lectura Del SPP

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

GUILLERMO DAVID HERRERO GONZLEZ

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:

Bit del estado de lectura del SPP (vlido cuando


SPPCON<SPPOWN>=1, USB)
1 = la transaccin anterior del SPP era de lectura
0 = la transaccin anterior del SPP no era de lectura
WRSPP:
Bit de estado de escritura del SPP (vlido cuando
SPPCON<SPPOWN>=1, USB)
1 = la transaccin anterior del SPP era de escritura
0 = la transaccin anterior del SPP no era de escritura
SPPBUSY:
Bit de ocupacin del bus del SPP
1 = El SPP est ocupado
0 = El SPP est listo para aceptar otras peticiones de
lectura y escritura
ADDR3:ADDR0: Bits de direccin del Endpoint del SPP
1111 = Endpoint 15

0001
0000 = Endpoint 0

TABLA 19-1: Registros Asociados Al Puerto Paralelo Streaming


Nombre

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)

Leyenda: -=no implementado, se leen 0. Las casillas sombreadas no se utilizan


con el SPP.

293

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Nota 1: Implementado cuando el Master Clean est desactivado (configuracin


del bit MCLRE=0).
2: RE3 es el nico bit de PORTE implementado en dispositivos de 28
pines y de 40/44 pines. El resto de pines se implementan si existen el resto del PORTE
(es decir, en los dispositivos de 40/44 pines).
3: Estos registros y/o bits no estn implementados en los dispositivos de
28 pines.

3.4.20.
(A/D)

MDULO CONVERTIDOR DE 10-BIT ANALGICO A DIGITAL

El mdulo conversor de analgico a digital (A/D) tiene 10 entradas con los


dispositivos de 28 pines y 13 en los de 40/44 pines. Este mdulo permite la conversin
de una seal de entrada analgica a un nmero digital de 10bits.
El mdulo tiene cinco registros:

Registro alto del resultado A/D (ADRESH)


Registro bajo del resultado A/D (ADRESL)
Registro de control A/D 0 (ADCON0)
Registro de control A/D 1 (ADCON1)
Registro de control A/D 2 (ADCON2)

El registro ADCON0, gobierna las operaciones del mdulo A/D. El registro


ADCON1 configura las funciones de los puertos. El registro ADCON2 configura el
reloj, programa el tiempo de adquisicin y justificacin.

294

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 20-1: ADCON0: Registro De Control A/D 0


BIT 7

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:

Bits selectores del canal analgico


0000 = canal 0 (AN0)
0001 = canal 1 (AN1)
0010 = canal 2 (AN2)
0011 = canal 3 (AN3)
0100 = canal 4 (AN4)
0101 = canal 5 (AN5)(1,2)
0110 = canal 6 (AN6)(1,2)
0111 = canal 7 (AN7)(1,2)
1000 = canal 8 (AN8)
1001 = canal 9 (AN9)
1010 = canal 10 (AN10)
1011 = canal 11 (AN11)
1100 = canal 12 (AN12)
1101 = No implementado(2)
1110 = No implementado(2)
1111 = No implementado(2)
Bit A/D del estado de la conversin
Cuando ADON=1:
1 = conversin A/D en marcha
0 = A/D en reposo
Bit de permiso del A/D
1 = mdulo A/D permitido
0 = mdulo A/D no permitido

Nota 1: Estos canales no se implementan en los dispositivos de 28pines.


2: La ejecucin de una conversin en los canales no implementados
devolver una medida flotante de la entrada.

295

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 20-2: ADCON1: Registro De Control A/D 1


BIT 7

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 de configuracin de la tensin de referencia


(fuente de VREF-)
1 = VREF- (AN2)
0 = VSS
VCFG0:
Bit de configuracin de la tensin de referencia
(fuente de VREF+)
1 = VREF+ (AN3)
0 = VDD
PCFG3:PCFG0: Bits de configuracin de los puertos A/D:

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

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 20-3: ADCON2: Registro De Control A/D 2


BIT 7

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:

Bit selecto del formato A/D del resultado


1 = derecho justificado
0 = izquierdo justificado
ACQT2:ACQT0: Bits selectores del tiempo de adquisicin
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD(1)
ADCS2:ADCS0: Bits selectores del reloj de conversin
111= FRC (reloj A/D derivado del oscilador RC)(1)
110= FOSC/64
101= FOSC/16
100= FOSC/4
011= FRC (reloj A/D derivado del oscilador RC)(1)
010= FOSC/32
001= FOSC/8
000= FOSC/2

Nota 1: Si se selecciona la fuente de reloj A/D FRC, se aade un retraso de un


TCY (ciclo de instruccin) antes de que el reloj A/D comience. Esto permite que la
instruccin SLEEP se ejecute antes de comenzar una conversin.
La tensin analgica de referencia es seleccionable por software es cualquier
fuente de tensin positiva y negativa del dispositivo (VDD y VSS) o el nivel de tensin en
los pines RA3/AN3/VREF+ y RA2/AN2/VREF-/CVREF.
El convertidor A/D tiene la caracterstica de poder funcionar mientras que el
dispositivo est en modo sleep. Al funcionar en sleep, el reloj de conversin A/D debe
derivar del oscilador interno RC A/D.
La salida de la muestra y del asimiento es la entrada en el convertidor, que
genera el resultado va aproximaciones sucesivas.
Un reset del dispositivo fuerza todos los registros a su estado de reset. Esto
provoca que el mdulo A/D se apague y la conversin en marcha se aborte.
Cada pin del puerto asociado al convertidor A/D puede configurarse como
entrada analgica o como entrada-salida digital. Los registros ADRESH y ADRESL

297

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

contienen el resultado de la conversin A/D. Cuando la conversin A/D se completa, el


resultado se carga en el par de registros ADRESH:ADRESL, el bit GO/DONE*
(registro ADCON0) se borra y se activa el flag de interrupcin A/D, ADIF.
FIGURA 20-1: Diagrama De Bloques Del A/D

Nota 1: Los canales de 5 a 7 no estn disponibles en los dispositivos de


28pines.
2: Los pines de E/S tienen un diodo de proteccin a VDD y VSS.
El valor en los registros ADRESH:ADRESL no se modifica con un POR. Los
registros ADRESH:ADRESL contendrn datos desconocidos despus de un POR.
Despus de que el mdulo A/D se haya configurado segn lo deseado, el canal
seleccionado debe adquirir antes de que comience la conversin. Los canales de entrada
analgica deben tener sus bits TRIS correspondientes seleccionados como entrada.
Despus de esta adquisicin el tiempo ha transcurrido, la conversin A/D puede

298

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 20-3: Modelo De Entrada Analgica

3.4.20.1.

Requisitos De La Adquisicin A/D

En el convertidor A/D, para satisfacer su exactitud especifica, el condensador


que mantiene la entrada (CHOLD) se tiene que cargar completamente para que entre el
nivel de tensin del canal. La impedancia de la fuente (RS) y la impedancia del cambio
del muestreo interno (RSS) afectan directamente al tiempo requerido para cargar el
condensador CHOLD. La impedancia del cambio del muestreo (RSS) vara sobre la tensin
del dispositivo (VDD). La impedancia de la fuente afecta a la tensin compensando la
entrada analgica (debido al pin de salida de corriente). La impedancia recomendada
mxima para las fuentes analgicas es de 2,5k. Despus de que el canal de entrada
analgico est seleccionado (cambiado), el canal se debe muestrear por lo menos el
tiempo mnimo de adquisicin antes de comenzar una conversin.
Nota: Cuando comienza la conversin, el condensador se desconecta del pin de
entrada.
Para calcular el tiempo mnimo de adquisicin, se puede usar la ecuacin 20-1.
Esta ecuacin asume que existe el error de 1/2LSb (1024 pasos para el A/D). El error de
1/2LSb es el error mximo permitido del A/D para conseguir su resolucin especfica.
El ejemplo 20-3 muestra el clculo del tiempo mnimo de adquisicin requerido
TACQ. Este clculo se base con los siguientes datos de aplicacin:
CHOLD=25pF
RS=2,5k
Error de la conversin <= 1/2 LSb
VDD=5V
RSS=2k

300

GUILLERMO DAVID HERRERO GONZLEZ

Temperatura=85C (mximo del sistema)


ECUACIN 20-1: Adquisicin Tiempo
T ACQ = Tiempo _ Colocacin _ Amplificador + Tiempo _ C arg a _ C HOLD + Coeficiente _ Temperatura =
= T AMP + TC + TCOFF

ECUACIN 20-2: Tiempo Mnimo De Carga A/D


V HOLD = (V REF (V REF / 2048)) (1 e ( TC / C HOLD ( RIC + RSS + RS )) )
o
TC = (C HOLD )( R IC + R SS + R S ) Ln(1 / 2048)

ECUACIN 20-3: Clculo Del Tiempo De Adquisicin Mnimo


T ACQ = T AMP + TC + TCOFF
T AMP = 2s
TCOFF = (Temp 25 C )(0,02s / C ) = (85 C 25 C )(0,02s / C ) = 1,2 s

El coeficiente de temperatura slo se necesita para temperaturas >25C. Por


debajo de 25C, TCOFF=0ms.
TC = (C HOLD )( R IC + R SS + R S ) Ln(1 / 2048) s = (25 pF )(1k + 2k + 2,5k) Ln(0,0004883) s = 1,05s
T ACQ = 0,2s + 1,05s + 1,2s = 2,45s

3.4.20.2.
Tiempo

Seleccionar Y Configuracin El Tiempo De Adquisicin

El registro ADCON2 permite que el usuario seleccione tiempo de adquisicin


que ocurre cada vez que se activa el bit GO/DONE*. Tambin da a los usuarios la
opcin de utilizar un tiempo de adquisicin automticamente determinado. El tiempo de
adquisicin se puede determinar con los bits ACQT2:ACQT0 (ADCON2<5: 3>) que
proporcionan una gama de 2 a 20 TAD. Cuando se activa el bit GO/DONE*, el mdulo
A/D contina muestreando la entrada con el tiempo de adquisicin seleccionado,
entonces comienza automticamente una conversin. Desde que se programa el tiempo
de adquisicin, puede que no ser necesite esperar un periodo de adquisicin entre la
seleccin de un canal y activar el bit GO/DONE*.
Se selecciona la adquisicin manual cuando ACQT2:ACQT0 = 000. Cuando se
activa el bit GO/DONE*, se para el muestreo y comienza una conversin. El usuario es
el responsable de asegurar que ha pasado el tiempo de adquisicin requerido entre la
seleccin de la entrada deseada y fijar el bit GO/DONE*. Esta opcin es el estado por
defecto en un reset de los bits ACQT2:ACQT0 y es compatible con los dispositivos que
no ofrecen tiempos de adquisicin programables.
En cualquier caso, cuando se termina la conversin, el bit GO/DONE* se borra,
se activa el flag ADIF y A/D comienza a muestrear el canal actualmente seleccionado

301

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

otra vez. Si se programa un periodo de adquisicin, no hay nada que indique si el


tiempo de adquisicin ha terminado o si la conversin ha comenzado.

3.4.20.3.

Seleccionar El Reloj De Conversin A/D

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)

Mxima frecuencia del dispositivo

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)

Nota 1: La fuente RC tiene un TAD de 4ms.


2: La fuente RC tiene un TAD de 6ms.
3: Para dispositivos con frecuencias alrededor de 1MHz, el dispositivo
tiene que estar en sleep durante la conversin o la exactitud del A/D est fuera de lo
especificado.
4: Dispositivos de baja potencia

302

GUILLERMO DAVID HERRERO GONZLEZ

3.4.20.4.

Operacin En Los Modos De Ahorro De Energa

La seleccin del tiempo de adquisicin automtico y el reloj de conversin A/D


se determinado en parte con la fuente de reloj y la frecuencia mientras se trabaje en un
modo de ahorro de energa.
Si se espera que el A/D funcione mientras que el dispositivo est dentro de un
modo de ahorro de energa, los bits ACQT2:ACQT0 y ADCS2:ADCS0 en ADCON2 se
deben actualizar con la fuente de reloj que se utilizar en este modo. Despus de entrar
en el modo, una adquisicin o la conversin A/D puede comenzar. Una vez que haya
comenzado, el dispositivo debe continuar controlado con la misma fuente de reloj hasta
que la conversin termine.
Si se desea, el dispositivo se puede poner en modo reposo durante la conversin.
Si la frecuencia de reloj del dispositivo es menos de 1MHz, se tiene que seleccionar la
fuente de reloj RC A/D.
Operar en el modo sleep requiere que se seleccione el reloj A/D FRC. Si los bits
ACQT2:ACQT0 se fijan a 000 y comienza una conversin, la conversin tendr un
retraso de un ciclo de instruccin para permitir la ejecucin de la instruccin SLEEP y
entrada del modo sleep. El bit IDLEN (OSCCON<7>) tiene que estar borrado antes de
comenzar la conversin.

3.4.20.5.

Configuracin De Los Pines De Los Puertos Analgicos

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

La fase de descarga se utiliza para inicializar el valor de la matriz del


condensador. La matriz se descarga antes de cada muestra. Esta caracterstica ayuda a
optimizar la ganancia unitaria del amplificador como el circuito siempre carga la matriz
del condensador, ms bien que cargar/descarga se basa en la medida de valores
anteriores.
FIGURA 20-4: Ciclos TAD En La Conversin A/D (ACQT<2:0>=000, TAQT=0)

304

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 20-5: Ciclos TAD En La Conversin A/D (ACQT<2:0>=010, TAQT=4TAD)

3.4.20.8.

Uso Del Disparador Del CCP2

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 20-2: Registros Asociados A Las Operaciones A/D


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

(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

A/D Result Register High Byte

ADRESL

A/D Result Register Low Byte

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

Leyenda: -=no implementado, se leen 0. Las casillas sombreadas no se utilizan


con el mdulo A/D.
Nota 1: Implementado cuando el Master Clean est desactivado (configuracin
del bit MCLRE=0).
2: RA6 y su latch asociado y los bits de direccin se activan como
puertos de E/S dependiendo de la configuracin del oscilador; en otro caso, se leen 0.
3: El puerto RE3 est disponible slo como entrada cuando el bit de
configuracin MCLRE es 0.
4: Estos registros y/o bits no estn disponibles en los dispositivos de
28pines.

306

GUILLERMO DAVID HERRERO GONZLEZ

3.4.21.

MDULO COMPARADOR

El mdulo comparador analgico contiene dos comparadores que se pueden


configurar de muchas maneras. Las entradas se pueden elegir de las entradas analgicas
multiplexadas con los pines RA0 a RA5, como el mdulo de tensin de referencia del
chip. Las salidas digitales (normales o invertidas) estn disponibles en los niveles de los
pines o tambin se pueden leer a travs del registro de control.
El registro CMCON selecciona la configuracin de la entrada y de la salida del
comparador.
REGISTRO 21-1: CMCON: Registro De Control Del Comparador
BIT 7
C2OUT
R-0

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

Bit de salida del comparador 2


Cuando C2INV=0:
1 = C2 VIN+ > C2 VIN0 = C2 VIN+ < C2 VINCuando C2INV=1:
1 = C2 VIN+ < C2 VIN0 = C2 VIN+ > C2 VINBit de salida del comparador 1
Cuando C1INV=0:
1 = C1 VIN+ > C1 VIN0 = C1 VIN+ < C1 VINCuando C1INV=1:
1 = C1 VIN+ < C1 VIN0 = C1 VIN+ > C1 VINBit inversor de la salida del comparador 2
1 = salida C2 invertida
0 = salida C2 no invertida
Bit inversor de la salida del comparador 1
1 = salida C1 invertida
0 = salida C1 no invertida
Bit del cambio de la entrada del comprador
Cuando CM2:CM0=110:
1 =C1 VIN- se conecta con RA3/AN3/VREF+
El C2 VIN- se conecta con RA2/AN2/VREF-/CVREF
0 =C1 VIN- se conecta con RA0/AN0
El C2 VIN- se conecta con RA1/AN1
Bits del modo del comparador
La figura 21-1 muestra los modos del comparador y
los ajustes de los bits CM2:CM0.

307

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 21-1: Modos De Operacin De Las E/S Del Comparador

308

GUILLERMO DAVID HERRERO GONZLEZ

3.4.21.1.

Configuracin Del Comparador

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.

Operaciones Del Comparador

En la figura 21-2 se muestra un comparador simple, junto con la relacin entre


los niveles de entrada de datos analgicos y la salida digital. Cuando la entrada
analgica en VIN+ es menor que la entrada analgica VIN-, la salida del comparador es
un nivel digital bajo. Cuando la entrada analgica en VIN+ es mayor que la entrada
analgica VIN-, la salida del comparador es un nivel digital alto. Las reas sombreadas
de la salida del comparador en la figura 21-2 representan la incertidumbre, debido a las
compensaciones de la entrada y al tiempo de reaccin.
FIGURA 21-2: Comparador Simple

3.4.21.3.

Referencia Del Comparador

Dependiendo del modo de funcionamiento del comparador, se puede utilizar


cualquier referencia externa o interna de tensin. La seal analgica presente en VIN- se
compara con la seal en VIN+ y la salida digital del comparador se ajusta
consecuentemente.

309

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.21.3.1.

Seal De Referencia Externa

Cuando son externas se utilizan las referencias de tensin, el mdulo del


comparador se puede configurar para tener los comparadores funcionar desde la misma
u otra fuente de referencia. Sin embargo, las aplicaciones del detector del umbral
pueden necesitar la misma referencia. La seal de referencia debe estar entre VSS y VDD
y se puede aplicar a cualquier pin del/los comparador/es.

3.4.21.3.2.

Seal De Referencia Interna

El mdulo del comparador tambin permite la seleccin de referencia interna de


tensin interna generada por el mdulo comparador de tensin de referencia.
La referencia interna est disponible solamente en el modo donde cuatro
entradas se multiplexan a dos comparadores (CM2:CM0=110). En este modo, la tensin
interna de referencia se aplica al pin VIN+ de ambos comparadores.

3.4.21.4.

Tiempo De Respuesta Del Comparador

El tiempo de reaccin es el tiempo mnimo, despus de seleccionar una nueva


tensin de referencia o fuente entrada, antes de que la salida del comparador tenga un
nivel vlido. Si la referencia interna cambia, se tiene que considerar el mximo retraso
de la tensin interna de referencia al usar las salidas del comparador. Si no, se tiene que
utilizar el mximo retraso de los comparadores.

3.4.21.5.

Salidas Del Comparador

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

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 21-3: Diagrama De Bloques Del Comparador De Salida

3.4.21.6.

Interrupciones Del Comparador

Se activa el flag de interrupcin del comparador siempre que haya un cambio en


el valor de la salida de cualquier comparador. El software necesitar mantener la
informacin sobre estado de los bits de la salida, dependiendo de la lectura de
CMCON<7:6>, para determinar el cambio real que ha ocurrido. El bit CMIF (PIR2<6>)
es el flag de interrupcin del comparador. El bit CMIF se tiene que resetear borrndolo.
Puesto que est tambin posible escribir un 1 en este registro, se puede iniciar una
interrupcin simulada.
El bit CMIE (PIE2<6>) y el bit PEIE (INTCON<6>) se tienen que activar para
permitir la interrupcin. Adems, el bit GIE (INTCON<7>) tiene que estar activo. Si
ninguno de estos bits estn activos, no se permiten las interrupciones, aunque el bit
CMIF todava se active si ocurre una condicin de interrupcin.
Nota: Si un cambio en el registro de CMCON (C1OUT o C2OUT) ocurre
cuando se est ejecutando la operacin de lectura (comienzo del ciclo Q2), entonces el
flag de interrupcin CMIF (PIR2<6>) puede que no e active.
El usuario, en la rutina de interrupcin, puede borrar la interrupcin de la manera
siguiente:
a) Cualquier lectura o escritura de CMCON terminar con condicin de
error de unin.
b) Borrar el flag CMIF.
Una condicin de error de unin continuar activando el flag CMIF. La lectura
de CMCON terminar con la condicin de error de unin y permitir que el flag CMIF
se borre.

311

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.21.7.

Operaciones Del Comparador Durante El Modo SLEEP

Cuando un comparador est activo y el dispositivo se pone en modo sleep, el


comparador sigue estando activo y la interrupcin es funcional si est permitida. Esta
interrupcin despertar al dispositivo del modo sleep, cuando est permitida. Cada
comparador operacional consumir corriente adicional, segn las indicaciones de las
especificaciones del comparador. Para reducir al mnimo el consumo de energa en el
modo sleep, se apagan los comparadores (CM2: CM0 = 111) antes de entrar en el modo
sleep. Si el dispositivo despierta del sleep, no le afecta al contenido del registro
CMCON.

3.4.21.8.

Efectos De Un Reset

Un reset del dispositivo fuerza al registro CMCON a su estado de reset,


haciendo que los mdulos del comparador se apaguen (CM2:CM0=111). Sin embargo,
los pines de entrada (RA0 a RA3) se configuran como entradas analgicas por defecto.
La configuracin de E/S para stos pines se determina con el ajuste de los bits
PCFG3:PCFG0 (ADCON1<3:0>). Por lo tanto, la corriente del dispositivo se reduce al
mnimo cuando las entradas analgicas estn presentes en el tiempo de 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

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 21-1: Registros Asociados Al Mdulo Comparador


Nombre

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

Leyenda: -=no implementado, se leen 0. Las casillas sombreadas no se utilizan


con el mdulo comparador.
Nota 1: PORTA<6> y su direccin y bit de latch se configuran
individualmente como pin de puerto en varios modos de oscilador. Cuando est
desactivado estos bits se leen 0.

313

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.22.

MDULO COMPARADOR DE TENSIN DE REFERENCIA

La tensin del comparador de referencia es una red de 16 resistencias que


proporciona una referencia seleccionable de tensin. Aunque su propsito primario es
proporcionar una referencia para los comparadores analgicos, se puede utilizar tambin
independientemente de ellos.
La red de resistencias se divide en segmentos para proporcionar dos gamas de
valores de CVREF y tiene una funcin de cada de energa para conservar la energa
cuando la referencia no se est utilizando. La fuente de referencia del mdulo se puede
obtener de dispositivo VDD/VSS o una referencia externa de tensin.

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

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 22-1: CVRCON: Registro De Control De La Tensin De Referencia Del


Comparador
BIT 7

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:

Bit de permiso de comparador de tensin de referencia


1= Circuito CVREF encendido
0= Circuito CVREF apagado
Bit de permiso de la salida del comparador VREF(1)
1= El nivel de tensin CVREF tambin sale por el pin
RA2/AN2/VREF-/CVREF
0= La tensin CVREF se desconecta del pin
RA2/AN2/VREF-/CVREF
Bit de seleccin del rango del comparador VREF
1 = 0 a 0,667CVRSRC, con el tamao de paso CVRSRC/24
(gama baja)
0 = 0,25CVRSRC a 0,75CVRSRC, con el tamao de paso
CVRSRC/32 (alta gama)
Bit de seleccin de la fuente del comparador VREF
1 = fuente de referencia del comparador,
CVRSRC=(VREF+)-(VREF-)
0 = fuente de referencia del comparador,
CVRSRC=VDDVSS
Bits de seleccin del valor del comparador VREF
(0<=(CVR3:CVR0)<=15)
Cuando CVRR=1:
CVREF=((CVR3:CVR0)/24)(CVRSRC)
Cuando CVRR=0:
CVREF=(CVRSRC/4)+((CVR3:CVR0)/32)(CVRSRC)

Nota 1: CVROE elimina el ajuste del bit TRISA<2>.

315

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 22-1: Diagrama De Bloques Del Comparador De Tensin De Referencia

3.4.22.2.

Exactitud/Error De La Tensin De Referencia

La gama completa de la tensin de referencia no se puede observar debido a la


construccin del mdulo. Los transistores en la tapa y el fondo de la red de la escala de
resistencias guardan CVREF la referencia de la fuente. La tensin de referencia deriva de
la fuente de referencia; por lo tanto, la salida CVREF cambia con fluctuaciones en esa
fuente.

3.4.22.3.

Operacin En Modo SLEEP

Cuando el dispositivo despierta del sleep con una interrupcin o un


desbordamiento del perro guardin, no le afecta al contenido del registro CVRCON.
Para reducir al mnimo la consumicin actual en el modo sleep, la tensin de referencia
debe desactivarse.

3.4.22.4.

Efectos De Un Reset

Un reset del dispositivo inhabilita la referencia de tensin borrando el bit,


CVREN (CVRCON<7>). Este reset tambin desconecta la referencia del pin RA2
borrando el bit, CVROE (CVRCON<6>) y selecciona el rango de alta tensin borrando
el bit, CVRR (CVRCON<5>). El valor de los bits selectores CVR tambin se borra.

316

GUILLERMO DAVID HERRERO GONZLEZ

3.4.22.5.

Consideraciones De La Conexin

El mdulo de tensin de referencia funciona independientemente del mdulo


comparador. La salida del generador de referencia se puede conectar al pin RA2 si el bit
TRISA<2> y el bit CVROE estn activos. Permitiendo a la tensin poner la salida en
RA2 cuando se configura como una entrada digital aumentar la consumicin de
corriente. Conectando RA2 como salida digital con CVRSS permitido tambin
aumentar el consumo de corriente.
El pin RA2 se puede utilizar como salida D/A simple con capacidad de control
limitada. Debido a la capacidad limitada de corriente actual, se debe utilizar un buffer
en la salida de tensin de referencia para las conexiones externas a VREF.
FIGURA 22-2: Ejemplo De Buffer De Salida Del Comparador De Tensin De
Referencia

Nota 1: R depende de los bits de configuracin de la tensin de referencia,


CVRCON<5> y CVRCON<3:0>.
TABLA 22-1: Registros Asociados Al Comparador De Tensin De Referencia
Nombre

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

Leyenda: -=no implementado, se leen 0. Las casillas sombreadas no se utilizan


con el mdulo comparador de la tensin de referencia.
Nota 1: PORTA<6> y su direccin y bit de latch se configuran
individualmente como pin de puerto en varios modos de oscilador. Cuando est
desactivado estos bits se leen 0.

317

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.23.

DETECTOR DE ALTA/BAJA TENSIN (HLVD)

Los dispositivos PIC18F2455/2550/4455/4550 tienen un mdulo detector de


alta/baja tensin (HLVD). ste es un circuito programable que permite al usuario
especificarla tensin del cambio del dispositivo y la direccin del cambio en ese punto.
Si el dispositivo experimenta un cambio mayor, se activa un flag de interrupcin. Si se
permite la interrupcin, la ejecucin del programa saltar a la direccin de vector de
interrupcin y el software responde a la interrupcin.
El registro de control que detecta la alta/baja tensin controla totalmente la
operacin del Mdulo HLVD. Esto permite que el circuito lo apague el usuario bajo
control por software que reduce al mnimo la consumicin actual del dispositivo.
REGISTRO 23-1: HLVDCON: Registro De Control Del Detector De Alta/Baja Tensin
BIT 7

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:

Bit selector de la magnitud de la direccin de tensin


1 = el acontecimiento ocurre cuando la tensin iguala o
excede el punto (HLVDL3:HLDVL0)
0 = el acontecimiento ocurre cuando la tensin iguala o
cae por debajo del punto (HLVDL3: HLVDL0)
IRVST:
Flag de la tensin interna de referencia estable
1 = indica que la tensin detectada generar el flag de
interrupcin en la gama especificada
0 = indica que la tensin detectada no generar el flag
de interrupcin en la gama especificada y la
interrupcin HLVD no se debe permitir
HLVDEN:
Bit de permiso del detector de la alta/baja tensin
1 = HLVD permitido
0 = HLVD inhabilitado
HLVDL3:HLVDL0: Bits del lmite de deteccin de tensin
1111 = se utiliza la entrada analgica externa (la entrada
es el pin HLVDIN)
1110 = ajuste mximo
...
0000 = ajuste mnimo

El mdulo se permite activando el bit HLVDEN. Cada vez que se permite el


mdulo HLVD, el circuito requiere un cierto tiempo para estabilizarse. El bit IRVST es
un bit inalterable y se utiliza para indicar cuando el circuito es estable. El mdulo puede
generar una sola interrupcin despus de que el circuito sea estable y se activa IRVST.

318

GUILLERMO DAVID HERRERO GONZLEZ

El bit VDIRMAG determina la operacin total del mdulo. Cuando se borra


VDIRMAG, el mdulo supervisa las bajadas en VDD por debajo de un punto
predeterminado. Cuando se activa el bit, la supervisn del mdulo se realiza en las
subidas de VDD sobre el punto de ajuste.

3.4.23.1.

Operacin

Cuando se permite el mdulo HLVD, un comparador usa una tensin de


referencia interna generada como puntote ajuste. El punto de ajuste se compara con el
punto de cambio, donde cada nodo en el divisor de la resistencia representa la tensin
del punto de cambio. La tensin del punto de cambio es el nivel de tensin en el cual
el dispositivo detecta un acontecimiento de subida o bajada de tensin, dependiendo de
la configuracin del mdulo. Cuando la fuente de tensin es igual al punto de cambio, la
tensin que llega a la matriz de resistencias es igual a la tensin de referencia interna
generada por el mdulo de tensin de referencia. El comparador entonces genera una
seal de interrupcin activando el bit HLVDIF.
La tensin del punto de cambio es programable por software a cualquiera de los
16 valores. El punto de cambio se selecciona programando los bits HLVDL3:HLVDL0
(HLVDCON<3: 0>).
El mdulo HLVD tiene una caracterstica adicional que permite al usuario
proveer la tensin de cambio al mdulo mediante una fuente externa. Se permite este
modo cuando los bits, HLVDL3:HLVDL0, se fijan a 1111. En este estado, la entrada
del comparador se multiplexa con la entrada del pin externa, HLVDIN. Esto da a los
usuarios flexibilidad porque permite que configuren la interrupcin del detector de
alta/baja tensin para que ocurra en la gama de tensin en funcionamiento.

319

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 23-1: Diagrama De Bloques Del Mdulo HLVD (Con Entrada Externa)

3.4.23.2.

Configuracin Del HLVD

Se necesitan los siguientes pasos para instalar el mdulo HLVD:


1. Inhabilitar el mdulo despejando el bit HLVDEN (HLVDCON<4>).
2. Escribir el valor del punto de cambio en los bits HLVDL3:HLVDL0.
3. Activar el bit VDIRMAG para detectar la subida de tensin
(VDIRMAG=1) o la bajada de tensin (VDIRMAG=0).
4. Permitir el mdulo HLVD activando el bit HLVDEN.
5. Despejar el flag de interrupcin HLVD, HLVDIF (PIR2<2>), que puede
estar activo.
6. Permitir la interrupcin HLVD, si se quieren las interrupciones,
activando los bits HLVDIE y GIE/GIEH (PIE2<2> e INTCON<7>). Una
interrupcin se genera hasta que se activa el bit IRVST.

320

GUILLERMO DAVID HERRERO GONZLEZ

3.4.23.3.

Consumicin De Corriente

Cuando se permite el mdulo, el comparador HLVD y el divisor de tensin


consumirn parsitos atmosfricos.
Dependiendo de la aplicacin, el mdulo HLVD no necesita funcionar
constantemente. Para disminuir los requisitos actuales, el circuito HLVD puede
permitirse en periodos cortos donde se compruebe la tensin. Despus de hacer la
comprobacin, el mdulo HLVD puede desactivarse.

3.4.23.4.

Tiempo De Arranque De HLVD

La tensin interna de referencia del mdulo HLVD, la puede utilizar otro


circuito interno, por ejemplo el reset programable por cese de tensin. Si el HLVD u
otros circuitos que usan la tensin de referencia se inhabilitan para bajar la consumicin
actual del dispositivo, la tensin de referencia del circuito requerir un tiempo para ser
estable antes de que una condicin de bajada o subida de tensin pueda detectarse
fiablemente. Este tiempo de arranque, TIRVST, es un intervalo que es independiente de la
velocidad de reloj del dispositivo.
El flag de interrupcin de HLVD permanece desactivado hasta que TIRVST expire
y se alcance una tensin estable de referencia. Por esta razn, los excesos leves del
punto de cambio puede que no se detecten.
FIGURA 23-2: Operacin De Deteccin De Bajada De Tensin (VDIRMAG=0)

321

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 23-3: Operacin De Deteccin De Subida De Tensin (VDIRMAG=1)

3.4.23.5.

Aplicaciones

En muchas aplicaciones, se desea la capacidad de detectar un pico bajo o la


subida de un umbral particular. Para el ejemplo, el mdulo HLVD poda estar
configurado para detectar peridicamente la conexin o desconexin del Bus Serie
Universal (USB). Esto asume que el dispositivo se acciona con una fuente de tensin
ms baja que cuando el USB est desconectado. Una activacin indicara que se ha
detectado un nivel alto de tensin, por ejemplo, 3,3V a 5V (tensin en el USB) y
viceversa al desconectar. Esta caracterstica poda ahorrar el diseo de algn suplemento
de componentes y una seal de activacin (pin de entrada).
En aplicaciones generales con batera, el cuadro 24-4 muestra una curva posible
de tensin. En un cierto tiempo, la tensin del dispositivo disminuye. Cuando la tensin
del dispositivo alcanza la tensin VA, la lgica del HLVD genera una interrupcin en el
tiempo, TA. La interrupcin poda causar la ejecucin de un ISR, el cul permitira que
la paliacin realizara tareas de economizacin y realizan una parada controlada antes
de que la tensin salga del rango de tensin vlida para el dispositivo en TB. El HLVD,
as, dara a la aplicacin una ventana de tiempo, representada por la diferencia entre TA
y TB, para salir con seguridad.

322

GUILLERMO DAVID HERRERO GONZLEZ

FIGURA 23-4: Aplicacin Tpica Del Detector De Alta/Baja Tensin

3.4.23.6.

Operaciones En El Modo Sleep

Cuando se activa, el circuito HLVD contina funcionando durante el modo


sleep. Si la tensin del dispositivo cruza el punto de cambio, el bit HLVDIF se activar
y el dispositivo se despertar del sleep. La ejecucin del dispositivo continuar en el
vector interrupcin si estn permitidas las interrupciones globalmente.

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

Leyenda: -=no implementado, se leen 0. Las casillas sombreadas no se utilizan


con el mdulo HLVD.

323

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.24.

CARACTERSTICAS ESPECIALES DE LA CPU

Los dispositivos PIC18F2455/2550/4455/4550 incluyen varias caractersticas


para maximizar la confiabilidad y reducir el coste al mnimo con la eliminacin de
componentes externos. stos son:
Seleccin del oscilador
Resets:
9 Reset por subida de tensin (POR)
9 Temporizador de inicio (PWRT)
9 Temporizador de inicio del oscilador (OST)
9 Reset por cese de tensin (BOR)
Interrupciones
Temporizador perro guardin (WDT)
Monitor de reloj a prueba de fallos
Arranque a dos velocidades
Cdigo de proteccin
Localizaciones de identificacin
Programacin serie en Circuito
El oscilador se puede configurar para cada aplicacin dependiendo de la
frecuencia, la energa, la exactitud y el coste.
Adems de sus contadores de tiempo del arranque y del oscilador temporizador
de inicio para los resets, los dispositivos PIC18F2455/2550/4455/4550 tienen un
temporizador perro guardin, que se permite permanentemente con los bits de
configuracin o el software de control (si est inhabilitado).
La inclusin de un oscilador interno RC tambin proporciona ventajas
adicionales de un monitor de reloj a prueba de fallos (FSCM) y arranque de dos
velocidades. FSCM proporciona una supervisin oculta del reloj del perifrico y un
cambio automtico en caso de fallo. El arranque a dos velocidades permite al cdigo
ejecutarse casi inmediatamente en el inicio, mientras que la fuente de reloj primario
termina su retraso de inicio.
Todas estas caractersticas se permiten y se configuran activando los bits
apropiados del registro de configuracin.

324

GUILLERMO DAVID HERRERO GONZLEZ

3.4.24.1.

Bits De Configuracin

Los bits de configuracin pueden programarse (leerse como 0) o no


programarse (leerse como 1) para seleccionar varias configuraciones del dispositivo.
Estos bits estn mapeados en la posicin de memoria del programa 300000h.
El usuario observar que la direccin 300000h est ms all de memoria del
programa de usuario. De hecho, pertenece a memoria de la configuracin (300000h3FFFFFh), la cul puede alcanzarse solamente usando la lectura y escritura de tablas.
La programacin de los registros de configuracin se hace de manera similar a la
programacin de la memoria flash. El bit WR del registro EECON1 comienza una
escritura auto-temporizada en el registro de configuracin. En modo de operacin
normal, una instruccin TBLWT, con el TBLPTR sealando al registro de
configuracin, selecciona la direccin y los datos para escribir el registro de
configuracin. Al activar el bit WR comienza una escritura larga en el registro de
configuracin. En los registros de configuracin se escribe un byte a la vez. Al escribir
o borrar una clula de configuracin, una instruccin TBLWT puede escribir un 1 o un
0 en la clula.
TABLA 24-1: Bits De Configuracin E Identificadores Del Dispositivo
Nombre del Registro

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Leyenda: x= desconocido; u=sin cambios; -=no implementado, se leen 0


Nota 1: No implementado en los dispositivos PIC18Fx455; mantener el bit
activo
2: Ver los registros 25-13 y 25-14 para los valores de DEVID. Los
registros DEVID slo se pueden leer y no los puede programar el usuario.
3: Disponible en los PIC18F4455/4550 en encapsulado TQFP de
44pines. Mantener este bit borrado en el resto de dispositivos.
REGISTRO 24-1: CONFIG1L: Registro De Configuracin Bajo (Direccin Del Byte
300000h)
BIT 7

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:

Bit de seleccin del reloj del USB (usado slo en el


modo Full-Speed; UCFG: FSEN = 1)
1 = fuente del reloj del USB viene de los 96MHz PLL
divididos por 2
0 = fuente del reloj del USB viene directamente del
bloque del oscilador primario sin postscaler
CPUDIV1:CPUDIV0:
Bits de seleccin del Postscaler del reloj del
sistema
Para modos del oscilador XT, HS, EC y ECIO:
11 = oscilador primario se divide por 4 para obtener el
reloj del sistema
10 = oscilador primario se divide por 3 para obtener el
reloj del sistema
01 = oscilador primario se divide por 2 para obtener el
reloj del sistema
00 = oscilador primario usado directamente en el reloj
del sistema (ningn postscaler)
Para modos del oscilador XTPLL, HSPLL, ECPLL y
ECPIO:
11 = 96MHz PLL se divide por 6 para obtener el reloj
del sistema
10 = 96MHz PLL se divide por 4 para obtener el reloj
del sistema
01 = 96MHz PLL se divide por 3 para obtener el reloj
del sistema
00 = 96MHz PLL se divide por 2 para obtener el reloj
del sistema
PLLDIV2:PLLDIV0: Bits de seleccin del Prescaler del PLL

326

GUILLERMO DAVID HERRERO GONZLEZ

111 = se divide por 12 (la entrada del oscilador de


48MHz)
110 = se divide por 10 (la entrada del oscilador de
40MHz)
101 = se divide por 6 (la entrada del oscilador de
24MHz)
100 = se divide por 5 (la entrada del oscilador de
20MHz)
011 = se divide por 4 (la entrada del oscilador de
16MHz)
010 = se divide por 3 (la entrada del oscilador de
12MHz)
001 = se divide por 2 (la entrada del oscilador de
8MHz)
000 = ningn prescaler (conducen 4MHz de entrada del
oscilador PLL directamente)
REGISTRO 24-2: CONFIG1H: Registro De Configuracin Alto (Direccin Del Byte
300001h)
BIT 7

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:

Bit del intercambio interno y externo del oscilador


1 = modo del intercambio del oscilador permitido
0 = modo del intercambio del oscilador inhabilitado
FCMEN:
Bit de permiso del monitor del reloj a prueba de fallos
1 = monitor del reloj a prueba de fallos permitido
0 = monitor del reloj a prueba de fallos inhabilitado
FOSC3:FOSC0: Bits de seleccin del oscilador(1)
111x= oscilador HS, PLL permitido (HSPLL)
110x= oscilador HS (HS)
1011= oscilador interno, oscilador HS utilizado por el
USB (INTHS)
1010= oscilador interno, XT utilizado por USB el
(INTXT)
1001= oscilador interno, CLKO en RA6, EC
utilizado por el USB (INTCKO)
1000= oscilador interno, puerto en RA6, EC utilizado
por el USB (INTIO)
0111= Oscilador EC, PLL permitido, CLKO en RA6
(ECPLL)
0110= Oscilador EC, PLL permitido, puerto en RA6

327

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

(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:

Bit de permiso del regulador interno de tensin del USB


1 = regulador de tensin del USB permitido
0 = regulador de tensin del USB inhabilitado
BORV1:BORV0: Bits de ajuste de la tensin de los resets por cada de
tensin
11 = ajuste mnimo
.
.
.
00 = ajuste mximo
BOREN1:BOREN0: Bit de permiso del reset por cada de tensin
11= reset permitido en hardware solamente
(SBOREN desactivado)
10= reset permitido en hardware solamente e
inhabilitado en modo sleep (SBOREN desactivado)
01= reset permitido y controlado por software
(SBOREN permitido)
00= reset desactivado en hardware y software
PWRTEN:
Bit de permiso del temporizador de inicio (PWRT)(1)
1 = PWRT inhabilitado
0 = PWRT permitido

Nota 1: El temporizador de inicio se desempareja del reset de cada de tensin,


permitiendo que estas caractersticas sean controladas independientemente.

328

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 24-4: CONFIG2H: Registro De Configuracin Alto (Direccin Del Byte


300003h)
BIT 7

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

WDTPS3:WDTPS0: Bits selectores del Postscaler del temporizador del


perro guardin
1111 = 1:32,768
1110 = 1:16,384
1101 = 1:8,192
1100 = 1:4,096
1011 = 1:2,048
1010 = 1:1,024
1001 = 1:512
1000 = 1:256
0111 = 1:128
0110 = 1:64
0101 = 1:32
0100 = 1:16
0011 = 1:8
0010 = 1:4
0001 = 1:2
0000 = 1:1
WDTEN:
Bit de permiso del temporizador del perro guardin
1 = WDT permitido
0 = WDT inhabilitado (el bit de control es SWDTEN)

329

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 24-5: CONFIG3H: Registro De Configuracin Alto (Direccin Del Byte


300005h)
BIT 7

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:

Bit de permiso del pin MCLR*


1= pin MCLR permitido, pin RE3 inhabilitado
0 = pin RE3 permitido, pin MCLR inhabilitado
Bit de permiso de la potencia del oscilador Timer1
1 = Timer1 configurado como baja potencia
0 = Timer1 configurado como alta potencia
Bit de permiso del PORTB A/D
(Afecta al estado del reset de ADCON1. ADCON1
controla la configuracin del pin PORTB<4:0>.)
1 = los pines PORTB<4:0> se configuran como canales
de la entrada analgica en el reset
0 = los pines PORTB<4:0> se configuran como E/S
digital en el reset
Bit CCP2 MUX
1 = la entrada-salida CCP2 se multiplexa con RC1
0 = la entrada-salida CCP2 se multiplexa con RB3

330

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 24-6: CONFIG4L: Registro De Configuracin Bajo (Direccin Del Byte


300006h)
BIT 7

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:

Bit de permiso de la depuracin oculta


1 = depuracin oculta inhabilitada, RB6 y RB7
configurados como pines E/S generales
0 = depuracin oculta permitida, RB6 y RB7 se dedica a
eliminar errores en Circuito
Bit de permiso del sistema de instrucciones extendidas
1 = extensin del sistema de instruccin y modo de
direccin indexado permitidos
0 = extensin del sistema de instruccin y modo de
direccin indexado inhabilitados (modo herencia)
Bit de permiso del puerto de programacin/depuracin
en Circuito (ICPORT)(1)
1 = ICPORT permitido
0 = ICPORT inhabilitado
Bit de permiso de un Slo-Proveedor ICSP
1 = Slo-Proveedor ICSP permitido
0 = Slo-Proveedor ICSP inhabilitado
Bit de permiso de reset por desbordamiento
superior/inferior de la pila
1 = Reset permitido
0 = Reset no permitido

Nota 1: Disponible solamente en los dispositivos PIC18F4455/4550 de 44 pines


con encapsulado TQFP. Borrar este bit en el resto de los dispositivos.

331

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 24-7: CONFIG5L: Registro De Configuracin Bajo (Direccin Del Byte


300008h)
BIT 7

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:

Bit de proteccin del cdigo (1)


1 = el bloque 3 (006000-007FFFh) no es el cdigo de
proteccin
0 = el bloque 3 (006000-007FFFh) es el cdigo de
proteccin
Bit de proteccin del cdigo
1 = el bloque 2 (004000-005FFFh) no es el cdigo de
proteccin
0 = el bloque 2 (004000-005FFFh) es el cdigo de
proteccin
Bit de proteccin del cdigo
1 = el bloque 1 (002000-003FFFh) no es el cdigo de
proteccin
0 = el bloque 1 (002000-003FFFh) es el cdigo de
proteccin
Bit de proteccin del cdigo
1 = el bloque 0 (000800-001FFFh) no es el cdigo de
proteccin
0 = el bloque 0 (000800-001FFFh) es el cdigo de
proteccin

Nota 1: No implementado en los dispositivos PIC18FX455; mantener este bit


activo.

332

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 24-8: CONFIG5H: Registro De Configuracin Alto (Direccin Del Byte


300009h)
BIT 7

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 de proteccin del cdigo de los datos EEPROM


1 = la EEPROM no se protege
0 = la EEPROM se protege
Bit de proteccin del cdigo del bloque de arranque
1 = el bloque de arranque (000000-0007FFh) no se
protege
0 = el bloque de arranque (000000-0007FFh) se protege

REGISTRO 24-9: CONFIG6L: Registro De Configuracin Bajo (Direccin Del Byte


30000Ah)
BIT 7

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:

Bit de proteccin de la escritura(1)


1 = el bloque 3 (006000-007FFFh) no es la proteccin
contra la escritura
0 = el bloque 3 (006000-007FFFh) es la proteccin
contra la escritura
Bit de proteccin de la escritura
1 = el bloque 2 (004000-005FFFh) no es la proteccin
contra la escritura
0 = el bloque 2 (004000-005FFFh) es la proteccin
contra la escritura
Bit de proteccin de la escritura
1 = el bloque 1 (002000-003FFFh) no es la proteccin
contra la escritura
0 = el bloque 1 (002000-003FFFh) es la proteccin
contra la escritura
Bit de proteccin de la escritura
1 = el bloque 0 (000800-001FFFh) o (001000-001FFFh)
no es la proteccin contra la escritura
0 = el bloque 0 (000800-001FFFh) o (001000-001FFFh)
es la proteccin contra la escritura

333

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Nota 1: No implementado en los dispositivos PIC18FX455; mantener este bit


activo.
REGISTRO 24-10: CONFIG6H: Registro De Configuracin Alto (Direccin Del Byte
30000Bh)
BIT 7

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:

Bit de proteccin de la escritura de datos EEPROM


1 = los datos EEPROM no tienen proteccin de
escritura
0 = los datos EEPROM tienen proteccin de escritura
Bit de proteccin de la escritura en el bloque de
arranque
1 = el bloque de arranque (000000-0007FFh) no tiene
proteccin de escritura
0 = el bloque de arranque (000000-0007FFh) tiene
proteccin de escritura
Bit de proteccin de la escritura en el registro de
configuracin(1)
1 = registros (300000-3000FFh) no estn protegidos
0 = registros (300000-3000FFh) protegidos

Nota 1: Este bit es inalterable en modo normal de ejecucin; se puede escribir


solamente en modo programacin.

334

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 24-11: CONFIG7L: Registro De Configuracin Bajo (Direccin Del Byte


30000Ch)
BIT 7

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:

Bit de proteccin de lectura de tabla(1)


1 = el bloque 3 (006000-007FFFh) no protege contra la
lectura en otros bloques
0 = el bloque 3 (006000-007FFFh) protege contra la
lectura en otros bloques
Bit de proteccin de lectura de tabla
1 = el bloque 2 (004000-005FFFh) no protege contra la
lectura en otros bloques
0 = el bloque 2 (004000-005FFFh) protege contra la
lectura en otros bloques
Bit de proteccin de lectura de tabla
1 = el bloque 1 (002000-003FFFh) no protege contra la
lectura en otros bloques
0 = el bloque 1 (002000-003FFFh) protege contra la
lectura en otros bloques
Bit de proteccin de lectura de tabla
1 = el bloque 0 (000800-001FFFh) no protege contra la
lectura en otros bloques
0 = el bloque 0 (000800-001FFFh) protege contra la
lectura en otros bloques

Nota 1: No implementado en los dispositivos PIC18FX455; mantener este bit


activo.

335

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

REGISTRO 24-12: CONFIG7H: Registro De Configuracin Alto (Direccin Del Byte


30000Dh)
BIT 7

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 de proteccin de lectura de tabla en el bloque de


arranque
1 = el bloque de arranque (000000-0007FFh) no protege
contra la lectura en otros bloques
0 = el bloque del cargador (000000-0007FFh) protege
contra la lectura en otros bloques

REGISTRO 24-13: DEVID1: Registro De Identificacin Del Dispositivo Para Los


Dispositivos PIC18F2455/2550/4455/4550
BIT 7

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:

Bits de identificacin del dispositivo


011 = PIC18F2455
010 = PIC18F2550
001 = PIC18F4455
000 = PIC18F4550
Bits de identificacin de la revisin
Estos bits se utilizan para indicar la revisin del
dispositivo.

336

GUILLERMO DAVID HERRERO GONZLEZ

REGISTRO 24-14: DEVID2: Registro De Identificacin Del Dispositivo Para Los


Dispositivos PIC18F2455/2550/4455/4550
BIT 7

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

DEV10:DEV3: Bits de identificacin del dispositivo(1)


Estos bits se utilizan con los bits DEV2:DEV0 del
DEVID1 para identificar el nmero de parte.
0001 0010 = dispositivos PIC18F2455/2550/4455/4550

Nota 1: Estos valores de DEV10:DEV3 se puede compartir con otros


dispositivos. El dispositivo especfico es identificado siempre usando la secuencia de
bits DEV10:DEV0.

3.4.24.2.

Temporizador Del Perro Guardin (WDT)

En los dispositivos PIC18F2455/2550/4455/4550, el WDT se controla con la


fuente INTRC. Cuando est permitido el WDT, la fuente del reloj tambin lo est. El
perodo nominal del WDT es de 4ms y tiene la misma estabilidad que Oscilador
INTRC.
El perodo de 4ms del WDT se multiplica por un postscaler de 16bit. Cualquier
salida del postscaler de WDT se selecciona con un multiplexor, controlado con los bits
del Registro 2H. La gama de periodos disponible es a partir de 4ms a 131,072 segundos
(2,18 minutos). El WDT y el postscaler se borra cuando ocurre uno de estos
acontecimientos: se ejecuta una instruccin SLEEP o CLRWDT, se cambian los bits
IRCF (OSCCON<6:4>) o falla el reloj.
Nota 1: Las instrucciones CLRWDT y SLEEP borran las cuentas del WDT y
del postscaler.
2: Cambiar el ajuste de los bits IRCF (OSCCON<6:4>) borra las cuentas
del WDT y del postscaler.
3: Cuando se ejecuta una instruccin de CLRWDT, borra la cuenta del
postscaler.

337

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 24-1: Diagrama De Bloques Del WDT

3.4.24.2.1.

Registro De Control

El registro WDTCON es un registro legible y escribible que contiene un bit de


control que permite que el software elimine el bit de permiso del WDT, pero solamente
si el bit de configuracin est inhabilitando el WDT.
REGISTRO 24-15: WDTCON: Registro De Control Del WDT
BIT 7

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:

Software del control del bit de permiso del WDT (1)


1 = temporizador del perro guardin est encendido
0 = temporizador del perro guardin est apagado

Nota 1: Este bit no tiene ningn efecto si se permite el bit de configuracin,


WDTEN.
TABLA 24-2: Sumario De Registros Del WDT
Nombre

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

Leyenda: -= no implementado, se lee 0; las celdas sombreadas no las utiliza el


WDT.
Nota 1: El bit SBOREN slo est disponible si BOREN<1:0>=01; en otro caso
se lee 0.

338

GUILLERMO DAVID HERRERO GONZLEZ

3.4.24.3.

Arranque A Dos Velocidades

La caracterstica de arranque de dos velocidades ayuda a reducir al mnimo


perodo del estado latente del inicio del oscilador para la ejecucin de cdigo,
permitiendo que el microcontrolador utilice el oscilador INTRC como fuente de reloj
hasta que la fuente de reloj primaria est disponible. Se permite activando el bit IESO.
El arranque de dos velocidades slo se puede permitir si el modo del oscilador
primario es XT, HS, XTPLL o HSPLL (modos basados en XTAL). Las dems fuentes
no requieren un retraso de inicio OST; para stos, hay que inhabilitar el arranque de dos
velocidades.
Cuando est permitido, los resets y reinicios del modo sleep hacen que el
dispositivo se configure para que funcione el bloque interno como fuente de reloj,
siguiente, el desbordamiento del temporizador de inicio despus de activar un POR.
Esto permite la ejecucin de cdigo casi de inmediato mientras que el oscilador
primario comienza y OST est funcionando. Cuando se sobrepasan los tiempos OST, el
dispositivo automticamente cambia al modo PRI_RUN.
Como el registro OSCCON se borra en los resets, la fuente de reloj INTOSC (o
postscaler) no se disponen inicialmente despus de un reset; el reloj INTRC se utiliza
directamente en su baja frecuencia. Para utilizar un reloj con velocidad ms alta en el
inicio, se utilizan las fuentes de reloj INTOSC o postscaler fijando los bits,
IRCF2:IRCF0, inmediatamente despus del reset. Para los reinicios del sleep, las
fuentes de reloj INTOSC o el postscaler se pueden seleccionar fijando IRCF2:IRCF0
antes de entrar en el modo sleep.
En el resto de los modos de ahorro de energa, el arranque a dos velocidades no
se utiliza. El dispositivo se controlar con la fuente de reloj seleccionada hasta que la
fuente primaria de reloj est disponible. El ajuste del bit IESO se ignora.
FIGURA 24-2: Transiciones De Tiempo Para El Inicio De Dos Velocidades (INTOSC A
HSPLL)

339

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.4.24.3.1. Consideraciones Especiales Para Usar Arranque A Dos


Velocidades
Cuando se usa el oscilador INTRC en el arranque de a velocidades, el
dispositivo obedece las secuencias normales del comando para entrar en los modos de
ahorro de energa, incluyendo la instruccin SLEEP. En la prctica, esto significa que el
usuario cambia los bits SCS1:SCS0 con la instruccin SLEEP antes de terminar los
tiempos OST. Esto permite un uso brevemente del reinicio, realizar rutinas de
economa domstica devuelve del modo sleep antes de que el dispositivo empiece a
operar con el oscilador primario.
El cdigo del usuario puede comprobar si la fuente primaria de reloj est
gobernando el dispositivo comprobando el estado del bit OSTS (OSCCON<3>). Si se
activa el bit, el oscilador primario est controlando el reloj. Si no, el bloque interno del
oscilador gobierna durante el reinicio del modo sleep o de un reset.

3.4.24.4.

Monitor De Reloj A Prueba De Fallos

El Monitor de reloj a prueba de fallos (FSCM) permite al microcontrolador


continuar la operacin en caso de fallo del oscilador externo automticamente
cambiando el reloj del dispositivo al bloque interno del oscilador. El la funcin FSCM
se permite activando la configuracin del bit FCMEN.
Cuando se permite el FSCM, el oscilador INTRC funciona todas las veces que
supervise los relojes de los perifricos y proporcione un reloj de reserva en caso de un
fallo del reloj. La supervisin del reloj se logra creando una muestra de la seal, que es
la salida de INTRC dividido por 64. Esto da un plazo de tiempo amplio entre la muestra
de FSCM y que ocurra un flanco del reloj del perifrico. El reloj del dispositivo
perifrico y la muestra del reloj se presentan como entradas del latch del monitor de
reloj (CM). El CM se activa en el flanco de bajada de la fuente de reloj del dispositivo,
pero borrado en el flanco de subida del reloj de muestreo.
El fallo del reloj se prueba en el flanco de bajada del reloj de muestreo. Si ocurre
un flanco de bajada del reloj de muestreo mientras que el CM todava est activo, se ha
detectado un fallo del reloj. Esto provoca lo siguiente:
el FSCM genera una interrupcin de fallo del oscilador activando el bit,
OSCFIF (PIR2<7>);
la fuente del reloj del dispositivo se cambia al bloque interno del
oscilador (OSCCON no se actualiza para mostrar la fuente actual del
reloj - esta es la condicin a prueba de fallos);
se resetea el WDT.
Durante el intercambio, la frecuencia del postscaler del bloque interno del
oscilador puede que no sea suficientemente estable para aplicaciones sensibles que
miden el tiempo. En estos casos, se puede seleccionar otra configuracin del reloj y
entrar en un modo de ahorro de energa diferente. Esto se puede hacer para realizar una
recuperacin parcial o ejecutar una parada controlada.

340

GUILLERMO DAVID HERRERO GONZLEZ

Para utilizar una velocidad de reloj ms alta en el reinicio, se pueden seleccionar


el INTOSC o las fuentes del reloj del postscaler los bits IRCF2:IRCF0 inmediatamente
despus del reset. Para los reinicios del sleep, INTOSC o las fuentes del reloj del
postscaler se pueden seleccionar fijando IRCF2:IRCF0 antes de entrar en el modo sleep.
El FSCM detectar los fallos de las fuentes de reloj primaria o secundaria
solamente. Si el bloque del oscilador interno falla, no se detectara, y no se puede
realizar ninguna accin.
FIGURA 24-3: Diagrama De Bloques Del FSCM

3.4.24.4.1.

FSCM Y El Temporizador Perro Guardin

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.

Salir De La Operacin A Prueba De Fallos

La condicin a prueba de fallos termina por cualquier reset o entrando en un


modo de ahorro de energa. En el reset, el regulador comienza con la fuente primaria de
reloj especificada en el registro de configuracin 1H (con cualquier retraso de inicio que
requiera el modo del oscilador, por ejemplo temporizador OST o PLL). El multiplexor
INTOSC proporciona el reloj del dispositivo hasta que la fuente primaria de reloj est
lista (similar a un arranque de a velocidades). La fuente de reloj entonces se cambia al
reloj primario (indicado por el bit OSTS en el registro OSCCON que se activa). El

341

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.3. Interrupciones De FSCM Dentro De Los Modos De Ahorro


De Energa
Entrando en un modo de ahorro de energa, el reloj del multiplexor selecciona la
fuente de reloj elegida en el registro OSCCON. La supervisin del reloj a prueba de
fallos de los modos de ahorro de energa de la fuente de reloj se reanuda en un modo de
ahorro de energa.
Si ocurre un fallo del oscilador durante el modo de ahorro de energa, los
acontecimientos subsecuentes dependen de si la interrupcin de fallo del oscilador est
permitida o no. Si est permitida (OSCFIF=1), la ejecucin del cdigo la controlar el
multiplexor INTOSC. No habr un cambio automtico al reloj que ha fallado.
Si la interrupcin no est activa, las siguientes interrupciones mientras que est
en modo reposo harn que la CPU comience a ejecutar instrucciones cuando la fuente
INTOSC siga controlando el dispositivo.

3.4.24.4.4.

POR O Reinicio Del Sleep

El FSCM se ha diseado para detectar fallos en el oscilador en cualquier punto


despus de salir el dispositivo de un reset por aumento de energa (POR) o del modo de
baja potencia sleep. Cuando el reloj primario del dispositivo es EC o INTRC, la
supervisin puede comenzar inmediatamente despus de estos acontecimientos.
En los modos del oscilador que implican un cristal o un resonador (HS, HSPLL
o XT), la situacin es algo diferente. Puesto que el oscilador puede necesitar un retraso
de inicio considerablemente ms de largo que el tiempo de reloj de la muestra de
FCSM, se puede detectar un fallo falso del reloj. Para prevenir esto, el bloque del

342

GUILLERMO DAVID HERRERO GONZLEZ

oscilador interno se configura automticamente como el reloj y las funciones del


dispositivo hasta que el reloj primario es estable (los contadores de tiempo OST y PLL
se han desbordado). Esto es igual al modo de inicio de dos velocidades. Una vez que el
reloj primario es estable, el INTRC vuelve a ser la fuente de FSCM.
Nota: La misma lgica que previene el oscilador de falsas interrupciones por
fallo en un POR o al despertar del sleep tambin prevendr la deteccin del fallo del
oscilador en todos los acontecimientos que siguen a estos. Esto se puede evitar
supervisando el bit OSTS y usar la rutina de sincronizacin para determinar si el
oscilador est tardando demasiado en comenzar. Sin embargo, la interrupcin de no
fallo del oscilador se sealar.
Tambin es posible seleccionar otra configuracin del reloj e incorporar un
modo de ahorro de energa suplente mientras que el reloj primario sea estable. Cuando
el nuevo modo de ahorro de energa se selecciona, el reloj primario se desactiva.

3.4.24.5.

Verificacin Del Programa Y Cdigo De Proteccin

La estructura total del cdigo de proteccin de los dispositivos PIC18F difiere


significativamente de otros dispositivos PICmicro.
La memoria de programa del usuario se divide en cinco bloques. Uno de estos es
el bloque de arranque de 2kb. El resto de la memoria se divide en cuatro bloques en
lmites binarios.
Cada uno de estos cinco bloques tiene tres cdigos de proteccin asociados a
ellos. Son:
Bit de proteccin del cdigo (CPn)
Bit de proteccin de la escritura (WRTn)
Bit de lectura del bloque de tabla externa (EBTRn)

343

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 24-5: CDIGO De Proteccin De La Memoria De Programa Para Los


PIC18F2455/2550/4455/4550

TABLA 24-3: Sumario De Los Registros Del Cdigo De Proteccin


Nombre

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

Leyenda: las celdas sombreadas no estn implementadas.


Nota 1: No implementado en los dispositivos PIC18Fx455; mantener este bit
activo.

344

GUILLERMO DAVID HERRERO GONZLEZ

3.4.24.5.1.

Memoria De Programa Cdigo De Proteccin

La memoria de programa se puede leer o escribir en cualquier localizacin


usando las instrucciones de lectura y escritura en tabla. La identificacin del dispositivo
se puede leer con la lectura de tabla. Los registros de configuracin se pueden leer y
escribir con la lectura y escritura de tabla.
En el modo normal de ejecucin, los bits CPn no tienen ningn efecto directo.
Los bits CPn inhiben la lectura y escritura externa. El bloque de memoria del usuario se
puede proteger contra la escritura de tabla si el bit de configuracin WRTn est a 0.
Los bits EBTRn controlan la lectura de tabla. Para un bloque de memoria del usuario
con el bit EBTRn a 0, se permite una instruccin de lectura de tabla ejecutada dentro
de ese bloque. Una instruccin de lectura de tabla que se ejecuta en una localizacin
exterior de ese bloque no se permite y da lugar a 0s.
Nota: Los bits de proteccin del cdigo se pueden escribir solamente de un 0 a
un 1. No es posible a escribir un 1 en un bit a 0. Los bits del cdigo de proteccin
se activan solamente con un borrado completo del chip o al borrar el bloque funcin. El
borrado completo del chip y el borrado del bloque funcin slo se pueden realizar por
medio de ICSP o de un programador externo.
FIGURA 24-6: Escritura En Tabla Rechazada (WRTn)

Resultado: Todas las escrituras en tabla desactivadas en el Blockn cuando


WRTn=0.

345

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

FIGURA 24-7: Lectura Externa De Tabla Rechazada (EBTRn)

Resultados: Todas las lecturas de los bloques externas al Blockn estn


desactivadas cuando EBTRn=0. El registro TABLAT devolver 0.
FIGURA 24-8: Lectura Externa De Tabla Permitida (EBTRn)

Resultados: Lecturas en tabla permitidas al Blockn, incluso cuando EBTRBn=0.


El registro TABLAT devolver el valor del dato en la localizacin TBLPTR.

346

GUILLERMO DAVID HERRERO GONZLEZ

3.4.24.5.2.

Datos EEPROM Cdigo De Proteccin

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.

Configuracin Del Registro De Proteccin

Los registros de configuracin pueden protegerse contra la escritura. El bit


WRTC controla la proteccin de los registros de configuracin. En modo de ejecucin
normal, el bit WRTC es solamente legible. WRTC slo se puede escribir va ICSP o con
un programador externo.

3.4.24.6.

Localizaciones De Identificacin

En ocho posiciones de memoria (200000h-200007h) se guardan como


localizaciones de identificacin, en donde el usuario puede almacenar versiones u otros
nmeros de identificacin del cdigo. stas localizaciones son legibles y escribibles
durante la ejecucin normal con las instrucciones TBLRD y TBLWT o durante
programacin/verificacin. Las localizaciones de identificacin se pueden leer cuando
se protege el cdigo del dispositivo.

3.4.24.7.

Programacin Serie In-Circuit

Los microcontroladores PIC18F2455/2550/4455/4550 pueden programarse en


serie en el circuito de la aplicacin. Esto se hace simplemente con dos lneas para el
reloj y los datos y tres otras lneas para la energa, tierra y tensin de programacin.
Esto permite que los clientes fabriquen las placas con los dispositivos sin programar y
entonces programar el microcontrolador momentos antes de enviar el producto. Esto
tambin permite los firmwares ms recientes o firmwares de encargo.

3.4.24.8.

Depuracin In-Circuit

Cuando el bit de configuracin DEBUG* se programa con un 0, la


funcionalidad de la depuracin en Circuito se permite. Esto permite funciones simples
para eliminar errores cuando se utiliza MPLAB IDE. Cuando el microcontrolador tiene
esta caracterstica permitida, algunos recursos no estn disponibles en el uso general.
Para utilizar la funcin In-Circuit de la depuracin del microcontrolador, el
diseo debe implementar las conexiones de la programacin In-Circuit:
MCLR*/VPP/RE3, VDD, VSS, RB7 y RB6. Esto interconectar al mdulo depuracin
In-Circuit disponible de microchip o de una de las compaas de herramientas de
desarrollo.

347

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

TABLA 24-4: Recursos De Depuracin


Pines E/S:

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.

Puerto Dedicado ICD/ICSP

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

GUILLERMO DAVID HERRERO GONZLEZ

TABLA 24-5: Equivalencia De Pines Entre Los Puertos Dedicados Y Herencia


ICD/ICSP
Nombre del pin

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

Los dispositivos PIC18F4455/4550 de 44 pines con encapsulado TQFP tienen la


capacidad de cambiar su configuracin bajo control externo para depurar errores. Esto
permite que el dispositivo se comporte como si fuera un PIC18F2455/2550 de 28pines.
Este modo de configuracin de 28pines se controla a travs de un solo pin,
NC/ICPORTS. Conectar este pin a VSS fuerza al dispositivo para que funcione como un
dispositivo de 28pines. Las caractersticas asociadas a los dispositivos de 40/44pines se
desactivan junto a sus registros y bits de control correspondientes. Esto incluye PORTD
y PORTE, los SPP y la funcionalidad PWM mejorado del CCP1. Por otra parte,
conectar el pin a VDD fuerza al dispositivo que funcione en su configuracin por
defecto.
La opcin de configuracin slo est disponible cuando se permite la depuracin
oculta y el puerto dedicado ICD/ICSP (bit DEBUG* est borrado y se activa el bit
ICPRT). Cuando est inhabilitado, NC/ICPORTS es un pin NC.

3.4.24.10.

Suministro nico De La Programacin ICSP

El bit de configuracin LVP permite el suministro nico de la programacin


ICSP (conocida antes como Programacin ICSP de baja tensin o LVP). Cuando el
suministro nico de programacin se permite, el microcontrolador puede programarse
sin requerir la tensin alta que se aplica al pin MCLR*/VPP/RE3, pero el pin
RB5/KBI1/PGM se dedica a controlar la entrada del modo de programa y no est
disponible como pin de entrada-salida.
Cuando se programa usando el suministro nico de programacin, VDD se aplica
al pin MCLR*/VPP/RE3 como en el modo de ejecucin normal. Para entrar en modo de
programacin, VDD se aplica al pin PGM.

349

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Nota 1: La programacin de alta tensin siempre est disponible, sin importar


el estado del bit LVP, aplicando VIHH al pin MCLR*.
2: Mientras que en la programacin de baja tensin del modo ICSP, el
pin RB5 no puede utilizarse ms como pin de entrada-salida y deber llevarse a un punto
de tensin bajo durante la operacin normal.
3: Al usar la programacin de baja tensin ICSP (LVP) y se permiten los
pull-ups del PORTB, el bit 5 en el registro TRISB debe borrarse para inhabilitar los
pull-ups en RB5 y asegurar el funcionamiento correcto del dispositivo.
4: Si el Master Clear est desactivado, verificar que lo siguiente sea
correcto para asegurar la entrada apropiada en el modo ICSP:
a) inhabilita la programacin de baja tensin (CONFIG4L<2>=0);
b) RB5/KBI1/PGM est en nivel bajo durante la entrada de ICSP.
Si el modo de programacin suministro nico ICSP no se utiliza, el bit LVP
puede borrarse. RB5/KBI1/PGM entonces esta disponible como pin de E/S digital,
RB5. El bit LVP puede activarse o borrarse solamente al usar la programacin estndar
de alta tensin (VIHH aplicado al pin MCLR*/VPP/RE3). Una vez que se haya
inhabilitado LVP, solamente la programacin de alta tensin estndar est disponible y
debe utilizarse para programar el dispositivo.
La memoria sin cdigo de proteccin puede borrarse usando el borrado de un
bloque, o borrar fila por fila, entonces escrita en cualquier VDD especificada. Si se
quiere borrar la memoria protegida, se necesita borrar un bloque. Si se realiza el borrado
de un bloque al usar la programacin de baja tensin, el dispositivo necesita una VDD de
4,5V a 5,5V.

350

GUILLERMO DAVID HERRERO GONZLEZ

3.5.

FUSES DE PROGRAMACIN DE LA FAMILIA PIC18FXX5X

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.

Bits Selectores Del Prescaler Del PLL:


PLLDIV = 1

Sin prescaler (Entrada de oscilador de 4MHz conduce el PLL


directamente)

PLLDIV = 2

Divide por 2 (8 MHz oscilador de entrada)

PLLDIV = 3

Divide por 3 (12 MHz oscilador de entrada)

PLLDIV = 4

Divide por 4 (16 MHz oscilador de entrada)

PLLDIV = 5

Divide por 5 (20 MHz oscilador de entrada)

PLLDIV = 6

Divide por 6 (24 MHz oscilador de entrada)

PLLDIV = 10

Divide por 10 (40 MHz oscilador de entrada)

PLLDIV = 12

Divide por 12 (48 MHz oscilador de entrada)

Postcaler Del Reloj Del Sistema CPU:

CPUDIV = OSC1_PLL2

[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]

CPUDIV = OSC2_PLL3

[OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]

CPUDIV = OSC3_PLL4

[OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]

CPUDIV = OSC4_PLL6

[OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]

3.5.1.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)
USBDIV = 1

La fuente de reloj es el oscilador primario sin postscaler

USBDIV = 2

La fuente de reloj viene de los 96MHz PLL y los divide por 2

351

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.1.4.

Bits Selectores Del Oscilador:

FOSC = XT_XT

XT oscilador, XT usado por USB

FOSC = XTPLL_XT

XT oscilador, PLL activo, XT usado por USB

FOSC = ECIO_EC

Reloj externo, funciona como puerto RA6, EC usado por USB

FOSC = EC_EC

Reloj externo, CLKOUT en RA6, EC usado por USB

FOSC = ECPLLIO_EC

Reloj externo, PLL activo, funciona como puerto RA6, EC usado por USB

FOSC = ECPLL_EC

Reloj externo, PLL activo, CLKOUT en RA6, EC usado por USB

FOSC = INTOSCIO_EC

Oscilador interno, funciona como puerto RA6, EC usado por SB

FOSC = INTOSC_EC

Oscilador interno, CLKOUT en RA6, EC usado por USB

FOSC = INTOSC_XT

Oscilador interno, XT usado por USB

FOSC = INTOSC_HS

Oscilador interno, HS usado por USB

FOSC = HS

HS oscilador, HS usado por USB

FOSC = HSPLL_HS

HS oscilador, PLL activo, HS usado por USB

3.5.1.5.

3.5.1.6.

3.5.1.7.

Bit De Permiso Del Monitor De Reloj De Seguridad:


FCMEM = OFF

Monitor de reloj de seguridad desactivado

FCMEM = ON

Monitor de reloj de seguridad activo

Bit De Cambio Del Oscilador Interno/Externo:


IESO = OFF

Modo de cambio del oscilador desactivado

IESO = ON

Modo de cambio del oscilador activo

Bit De Permiso Del Retraso En El Inicio:


PWRT = ON

PWRT activo

PWRT = OFF

PWRT desactivado

352

GUILLERMO DAVID HERRERO GONZLEZ

3.5.1.8.

Bit De Permiso Del Reset Por Cese De Tensin (BOR):


BOR = OFF
BOR = SOFT

BOR = ON_ACTIVE

BOR = ON

3.5.1.9.

BOR desactivado en hardware y software


BOR activo y controlado por software
(SBOREN activo)
BOR activo slo en hardware y desactivado en modo Sleep
(SBOREN est desactivado)
BOR activo slo en hardware
(SBOREN desactivado)

Bits De Tensin BOR:


BORV = 0

Configuracin mxima

BORV = 1
BORV = 2
BORV = 3

3.5.1.10.

3.5.1.11.

Configuracin mnima

Bit De Permiso Del Regulador De Tensin USB:


VREGEN = OFF

Regulador de tensin USB desactivado

VREGEN = ON

Regulador de tensin USB activo

Bit De Permiso Del Temporizador Watchdog:


WDT = OFF

HW Desactivado - SW Controlado

WDT = ON

HW Activo - SW Desactivado

353

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.1.12.

3.5.1.13.

3.5.1.14.

Bits Selectores Del Postscaler Del Watchdog:


WDTPS = 1

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

Bit De Permiso Del Pin MCLR:


MCLRE = OFF

RE3 pin de entrada activo; MCLR desactivado

MCLRE = ON

MCLR pin activo; RE3 pin de entrada desactivado

Bit De Permiso De La Potencia Del Oscilador Timer 1:


LPT1OSC = OFF

Timer 1 configurado para la operacin de alta potencia

LPT1OSC = ON

Timer 1 configurado para baja potencia

354

GUILLERMO DAVID HERRERO GONZLEZ

3.5.1.15.

3.5.1.16.

3.5.1.17.

3.5.1.18.

3.5.1.19.

3.5.1.20.

Bit De Permiso PORTB A/D:


PBADEN = OFF

Los pines PORTB<4:0> se configuran como E/S digitales en el


Reset

PBADEN = ON

Los pines PORTB<4:0> se configuran como entradas


analgicas en el Reset

CCP2 MUX Bit:


CCP2MX = OFF

E/S CCP2 se multiplexa con RB3

CCP2MX = ON

E/S CCP2 se multiplexa con RC1

Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:


STVREN = OFF

Llenado/vaciado de la pila no provoca el Reset

STVREN = ON

Llenado/vaciado de la pila provoca el Reset

Bit De Permiso Del ICSP:


LVP = OFF

ICSP desactivado

LVP = ON

ICSP activo

Bit De Permiso Del Juego De Instrucciones Extendido:


XINST = OFF

Juego de instrucciones extendido y modo de direccionamiento


indexado desactivado (Modo legado)

XINST = ON

Juego de instrucciones extendido y modo de direccionamiento


indexado activo

Bit De Permiso Del Debugger Oculto:

DEBUG = ON

Debugger oculto: activo, RB6 y RB7 se dedican al Debug En-Circuito

DEBUG = OFF

Debugger oculto: desactivado, RB6 y RB7 configurados como pines de E/S de


propsito general

355

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Bit Del Cdigo De Proteccin En El Bloque 0:


CP0 = ON

Bloque 0 (000800-001FFFh) con cdigo de proteccin

CP0 = OFF

Bloque 0 (000800-001FFFh)

Bit Del Cdigo De Proteccin En El Bloque 1:


CP1 = ON

Bloque 1 (002000-003FFFh) con cdigo de proteccin

CP1 = OFF

Bloque 1 (002000-003FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 2:


CP2 = ON

Bloque 2 (004000-005FFFh) con cdigo de proteccin

CP2 = OFF

Bloque 2 (004000-005FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque De Inicio:


CPB = ON

Bloque de inicio (000000-0007FFh) con cdigo de proteccin

CPB = OFF

Bloque de inicio (000000-0007FFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En La EEPROM De Datos:


CPD = ON

EEPROM de datos con cdigo de proteccin

CPD = OFF

EEPROM de datos sin cdigo de proteccin

Bit De Proteccin Contra Escritura 0:


WRT0 = ON

Bloque 0 (000800-001FFFh) con proteccin contra escritura

WRT0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura 1:


WRT1 = ON

Bloque 1 (002000-003FFFh) con proteccin contra escritura

WRT1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin contra escritura

356

GUILLERMO DAVID HERRERO GONZLEZ

3.5.1.28.

3.5.1.29.

Bit De Proteccin Contra Escritura 2:


WRT2 = ON

Bloque 2 (004000-005FFFh) con proteccin contra escritura

WRT2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura En El Bloque De Inicio:


WRTC = ON

Bloque de inicio (000000-0007FFh) con proteccin contra


escritura

WRTC = OFF

Bloque de inicio (000000-0007FFh) sin proteccin contra


escritura

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

Registros de configuracin (300000-3000FFh) con proteccin


contra escritura

WRTB = OFF

Registros de configuracin (300000-3000FFh) sin proteccin


contra escritura

Bits De Proteccin Contra Escritura En La EEPROM De


WRTD = ON

EEPROM de datos con proteccin contra escritura

WRTD = OFF

EEPROM de datos sin proteccin contra escritura

Bit De Proteccin De La Lectura De Tabla Del Bloque 0:


EBTR0 = ON

Bloque 0 (000800-001FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 1:


EBTR1 = ON

Bloque 1 (002000-003FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

357

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.1.34.

3.5.1.35.
Inicio:

3.5.2.

Bit De Proteccin De La Lectura De Tabla Del Bloque 2:


EBTR2 = ON

Bloque 2 (004000-005FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Proteccin Contra La Lectura De Tabla Del Bloque De


EBTRB = ON

Bloque de inicio (000000-0007FFh) con proteccin de la


lectura de tabla ejecutado en otros bloques

EBTRB = OFF

Bloque de inicio (000000-0007FFh) sin proteccin de la lectura


de tabla ejecutado en otros bloques

PIC18F2550

3.5.2.1.

3.5.2.2.

Bits Selectores Del Prescaler Del PLL:


PLLDIV = 1

Sin prescaler (Entrada de oscilador de 4MHz conduce el PLL


directamente)

PLLDIV = 2

Divide por 2 (8 MHz oscilador de entrada)

PLLDIV = 3

Divide por 3 (12 MHz oscilador de entrada)

PLLDIV = 4

Divide por 4 (16 MHz oscilador de entrada)

PLLDIV = 5

Divide por 5 (20 MHz oscilador de entrada)

PLLDIV = 6

Divide por 6 (24 MHz oscilador de entrada)

PLLDIV = 10

Divide por 10 (40 MHz oscilador de entrada)

PLLDIV = 12

Divide por 12 (48 MHz oscilador de entrada)

Postcaler Del Reloj Del Sistema CPU:

CPUDIV = OSC1_PLL2

[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]

CPUDIV = OSC2_PLL3

[OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]

CPUDIV = OSC3_PLL4

[OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]

CPUDIV = OSC4_PLL6

[OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]

358

GUILLERMO DAVID HERRERO GONZLEZ

3.5.2.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)

3.5.2.4.

USBDIV = 1

La fuente de reloj es el oscilador primario sin postscaler

USBDIV = 2

La fuente de reloj viene de los 96MHz PLL y los divide por 2

Bits Selectores Del Oscilador:


FOSC = XT_XT
FOSC = XTPLL_XT
FOSC = ECIO_EC
FOSC = EC_EC

XT oscilador, XT usado por USB


XT oscilador, PLL activo, XT usado por USB
Reloj externo, funciona como puerto RA6, EC usado por USB
Reloj externo, CLKOUT en RA6, EC usado por USB

FOSC = ECPLLIO_EC

Reloj externo, PLL activo, funciona como puerto RA6, EC


usado por USB

FOSC = ECPLL_EC

Reloj externo, PLL activo, CLKOUT en RA6, EC usado por


USB

FOSC = INTOSCIO_EC

Oscilador interno, funciona como puerto RA6, EC usado por


USB

FOSC = INTOSC_EC

Oscilador interno, CLKOUT en RA6, EC usado por USB

FOSC = INTOSC_XT

Oscilador interno, XT usado por USB

FOSC = INTOSC_HS

Oscilador interno, HS usado por USB

FOSC = HS
FOSC = HSPLL_HS

3.5.2.5.

3.5.2.6.

HS oscilador, HS usado por USB


HS oscilador, PLL activo, HS usado por USB

Bit De Permiso Del Monitor De Reloj De Seguridad:


FCMEM = OFF

Monitor de reloj de seguridad desactivado

FCMEM = ON

Monitor de reloj de seguridad activo

Bit De Cambio Del Oscilador Interno/Externo:


IESO = OFF

Modo de cambio del oscilador desactivado

IESO = ON

Modo de cambio del oscilador activo

359

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.2.7.

Bit De Permiso Del Retraso En El Inicio:

3.5.2.8.

PWRT = ON

PWRT activo

PWRT = OFF

PWRT desactivado

Bit De Permiso Del Reset Por Cese De Tensin (BOR):


BOR = OFF
BOR = SOFT
BOR = ON_ACTIVE
BOR = ON

3.5.2.9.

BOR desactivado en hardware y software


BOR activo y controlado por software (SBOREN est activo)
BOR activo slo en hardware y desactivado en modo Sleep
(SBOREN desactivado)
BOR activo slo en hardware (SBOREN est desactivado)

Bits De Tensin BOR:


BORV = 0

Configuracin mxima

BORV = 1
BORV = 2
BORV = 3

3.5.2.10.

3.5.2.11.

Configuracin mnima

Bit De Permiso Del Regulador De Tensin USB:


VREGEN = OFF

Regulador de tensin USB desactivado

VREGEN = ON

Regulador de tensin USB activo

Bit De Permiso Del Temporizador Watchdog:


WDT = OFF

HW Desactivado - SW Controlado

WDT = ON

HW Activo - SW Desactivado

360

GUILLERMO DAVID HERRERO GONZLEZ

3.5.2.12.

3.5.2.13.

3.5.2.14.

Bits Selectores Del Postscaler Del Watchdog:


WDTPS = 1

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

Bit De Permiso Del Pin MCLR:


MCLRE = OFF

RE3 pin de entrada activo; MCLR desactivado

MCLRE = ON

MCLR pin activo; RE3 pin de entrada desactivado

Bit De Permiso De La Potencia Del Oscilador Timer 1:


LPT1OSC = OFF

Timer 1 configurado para alta potencia

LPT1OSC = ON

Timer 1 configurado para baja potencia

361

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Bit De Permiso PORTB A/D:


PBADEN = OFF

Los pines PORTB<4:0> se configuran como E/S digitales en el


Reset

PBADEN = ON

Los pines PORTB<4:0> se configuran como entradas


analgicas en el Reset

CCP2 MUX Bit:


CCP2MX = OFF

E/S CCP2 se multiplexa con RB3

CCP2MX = ON

E/S CCP2 se multiplexa con RC1

Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:


STVREN = OFF

Llenado/vaciado de la pila no provoca el Reset

STVREN = ON

Llenado/vaciado de la pila provoca el Reset

Bit De Permiso Del ICSP:


LVP = OFF

ICSP desactivado

LVP = ON

ICSP activo

Bit De Permiso Del Juego De Instrucciones Extendido:


XINST = OFF

Juego de instrucciones extendido y modo de direccionamiento


indexado desactivado (Modo legado)

XINST = ON

Juego de instrucciones extendido y modo de direccionamiento


indexado activo

Bit De Permiso Del Debugger Oculto:


DEBUG = ON

Debugger oculto: activo, RB6 y RB7 se dedican al Debug EnCircuito

DEBUG = OFF

Debugger oculto: desactivado, RB6 y RB7 configurados como


pines de E/S de propsito general

Bit Del Cdigo De Proteccin En El Bloque 0:


CP0 = ON

Bloque 0 (000800-001FFFh) con cdigo de proteccin

CP0 = OFF

Bloque 0 (000800-001FFFh) sin cdigo de proteccin

362

GUILLERMO DAVID HERRERO GONZLEZ

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.

Bit Del Cdigo De Proteccin En El Bloque 1:


CP1 = ON

Bloque 1 (002000-003FFFh) con cdigo de proteccin

CP1 = OFF

Bloque 1 (002000-003FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 2:


CP2 = ON

Bloque 2 (004000-005FFFh) con cdigo de proteccin

CP2 = OFF

Bloque 2 (004000-005FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 3:


CP3 = ON

Bloque 3 (006000-007FFFh) con cdigo de proteccin

CP3 = OFF

Bloque 3 (006000-007FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque De Inicio:


CPB = ON

Bloque de inicio (000000-0007FFh) con cdigo de proteccin

CPB = OFF

Bloque de inicio (000000-0007FFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En La EEPROM De Datos:


CPD = ON

EEPROM de datos con cdigo de proteccin

CPD = OFF

EEPROM de datos sin cdigo de proteccin

Bit De Proteccin Contra Escritura 0:


WRT0 = ON

Bloque 0 (000800-001FFFh) con proteccin contra escritura

WRT0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura 1:


WRT1 = ON

Bloque 1 (002000-003FFFh) con proteccin contra escritura

WRT1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin contra escritura

363

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.2.29.

3.5.2.30.

3.5.2.31.

Bit De Proteccin Contra Escritura 2:


WRT2 = ON

Bloque 2 (004000-005FFFh) con proteccin contra escritura

WRT2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura 3:


WRT3 = ON

Bloque 3 (006000-007FFFh) con proteccin contra escritura

WRT3 = OFF

Bloque 3 (006000-007FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura En El Bloque De Inicio:


WRTB = ON

Registros de configuracin (300000-3000FFh) con proteccin


contra escritura

WRTB = OFF

Registros de configuracin (300000-3000FFh) sin proteccin


contra escritura

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

Bloque de inicio (000000-0007FFh) con proteccin contra


escritura

WRTC = OFF

Bloque de inicio (000000-0007FFh) sin proteccin contra


escritura

Bits De Proteccin Contra Escritura En La EEPROM De


WRTD = ON

EEPROM de datos con proteccin contra escritura

WRTD = OFF

EEPROM de datos sin proteccin contra escritura

Bit De Proteccin De La Lectura De Tabla Del Bloque 0:


EBTR0 = ON

Bloque 0 (000800-001FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

364

GUILLERMO DAVID HERRERO GONZLEZ

3.5.2.35.

3.5.2.36.

3.5.2.37.

3.5.2.38.
Inicio:

Bit De Proteccin De La Lectura De Tabla Del Bloque 1:


EBTR1 = ON

Bloque 1 (002000-003FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 2:


EBTR2 = ON

Bloque 2 (004000-005FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 3:


EBTR3 = ON

Bloque 3 (006000-007FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR3 = OFF

Bloque 3 (006000-007FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Proteccin Contra La Lectura De Tabla Del Bloque De


EBTRB = ON

Bloque de inicio (000000-0007FFh) con proteccin de la


lectura de tabla ejecutado en otros bloques

EBTRB = OFF

Bloque de inicio (000000-0007FFh) sin proteccin de la lectura


de tabla ejecutado en otros bloques

365

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.3.

PIC18F4455

3.5.3.1.

3.5.3.2.

Bits Selectores Del Prescaler Del PLL:


PLLDIV = 1

Sin prescaler (Entrada de oscilador de 4MHz conduce el PLL


directamente)

PLLDIV = 2

Divide por 2 (8 MHz oscilador de entrada)

PLLDIV = 3

Divide por 3 (12 MHz oscilador de entrada)

PLLDIV = 4

Divide por 4 (16 MHz oscilador de entrada)

PLLDIV = 5

Divide por 5 (20 MHz oscilador de entrada)

PLLDIV = 6

Divide por 6 (24 MHz oscilador de entrada)

PLLDIV = 10

Divide por 10 (40 MHz oscilador de entrada)

PLLDIV = 12

Divide por 12 (48 MHz oscilador de entrada)

Postcaler Del Reloj Del Sistema CPU:

CPUDIV = OSC1_PLL2

[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]

CPUDIV = OSC2_PLL3

[OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]

CPUDIV = OSC3_PLL4

[OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]

CPUDIV = OSC4_PLL6

[OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]

3.5.3.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)
USBDIV = 1

La fuente de reloj es el oscilador primario sin postscaler

USBDIV = 2

La fuente de reloj viene de los 96MHz PLL y los divide por 2

366

GUILLERMO DAVID HERRERO GONZLEZ

3.5.3.4.

Bits Selectores Del Oscilador:


FOSC = XT_XT
FOSC = XTPLL_XT
FOSC = ECIO_EC
FOSC = EC_EC

XT oscilador, XT usado por USB


XT oscilador, PLL activo, XT usado por USB
Reloj externo, funciona como puerto RA6, EC usado por USB
Reloj externo, CLKOUT en RA6, EC usado por USB

FOSC = ECPLLIO_EC

Reloj externo, PLL activo, funciona como puerto RA6, EC


usado por USB

FOSC = ECPLL_EC

Reloj externo, PLL activo, CLKOUT en RA6, EC usado por


USB

FOSC = INTOSCIO_EC

Oscilador interno, funciona como puerto RA6, EC usado por


USB

FOSC = INTOSC_EC

Oscilador interno, CLKOUT en RA6, EC usado por USB

FOSC = INTOSC_XT

Oscilador interno, XT usado por USB

FOSC = INTOSC_HS

Oscilador interno, HS usado por USB

FOSC = HS
FOSC = HSPLL_HS

3.5.3.5.

3.5.3.6.

3.5.3.7.

HS oscilador, HS usado por USB


HS oscilador, PLL activo, HS usado por USB

Bit De Permiso Del Monitor De Reloj De Seguridad:


FCMEM = OFF

Monitor de reloj de seguridad desactivado

FCMEM = ON

Monitor de reloj de seguridad activo

Bit De Cambio Del Oscilador Interno/Externo:


IESO = OFF

Modo de cambio del oscilador desactivado

IESO = ON

Modo de cambio del oscilador activo

Bit De Permiso Del Retraso En El Inicio:


PWRT = ON

PWRT activo

PWRT = OFF

PWRT desactivado

367

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.3.8.

Bit De Permiso Del Reset Por Cese De Tensin (BOR):


BOR = OFF
BOR = SOFT
BOR = ON_ACTIVE
BOR = ON

3.5.3.9.

BOR desactivado en hardware y software


BOR activo y controlado por software (SBOREN est activo)
BOR activo slo en hardware y desactivado en modo Sleep
(SBOREN desactivado)
BOR activo slo en hardware (SBOREN est desactivado)

Bits De Tensin BOR:


BORV = 0

Configuracin mxima

BORV = 1
BORV = 2
BORV = 3

3.5.3.10.

3.5.3.11.

Configuracin mnima

Bit De Permiso Del Regulador De Tensin USB:


VREGEN = OFF

Regulador de tensin USB desactivado

VREGEN = ON

Regulador de tensin USB activo

Bit De Permiso Del Temporizador Watchdog:


WDT = OFF

HW Desactivado - SW Controlado

WDT = ON

HW Activo - SW Desactivado

368

GUILLERMO DAVID HERRERO GONZLEZ

3.5.3.12.

3.5.3.13.

3.5.3.14.

Bits Selectores Del Postscaler Del Watchdog:


WDTPS = 1

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

Bit De Permiso Del Pin MCLR:


MCLRE = OFF

RE3 pin de entrada activo; MCLR desactivado

MCLRE = ON

MCLR pin activo; RE3 pin de entrada desactivado

Bit De Permiso De La Potencia Del Oscilador Timer 1:


LPT1OSC = OFF

Timer 1 configurado para alta potencia

LPT1OSC = ON

Timer 1 configurado para baja potencia

369

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.3.15.

3.5.3.16.

Bit De Permiso PORTB A/D:


PBADEN = OFF

Los pines PORTB<4:0> se configuran como E/S digitales en el


Reset

PBADEN = ON

Los pines PORTB<4:0> se configuran como entradas


analgicas en el Reset

CCP2 MUX Bit:

CCP2MX = OFF

E/S CCP2 se multiplexa con RB3

CCP2MX = ON

E/S CCP2 se multiplexa con RC1

3.5.3.17.

3.5.3.18.

Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:


STVREN = OFF

Llenado/vaciado de la pila no provoca el Reset

STVREN = ON

Llenado/vaciado de la pila provoca el Reset

Bit De Permiso Del ICSP:


LVP = OFF

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

Bit De Permiso Del Juego De Instrucciones Extendido:


XINST = OFF

Juego de instrucciones extendido y modo de direccionamiento


indexado desactivado (Modo legado)

XINST = ON

Juego de instrucciones extendido y modo de direccionamiento


indexado activo

Bit De Permiso Del Debugger Oculto:


DEBUG = ON

Debugger oculto: activo, RB6 y RB7 se dedican al Debug EnCircuito

DEBUG = OFF

Debugger oculto: desactivado, RB6 y RB7 configurados como


pines de E/S de propsito general

370

GUILLERMO DAVID HERRERO GONZLEZ

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.

Bit Del Cdigo De Proteccin En El Bloque 0:


CP0 = ON

Bloque 0 (000800-001FFFh) con cdigo de proteccin

CP0 = OFF

Bloque 0 (000800-001FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 1:


CP1 = ON

Bloque 1 (002000-003FFFh) con cdigo de proteccin

CP1 = OFF

Bloque 1 (002000-003FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 2:


CP2 = ON

Bloque 2 (004000-005FFFh) con cdigo de proteccin

CP2 = OFF

Bloque 2 (004000-005FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque De Inicio:


CPB = ON

Bloque de inicio (000000-0007FFh) con cdigo de proteccin

CPB = OFF

Bloque de inicio (000000-0007FFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En La EEPROM De Datos:


CPD = ON

EEPROM de datos con cdigo de proteccin

CPD = OFF

EEPROM de datos sin cdigo de proteccin

Bit De Proteccin Contra Escritura 0:


WRT0 = ON

Bloque 0 (000800-001FFFh) con proteccin contra escritura

WRT0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura 1:


WRT1 = ON

Bloque 1 (002000-003FFFh) con proteccin contra escritura

WRT1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin contra escritura

371

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.3.29.

3.5.3.30.

Bit De Proteccin Contra Escritura 2:


WRT2 = ON

Bloque 2 (004000-005FFFh) con proteccin contra escritura

WRT2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura En El Bloque De Inicio:


WRTB = ON

Registros de configuracin (300000-3000FFh) con proteccin


contra escritura

WRTB = OFF

Registros de configuracin (300000-3000FFh) sin proteccin


contra escritura

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

Bloque de inicio (000000-0007FFh) con proteccin contra


escritura

WRTC = OFF

Bloque de inicio (000000-0007FFh) sin proteccin contra


escritura

Bits De Proteccin Contra Escritura En La EEPROM De


WRTD = ON

EEPROM de datos con proteccin contra escritura

WRTD = OFF

EEPROM de datos sin proteccin contra escritura

Bit De Proteccin De La Lectura De Tabla Del Bloque 0:


EBTR0 = ON

Bloque 0 (000800-001FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 1:


EBTR1 = ON

Bloque 1 (002000-003FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

372

GUILLERMO DAVID HERRERO GONZLEZ

3.5.3.35.

3.5.3.36.
Inicio:

3.5.4.

Bit De Proteccin De La Lectura De Tabla Del Bloque 2:


EBTR2 = ON

Bloque 2 (004000-005FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Proteccin Contra La Lectura De Tabla Del Bloque De


EBTRB = ON

Bloque de inicio (000000-0007FFh) con proteccin de la


lectura de tabla ejecutado en otros bloques

EBTRB = OFF

Bloque de inicio (000000-0007FFh) sin proteccin de la lectura


de tabla ejecutado en otros bloques

PIC18F4550

3.5.4.1.

3.5.4.2.

Bits Selectores Del Prescaler Del PLL:


PLLDIV = 1

Sin prescaler (Entrada de oscilador de 4MHz conduce el PLL


directamente)

PLLDIV = 2

Divide por 2 (8 MHz oscilador de entrada)

PLLDIV = 3

Divide por 3 (12 MHz oscilador de entrada)

PLLDIV = 4

Divide por 4 (16 MHz oscilador de entrada)

PLLDIV = 5

Divide por 5 (20 MHz oscilador de entrada)

PLLDIV = 6

Divide por 6 (24 MHz oscilador de entrada)

PLLDIV = 10

Divide por 10 (40 MHz oscilador de entrada)

PLLDIV = 12

Divide por 12 (48 MHz oscilador de entrada)

Postcaler Del Reloj Del Sistema CPU:

CPUDIV = OSC1_PLL2

[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]

CPUDIV = OSC2_PLL3

[OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]

CPUDIV = OSC3_PLL4

[OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]

CPUDIV = OSC4_PLL6

[OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]

373

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.4.3.
Bit Selectores Del Reloj Del USB (Modo Full-Speed;
UCFG:FSEN=1)

3.5.4.4.

USBDIV = 1

La fuente de reloj es el oscilador primario sin postscaler

USBDIV = 2

La fuente de reloj viene de los 96MHz PLL y los divide por 2

Bits Selectores Del Oscilador:


FOSC = XT_XT
FOSC = XTPLL_XT
FOSC = ECIO_EC
FOSC = EC_EC

XT oscilador, XT usado por USB


XT oscilador, PLL activo, XT usado por USB
Reloj externo, funciona como puerto RA6, EC usado por USB
Reloj externo, CLKOUT en RA6, EC usado por USB

FOSC = ECPLLIO_EC

Reloj externo, PLL activo, funciona como puerto RA6, EC


usado por USB

FOSC = ECPLL_EC

Reloj externo, PLL activo, CLKOUT en RA6, EC usado por


USB

FOSC = INTOSCIO_EC

Oscilador interno, funciona como puerto RA6, EC usado por


USB

FOSC = INTOSC_EC

Oscilador interno, CLKOUT en RA6, EC usado por USB

FOSC = INTOSC_XT

Oscilador interno, XT usado por USB

FOSC = INTOSC_HS

Oscilador interno, HS usado por USB

FOSC = HS
FOSC = HSPLL_HS

3.5.4.5.

3.5.4.6.

HS oscilador, HS usado por USB


HS oscilador, PLL activo, HS usado por USB

Bit De Permiso Del Monitor De Reloj De Seguridad:


FCMEM = OFF

Monitor de reloj de seguridad desactivado

FCMEM = ON

Monitor de reloj de seguridad activo

Bit De Cambio Del Oscilador Interno/Externo:


IESO = OFF

Modo de cambio del oscilador desactivado

IESO = ON

Modo de cambio del oscilador activo

374

GUILLERMO DAVID HERRERO GONZLEZ

3.5.4.7.

Bit De Permiso Del Retraso En El Inicio:

3.5.4.8.

PWRT = ON

PWRT activo

PWRT = OFF

PWRT desactivado

Bit De Permiso Del Reset Por Cese De Tensin (BOR):


BOR = OFF
BOR = SOFT
BOR = ON_ACTIVE
BOR = ON

3.5.4.9.

BOR desactivado en hardware y software


BOR activo y controlado por software (SBOREN est activo)
BOR activo slo en hardware y desactivado en modo Sleep
(SBOREN desactivado)
BOR activo slo en hardware (SBOREN est desactivado)

Bits De Tensin BOR:


BORV = 0

Configuracin mxima

BORV = 1
BORV = 2
BORV = 3

3.5.4.10.

3.5.4.11.

Configuracin mnima

Bit De Permiso Del Regulador De Tensin USB:


VREGEN = OFF

Regulador de tensin USB desactivado

VREGEN = ON

Regulador de tensin USB activo

Bit De Permiso Del Temporizador Watchdog:


WDT = OFF

HW Desactivado - SW Controlado

WDT = ON

HW Activo - SW Desactivado

375

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.4.12.

3.5.4.13.

3.5.4.14.

Bits Selectores Del Postscaler Del Watchdog:


WDTPS = 1

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

Bit De Permiso Del Pin MCLR:


MCLRE = OFF

RE3 pin de entrada activo; MCLR desactivado

MCLRE = ON

MCLR pin activo; RE3 pin de entrada desactivado

Bit De Permiso De La Potencia Del Oscilador Timer 1:


LPT1OSC = OFF

Timer 1 configurado para alta potencia

LPT1OSC = ON

Timer 1 configurado para baja potencia

376

GUILLERMO DAVID HERRERO GONZLEZ

3.5.4.15.

3.5.4.16.

3.5.4.17.

3.5.4.18.

Bit De Permiso PORTB A/D:


PBADEN = OFF

Los pines PORTB<4:0> se configuran como E/S digitales en el


Reset

PBADEN = ON

Los pines PORTB<4:0> se configuran como entradas


analgicas en el Reset

CCP2 MUX Bit:


CCP2MX = OFF

E/S CCP2 se multiplexa con RB3

CCP2MX = ON

E/S CCP2 se multiplexa con RC1

Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:


STVREN = OFF

Llenado/vaciado de la pila no provoca el Reset

STVREN = ON

Llenado/vaciado de la pila provoca el Reset

Bit De Permiso Del ICSP:


LVP = OFF

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

Bit De Permiso Del Juego De Instrucciones Extendido:


XINST = OFF

Juego de instrucciones extendido y modo de direccionamiento


indexado desactivado (Modo legado)

XINST = ON

Juego de instrucciones extendido y modo de direccionamiento


indexado activo

Bit De Permiso Del Debugger Oculto:


DEBUG = ON

Debugger oculto: activo, RB6 y RB7 se dedican al Debug EnCircuito

DEBUG = OFF

Debugger oculto: desactivado, RB6 y RB7 configurados como


pines de E/S de propsito general

377

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Bit Del Cdigo De Proteccin En El Bloque 0:


CP0 = ON

Bloque 0 (000800-001FFFh) con cdigo de proteccin

CP0 = OFF

Bloque 0 (000800-001FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 1:


CP1 = ON

Bloque 1 (002000-003FFFh) con cdigo de proteccin

CP1 = OFF

Bloque 1 (002000-003FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 2:


CP2 = ON

Bloque 2 (004000-005FFFh) con cdigo de proteccin

CP2 = OFF

Bloque 2 (004000-005FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque 3:


CP3 = ON

Bloque 3 (006000-007FFFh) con cdigo de proteccin

CP3 = OFF

Bloque 3 (006000-007FFFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En El Bloque De Inicio:


CPB = ON

Bloque de inicio (000000-0007FFh) con cdigo de proteccin

CPB = OFF

Bloque de inicio (000000-0007FFh) sin cdigo de proteccin

Bit Del Cdigo De Proteccin En La EEPROM De Datos:


CPD = ON

EEPROM de datos con cdigo de proteccin

CPD = OFF

EEPROM de datos sin cdigo de proteccin

Bit De Proteccin Contra Escritura 0:


WRT0 = ON

Bloque 0 (000800-001FFFh) con proteccin contra escritura

WRT0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin contra escritura

378

GUILLERMO DAVID HERRERO GONZLEZ

3.5.4.29.

3.5.4.30.

3.5.4.31.

3.5.4.32.

Bit De Proteccin Contra Escritura 1:


WRT1 = ON

Bloque 1 (002000-003FFFh) con proteccin contra escritura

WRT1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura 2:


WRT2 = ON

Bloque 2 (004000-005FFFh) con proteccin contra escritura

WRT2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura 3:


WRT3 = ON

Bloque 3 (006000-007FFFh) con proteccin contra escritura

WRT3 = OFF

Bloque 3 (006000-007FFFh) sin proteccin contra escritura

Bit De Proteccin Contra Escritura En El Bloque De Inicio:


WRTC = ON

Bloque de inicio (000000-0007FFh) con proteccin contra


escritura

WRTC = OFF

Bloque de inicio (000000-0007FFh) sin proteccin contra


escritura

3.5.4.33.
Bits De Proteccin Contra Escritura En Los Registros De
Configuracin:

3.5.4.34.
Datos:

WRTB = ON

Registros de configuracin (300000-3000FFh) con proteccin


contra escritura

WRTB = OFF

Registros de configuracin (300000-3000FFh) sin proteccin


contra escritura

Bits De Proteccin Contra Escritura En La EEPROM De

WRTD = ON

EEPROM de datos con proteccin contra escritura

WRTD = OFF

EEPROM de datos sin proteccin contra escritura

379

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3.5.4.35.

3.5.4.36.

3.5.4.37.

3.5.4.38.

3.5.4.39.
Inicio:

Bit De Proteccin De La Lectura De Tabla Del Bloque 0:


EBTR0 = ON

Bloque 0 (000800-001FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR0 = OFF

Bloque 0 (000800-001FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 1:


EBTR1 = ON

Bloque 1 (002000-003FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR1 = OFF

Bloque 1 (002000-003FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 2:


EBTR2 = ON

Bloque 2 (004000-005FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR2 = OFF

Bloque 2 (004000-005FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Bit De Proteccin De La Lectura De Tabla Del Bloque 3:


EBTR3 = ON

Bloque 3 (006000-007FFFh) con proteccin de la lectura de


tabla ejecutado en otros bloques

EBTR3 = OFF

Bloque 3 (006000-007FFFh) sin proteccin de la lectura de


tabla ejecutado en otros bloques

Proteccin Contra La Lectura De Tabla Del Bloque De


EBTRB = ON

Bloque de inicio (000000-0007FFh) con proteccin de la lectura


de tabla ejecutado en otros bloques

EBTRB = OFF

Bloque de inicio (000000-0007FFh) sin proteccin de la lectura


de tabla ejecutado en otros bloques

380

4. LENGUAJE DE PROGRAMACIN
C18

383

4.

LENGUAJE DE PROGRAMACIN C18

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.

COMPILADOR MPLAB C18


INTRODUCCIN

El compilador MPLAB C18 es un compilador que optimiza el estndar ANSI C


en los microcontroladores PIC18. El compilador modifica el estndar ANSI X3.1591989 slo en los puntos en los que se puedan crear conflictos con el soporte del
microcontrolador.
El MPLAB C18 tiene las siguientes caractersticas:
Compatibilidad ANSI 89.
Integracin con el MLAB IDE para una mayor facilidad de realizacin y
debugg de proyectos.
Admite ensamblador empotrado.
Gran variedad de libreras.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Los datos de ms de un byte de longitud, se almacenan en memoria como en el


ensamblador, con el criterio Little Indian; es decir, los bytes menos significativos se
almacenan en las posiciones de memoria bajas.

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

Unsigned short long

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

GUILLERMO DAVID HERRERO GONZLEZ

4.2.2.3.

Estructuras

Se permiten las estructuras de datos. Su utilidad es el acceso a bits.


union tpuerto{
unsigned char valor;
struct{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
};
}byte;

En este ejemplo se declara tpuerto como byte que contiene:


Una variable tipo char llamada valor.
Un conjunto de bits.

4.2.2.4.

Almacenamiento

El compilador reconoce los modificadores establecidos en la norma ANSI:


Auto:
9 Las variables se declaran globales si se ha hecho fuera de las
funciones y locales si se realiza en las funciones.
9 Tienen prioridad las locales. Todas las variables no inicializadas
tienen un valor indefinido.
Externa:
9 La variable declarada pertenece a otro mdulo, por lo que no
reserva memoria para ella.
9 Sirve para acceder a una variable aunque no se haya declarado
todava.
9 Se inicializan a cero.
Register:
9 La variable se guarda en uno de los registros del procesador.
9 Si no se puede almacenar en un registro, se comporta como Auto.
9 til para optimizar el tiempo de ejecucin de algunas funciones.

385

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Las instrucciones se ejecutan repetidamente hasta que el valor de la expresin,


que se comprueba al comenzar el bucle, sea falso, es decir cero.
while (expresin) {
Instruccin 1
Instruccin 2
...
Instruccin n }

386

GUILLERMO DAVID HERRERO GONZLEZ

4.2.3.1.2.

Sentencia Do

Las instrucciones se ejecutan repetidamente hasta que el valor de la expresin,


que se comprueba al final del bucle, sea falso, es decir cero.
do {
Instruccin 1
Instruccin 2
...
Instruccin n
} while ( expresin );

4.2.3.1.3.

Sentencia For

Las instrucciones se ejecutan repetidamente hasta que el valor de la exp2 sea


falso, es decir cero.
exp1 sirve para inicializar el contador del bucle.
exp3 controla el contador del bucle. Se evala al final del mismo.
for( exp1; exp 2; exp 3) {
Instruccin 1
Instruccin 2
...
Instruccin n }

4.2.3.1.4.

Sentencia If

La expresin se evala y si es verdadera (distinta de cero) se ejecutan las


instrucciones.
If( expresin )
{ Instruccin 1
Instruccin 2
...
Instruccin n }

4.2.3.1.5.

Sentencia If-Else

La expresin se evala, si es verdadera se ejecutan las instrucciones A, en caso


contrario las Instrucciones B.
If( expresin )
{ Instrucciones A }
else
{Instrucciones B }

387

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.2.3.1.6.

Sentencia Switch

Permite realizar selecciones mltiples.


switch ( expresin ) {
case const1:
Instruccin 1;
break;
case const2:
Instruccin 2;
break;
...
default:
Instruccin n
break;
}

4.2.3.1.7.

Sentencia Break

Interrumpe la ejecucin de un bucle while, do-while o for.


Ejemplo: cmo salir de un bucle infinito for?
For (;;) {
if( a==0) {
break;
}
a=PORTA; }

4.2.3.1.8.

Sentencia Continue

Se utiliza en los bucles para pasar a la siguiente repeticin.


For (;;) {
if( a!=0) {
continue; }
break;
}

4.2.3.1.9.

Sentencia Goto

Transfiere incondicionalmente el control a la sentencia etiquetada por el


identificador.
goto identificador;

identificador:

instrucciones;

Es una sentencia propia del lenguaje Basic. No se recomienda su utilizacin ya


que vara la estructura del programa.

388

GUILLERMO DAVID HERRERO GONZLEZ

4.2.4.

PUNTEROS

Un puntero es una variable que contiene la direccin a una zona de memoria en


la que se almacena una variable.
Los punteros ocupan 16Bits.
char
char

car;
*pcar;

//variable de tipo char


//puntero a una variable char

car=0xAA
pcar=&car

//almacena el dato hexadecimal AA


//almacena la direccin de la variable car, & devuelve la direccin

Otra forma de acceso:


char

*pcar;

//puntero a una variable char

pcar=(char*)0x501
*pcar=0xAA

//almaceno en el puntero la direccin de memoria 501


//almaceno en la direccin de memoria que tiene el puntero, el dato 0xAA

Optimizando este cdigo:


#define

CAR (*(char*)0x501)

CAR=0xAA

Al optimizarlo se ahorran las direcciones de memoria del puntero.


Hay que tener cuidado ya que el compilador no comprueba errores.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.

LIBRERAS DEL C18

Una librera es una coleccin de funciones agrupadas por referencia y facilidad


de llamada.
En este apartado aparecen las libreras utilizadas en el proyecto.
Las libreras relacionadas con el USB no se instalan con el compilador, teniendo
que descargarse de la pgina del fabricante; el resto se encuentran en la carpeta lib
dentro de la carpeta de instalacin del MPLAB C18.

4.3.1.

ABREVIATURAS EN LAS LIBRERAS DE MICROCHIP

A
ACM

Modelo abstracto de control

ACT

Actividad, activa

ADR

Direccin

ALLOC

Asignacin

ALT

Alterno

AUX

Auxiliar

BD

Buffer Descriptor

BDT

Tabla del buffer descriptor

BUFF

Buffer

CDC

Clase del dispositivo

CFG

Configuracin

CLR

borrar

CLS

Clase

CTRL

Control

DC

Clase del dispositivo

DEF

Definicin

DEFS

ver DEF

DEV

Dispositivo

DIR

Direccin

390

GUILLERMO DAVID HERRERO GONZLEZ

DSC

Descriptor

ENDP

Endpoint

EP

Endpoint

EXT

Externo

FN

funcional

FS

Full-Speed

HID

Dispositivo interfaz humana

INIT

inicializar

INT

Interrupcin/interno

INTF

Interfaz

IO

Entrada-salida

ISOCH

Sncrono

ISR

Rutina del servicio de interrupcin

LANG

Lenguaje

LEN

Longitud

LS

Low-speed

MAX

Mximo

MCHP

Tecnologa de microchip

MEM

Memoria

MFR

Fabricante, fabricacin, fabricacin

MGT

Gerencia

MIN

Mnimo

MSD

Dispositivo de almacenamiento masivo

391

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Motor de la interfaz serie

STAT

Estado

STD

Estndar

SYNCH

sncrono, sincronizacin

SYS

Sistema

TEL

Telfono

TR

Emisor

TRF

Transferencia

TX

transmisin

392

GUILLERMO DAVID HERRERO GONZLEZ

U
USB

Bus serie universal

UTIL

Utilidad

VAR

Variable

VAL

Valor

VEND

Vendedor

ZLP

Paquete cero de longitud

4.3.2.

ADC.H: LIBRERA DE LOS CONVERSORES A/D

Con esta librara se tratan los conversores analgico-digitales, desde su


configuracin hasta su lectura.
Para poder llamar a las funciones, como se indica en el cdigo, hay que incluir la
librera de la siguiente forma:
#include <adc.h>

4.3.2.1.

Descripcin De Las Funciones

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

void OpenADC(unsigned char config, unsigned char config2, unsigned char


portconfig)
Esta funcin resetea los registros asociados al conversor A/D al estado POR y
configura el reloj, el formato del resultado, tensin de referencia, puerto y canal.
Hay variaciones dependiendo del microcontrolador. Lo que se expone aqu es
para la mayora de los micros.
config:
Fuente de reloj:
ADC_FOSC_2

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

Justificacin del resultado A/D:


ADC_RIGHT_JUST

Resultado en los bits menos significativos

ADC_LEFT_JUST

Resultado en los bits ms significativos

Selectores del tiempo de adquisicin A/D:


ADC_0_TAD

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

GUILLERMO DAVID HERRERO GONZLEZ

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

Configuracin de tensiones A/D:


ADC_VREFPLUS_VDD VREF+=AVDD
ADC_VREFPLUS_EXT VREF+=externa
ADC_VREFMINUS_VDD VREF-=AVDD
ADC_VREFMINUS_EXT VREF-=externa
portconfig:
El valor de portconfig es un valor de 0 a 15. Corresponde con los bits 0 a 3 del
registro ADCON1, que son los bits de configuracin de los puertos.
OpenADC(ADC_FOSC_32
ADC_INT_OFF, 15;

&

ADC_RIGHT_JUST

395

&

ADC_12_TAD,

DC_CH0

&

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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();

void SetChanADC(unsigned char channel)


Selecciona al canal que se va a utlizar en el cdigo.
Si se han activado los canales AN0 y AN1, antes de leer el AN1 hay que llamar
esta funcin para que se lea al AN1 y no el AN0.
channel:
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

SetChanADC(ADC_CH1);

396

GUILLERMO DAVID HERRERO GONZLEZ

4.3.3.

PWM.H: FUNCIONES DEL PWM Y EPWM

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>

Para que la modulacin funcione correctamente hay que activar el Timer 2, se


explica en este captulo.

4.3.3.1.

Descripcin De Las Funciones

void ClosePWMx(void) y void CloseEPWM1(void)


Esta funcin desactiva el canal PWM especfico. La x corresponde al canal.
ClosePWM2();

void OpenPWMx(char period) y void OpenEPWM1(char period)


Esta funcin configura el canal PWM especfico por periodo y por base de
tiempos. El PWM slo utiliza el Timer2.
Para que funcione el PWM, antes hay que abrir el Timer2 con la funcin
OpenTimer2().
period:
Puede ser un valor de 0x00 a 0xFF. Este dato determina la frecuencia del PWM
mediante la frmula:
Periodo _ PWM = [( period ) + 1] 4 TOSC (Valor _ del _ prescaler _ de _ TMR 2)

OpenPWM2(0xFF);

void SetDCPWMx(unsigned int dutycicle) y void SetDCPEPWM1(unsigned


int dutycicle)
Esta funcin escribe un valor nuevo del ciclo de trabajo en el canal PWM
especificado.
dutycicle:
El valor de dutycicle puede ser de 10 bits, si es mayor slo se almacenarn los
10 bits de menos peso.
SetDCPWM2(0x0F0);

397

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

void SetOutputEPWM1(unsigned
outputmode)

char

outputconfig,

unsigned

Esta funcin configura la salida del mdulo EPWM.


outputconfig:
SINGLE_OUT

Salida simple

FULL_OUT_FWD

Salida full-bridge forward

FULL_OUT_REV

Salida full-bridge reverse

HALF_OUT

Salida half-bridge

outputmode:
PWM_MODE_1

P1A, P1B, P1C y P1D activo por altos

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

P1A, P1B, P1C y P1D activo por bajos

SetOutputEPWM1(SIGNED_OUT, PWM_MODE_1);

398

char

GUILLERMO DAVID HERRERO GONZLEZ

4.3.4.

TIMERS.H: FUNCIONES DE LOS TEMPORIZADORES


Esta librera es la encargada de los temporizadores.

En esta traduccin de la librera de Microchip slo aparecen las palabras de


configuracin vlidas para la familia PIC18Fxx5x, ya que vara dependiendo del
microprocesador.
Para incluirla hay que escribir al principio del archivo:
#include <timers.h>

4.3.4.1.

Descripcin de las funciones

void CloseTimerx(void)
Esta funcin desactiva el temporizador x y su interrupcin.
CloseTimer2();

void OpenTimer0(unsigned char config);


Esta funcin configura el Timer0 de acuerdo con las opciones especificadas y lo
activa.
config:
Interrupcin Timer0:
TIMER_INT_ON

Activa

TIMER_INT_OFF

Desactiva

Tamao del Temporizador:


T0_8BIT

Modo 8bits

T0_16BIT

Modo 16bits

Fuente de reloj:
T0_SOURCE_EXT

Fuente esterna

T0_SOURCE_INT

Fuente interna
(TOSC)

Disparador del reloj externo (de la fuente externa):


T0_EDGE_FALL

Flanco de bajada

T0_EDGE_RISE

Flanco de subida

399

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Valor del Prescaler:


T0_PS_1_1

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

OpenTimer0(TIMER_INT_OFF & T0_8BIT & T0_SOURCE_INT & T0_PS_1_32)

void OpenTimer1(unsigned char config);


Esta funcin configura el Timer1 de acuerdo con las opciones especificadas y lo
activa.
config:
Interrupcin Timer1:
TIMER_INT_ON

Activa

TIMER_INT_OFF

Desactiva

Tamao del Temporizador:


T1_8BIT_RW

Modo 8bits

T1_16BIT_RW

Modo 16bits

Fuente de reloj:
T1_SOURCE_EXT

Fuente esterna

T1_SOURCE_INT

Fuente interna
(TOSC)

Valor del Prescaler:


T0_PS_1_1

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

GUILLERMO DAVID HERRERO GONZLEZ

Oscilador:
T1_OSC1EN_ON

Activo

T1_OSC1EN_OFF

Desactivo

Sincronizacin del reloj de entrada:


T1_SYNC_EXT_ON

Sincronizacin de la entrada del reloj ext.

T1_SYNC_EXT_OFF Sin sinc.


Uso con CCP:
Dispositivos con 1 2 CCP:
T3_SOURCE_CCP

Timer3 fuente de ambos CCP

T1_CCP1_T3_CCP2

Timer1 fuente del CCP1 y Timer3 del CCP2

T1_SOURCE_CCP

Timer1 fuente de ambos CCP

OpenTimer1(TIMER_INT_OFF & T1_8BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 &


T1_OSC1EN_OFF & T1_SYNC_EXT_OFF & T1_SOURCE_CPP)

void OpenTimer2(unsigned char config);


Esta funcin configura el Timer2 de acuerdo con las opciones especificadas y lo
activa.
config:
Interrupcin Timer2:
TIMER_INT_ON
Activa
TIMER_INT_OFF
Desactiva
Valor del Prescaler:
T2_PS_1_1
Prescaler 1:1
T2_PS_1_2
Prescaler 1:2
T2_PS_1_4
Prescaler 1:4
T2_PS_1_16
Prescaler 1:16
Valor del Postscaler:
T2_PS_1_1
Postscaler 1:1
T2_PS_1_2
Postscaler 1:2

T2_PS_1_15
Postscaler 1:15
T0_PS_1_16
Prescaler 1:16

401

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Uso con CCP:


Dispositivos con 1 2 CCP:
T3_SOURCE_CCP
Timer3 fuente de ambos CCP
T1_CCP1_T3_CCP2
Timer1 fuente del CCP1 y
T1_SOURCE_CCP
Timer1 fuente de ambos CCP

Timer3 del CCP2

OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_8)

void OpenTimer3(unsigned char config);


Esta funcin configura el Timer3 de acuerdo con las opciones especificadas y lo
activa.
config:
Interrupcin Timer3:
TIMER_INT_ON

Activa

TIMER_INT_OFF

Desactiva

Tamao del Temporizador:


T3_8BIT_RW

Modo 8bits

T3_16BIT_RW

Modo 16bits

Fuente de reloj:
T3_SOURCE_EXT

Fuente esterna

T3_SOURCE_INT

Fuente interna (TOSC)

Valor del Prescaler:


T3_PS_1_1

Prescaler 1:1

T3_PS_1_2

Prescaler 1:2

T3_PS_1_4

Prescaler 1:4

T3_PS_1_8

Prescaler 1:8

Sincronizacin del reloj de entrada:


T3_SYNC_EXT_ON

Sincronizacin de la entrada del reloj ext.

T3_SYNC_EXT_OFF Sin sinc.


Uso con CCP:
Dispositivos con 1 2 CCP:
T3_SOURCE_CCP

Timer3 fuente de ambos CCP

T1_CCP1_T3_CCP2

Timer1 fuente del CCP1 y Timer3 del CCP2

T1_SOURCE_CCP

Timer1 fuente de ambos CCP

402

GUILLERMO DAVID HERRERO GONZLEZ

OpenTimer3(TIMER_INT_OFF & T3_8BIT_RW & T3_SOURCE_EXT & T3_PS_1_1 &


T3_SYNC_EXT_OFF & T1_SOURCE_CPP)

unsigned int/char ReadTimerx(void)


Esta funcin lee el valor del registro/registros del temporizador respectivo
dependiendo si es de 8bits o de 16bits.
Cuando se utiliza un temporizador de 16bits en el modo de 8bits, el byte alto
puede que no sea cero. El usuario tiene que almacenar el resultado en un char para que
sea correcto.
unsigned int resultado;
resultado=ReadTimer0();

//el resultado es un int porque el Timer0 es de 16bits

unsigned char resultado;


resultado=ReadTimer2();

//el resultado es un char porque el Timer2 es de 8bits

void WriteTimerx(unsigned int/char timer)


Esta funcin escribe un valor en el/los registros especficos del temporizador.
timer: Es el valor que se va a almacenar en el temporizador.
Es un int si el temporizador es de 16bits, aunque trabaje en modo 8bits; y un
char si el temporizador es de 8bits.
WriteTimer0(10000);

403

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.5.

DELAYS.H: RETRASOS POR SOFTWARE

Las funciones delay ejecutan un cdigo de un nmero especfico de ciclos de


instrucciones. Hay que tener en cuenta la frecuencia del procesador.
Para usarla primero hay que incluirla en el programa:
#include <delays.h>

4.3.5.1.

Descripcin De Las Funciones

void Delay1TCY(void)
Esta funcin es una definicin de la instruccin NOP. Cuando se encuentra en el
cdigo, el compilador inserta un NOP.
Delay1TCY();

void Delay10TCYx(unsigned char unit)


Esta funcin crea un retraso en mltiplos de 10 ciclos de instruccin.
unit:
El valor de unit puede ser de 8bits; en un rango de [1,255].
El retraso ser de (10*unit) ciclos.
Si unit=0 el retraso ser de 2 560 ciclos.
Delay10TCYx();

void Delay100TCYx(unsigned char unit)


Esta funcin crea un retraso en mltiplos de 100 ciclos de instruccin.
Esta funcin utiliza la variable global DelayCounter1. Si se utliza la funcin en
las interrupciones y en el cdigo, la variable anterior se tiene que almacenar y recuperar
en el cdigo de la interrupcin. Darse cuenta de que otras funciones de retrasos utilizan
la variable DelayCounter1.
unit:
El valor de unit puede ser de 8bits; en un rango de [1,255].
El retraso ser de (100*unit) ciclos.
Si unit=0 el retraso ser de 25 600 ciclos.
Delay100TCYx();

404

GUILLERMO DAVID HERRERO GONZLEZ

void Delay1KTCYx(unsigned char unit)


Esta funcin crea un retraso en mltiplos de 1 000 ciclos de instruccin.
Esta funcin utiliza la variable global DelayCounter1 y DelayCounter2. Si se
utliza la funcin en las interrupciones y en el cdigo, las variables anteriores se tienen
que almacenar y recuperar en el cdigo de la interrupcin. Darse cuenta de que otras
funciones de retrasos utilizan las variables DelayCounter1 y DelayCounter2.
unit:
El valor de unit puede ser de 8bits; en un rango de [1,255].
El retraso ser de (1 000*unit) ciclos.
Si unit=0 el retraso ser de 256 000 ciclos.
Delay1KTCYx();

void Delay10KTCYx(unsigned char unit)


Esta funcin crea un retraso en mltiplos de 10 000 ciclos de instruccin.
Esta funcin utiliza la variable global DelayCounter1 y DelayCounter2. Si se
utliza la funcin en las interrupciones y en el cdigo, las variables anteriores se tienen
que almacenar y recuperar en el cdigo de la interrupcin. Darse cuenta de que otras
funciones de retrasos utilizan las variables DelayCounter1 y DelayCounter2.
unit:
El valor de unit puede ser de 8bits; en un rango de [1,255].
El retraso ser de (10 000*unit) ciclos.
Si unit=0 el retraso ser de 2 560 000 ciclos.
Delay1KTCYx();

405

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.

LIBRERAS DEL USB

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

GUILLERMO DAVID HERRERO GONZLEZ

Si USB_USE_HID est definida se incluye la librera hid.h


#if defined(USB_USE_HID)
#include "system\usb\class\hid\hid.h"
#endif

Ver autofiles\usbcfg.h

Si USB_USE_MSD est definida se incluye la librera msd.h


#if defined(USB_USE_MSD)
#include "system\usb\class\msd\msd.h"
#endif

Ver autofiles\usbcfg.h

Si USB_USE_CDC est definida se incluye la librera cdc.h


#if defined(USB_USE_CDC)
#include "system\usb\class\cdc\cdc.h"
#endif

Ver autofiles\usbcfg.h

407

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.2.

Usbcfg.h: Configuracin

Esta librera es la encargada de la configuracin del buffer por defecto, del


Endpoint 0, de los Endpoints utilizados en la comunicacin Hay que modificarla en
cada aplicacin.

4.3.6.2.1.

Definiciones

Tamao del buffer del Endpoint 0 (8, 16 32 64):


#define EP0_BUFF_SIZE 8

Nmero mximo de interrupciones:


#define MAX_NUM_INT 1

Definicin de parmetros descritos en usbdrv.h:


Modo Ping-Pong:
#define MODE_PP

_PPBM0

Valor de configuracin:
#define UCFG_VAL

_PUEN|_TRINT|_FS|MODE_PP

E/S auto-alimentadas:
#define USE_SELF_POWER_SENSE_IO

E/S dependientes del bus USB:


#define USE_USB_BUS_SENSE_IO

Las dos definiciones anteriores se realizarn cuando sea necesario, siendo


totalmente independiente una de la otra.

4.3.6.2.2.

Uso de la clase del dispositivo

Dependiendo de la aplicacin hay que definir la clase que vamos a utilizar.


Uso de la interfaz humana del dispositivo USB: #define USB_USE_HID
Uso del CDC del dispositivo: #define USB_USE_CDC
9 Uso de la clase Almacenamiento masivo: #define USB_USE_MSD

9
9

MUID = Microchip USB Clase ID


Se utiliza para identificar la clase del USB de la sesin actual de control de la
transferencia del EP0:
#define MUID_NULL
#define MUID_USB9
#define MUID_HID
#define MUID_CDC

0
1
2
3

Ninguna
USB9
Interfaz humana
Clase de comunicacin del dispositivo

408

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.2.3.
#define
#define
#define
#define
#define
#define

Distribucin de los Endpoint

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;
}

Ver la direccin del informe del descriptor HID:


#define mUSBGetHIDRptDscAdr(ptr)
{
if(usb_active_cfg == 1)
ptr = (rom byte*)&hid_rpt01;
}

Ver el tamao del informe del descriptor HID:


#define mUSBGetHIDRptDscSize(count)
{
if(usb_active_cfg == 1)
count = sizeof(hid_rpt01);
}

Nmero mximo de Endpoints:


#define MAX_EP_NUMBER

//UEP1

409

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.3.

Usbdefs_std_dsc.h: Definiciones estndar de los descriptores:

Mediante esta librara se crean las estructuras de los descriptores estndar, se


definen constantes para realizar el cdigo ms rpidamente, etc.
En general, no hay que modificar nada de la librera. En nuestra aplicacin
copiaremos la que cede Microchip que corresponda con nuestra clase.

4.3.6.3.1.

Incluye:

#include "system\typedefs.h"

4.3.6.3.2.

Librera en la que se definen tipos de datos

Definiciones

Tipos de descriptores:
#define DSC_DEV
#define DSC_CFG
#define DSC_STR
#define DSC_INTF
#define DSC_EP

0x01
0x02
0x03
0x04
0x05

Descriptor del dispositivo


Descriptor de configuracin
Descriptor de la secuencia
Descriptor de la interfaz
Descriptor del Endpoint

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

GUILLERMO DAVID HERRERO GONZLEZ

#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

Valor por defecto (El Bit 7 se activa)


Auto-alimentado (Mantener si est activo)
Reinicio remoto (Mantener si est activo)

Tipo de transferencia del Endpoint:


#define _CTRL
#define _ISO
#define _BULK
#define _INT

0x00
0x01
0x02
0x03

Transferencia de control
Transferencia sncrona
Transferencia Bulk
Transferencia interrupcin

Tipo de sincronizacin del Endpoint de transferencia sncrona:


#define _NS
#define _AS
#define _AD
#define _SY

0x00<<2
0x01<<2
0x02<<2
0x03<<2

Sin sincronizacin
Asncrona
Adaptivo
Sncrona

Utilizacin del Endpoint tipo sncrono:


#define _DE
#define _FE
#define _IE

4.3.6.3.3.

0x00<<4
0x01<<4
0x02<<4

Endpoint de datos
Endpoint retroalimentado
Endpoint de datos y retroalimentado

Estructuras

Estructura de los descriptores del dispositivo USB (ver usbdsc.c):


typedef struct _USB_DEV_DSC
{
Longitud;
Tipo de descriptor;
byte bLength;
byte bDscType;
Clase del dispositivo;
Subclase del dispositivo;
byte bDevCls;
byte bDevSubCls;
Tamao mximo del paquete;
Identificador del fabricante;
producto;
byte bMaxPktSize0;
word idVendor;
Bcd del dsipositivo;
Informacin de la manufactura;
word bcdDevice;
byte iMFR;
Nmero de serie;
Nmero de configuracin;

411

Bcd del USB;


word bcdUSB;
Protocolo del dispositivo;
byte bDevProtocol;
Identificacin
del
word idProduct;
Informacin del producto;
byte iProduct;

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

byte iSerialNum;
} USB_DEV_DSC;

byte bNumCfg;

Estructura del descriptor de configuracin del USB:


typedef struct _USB_CFG_DSC
{
Longitud;
Tipo de descriptor;
byte bLength;
byte bDscType;
Nmero de interfaz;
Valor de configuracin;
configuracin;
byte bNumIntf;
byte bCfgValue;
Atributos;
Mxima energa;
byte bmAttributes;
byte bMaxPower;
} USB_CFG_DSC;

Longitud total;
word wTotalLength;
Informacin
de
byte iCfg;

Estructura de la interfaz del dispositivo USB:


typedef struct _USB_INTF_DSC
{
Longitud;
Tipo de descriptor;
byte bLength;
byte bDscType;
Configuracin alterna;
Nmero de Endpoints;
byte bAltSetting;
byte bNumEPs;
Subclase de interfaz;
Protocolo de la interfaz;
byte bIntfSubCls;
byte bIntfProtocol;
} USB_INTF_DSC;

Nmero de interfaz;
byte bIntfNum;
Clase de interfaz;
byte bIntfCls;
Informacin de la interfaz;
byte iIntf;

Estructura del Descriptor del Endpoint del USB:


typedef struct _USB_EP_DSC
{
Longitud;
byte bLength;
Atributos;
byte bmAttributes;
} USB_EP_DSC;

Tipo de descriptor;
byte bDscType;
Tamao mximo del paquete;
word wMaxPktSize;

412

Direccin del Endpoint;


byte bEPAdr;
Intervalo;
byte bInterval;

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.4.

Usbdsc.h: Descriptores

Esta es una de las libreras ms importantes, ya que en ella se definen los


descriptores.
Como hemos visto anteriormente, los descriptores definen la interfaz, la clase, el
fabricante, etc.
Esta librera suele ser totalmente distinta en cada aplicacin.

4.3.6.4.1.

Libreras que incluye

#include "system\typedefs.h"
#include "autofiles\usbcfg.h"
#include "system\usb\usb.h"

4.3.6.4.2.

Definiciones

#define CFG01 rom struct


{
USB_CFG_DSC
cd01;
USB_INTF_DSC
i00a00;
USB_EP_DSC
ep01o_i00a00;
USB_EP_DSC
ep01i_i00a00;
} cfg01

4.3.6.4.3.

Configuracin 01
Descriptor de configuracin
Descriptor de la interfaz
Endpoint descriptor de salida
Endpoint descriptor de entrada

Externas

extern rom USB_DEV_DSC device_dsc;


extern CFG01;
extern rom struct{byte bLength;byte bDscType;word string[1];}sd000;

413

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.5.

Usbdefs_ep0_buff.h: Descripciones Del Buffer Del Endpoint 0

La librera actual recopila las caractersticas del Endpoint 0 y de su buffer, no


hay que modificarla ya que las variables se han declarado en otras libreras.

4.3.6.5.1.

Incluye

#include "system\typedefs.h"
#include "autofiles\usbcfg.h"

Control de transferencias setup


Cada paquete setup tiene 8bytes. Sin embargo, el tamao del buffer del Endpoint
0 es el especificado en la librera usbcfg.h.
El tamao del buffer puede ser de 8, 16, 32 64.
Los primeros 8bytes se definen para direccionarse directamente para mejorar la
velocidad y reducir el tamao del cdigo. El resto de bytes se direccionan
indirectamente.
typedef union _CTRL_TRF_SETUP
{
Matriz para el direccionamiento indirecto
struct
{
byte _byte[EP0_BUFF_SIZE];
};
Respuestas estndar del dispositivo
struct
{
byte bmRequestType;
byte bRequest;
word wValue;
word wIndex;
word wLength;
};
struct
{
unsigned :8;
unsigned :8;
WORD W_Value;
WORD W_Index;
WORD W_Length;
};
struct
{

Tipo de respuesta
Respuesta
Valor
ndice
Longitud

Valor
ndice
Longitud

414

GUILLERMO DAVID HERRERO GONZLEZ

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
{

Dispositivo, Interfaz, Endpoint, Otro


Estndar, Clase, Fabricante, Reservado
Host-al-dispositivo, Dispositivo-al-host
Reinicio remoto, Paro del Endpoint

Slo para configuracin y String del descriptor


Dispositivo, Configuracin, String
Identificacin de idioma

Direccin del dispositivo 0-127


Tiene que ser cero

Valor de configuracin 0-255


Tiene que ser cero (Reservado)

415

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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;

Valor alterno de configuracin 0-255


Tiene que ser cero
Valor del nmero de interfaz 0-255
Tiene que ser cero

Identificacin del Endpoint ID (Nmero y Direccin)


Tiene que ser cero

Nmero del Endpoint 0-15


Direccin del Endpoint: 0-OUT, 1-IN

416

GUILLERMO DAVID HERRERO GONZLEZ

Control de transferencia de datos


typedef union _CTRL_TRF_DATA
{
Matriz para el direccionamiento indirecto:
struct
{
byte _byte[EP0_BUFF_SIZE];
};
Los primeros 8bytes direccionables directamente:
struct
{
byte _byte0;
byte _byte1;
byte _byte2;
byte _byte3;
byte _byte4;
byte _byte5;
byte _byte6;
byte _byte7;
};
struct
{
word _word0;
word _word1;
word _word2;
word _word3;
};
} CTRL_TRF_DATA;

417

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.6.

Usbmmap.h

Esta librera define constantes y estructuras utilizadas por otras.


El programador, salvo excepcin, no tiene que modificarla utilizndola tal y
como aparece.

4.3.6.6.1.

Incluye

#include "system\typedefs.h"

4.3.6.6.2.

Definiciones

Parmetros de inicializacin del descriptor del registro estado:


#define _BSTALL
#define _DTSEN
#define _INCDIS
#define _KEN

0x04
0x08
0x10
0x20

#define _DAT0
#define _DAT1
#define _DTSMASK
#define _USIE
#define _UCPU

0x00
0x40
0x40
0x80
0x00

Parada del buffer activa


Dato de sincronizacin activo
Incremento de direccin desactivado
Guardado del buffer descriptor por el
SIE activo
Paquete DATA0 esperando el siguiente
Paquete DATA1 esperando el siguiente
Mscara DTS
El SIE controla el buffer
La CPU controla el buffer

Estados del dispositivo USB. Para utilizarlos con [byte usb_device_state]:


#define DETACHED_STATE
#define ATTACHED_STATE
#define POWERED_STATE
#define DEFAULT_STATE
#define ADR_PENDING_STATE
#define ADDRESS_STATE
#define CONFIGURED_STATE

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

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.6.3.

Tipos

typedef union _USB_DEVICE_STATUS


Estado del dispositivo
{
byte _byte;
struct
{
unsigned RemoteWakeup:1;
[0]Desactivado [1]Activado: Ver usbdrv.h, usb9.h
unsigned ctrl_trf_mem:1;
[0]RAM [1]ROM
};
} USB_DEVICE_STATUS;

typedef union _BD_STAT


{
byte _byte;
struct{
unsigned BC8:1;
unsigned BC9:1;
unsigned BSTALL:1;
unsigned DTSEN:1;
unsigned INCDIS:1;
unsigned KEN:1;
unsigned DTS:1;
unsigned UOWN:1;
};
struct{
unsigned BC8:1;
unsigned BC9:1;
unsigned PID0:1;
unsigned PID1:1;
unsigned PID2:1;
unsigned PID3:1;
unsigned :1;
unsigned UOWN:1;
};
struct{
unsigned :2;
unsigned PID:4;
unsigned :2;
};
} BD_STAT;

Estado del buffer descriptor

typedef union _BDT


{

Tabla del buffer descriptor

Parada del buffer activa


Dato de sincronizacin activo
Incremento de direccin desactivado
Guardado del buffer descriptor por el SIE activo
Valor del dato de sincronizacin
Propiedad del USB

Paquete de identificacin

419

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

struct
{
BD_STAT Stat;
byte Cnt;
byte ADRL;
byte ADRH;
};
struct
{
unsigned :8;
unsigned :8;
byte* ADR;
};
} BDT;

4.3.6.6.4.

Direccin del buffer baja


Direccin del buffer alta

Direccin del Buffer

Externas

extern byte usb_device_state;


extern USB_DEVICE_STATUS usb_stat;
extern byte usb_active_cfg;
extern byte usb_alt_intf[MAX_NUM_INT];
extern volatile far BDT ep0Bo;
extern volatile far BDT ep0Bi;
extern volatile far BDT ep1Bo;
extern volatile far BDT ep1Bi;
extern volatile far BDT ep2Bo;
extern volatile far BDT ep2Bi;
extern volatile far BDT ep3Bo;
extern volatile far BDT ep3Bi;
extern volatile far BDT ep4Bo;
extern volatile far BDT ep4Bi;
extern volatile far BDT ep5Bo;
extern volatile far BDT ep5Bi;
extern volatile far BDT ep6Bo;
extern volatile far BDT ep6Bi;
extern volatile far BDT ep7Bo;
extern volatile far BDT ep7Bi;
extern volatile far BDT ep8Bo;
extern volatile far BDT ep8Bi;
extern volatile far BDT ep9Bo;
extern volatile far BDT ep9Bi;
extern volatile far BDT ep10Bo;
extern volatile far BDT ep10Bi;
extern volatile far BDT ep11Bo;

Buffer descriptor del Endpoint #0 Out


Buffer descriptor del Endpoint #0 In
Buffer descriptor del Endpoint #1 Out
Buffer descriptor del Endpoint #1 In
Buffer descriptor del Endpoint #2 Out
Buffer descriptor del Endpoint #2 In
Buffer descriptor del Endpoint #3 Out
Buffer descriptor del Endpoint #3 In
Buffer descriptor del Endpoint #4 Out
Buffer descriptor del Endpoint #4 In
Buffer descriptor del Endpoint #5 Out
Buffer descriptor del Endpoint #5 In
Buffer descriptor del Endpoint #6 Out
Buffer descriptor del Endpoint #6 In
Buffer descriptor del Endpoint #7 Out
Buffer descriptor del Endpoint #7 In
Buffer descriptor del Endpoint #8 Out
Buffer descriptor del Endpoint #8 In
Buffer descriptor del Endpoint #9 Out
Buffer descriptor del Endpoint #9 In
Buffer descriptor del Endpoint #10 Out
Buffer descriptor del Endpoint #10 In
Buffer descriptor del Endpoint #11 Out

420

GUILLERMO DAVID HERRERO GONZLEZ

extern volatile far BDT ep11Bi;


extern volatile far BDT ep12Bo;
extern volatile far BDT ep12Bi;
extern volatile far BDT ep13Bo;
extern volatile far BDT ep13Bi;
extern volatile far BDT ep14Bo;
extern volatile far BDT ep14Bi;
extern volatile far BDT ep15Bo;
extern volatile far BDT ep15Bi;

Buffer descriptor del Endpoint #11 In


Buffer descriptor del Endpoint #12 Out
Buffer descriptor del Endpoint #12 In
Buffer descriptor del Endpoint #13 Out
Buffer descriptor del Endpoint #13 In
Buffer descriptor del Endpoint #14 Out
Buffer descriptor del Endpoint #14 In
Buffer descriptor del Endpoint #15 Out
Buffer descriptor del Endpoint #15 In

extern volatile far CTRL_TRF_SETUP SetupPkt;


extern volatile far CTRL_TRF_DATA CtrlTrfData;
#if defined(USB_USE_HID)
Si est definido USB_USE_HID
extern volatile far unsigned char hid_report_out[HID_INT_OUT_EP_SIZE];
extern volatile far unsigned char hid_report_in[HID_INT_IN_EP_SIZE];
#endif

421

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.7.

Usbdrv.h: Driver Del USB

Esta librera es la encargada de definir la configuracin inicial.


Lo nico que hay que modificar es la correccin de la errata en la original de
Microchip, como se comenta ms adelante.

4.3.6.7.1.

Incluye

#include "system\typedefs.h"
#include "system\usb\usb.h"

4.3.6.7.2.

Definiciones

Parmetros de configuracin iniciales:


#define _PPBM0
#define _PPBM1
#define _PPBM2
#define _LS
#define _FS
#define _TRINT
#define _TREXT
#define _PUEN
#define _OEMON
#define _UTEYE

0x00
0x01
0x02
0x00
0x04
0x00
0x08
0x10
0x40
0x80

Buffer Ping-pong Modo 0


Buffer Ping-pong Modo 1
Buffer Ping-pong Modo 2
Modo USB Low-Speed
Modo USB Full-Speed
Transmisor-receptor interno
Transmisor-receptor externo
Usar resistencias pull-up internas
Usar el indicador de salida SIE
Usar el test Patrn de ojo

Parmetros de los Endpoint iniciales:


#define EP_CTRL
#define EP_OUT
#define EP_IN
#define EP_OUT_IN
#define HSHK_EN

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

Definiciones de los Endpoints PICmicro


El
formato
de
la
X:EP3:EP2:EP1:EP0:DIR:PPBI:X

direccin

de

los

EP

PICmicro:

Esto se utiliza cuando se comprueba el valor ledo de la USTAT.


NOTA: estas definiciones no se usan en los descriptores porque tienen distinto
formato. Se definen en : "system\usb\usbdefs\usbdefs_std_dsc.h"

422

GUILLERMO DAVID HERRERO GONZLEZ

#define OUT
#define IN

0
1

#define PIC_EP_NUM_MASK 0b01111000


#define PIC_EP_DIR_MASK 0b00000100

Nmero de mscara del Endpoint


Direccin de la mscara del Endpoint

NOTA: la librera tiene una errata en la definicin de los Endpoints, lo correcto


es:
#define EP00_OUT
#define EP00_IN
#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
#define EP12_OUT
#define EP12_IN
#define EP13_OUT
#define EP13_IN
#define EP14_OUT
#define EP14_IN
#define EP15_OUT
#define EP15_IN

((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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

#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

Guarda slo el bit DTS


Cambia el bit DTS
Cambia la propiedad al SIE

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.8.

Usbctrltrf.h: Control de transferencias del USB

Esta librera es la encargada de definir los tipos de transferencia. Se utiliza desde


otras libreras al declarar la interfaz, la transferecia, etc.
No hay que modificarla

4.3.6.8.1.

Incluye

#include "system\typedefs.h"

4.3.6.8.2.

Definiciones

Estado de las transferencias de control


#define WAIT_SETUP
#define CTRL_TRF_TX
#define CTRL_TRF_RX

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

Definicin de los tipos de respuesta:


#define HOST_TO_DEV
#define DEV_TO_HOST
#define STANDARD
#define CLASS
#define VENDOR
#define RCPT_DEV
#define RCPT_INTF
#define RCPT_EP
#define RCPT_OTH

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

extern byte ctrl_trf_session_owner;


extern POINTER pSrc;
extern POINTER pDst;
extern WORD wCount;

4.3.6.8.4.

Prototipos pblicos

void USBCtrlEPService(void);
void USBCtrlTrfTxService(void);
void USBCtrlTrfRxService(void);
void USBCtrlEPServiceComplete(void);
void USBPrepareForNextSetupTrf(void);

426

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.9.

Usb9.h

Gracias a esta librera obtenemos la direccin del dispositivo, entre otras


caractersticas.
No se tiene que modificar.

4.3.6.9.1.

Incluye

#include "system\typedefs.h"

4.3.6.9.2.

Definiciones

Cdigos de respuesta estndar:


#define GET_STATUS
#define CLR_FEATURE
#define SET_FEATURE
#define SET_ADR
#define GET_DSC
#define SET_DSC
#define GET_CFG
#define SET_CFG
#define GET_INTF
#define SET_INTF
#define SYNCH_FRAME

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

Caractersticas de los selectores estndar:


#define DEVICE_REMOTE_WAKEUP
#define ENDPOINT_HALT

0x01
0x00

Reinicio remoto del dispositivo


Paro del Endpoint

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.3.6.10.

Usbgen.h: USB Genrico

Esta es la librera de la clase genrica. Se definen las transferencias creando


funciones para realizarlas.
No hay que modificarla.

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

extern byte usbgen_rx_len;

4.3.6.10.4.

Prototipos Pblicos

void USBGenInitEP(void);
void USBGenWrite(byte *buffer, byte len);
byte USBGenRead(byte *buffer, byte len);

428

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.11.

Msd.h: Almacenamiento Masivo

Esta es la librera de la clase MSD. Se definen las transferencias creando


funciones para realizarlas.
No hay que modificarla.

4.3.6.11.1.

Incluye

#include "system\typedefs.h"
#include "io_cfg.h"

4.3.6.11.2.

Mapa de pines E/S

Definiciones

Cdigo de la clase de interfaz MSD:


#define MSD_INTF

0x08

Cdigo de la subclase de la interfas de clase MSD:


#define MSD_INTF_SUBCLASS

0x06

Cdigo de protocolo de la clase de la interfaz MSD:


#define MSD_PROTOCOL

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;

Set de commandos de cdigo de la subclase transparente SCSI:


#define INQUIRY
#define READ_FORMAT_CAPACITY
#define READ_CAPACITY
#define READ_10
#define WRITE_10
#define REQUEST_SENSE
#define MODE_SENSE
#define PREVENT_ALLOW_MEDIUM_REMOVAL
#define TEST_UNIT_READY
#define VERIFY

429

0x12
0x23
0x25
0x28
0x2A
0x03
0x1A
0x1E
0x00
0x2F

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

#define STOP_START

0x1B

Varios estados del Firmware de almacenamiento masivo:


#define MSD_WAIT
0
#define MSD_DATA_IN
2
#define MSD_DATA_OUT 3

Esperando para un CBW vlido


Estado de datos IN (Dispositivo-> Host)
Estado de datos OUT (Host -> Device)

#define MSD_CSW_SIZE 0x0d


#define MSD_CBW_SIZE 0x1f

Datos CSW de 10 bytes CSW


Datos CSW de 31 bytes CBW

#define INVALID_CBW
#define VALID_CBW
#define MAX_LUN

1
!INVALID_CBW
0

Clave de los cdigos de error Sense


#define S_NO_SENSE
#define S_RECOVERED_ERROR
#define S_NOT_READY
#define S_MEDIUM_ERROR
#define S_HARDWARE_ERROR
#define S_ILLEGAL_REQUEST
#define S_UNIT_ATTENTION
#define S_DATA_PROTECT
#define S_BLANK_CHECK
#define S_VENDOR_SPECIFIC
#define S_COPY_ABORTED
#define S_ABORTED_COMMAND
#define S_OBSOLETE
#define S_VOLUME_OVERFLOW
#define S_MISCOMPARE

0x0
0x1
0x2
0x3
0X4
0x5
0x6
0x7
0x8
0x9
0xA
0xB
0xC
0xD
0xE

#define S_CURRENT
#define S_DEFERRED

0x70
0x71

Cdigos ASC ASCQ para datos (slo el que vamos a utilizar)


Con una respuesta de clave sense ilegal de un comando no soportado:
#define ASC_INVALID_COMMAND_OPCODE 0x20
#define ASCQ_INVALID_COMMAND_OPCODE 0x00

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

GUILLERMO DAVID HERRERO GONZLEZ

Con una clave sense Not ready


#define ASC_LOGICAL_UNIT_DOES_NOT_RESPOND 0x05
#define ASCQ_LOGICAL_UNIT_DOES_NOT_RESPOND 0x00
#define ASC_MEDIUM_NOT_PRESENT 0x3a
#define ASCQ_MEDIUM_NOT_PRESENT 0x00
#define ASC_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE 0x04
#define ASCQ_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE 0x00
#define ASC_LOGICAL_UNIT_IN_PROCESS 0x04
#define ASCQ_LOGICAL_UNIT_IN_PROCESS 0x01
#define ASC_LOGICAL_UNIT_NOT_READY_INIT_REQD 0x04
#define ASCQ_LOGICAL_UNIT_NOT_READY_INIT_REQD 0x02
#define ASC_LOGICAL_UNIT_NOT_READY_INTERVENTION_REQD 0x04
#define ASCQ_LOGICAL_UNIT_NOT_READY_INTERVENTION_REQD 0x03
#define ASC_LOGICAL_UNIT_NOT_READY_FORMATTING 0x04
#define ASCQ_LOGICAL_UNIT_NOT_READY_FORMATTING 0x04
#define ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21
#define ASCQ_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x00
#define ASC_WRITE_PROTECTED 0x27
#define ASCQ_WRITE_PROTECTED 0x00

(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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

(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

typedef struct _USB_MSD_CBW


{
dword dCBWSignature;
dword dCBWTag;
con el
dword dCBWDataTransferLength;
transferir
byte bCBWFlags;
bits 0
byte bCBWLUN;
una
byte bCBWCBLength;
byte CBWCB[16];
} USB_MSD_CBW;
typedef struct {
escribir 10

31 bytes totales CBW


55 53 42 43h
Enviado por el host, el dispositivo se hace eco
valor en CSW (asociado a CSW con CBW)
Nmero de bytes de datos que el host espera
Flags CBW, bit 7 = 0 salida de datos del hostdispositivo; bit 7=1 dispositivo-host, el resto de
MS1bits son siempre cero, 0 en nuestro caso es
sola unidad lgica
MS3bits son cero
Bloque de comando que ejecuta el dispositivo

/Bloque de comando para leer 10 (0x28) y


(0x2a) comandos

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;

b7-b5 lectura protegida, b4 DPO, b3 FUA,


b2 Reservado, b1 FUA_NV, b0 Obsoleto
b4-b0 es el nmero de grupo el resto reservados

Formato del comando Inquiry


slo b0 enable vital product data

432

GUILLERMO DAVID HERRERO GONZLEZ

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;

Respuesta Sense 0x03

typedef struct {
byte Opcode;
byte DBD;

Modo Sense 0x1A

byte PageCode;
cdigo

Bloque de direccin lgico


Partial medium Indicator slo b0

Actualmente slo se utiliza b3 como bloque


descriptor desactivado
b7,b6 PC=pgina de control, b5-b0 pgina de
Pgina de Control bits 00=> valor actual,
01=>valores modificables,10=>valor por defecto,
11=>valores guardados

byte SubPageCode;
byte AllocationLength;
byte Control;
} ModeSenseCB;
typedef struct {
byte Opcode;
byte Reserved[3];
byte Prevent;
byte Control;
} PreventAllowMediumRemovalCB;

Prevenir el permiso de retirada del medio 0x1E

typedef struct {
byte Opcode;
dword Reserved;
byte Control;
} TestUnitReadyCB;

Unidad de prueba disponible 0x00

typedef struct {
byte Opcode;

Verificar 10 Comando 0x2F

Slo se previenen b1-b0, el resto reservados

433

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

byte VRProtect;
dword LBA;
byte GroupNumber;
word VerificationLength;
byte Control;
} VerifyCB;
typedef struct {
byte Opcode;
byte Immed;
word Reserved;
byte Start;

b7-b5 VRProtect, b4 DPO, b3-b2,Reservado,


b1 BYTCHK, b0 Obsoleto
Nmero del grupo b4-b0, el resto reservado

STOP_START 0x1B

b7-b4 Condicin de energa, b3-b2 reservedo,


b1 LOEJ, b0 Start

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;

Clasificador del perifrico:3;


Perifrico_DevType:5;
medio removible bit7 = 0 medio no removible,
resto reservado
versin
b7,b6 Obsoleto, b5 Acceso de control
coordinado,
b4 direccionamiento jerrquico soportado
b3:0 respuesta al formato de datos 2 indica que la
respuesta esta en el formato definido por spec
longitud en bytes de los datos que quedan de la
indagacin estndar
b7 SCCS, b6 ACC, b5-b4 TGPS, b3 3PC,
b2-b1 Reservado, b0 Protegido
b7 bque, b6- EncServ, b5-VS, b4-MultiP,
b3-MChngr, b2-b1 Obsoleto, b0-Addr16
b7-b6 Obsoleto, b5-WBUS, b4-Sync, b3-Linked,

434

GUILLERMO DAVID HERRERO GONZLEZ

b2 Obsoleto, b1 Cmdque, b0-VS


char vendorID[8];
char productID[16];
char productRev[4];
} InquiryResponse;
typedef struct {
byte ModeDataLen;
byte MediumType;
unsigned Resv:4;
unsigned DPOFUA:1;
unsigned notused:2;
unsigned WP:1;
byte BlockDscLen;
} tModeParamHdr;

0 indica que no soporta los bits DPO y FUA


0 indica que no protege la escritura
Longitud del Bloque Descriptor

Modo corto del bloque descriptor LBA (ver Pgina 1009, SBC-2)
typedef struct {
byte NumBlocks[4];
byte Resv;
byte BlockLen[3];
} tBlockDescriptor;

reservado

/* Page_0 mode page format */


typedef struct {
unsigned PageCode:6;
unsigned SPF:1;
unsigned PS:1;
byte PageLength;
byte ModeParam[];
} tModePage;

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Formato fijado si el bit Desc de la respuesta sense CBW es 0


typedef union {
struct
{
byte _byte[18];
};
struct {
unsigned ResponseCode:7;
unsigned VALID:1;
byte Obsolete;
unsigned SenseKey:4;
unsigned Resv:1;
unsigned ILI:1;
unsigned EOM:1;
unsigned FILEMARK:1;
DWORD Information;
byte AddSenseLen;
DWORD CmdSpecificInfo;
byte ASC;
byte ASCQ;
byte FRUC;
byte SenseKeySpecific[3];

b6-b0 es el cdigo de respuesta fijado o el


formato
del descriptor
Poner a 1 indica que el campo de informacin
tiene un valor vlido
Referencia SPC-3 Seccin 4.5.6
Indicador de la longitud incorrecta
Fin del medio
para los comandos READ y SPACE
Tipo de dispositivo o comando especfico
(SPC-33.1.18)
Nmero de bytes sense adicionales que
siguen <=244
depende del comando de la excepcin ocurrida
cdigo sense adicional
cdigo sense adicional seccin clasificada
4.5.2.1 SPC-3
SKSV son los msb de la clave sense especfica de
campo vlido fijado=>SKS vlido.
Los 18-n bytes
sense adicionales se pueden definir ms tarde

18bytes
de respuesta sense de formato fijado
};
} RequestSenseResponse;

4.3.6.11.4.

Externas

extern CSD gblCSDReg;

4.3.6.11.5.

declarado en sdcard.c

Prototipos pblicos

void USBCheckMSDRequest(void);
void ProcessIO(void);
void SDCardInit(void);
void MSDInitEP(void);

436

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.12.

Cdc.h: Dispositivos De Comunicacin

Esta es la librera de la clase CDC. Se definen las transferencias creando


funciones para realizarlas.
No hay que modificarla.

4.3.6.12.1.

Incluye

#include "system\typedefs.h"

4.3.6.12.2.

Definiciones

Repuesta de clase especfica:


#define SEND_ENCAPSULATED_COMMAND
#define GET_ENCAPSULATED_RESPONSE
#define SET_COMM_FEATURE
#define GET_COMM_FEATURE
#define CLEAR_COMM_FEATURE
#define SET_LINE_CODING
#define GET_LINE_CODING
#define SET_CONTROL_LINE_STATE
#define SEND_BREAK

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

Cdigo de la clase del dispositivo:


#define CDC_DEVICE

0x02

Cdigo de la clase de la interfaz de comunicacin


#define COMM_INTF

0x02

Cdigo de la subclase de la interfaz de comunicacin


#define ABSTRACT_CONTROL_MODEL

0x02

Cdigo del protocolo de control de la clase de la interfaz de comunicacin


#define V25TER

0x01

Comandos comunes AT ("Hayes(TM)")

Cdigo de la clase de la interfaz de datos


#define DATA_INTF

0x0A

437

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Cdigo del protocolo de la clase de la interfaz de datos


#define NO_PROTOCOL

0x00

No necesita un protrocolo de clase especfico

Cdigo selector de las caractersticas de la comunicacin


#define ABSTRACT_STATE
#define COUNTRY_SETTING

0x01
0x02

Descriptores funcionales
Tipos de valor del campo bDscType
#define CS_INTERFACE
#define CS_ENDPOINT

0x24
0x25

bDscSubType en descriptores funcionales


#define DSC_FN_HEADER
#define DSC_FN_CALL_MGT
#define DSC_FN_ACM

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

ACM Administracin de control


abstracta
DLM Direccin de lnea directa

Estados de tranferencia CDC Bulk IN


#define CDC_TX_READY
#define CDC_TX_BUSY
#define CDC_TX_BUSY_ZLP
#define CDC_TX_COMPLETING

0
1
2
3

ZLP: Paquete de longitud cero

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

GUILLERMO DAVID HERRERO GONZLEZ

(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

void mUSBUSARTTxRam(byte *pData, byte len)


Precondicin: cdc_trf_state tiene que estar en el estado CDC_TX_READY.
El valor de len tiene que se igual o menor de 255bytes.
Entrada: pDdata: Puntero al comienzo de la localizacin de los bytes de datos.
len: nmero de bytes que se van a transferir.
Esta macro se utiliza para transferir datos localizados en la memoria de datos.
Utilizar esta macro cuando:
1. La longitud de la transferencia se conoce
2. Los datos no terminan con uno nulo
Nota: Esta macro slo manipula la transferencia setup. La transferencia actual la
manipula CDCTxService().
#define mUSBUSARTTxRam(pData,len)
{
pCDCSrc.bRam = pData;
cdc_tx_len = len;
cdc_mem_type = _RAM;
cdc_trf_state = CDC_TX_BUSY;
}

439

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

void mUSBUSARTTxRom(rom byte *pData, byte len)


Precondicin: cdc_trf_state tiene que estar en el estado CDC_TX_READY.
El valor de len tiene que se igual o menor de 255bytes.
Entrada: pDdata: Puntero al comienzo de la localizacin de los bytes de datos.
len: nmero de bytes que se van a transferir.
Esta macro se utiliza para transferir datos localizados en la memoria de
programa.
Utilizar esta macro cuando:
3. La longitud de la transferencia se conoce
4. Los datos no terminan con uno nulo
Nota: Esta macro slo manipula la transferencia setup. La transferencia actual la
manipula CDCTxService().
#define mUSBUSARTTxRom(pData,len)
{
pCDCSrc.bRom = pData;
cdc_tx_len = len;
cdc_mem_type = _ROM;
cdc_trf_state = CDC_TX_BUSY;
}

4.3.6.12.3.

Estructuras

Estructura de la lnea de codificacin


#define LINE_CODING_LENGTH
typedef union _LINE_CODING
{
struct
{
byte _byte[LINE_CODING_LENGTH];
};
struct
{
DWORD
byte
byte
byte
};
} LINE_CODING;

0x07

dwDTERate; Estructura de datos compleja


bCharFormat;
bParityType;
bDataBits;

440

GUILLERMO DAVID HERRERO GONZLEZ

typedef union _CONTROL_SIGNAL_BITMAP


{
byte _byte;
struct
{
unsigned DTE_PRESENT;
[0] No Presente [1] Presente
unsigned CARRIER_CONTROL;
[0] Desactiva [1] Activa
};
} CONTROL_SIGNAL_BITMAP;

Descriptor de cabecera funcional


typedef struct _USB_CDC_HEADER_FN_DSC
{
byte bFNLength;
byte bDscType;
byte bDscSubType;
word bcdCDC;
} USB_CDC_HEADER_FN_DSC;

Descriptor funcional de direccin de control abstracto


typedef struct _USB_CDC_ACM_FN_DSC
{
byte bFNLength;
byte bDscType;
byte bDscSubType;
byte bmCapabilities;
} USB_CDC_ACM_FN_DSC;

Descriptor funcional de unin


typedef struct _USB_CDC_UNION_FN_DSC
{
byte bFNLength;
byte bDscType;
byte bDscSubType;
byte bMasterIntf;
byte bSaveIntf0;
} USB_CDC_UNION_FN_DSC;

Descriptor funcional de control de llamadas


typedef struct _USB_CDC_CALL_MGT_FN_DSC
{
byte bFNLength;
byte bDscType;
byte bDscSubType;
byte bmCapabilities;

441

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

byte bDataInterface;
} USB_CDC_CALL_MGT_FN_DSC;

4.3.6.12.4.

Externas

extern byte cdc_rx_len;


extern byte cdc_trf_state;
extern POINTER pCDCSrc;
extern byte cdc_tx_len;
extern byte cdc_mem_type;

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

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.13.

Hid.h: Dispositivo interfaz con humanos

Esta es la librera de la clase HID. Se definen las transferencias creando


funciones para realizarlas.
No hay que modificarla.

4.3.6.13.1.

Incluye

#include "system\typedefs.h"

4.3.6.13.2.

Definiciones

Repuestas de clase especficas:


#define GET_REPORT
#define GET_IDLE
#define GET_PROTOCOL
#define SET_REPORT
#define SET_IDLE
#define SET_PROTOCOL

0x01
0x02
0x03
0x09
0x0A
0x0B

Obtener informe
Obtener reposo
Obtener protocolo
Fijar informe
Fijar reposo
Fijar protocolo

Tipos de clase de descriptor:


#define DSC_HID
#define DSC_RPT
#define DSC_PHY

0x21
0x22
0x23

Descriptor HID
Descriptor informe

0x00
0x01

Protocolo de inicio
Informe de protocolo

Seleccin de protocolo:
#define BOOT_PROTOCOL
#define RPT_PROTOCOL

Cdigo de clase de interfaz HID:


#define HID_INTF

0x03

Interfaz HID

Cdigo de subclase de interfaz HID:


#define BOOT_INTF_SUBCLASS 0x01

Cdigo de protocolo de clase de interfaz:


#define HID_PROTOCOL_NONE
#define HID_PROTOCOL_KEYBOAD
#define HID_PROTOCOL_MOUSE

0x00
0x01
0x02

443

Ninguno
Teclado
Ratn

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

(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

typedef struct _USB_HID_DSC_HEADER


Cabecera del descriptor HID
{
byte bDscType;
Tipo de descriptor
word wDscLength;
Longitud del descriptor
} USB_HID_DSC_HEADER;
typedef struct _USB_HID_DSC
Descriptor HID
{
Longitud
Tipo de descriptor
Bcd del HID
byte bLength;
byte bDscType;
word bcdHID;
Cdigo de territorio
Nmero del descriptor
byte bCountryCode;
byte bNumDsc;
USB_HID_DSC_HEADER
hid_dsc_header[HID_NUM_OF_DSC];
HID_NUM_OF_DSC se define en autofiles\usbcfg.h
} USB_HID_DSC;

4.3.6.13.4.

Externas

extern byte hid_rpt_rx_len;

444

GUILLERMO DAVID HERRERO GONZLEZ

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

En esta librera se definen los puertos utilizados en la aplicacin USB.


Si no se desea incluir hay que definir el apartado del USB ya que si no, la
compilacin dara un error al no definir los puertos Bus Sense y Power Sense.

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

Interfaz del transmisor externo


#define tris_usb_vpo
#define tris_usb_vmo
#define tris_usb_rcv
#define tris_usb_vp
#define tris_usb_vm
#define tris_usb_oe

TRISBbits.TRISB3
TRISBbits.TRISB2
TRISAbits.TRISA4
TRISCbits.TRISC5
TRISCbits.TRISC4
TRISCbits.TRISC1

445

Salida
Salida
Entrada
Entrada
Entrada
Salida

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

#define tris_usb_suspnd

4.3.6.14.4.

LATD &= 0xF0; TRISD &= 0xF0;


LATDbits.LATD0
LATDbits.LATD1
LATDbits.LATD2
LATDbits.LATD3
mLED_1 = 1;
mLED_2 = 1;
mLED_3 = 1;
mLED_4 = 1;
mLED_1 = 0;
mLED_2 = 0;
mLED_3 = 0;
mLED_4 = 0;
mLED_1 = !mLED_1;
mLED_2 = !mLED_2;
mLED_3 = !mLED_3;
mLED_4 = !mLED_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.

SPI: Lneas de Chip Select

#define tris_cs_temp_sensor TRISBbits.TRISB2


#define cs_temp_sensor
LATBbits.LATB2
#define tris_cs_sdmmc
TRISBbits.TRISB3
#define cs_sdmmc
LATBbits.LATB3

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

GUILLERMO DAVID HERRERO GONZLEZ

4.3.6.15.

interrupt.h

En esta librera se incluye todo lo referente a las interrupciones. El usuario la


modificar dependiendo de la aplicacin.

4.3.6.15.1.

Incluye

#include "system\typedefs.h"

4.3.6.15.2.

Definiciones

#define mEnableInterrupt() INTCONbits.GIE = 1;

4.3.6.15.3.

Prototipos

void low_isr(void);
void high_isr(void);

447

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Validacin del USB

#if

(EP0_BUFF_SIZE != 8) && (EP0_BUFF_SIZE != 16) &&


(EP0_BUFF_SIZE != 32) && (EP0_BUFF_SIZE != 64)
#error(Tamao del buffer del Endpoint 0 incorrecto, comprueba "autofiles\usbcfg.h")
#endif
#if defined(HID_INT_OUT_EP_SIZE)
#if (HID_INT_OUT_EP_SIZE > 64)
#error(El tamao del Endpoint de salida de HID no puede ser mayor de 64,
comprueba
"autofiles\usbcfg.h")
#endif
#endif
#ifdef HID_INT_IN_EP_SIZE
#if (HID_INT_IN_EP_SIZE > 64)
#error(El tamao del Endpoint de entrada de HID no puede ser mayor de 64,
comprueba
"autofiles\usbcfg.h")
#endif
#endif

4.3.7.

LIBRERAS DEL MICROPROCESADOR

Al instalar el compilador MPLAB C18 se crea una carpeta llamada lkr, en la


cual hay unos archivos que se pueden aadir al proyecto.
Estos archivos definen todos los puertos, registros, bits del microprocesador
que utilicemos en el proyecto.
Es recomendable aadir este archivo ya que todas las libreras trabajan con las
definiciones hechas en l.

448

GUILLERMO DAVID HERRERO GONZLEZ

4.4.

MACROS DEL COMPILADOR C18

Una macro es un conjunto de funciones declaradas en un programa. Se declaran


por ser funciones muy utilizadas para ahorrar tiempo al programar.
Para poder trabajar con las funciones definidas en las macros, hay que definir las
libreras. En stas hay un apartado llamado prototipos pblicos en los que se declara la
macro como funcin.
Las macros que no aparecen en el apartado de prototipos pblicos, son funciones
internas que no se pueden llamar desde otro archivo.
En este punto se comentan las macros de Microchip relativas al puerto USB.
Como en las libreras, aparecen en rojo los datos que hay que modificar en cada
aplicacin, en azul los referentes a la clase y en verde todo el cdigo fuente.

4.4.1.

USBDRV.C: DRIVERS USB

En este archive el fabricante ha creado el cdigo relativo a la comunicacin


inicial. En el cual se declaran los estados del USB, los comprueba y determina en cual
est la aplicacin.

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.

Se necesita para USBCheckBusStatus()

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.1.4.1.

void USBCheckBusStatus(void)

Esta rutina activa/desactiva el mdulo USB comprobado la seal de energa.


void USBCheckBusStatus(void)
{

Deteccin de la conexin/desconexin del bus


usb_bus_sense es un puerto de E/S definido en io_cfg.h
#define USB_BUS_ATTACHED
#define USB_BUS_DETACHED

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...)

Est el USB conectado?


Est el mdulo apagado?
Est apagado, actvalo

Est el mdulo encendido?


Est encendido, desactvalo

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

Borra todas las interrupciones del USB


Enmascara todas las interrupciones del
Desenmascara la interrupcin RESET
Desenmascara la interrupcin IDLE
Lo dems espera hasta que SE0 est

GUILLERMO DAVID HERRERO GONZLEZ

4.4.1.4.2.

void USBModuleEnable(void)

Esta rutina activa el mdulo USB.


Slo se puede llamar esta rutina desde USBCheckBusStatus().
void USBModuleEnable(void)
{
UCON = 0;
UIE = 0;
UCONbits.USBEN = 1;
usb_device_state = ATTACHED_STATE;
} end USBModuleEnable

4.4.1.4.3.

Enmascara todas las interrupciones USB


Activa el modulo y une el bus
Definido en usbmmap.c y .h

void USBModuleDisable(void)

Esta rutina desactiva el modulo USB.


Slo se puede llamar esta rutina desde USBCheckBusStatus().
void USBModuleDisable(void)
{
UCON = 0;
bus
UIE = 0;
usb_device_state = DETACHED_STATE;
} end USBModuleDisable

4.4.1.4.4.

Desactiva el modulo y desconecta del


Enmascara todas las interrupciones USB
Definido en usbmmap.c y .h

void USBSoftDetach(void)

Efectos secundarios: El dispositivo se tiene que reenumerar.


USBSoftDetach desconecta elctricamente el dispositivo del bus. Se utiliza para
dejar de suministrar tensin VUSB a las resistencias pull-up. Las resistencias pull-down
en el lado del host pondrn las seales diferenciales en bajo y el host registrar el evento
como una desconexin.
Como el cable USB no se desconecta fsicamente, la energa suministrada a
travs de l la puede detectar el dispositivo. Cuando se llame la funcin
USBCheckBusStatus(), se reconectar el dispositivo al bus.
void USBSoftDetach(void)
{
USBModuleDisable();
} end USBSoftDetach

451

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.1.4.5.

void USBDriverService(void)

Esta rutina es el corazn del firmware. Controla las interrupciones USB.


Nota: Las transiciones de estado del dispositivo son las siguientes:
Desconectado->Conectado->Alimentado->Por defecto->Pendiente de direccin> ->Direccionado->Configurado->Listo
void USBDriverService(void)
{
Punto para continuar dando servicio si el cable del USB no est unido.
if(usb_device_state == DETACHED_STATE) return;

Tarea A: Servicio de la interrupcin de actividad


if(UIRbits.ACTVIF && UIEbits.ACTVIE)
USBWakeFromSuspend();
Punto para continuar dando servicio si el dispositivo est en modo suspendido.
if(UCONbits.SUSPND==1)
return;

Tarea B: Servicio de la Interrupcin Reset del Bus.


Cuando se recibe un reset del bus durante el modo suspendido, lo primero hay
que activar ACTVIF, una vez que UCONbits.SUSPND est borrado, entonces el bit
URSTIF se reafirmar. Esto es porque URSTIF se chequea despus de ACTVIF.
El flag de reset USB se enmascara cuando el USB est en estado desconectado o
conectado, por lo que no se puede provocar un estado de reset del USB en estos dos
estados.
if(UIRbits.URSTIF && UIEbits.URSTIE)

USBProtocolResetHandler();

Tarea C: Servicio de otras interrupciones.


if(UIRbits.IDLEIF && UIEbits.IDLEIE)
USBSuspend();
if(UIRbits.SOFIF && UIEbits.SOFIE)
USB_SOF_Handler();
if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler();
if(UIRbits.UERRIF && UIEbits.UERRIE)
USBErrorHandler();
Punto para continuar dando servicio si el bus no ha enviado un reset del bus.
Al recibir el reset del bus, el dispositivo cambia al estado por defecto y est listo para
comunicarse.
if(usb_device_state < DEFAULT_STATE)
return;

Tarea D: Servicio de una interrupcin de transaccin completa


if(UIRbits.TRNIF && UIEbits.TRNIE)
{
USBCtrlEPService slo maneja las transacciones del EP0, ignora todas las
transacciones de los otros EP.
USBCtrlEPService();
Los dems Endpoint se pueden determinar despus respondiendo a la clase del
firmware. Cada driver del dispositivo sabe cuando una transaccin OUT o IN est disponible
comprobando el bit de propiedad del buffer.
Un EP OUT lo debe controlar siempre el SIE hasta que el dato est disponible.
Un EP IN lo debe controlar siempre la CPU hasta que el dato est disponible.

452

GUILLERMO DAVID HERRERO GONZLEZ

Por esta lgica, no es necesario guardar el valor de USTAT de una transaccin de un


Endpoint distinto del 0 (non-EP0).
UIRbits.TRNIF = 0;
} end if(UIRbits.TRNIF && UIEbits.TRNIE)
} end USBDriverService

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Periodo seal RESUME (ms)


1,05
12,6

Estos tiempos pueden ser distintos si se utiliza la optimizacin o el cdigo de


instrucciones entendido o cuando se tiene otra interrupcin activa. Asegurarse usando
del Stopwatch del MPLAB SIM.
void USBRemoteWakeup(void)
{
static word delay_count;
if(usb_stat.RemoteWakeup == 1)
funcin
{
USBWakeFromSuspend();
UCONbits.RESUME = 1;

Comprueba si el host a activado la


reinicio remoto
Reinicio del modo suspendido
Comienzo de la seal RESUME

/* Seccin modificable */

/* Final de la seccin modificable */


UCONbits.RESUME = 0;
} endif
} end USBRemoteWakeup

454

GUILLERMO DAVID HERRERO GONZLEZ

4.4.1.4.9.

void USB_SOF_Handler(void)

El host enva un paquete SOF a los dispositivos cada milisegundo. Esta


interrupcin puede ser til en las pipes sncronas. Los diseadores pueden implementar
una rutina de realimentacin como necesite.
void USB_SOF_Handler(void)
{ /* Rutina de realimentacin aqu */
UIRbits.SOFIF = 0;
} end USB_SOF_Handler

4.4.1.4.10.

void USBStallHandler(void)

Precondicin: El SIE tiene que haber mandado un paquete STALL al host.


El STALLIF se active cada vez que el SIE enva un paquete STALL siempre
que un Endpoint lo provoque. Una transaccin Setup invalida la funcin STALL. Un
Endpoint paralizado para el STALL cuando recibe un paquete setup. En este caso, el
SIE aceptar el paquete Setup y activa la bandera TRNIF para informar el firmware.
Una funcin STALL a un pipe Endpoint particular se desactivar automticamente
(direccin especfica).
Hay varios motivos para que un Endpoint se paralice:
1. Cuando se recibe una repuesta no soportada por el USB.
Ejemplo: GET_DESCRIPTOR(DEVICE_QUALIFIER)
2. Cuando un Endpoint est actualmente parado
3. Cuando la clase del dispositivo especifica que Endpoint tiene que
paralizarse en repuesta a un evento especfico.
Ejemplo: Clase de dispositivo de almacenamiento masivo
Si el CBW no es vlido, el dispositivo parar la pipe Bulk de
entrada.
Nota: UEPn.EPSTALL tiene que escanear que Endpoint provoca el evento
STALL.
void USBStallHandler(void)
{
Todos los buffer descriptores del Endpoint 0 los controla el SIE, pero al recibir una
transaccin Setup, la CPU gobierna el EP0_OUT forzndolo por firmware.
if(UEP0bits.EPSTALL == 1)
{
USBPrepareForNextSetupTrf();
UEP0bits.EPSTALL = 0;
}
UIRbits.STALLIF = 0;
} end USBStallHandler

455

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.1.4.11.

void USBErrorHandler(void)

El propsito de esta interrupcin es slo por depuracin durante el desarrollo.


Chequea UEIR para ver error ha causado la interrupcin.
void USBErrorHandler(void)
{
UIRbits.UERRIF = 0;
} end USBErrorHandler

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

GUILLERMO DAVID HERRERO GONZLEZ

4.4.1.5.

Funcin auxiliar

void ClearArray(byte* startAdr,byte count)


{
*startAdr;
while(count)
{
_asm
clrf POSTINC0,0
_endasm
count--;
} end while
} end ClearArray

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.

Requerido para el estado auto-alimentado

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

usb_device_state = ADR_PENDING_STATE; Actualizacin de estado


Ver USBCtrlTrfInHandler() en usbctrltrf.c para el prximo paso
break;
case GET_DSC:
ctrl_trf_session_owner = MUID_USB9;
if(SetupPkt.bDscType == DSC_DEV)
{
pSrc.bRom = (rom byte*)&device_dsc;
wCount._word = sizeof(device_dsc);
Activa la cuenta de datos
}
else if(SetupPkt.bDscType == DSC_CFG)
{
pSrc.bRom = (rom byte*)&cfg01;
wCount._word = sizeof(cfg01);
Activa la cuenta de datos
}
else if(SetupPkt.bDscType == DSC_STR)
{
pSrc.bRom = (rom byte*)&sd000;
wCount._word = sizeof(sd000);
Activa la cuenta de datos
}
else
Esto se necesita para parar la respuesta DEVICE_QUALIFIER
ctrl_trf_session_owner = MUID_NULL;
usb_stat.ctrl_trf_mem = _ROM;
Fija el tipo de memoria
break;
case SET_CFG:
USBStdSetCfgHandler();
break;
case GET_CFG:
ctrl_trf_session_owner = MUID_USB9;
pSrc.bRam = (byte*)&usb_active_cfg;
Fija la fuente
usb_stat.ctrl_trf_mem = _RAM;
Fija el tipo de memoria
LSB(wCount) = 1;
Activa la cuenta de datos
break;
case GET_STATUS:
USBStdGetStatusHandler();
break;
case CLR_FEATURE:
case SET_FEATURE:
USBStdFeatureReqHandler();
break;
case GET_INTF:
ctrl_trf_session_owner = MUID_USB9;
pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID;
Fija la fuente
usb_stat.ctrl_trf_mem = _RAM;
Fija el tipo de memoria
LSB(wCount) = 1;
Activa la cuenta de datos
break;
case SET_INTF:

458

GUILLERMO DAVID HERRERO GONZLEZ

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)

Esta rutina une la respuesta estndar GET_DESCRIPTOR. Utiliza tablas


dinmicamente buscando el tamao del descriptor. Esta rutina no se debe modificar si
las tablas usbdsc.c en estn declaradas correctamente.
void USBStdGetDscHandler(void)
{
if(SetupPkt.bmRequestType == 0x80)
{
switch(SetupPkt.bDscType)
{
case DSC_DEV:
ctrl_trf_session_owner = MUID_USB9;
pSrc.bRom = (rom byte*)&device_dsc;
wCount._word = sizeof(device_dsc);
Activa la cuenta de datos
break;
case DSC_CFG:
ctrl_trf_session_owner = MUID_USB9;
pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex);
wCount._word = *(pSrc.wRom+1);
Activa la cuenta de datos
break;
case DSC_STR:
ctrl_trf_session_owner = MUID_USB9;
pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex);
wCount._word = *pSrc.bRom;
Activa la cuenta de datos
break;
}
end switch

}
}

usb_stat.ctrl_trf_mem = _ROM;
end if
end USBStdGetDscHandler

Fija el tipo de memoria

459

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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)

Esta rutina une la respuesta estndar GET_STATUS.


void USBStdGetStatusHandler(void)
{
CtrlTrfData._byte0 = 0;
CtrlTrfData._byte1 = 0;

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;

usb_stat definido en usbmmap.c


Activa bit1

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

GUILLERMO DAVID HERRERO GONZLEZ

if(*pDst.bRam & _BSTALL)


CtrlTrfData._byte0=0x01;
}

Usar _BSTALL como mscara de bit


Activa bit0

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)

Esta rutina une las repuestas estndar SET y CLEAR FEATURES.


void USBStdFeatureReqHandler(void)
{
if((SetupPkt.bFeature==DEVICE_REMOTE_WAKEUP)&&(SetupPkt.Recipient==RCPT_DE
V))
{
ctrl_trf_session_owner = MUID_USB9;
if(SetupPkt.bRequest == SET_FEATURE)
usb_stat.RemoteWakeup = 1;
else
usb_stat.RemoteWakeup = 0;
}
end if
if((SetupPkt.bFeature==ENDPOINT_HALT)&&(SetupPkt.Recipient==RCPT_EP)&&
(SetupPkt.EPNum!=0))
{
ctrl_trf_session_owner = MUID_USB9;
Se tiene que calcular la direccin en este punto
pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4);
if(SetupPkt.bRequest == SET_FEATURE)
*pDst.bRam = _USIE|_BSTALL;
else
{
if(SetupPkt.EPDir == 1) // IN
*pDst.bRam = _UCPU;
else
*pDst.bRam = _USIE|_DAT0|_DTSEN;
} end if
}
end if
} end USBStdFeatureReqHandler

461

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Estado de la transferencia de control


Controlador de la sesin de transferencia actual
Puntero a la fuente de datos
Puntero al destino de los datos
Contador de datos

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)

Precondicin: USTAT est cargada con una direccin de Endpoint vlida.


USBCtrlEPService chequea tres tipos de transacciones que conoce como
tratarlas y lo hace:
1. EP0 SETUP
2. EP0 OUT
3. EP0 IN
Ignora los dems tipos.
void USBCtrlEPService(void)
{
if(USTAT == EP00_OUT)
{
if(ep0Bo.Stat.PID == SETUP_TOKEN)
USBCtrlTrfSetupHandler();
else
USBCtrlTrfOutHandler();
}

EP0 SETUP
EP0 OUT

462

GUILLERMO DAVID HERRERO GONZLEZ

else if(USTAT == EP00_IN)


USBCtrlTrfInHandler();
} end USBCtrlEPService

4.4.3.4.2.

EP0 IN

void USBCtrlTrfSetupHandler(void)

Precondicin: El buffer SetupPkt est cargado con un dato vlido de Setup.


Esta rutina es una tarea para despachar y tiene tres estados.
1. Inicializa la transferencia de control de estados mquina.
2. Llama cada vez al mdulo que sabe como servir la respuesta Setup del
host. Ejemplo de mdulo: USB9, HID, CDC, MSD, Se aade una
nueva clase, la tabla ClassReqHandler en usbdsc.c se tiene que actualizar
para llamar todas las clases de unin disponibles.
3. Una vez que el mdulo se arriesga a chequear si el responsable de servir
la respuesta, en el estado 3 chequea la direccin de la transferencia para
determinar como preparar el EP0 para la transferencia de control.
Nota: El firmware del USB de Microchip tiene tres estados distintos para el
control de los estados mquina:
1. WAIT_SETUP
2. CTRL_TRF_TX
3. CTRL_TRF_RX
Mirar en el manual del firmware como cambia de un estado a otro.
Una transferencia de control se compone de varias transacciones USB. Cuando
se transfieren datos con muchas transacciones, es importante guardar los datos fuente,
datos destino y cuenta de datos. Estos tres parmetros se guardan en pSrc, pDst y
wCount. Un flag se utiliza para ver si la fuente de los datos es de la RAM o de la ROM.

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;

Fijar el dueo a NULL

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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)

Esta rutina une una transaccin IN de acuerdo con el estado de la transferencia


de control que est actualmente activa.
Nota: Si se fija la direccin de respuesta no modificar la actual hasta que se
complete la transferencia de control. El final de la transferencia de control para una
repuesta de cambio de direccin es una transaccin IN. Por lo tanto se necesita para
servir esta situacin cuando la condicin es correcta. La macro
mUSBCheckAdrPendingState se define en usb9.h y est diseada para servir este
evento.
void USBCtrlTrfInHandler(void)
{
mUSBCheckAdrPendingState();

Se tiene que comprobar si est en ADR_PENDING_STATE

if(ctrl_trf_state == CTRL_TRF_TX)
{
USBCtrlTrfTxService();
if(ep0Bi.Stat.DTS == 0)

464

GUILLERMO DAVID HERRERO GONZLEZ

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)

Precondicin: pSrc, wCount, y usb_stat.ctrl_trf_mem estn configurados


correctamente.
Hay
que
llamar
esta
rutina
en
dos
casos.
Uno
desde
USBCtrlEPServiceComplete() y otro desde USBCtrlTrfInHandler(). Hay que tener
cuidado con el control de una transferencia sobre mltiples transacciones USB.
Nota: Esta rutina trabaja con Endpoints sncronos mayores que 256bytes y aqu
se muestra un ejemplo de cmo tratar BC9 y BC8. En realidad, un Endpoint de control
no puede ser mayor de 64bytes.
void USBCtrlTrfTxService(void)
{
byte byte_to_send;
Primero, hay que calcular cuantos bytes de datos se envan.
if(wCount._word < EP0_BUFF_SIZE)
byte_to_send = wCount._word;
else
byte_to_send = EP0_BUFF_SIZE;
ep0Bi.Cnt = byte_to_send;
Resta el nmero de bytes enviados a los del total.
wCount._word -= byte_to_send;
pDst.bRam = (byte*)&CtrlTrfData;
Fija el puntero destino
while(byte_to_send)
{
if(usb_stat.ctrl_trf_mem == _ROM)
{
*pDst.bRam = *pSrc.bRom;
pSrc.bRom++;
}
else
{
*pDst.bRam = *pSrc.bRam;
pSrc.bRam++;
}//end if else
pDst.bRam++;
byte_to_send--;

465

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

} end while
} end USBCtrlTrfTxService

4.4.3.4.7.

void USBCtrlTrfRxService(void)

Precondiciones: pDst y wCount tienen que estar configurados correctamente.


pSrc siempre es &CtrlTrfData y usb_stat.ctrl_trf_mem es _RAM. wCount tiene que
estar configurado como 0 al principio de cada transferencia de control.
Esta rutina no est completada. Comprueba una nueva versin del firmware.
void USBCtrlTrfRxService(void)
{
byte byte_to_read;
byte_to_read = ep0Bo.Cnt;
Acumula el nmero total de bytes ledos
wCount._word = wCount._word + byte_to_read;
pSrc.bRam = (byte*)&CtrlTrfData;
while(byte_to_read)
{
*pDst.bRam = *pSrc.bRam;
pDst.bRam++;
pSrc.bRam++;
byte_to_read--;
} end while(byte_to_read)
} end USBCtrlTrfRxService

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

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

EP0 IN buffer inicializacin

dsc,

ver

GUILLERMO DAVID HERRERO GONZLEZ

4.4.4.

USBDSC.C: DESCRIPTORES USB

Este archivo contiene la informacin de los descriptores USB. Se utiliza junto al


archivo usbdsc.h. Cuando se aade o remueve un descriptor del men de configuracin
de los descriptores, ej. CFG01, el usuario debe cambiar la estructura del descriptor
definida en el archivo usbdsc.h. La estructura se utiliza para calcular el tamao del
descriptor, ej. sizeof(CFG01).
Una configuracin tpica de los descriptores consiste en:
La mnima configuracin del descriptor (USB_CFG_DSC)
Uno o ms descriptores de interfaz (USB_INTF_DSC)
Uno o ms descriptores de Endpoint (USB_EP_DSC)
Nombres convenidos:
Tipo USB_CFG_DSC se nombra cdxx, donde xx es el nmero de
configuracin. Este nmero debera ser el mismo que el valor del ndice
actual de esta configuracin.
Tipo USB_INTF_DSC se nombra i<yy>a<zz>, donde yy es el nmero
de la interfaz y zz es el nmero de la interfaz alterna.
Tipo USB_EP_DSC se nombra ep<##><d>_i<yy>a<zz>, donde ## es el
nmero del Endpoint y d es la direccin de transferencia.
El nombre de la interfaz se tiene que listar como un sufijo para identificar que
interfaz pertenece al Endpoint.
Ejemplo:
Si un dispositivo tiene una configuracin, dos interfaces, la interfaz 0 tiene dos
Endpoints (IN y OUT), y la interfaz 1 tiene un Endpoint (IN). Entonces la estructura en
usbdsc.h tiene que ser:
#define CFG01 rom struct
{

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

Ver que la jerarqua de los descriptores sigue a las especificaciones de necesidad


del USB. Todos los Endpoint que pertenecen a una interfaz se tienen que listar
inmediatamente despus que la interfaz.

469

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Rellenar los valores del descriptor en el archivo usbdsc.c:


[Descriptor de Configuration (USB_CFG_DSC)]
El atributo de configuracin tiene que tener la definicin _DEFAULT como
mnimo. Se pueden aadir opciones adicionales al tributo _DEFAULT. Las opciones
disponibles son _SELF y _RWU.
Estas definiciones se encuentran en el archivo usbdefs_std_dsc.h. El _SELF dice
al host del USB que este dispositivo es autoalimentado. El _RWU dice al host del USB
que el dispositivo soporta el reinicios remoto.
[Descriptor del Endpoint (USB_EP_DSC)]
Suponer el siguiente ejemplo:
sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,64,0x00
Los dos primeros parmetros son auto-explicativos. Especifican la longitud del
descriptor del Endpoint (7) y el tipo de descriptor. El siguiente parmetro identifica el
Endpoint, las definiciones se encuentran en usbdefs_std_dsc.h y tienen la siguiente
convencin:
_EP<##>_<dir>
donde ## es el nmero del endpoint y dir es la direccin de la transferencia. dir
tiene el valor de OUT o IN.
El siguiente parmetro especifica el tipo de Endpoint. Las opciones disponibles
son _BULK, _INT, _ISO, y _CTRL. El _CTRL no se utiliza normalmente porque el
Endpoint de transferencia de control por defecto no se define en los descriptores USB.
Cuando se utiliza la opcin _ISO, se pueden aadir opciones adicionales. Ejemplo:
_ISO|_AD|_FE
Esto describe el Endpoint como una pipe sncrona con los atributos adoptivo y
realimentacin. Ver usbdefs_std_dsc.h y las especificaciones del USB por ms detalles.
El siguiente parmetro define el tamao del Endpoint. El ltimo parmetro es el
intervalo de muestreo.
Aadir un String al USB
Una matriz de string descriptor debe tener el siguiente formato:
rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={
sizeof(sdxxx),DSC_STR,<text>};
La estructura proporciona un medio al compilador de C para calcular la longitud
del string descriptor sdxxx, donde xxx es el nmero de ndice. Los dos primeros bytes
del descriptor son su longitud y tipo. El resto <text> son strings de texto que tienen que
estar en formato unicode. El formato unicode se obtiene declarando cada carcter como
un tipo de letra. Todo el texto string se declara como una matriz de letras con el nmero

470

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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,

Tamao del descriptor en bytes


Descriptor tipo DEVICE
Nmero de versin del USB en formato BCD
Cdigo de Clase
Cdigo Subclase
Cdigo Protocolo
Tamao de paquete mximo para el EP0, ver usbcfg.h
ID Fabricante
ID Producto
Nmero de versin del dispositivo en formato BCD
String ndice de fabricante
String ndice del producto
String ndice del nmero de serie del dispositivo
Nmero de configuraciones posible

Tamao del descriptor en bytes


Tipo del descriptor CONFIGURACIN
Longitud total de datos de esta configuracin
Nmero de interfaces en esta configuracin
Valor del ndice de esta configuracin
String ndice de configuracin
Atributos, ver usbdefs_std_dsc.h
Consumo mximo de corriente (2X mA)

Tamao del descriptor en bytes


Tipo de descriptor INTERFACE
Nmero de Interface
Nmero alterno de configuracin
Nmero de Endpoints en esta interfaz
Cdigo de la Clase
Cdigo de la Subclase
Cdigo del Protocolo
String ndice de interfaz

472

GUILLERMO DAVID HERRERO GONZLEZ

Descriptor de Clase Especfica HID


sizeof(USB_HID_DSC),
Tamao del descriptor en bytes
DSC_HID,
Tipo del descriptor HID
0x0101,
Nmero de versin especfica HID en formato BCD
0x00,
Cdigo del pas (0x00 en los no soportados)
HID_NUM_OF_DSC,
Nmero de la clase del descriptor, ver usbcfg.h
DSC_RPT,
Tipo del informe del descriptor
sizeof(hid_rpt01),
Tamao del informe del descriptor
Descriptor del Endpoint
sizeof(USB_EP_DSC),DSC_EP,_EP01_IN,_INT,HID_INT_IN_EP_SIZE,0x0A

};
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'};

rom struct{byte report[HID_RPT01_SIZE];}hid_rpt01={


0x05, 0x01,
Pgina de uso (Escritorio genrico)
0x09, 0x02,
Uso (Ratn)
0xA1, 0x01,
Coleccin (Aplicacin)
0x09, 0x01,
Uso (Puntero)
0xA1, 0x00,
Coleccin (Fsica)
0x05, 0x09,
Pgina de uso (Botones)
0x19, 0x01,
Uso mnimo (01)
0x29, 0x03,
Uso mximo (03)
0x15, 0x00,
Mnimo lgico (0)
0x25, 0x01,
Mximo lgico (0)
0x95, 0x03,
Cuenta del informe (3)
0x75, 0x01,
Tamao del informe (1)
0x81, 0x02,
Entrada (Dato, Variable, Absoluto)
0x95, 0x01,
Cuenta del informe (1)
0x75, 0x05,
Tamao del informe (5)
0x81, 0x01,
Entrada (Constante); 5 bit de relleno
0x05, 0x01,
Uso de pgina (Escritorio genrico)
0x09, 0x30,
Uso (X)
0x09, 0x31,
Uso (Y)
0x15, 0x81,
Mnimo lgico (-127)
0x25, 0x7F,
Mximo lgico (127)
0x75, 0x08,
Tamao del informe (8)

473

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

0x95, 0x02,
0x81, 0x06,
0xC0, 0xC0};

Cuenta del informe (2)


Entrada (Dato, Variable, Relativo)
Fin de la coleccin

rom const unsigned char *rom USB_CD_Ptr[]={&cfg01,&cfg01};


rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002};
rom pFunc ClassReqHandler[1]=
{
&USBCheckHIDRequest
};
#pragma code

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

GUILLERMO DAVID HERRERO GONZLEZ

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.

Ejemplo: Suponer una clase de dispositivo foo, que utiliza un Endpoint de


salida de 64bytes y un Endpoint de entrada de 64bytes, entonces:
#define FOO_INTF_ID

0x00

#define FOO_UEP

UEP1

#define FOO_BD_OUT

ep1Bo

#define FOO_BD_IN

ep1Bi

#define FOO_EP_SIZE

64

El mapeo anterior elige la clase foo para utilizarse con el Endpoint 1. El


nombre es arbitrario y se puede elegir otro que no sea FOO_???????. Como idea
abstracta, el cdigo para la clase foo se tiene que usar en las definiciones abstractas de
FOO_BD_OUT,FOO_BD_IN y o ep1Bo o ep1Bi.
Ver que el tamao del Endpoint definido en el archivo usbcfg.h se utiliza de
nuevo en el archivo usbmmap.c. Esto muestra que los dos archivos estn muy
relacionados.
El buffer del Endpoint para cada funcin USB se localiza en el rea del puertodual RAM y como despus se tiene que hacer instantneos los BDTs. Un ejemplo de
declaracin es: volatile far unsigned char[FOO_EP_SIZE] data;
La palabra volatile dice al compilador que no funcione ningn cdigo de
optimizacin en esta variable porque el contenido lo tiene que modificar el hardware. La
palabra far dice que la variable no se localiza en el rea de RAM Accesible (0x0000x05F).

475

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Variables globales del USB

#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.

Estados del dispositivo: Desconectado, Conectado, ...


Flags globales del USB
Valor de la configuracin actual
Matriz para guardar los datos de la configuracin actual
alterna para cada ID interfaz

Localizaciones de variables fijas del USB

#pragma udata usbram4=0x400


Ver, usb4: 0x400-0x4FF(256-byte)
Seccin A: Tabla del Buffer Descriptor
- 0x400 - 0x4FF(max)
- MAX_EP_NUMBER se define en autofiles\usbcfg.h
- BDT data type se define en system\usb\usbmmap.h
#if(0 <= MAX_EP_NUMBER)
volatile far BDT ep0Bo;
Endpoint #0 BD Out
volatile far BDT ep0Bi;
Endpoint #0 BD In
#endif
#if(1 <= MAX_EP_NUMBER)
volatile far BDT ep1Bo;
volatile far BDT ep1Bi;
#endif

Endpoint #1 BD Out
Endpoint #1 BD In

476

GUILLERMO DAVID HERRERO GONZLEZ

#if(2 <= MAX_EP_NUMBER)


volatile far BDT ep2Bo;
volatile far BDT ep2Bi;
#endif

Endpoint #2 BD Out
Endpoint #2 BD In

#if(3 <= MAX_EP_NUMBER)


volatile far BDT ep3Bo;
volatile far BDT ep3Bi;
#endif

Endpoint #3 BD Out
Endpoint #3 BD In

#if(4 <= MAX_EP_NUMBER)


volatile far BDT ep4Bo;
volatile far BDT ep4Bi;
#endif

Endpoint #4 BD Out
Endpoint #4 BD In

#if(5 <= MAX_EP_NUMBER)


volatile far BDT ep5Bo;
volatile far BDT ep5Bi;
#endif

Endpoint #5 BD Out
Endpoint #5 BD In

#if(6 <= MAX_EP_NUMBER)


volatile far BDT ep6Bo;
volatile far BDT ep6Bi;
#endif

Endpoint #6 BD Out
Endpoint #6 BD In

#if(7 <= MAX_EP_NUMBER)


volatile far BDT ep7Bo;
volatile far BDT ep7Bi;
#endif

Endpoint #7 BD Out
Endpoint #7 BD In

#if(8 <= MAX_EP_NUMBER)


volatile far BDT ep8Bo;
volatile far BDT ep8Bi;
#endif

Endpoint #8 BD Out
Endpoint #8 BD In

#if(9 <= MAX_EP_NUMBER)


volatile far BDT ep9Bo;
volatile far BDT ep9Bi;
#endif

Endpoint #9 BD Out
Endpoint #9 BD In

#if(10 <= MAX_EP_NUMBER)


volatile far BDT ep10Bo;
volatile far BDT ep10Bi;
#endif

Endpoint #10 BD Out


Endpoint #10 BD In

477

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

#if(11 <= MAX_EP_NUMBER)


volatile far BDT ep11Bo;
volatile far BDT ep11Bi;
#endif

Endpoint #11 BD Out


Endpoint #11 BD In

#if(12 <= MAX_EP_NUMBER)


volatile far BDT ep12Bo;
volatile far BDT ep12Bi;
#endif

Endpoint #12 BD Out


Endpoint #12 BD In

#if(13 <= MAX_EP_NUMBER)


volatile far BDT ep13Bo;
volatile far BDT ep13Bi
#endif

Endpoint #13 BD Out


Endpoint #13 BD In

#if(14 <= MAX_EP_NUMBER)


volatile far BDT ep14Bo;
volatile far BDT ep14Bi;
#endif

Endpoint #14 BD Out


Endpoint #14 BD In

#if(15 <= MAX_EP_NUMBER)


volatile far BDT ep15Bo;
Endpoint #15 BD Out
volatile far BDT ep15Bi;
Endpoint #15 BD In
#endif
Seccin B: Espacio del Buffer del EP0
- Dos areas definidas para el buffer:
A. CTRL_TRF_SETUP
- Tamao = EP0_BUFF_SIZE definido en autofiles\usbcfg.h
- La estructura de datos detallada permite el direccionamiento directo de bits y bytes.
B. CTRL_TRF_DATA
- Tamao = EP0_BUFF_SIZE definido en autofiles\usbcfg.h
- La estructura de datos detallada permite el direccionamiento directo de los 8 bytes
primeros.
- Los dos tipos se definen en system\usb\usbdefs\usbdefs_ep0_buff.h
volatile far CTRL_TRF_SETUP SetupPkt;
volatile far CTRL_TRF_DATA CtrlTrfData;
Seccin C: Buffer CDC
#pragma udata usbram5a=0x500 //See Linker Script,usb5:0x500#if defined(USB_USE_CDC)
volatile far unsigned char cdc_notice[CDC_INT_EP_SIZE];
volatile far unsigned char cdc_data_rx[CDC_BULK_OUT_EP_SIZE];
volatile far unsigned char cdc_data_tx[CDC_BULK_IN_EP_SIZE];
#endif
#pragma udata

478

GUILLERMO DAVID HERRERO GONZLEZ

4.4.6.

USBGEN.C: USB GENRICO

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.

API del usuario

4.4.6.4.1.

void USBGenInitEP(void)

USBGenInitEP inicializa Endpoints genricos, buffer de los descriptores,


estados mquina internos y variables. Hay que llamarla despus de que el host haya
enviado una repuesta SET_CONFIGURATION.
Ver USBStdSetCfgHandler() en usb9.c como ejemplo.
void USBGenInitEP(void)
{
usbgen_rx_len = 0;
USBGEN_UEP = EP_OUT_IN|HSHK_EN;
Activa 2 pipes de datos
No hay que iniciar Cnt para las pipes de entrada.
Razn: El nmero de bytes enviados al host vara de una transaccin a otra. Cnt tiene que ser
igual al nmero exacto de bytes a transmitir en una transaccin IN dada. Este nmero de bytes slo se
conoce una vez que los datos hayan sido enviados.
USBGEN_BD_OUT.Cnt = sizeof(usbgen_out);
Fija el tamao del buffer
USBGEN_BD_OUT.ADR = (byte*)&usbgen_out;
Fija la direccin del buffer
USBGEN_BD_OUT.Stat._byte = _USIE|_DAT0|_DTSEN;
Fija el estado
USBGEN_BD_IN.ADR = (byte*)&usbgen_in;
USBGEN_BD_IN.Stat._byte = _UCPU|_DAT1;
} end USBGenInitEP

479

Fija la direccin del buffer


Fija el estado del buffer

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.6.4.2.

void USBGenWrite(byte *buffer, byte len)

Precondicin: mUSBGenTxIsBusy() tiene que devolver falso.


El valor de len tiene que ser igual o menor que USBGEN_EP_SIZE.
Para un Endpoint interrupcin/bulk, el tamao mximo del buffer es de
64bytes.
Entrada: buffer: Puntero a la localizacin de inicio de los bytes de datos.
len: Nmero de bytes a transmitir.
Esta macro se utiliza para transferir datos de la memoria de datos.
Aplicacin tpica:
if(!mUSBGenTxIsBusy())
USBGenWrite(buffer, 3);
void USBGenWrite(byte *buffer, byte len)
{
byte i;
El valor de len tiene que ser igual o menor que USBGEN_EP_SIZE. Esta comprobacin fuerza
que se cumpla la precondicin.
if(len > USBGEN_EP_SIZE)
len = USBGEN_EP_SIZE;
Copia de los datos del buffer del usuario al buffer de la ram-dual.
for (i = 0; i < len; i++)
usbgen_in[i] = buffer[i];
USBGEN_BD_IN.Cnt = len;
mUSBBufferReady(USBGEN_BD_IN);
} end USBGenWrite

480

GUILLERMO DAVID HERRERO GONZLEZ

4.4.6.4.3.

byte USBGenRead(byte *buffer, byte len)

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.7.

MSD.C: USB ALMACENAMIENTO MASIVO

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;

Toma valores MSD_WAIT, MSD_DATA_IN o


SD_DATA_OUT

USB_MSD_CBW gblCBW;
byte gblCBWLength;
SDCSTATE gblFlag;
RequestSenseResponse gblSenseData;
byte *ptrNextData;

El nmero de bloques o la longitud son globales porque para cada comando


READ_10 y WRITE_10 se tiene que verificar que el ltimo LBA es menor que
gblNumBLKS.
DWORD gblNumBLKS=0x00,gblBLKLen=0x00;

Respuesta estndar para saber que commando est en la ROM.


const rom InquiryResponse inq_resp = {
0x00,
Dispositivo perifrico conectado, acceso directo al bloque del
0x80,
dispositivo removible.
0x04,
versin = 00=> no cumple ningn estndar, 4=> SPC-2
0x02,
respuesta en formato especificado por SPC-2
0x20,
n-4 = 36-4=32= 0x20
0x00,
sccs etc.
0x00,
bque=1 y cmdque=0, indica que la cola simple 00 est
obsoleta,
pero en el caso de otro dispositivo, usamos 00
0x00,
00 obsoleto, 0x80 para tareas bsicas de cola
"Microchp",
este es el T10 asignado ID del fabricante
"Mass Storage ",
"0001"
};

482

GUILLERMO DAVID HERRERO GONZLEZ

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.

Respuestas especficas de la clase

4.4.7.5.1.

void USBCheckMSDRequest(void)

Esta rutina une el RESET estndar y el comando de repuesta recibido en el EP0


de control GET_MAX_LUN.

483

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.7.5.2.

void ProcessIO(void)

Precondicin: Se han llamado MSDInitEP() y SDCardInit().


MSDInitEP() se llama desde USBStdSetCfgHandler(void)(usb9.c)
SDCardInit() se llama desde InitializeSystem() en main.c
Esta rutina se llama desde loop continuos de main.c.
Todos los comandos de transporte Bulk en el Endpoit 1 se unen aqu:
MSD_State contiene el estado actual del mdulo de almacenamiento masivo.
En el estado MSD_WAIT: Espera al bloque de comando de cubierta (CBW) del
Endpoint1. Si se recibe un CBW vlido y significativo, dependiendo del comando
recibido MSD_State cambia a MSD_DATA_IN si el dato se enva al host (para todos
comandos adems del WRITE_10).
MSD_DATA_OUT si el host est esperando a mandar datos (slo en el caso de
WRITE_10). Al finalizar el comando de estado de transferencia de datos de cubierta
(CSW) se enva llamando SendCSW().

4.4.7.5.3.

void MSDInitEP(void)

Esta rutina se llama desde USBStdSetCfgHandler(void) inicializa Bulk-IN y


Bulk-OUT, los Endpoints MSD_BD_IN y MSD_BD_OUT Tamao = 64B (Ver
usbmmap.c y usbdefs_std_dsc.h para las definiciones de los Enspoints.

4.4.7.5.4.

void SDCardInit(void)

Efectos secundarios: gblFlag se actualiza de acuerdo con la Inicializacin.


MSD_State se fija a MAD_WAIT.
Esta rutina se llama desde InitializeSystem() en main.c. Inicializa la tarjeta SD y
si tiene algn problema en la inicializacin todos los LEDs se encienced. Tambin fija
MSD_State = MSD_WAIT

4.4.7.5.5.

void MSDCommandHandler(void)

Esta rutina se llama desde ProcessIO() cuando MSD_State=MSD_WAIT. Esta


funcin decodifica el comando CBW y actua consecuentemente. Si el CBW no est
soportado se fija el dato Sense, el estado de CSW se pone en comando fallido
(bCSWStatus=01h).

4.4.7.5.6.

void SendCSW(void)

Esta funcin enva el CSW y fija el estado a MSD_WAIT. Tambin cambia


MSD_BD_OUT para que apunte a msd_csw (estructura para leer CSW). Notar que esto
ha cambiado en el estado MSD_DATA_OUT para que apunte a msd_buffer para que
lea datos del host.

484

GUILLERMO DAVID HERRERO GONZLEZ

4.4.7.5.7.

void SendData(byte* dataAddr, byte dataSize)

Esta funcin enva dataSize bytes de datos empezando en la direccin


dataAddr.

4.4.7.5.8.

void MSDDataIn(void)

Esta funcin enva 512B de datos en el msd_buffer al host en trozos de 64B


usando MSD_BD_IN. Hay varias condiciones; cuando los datos que se envan son
menores que MSD_EP:SIZE y cuando se comprueba la condicin de error
bCSWStatus=0x01. En caso de error 0 se llenan y se envan los datos del tamao
esperado por el host dCBWDataTransferLength is sent.

4.4.7.5.9.

void IsValidCBW()

Comprueba si el CBW es vlido de acuerdo con las especificaciones de la clase


almacenamiento masivo. Se considera un CSW vlido si:
1. Se recibe en estado MS_WAIT
2. La longitud de CBW es 1Fh (MSD_CBW_SIZE)
3. dCBWSignature es igual a 0x43425355h

4.4.7.5.10.

void IsMeaningfulCBW()

Comprueba si el CBW recibido es significativo de acuerdo con las


especificaciones de la clase almacenamiento masivo. Un CSW se considera
significativo si:
1. No se fijan bits reservados
2. bCBWLUN contiene un LUN vlido soportado por el dispositivo
3. bCBWCBLength
y
CBWCB
tienen
concordancia
bInterfaceSubClass

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)

Esta funcin prepara la repuesta del comando INQUIRY. La repuesta se copia


de la ROM al msd_buffer y CSWStatus, se fijan los valores CSWDataResidue.

4.4.7.5.13.

void ResetSenseData(void)

Esta rutina resetean el dato


RequestSenseResponse gblSenseData.

Sense,

485

inicializando

la

estructura

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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)

Decodifica el CBWCB del comando READ(10) para calcular el inicio LBA y la


longitud de la transferencia (nmero de bloques a leer). Leyendo bloques de 512B de
datos de la tarjeta SD en msd_buffer (llamando SectorRead). Si se lee
satisfactoriamente (sdcValid), los datos se envan al host en trozos de 64B
(MSD_IN_EP_SIZE) (ver MSDDataIN()). Esto se repite para el nmero de bloques
TransferLength. En el caso de error bCSWStatus se fija a 0x01 y dato Sense con la
clave de dato NOT READY y se prepara el cdigo apropiado ASC, ASCQ.

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

Esta funcin lee 64B (MSD_OUT_EP_SIZE) de EP1 OUT MSD_BD_OUT.

4.4.7.5.17.

void MSDWriteHandler()

Decodifica el CBWCB del comando WRITE(10) para calcular el comienzo de


LBA y la longitud de la transferencia (nmero de bloques que se escriben). Lee los
bloques TransferLength de datos, 1 bloque=512B en un momento en msd_buffer. Los
datos del host, 64B en MSD_BD_OUT, se reciben en el msd_buffer (ver
MSDDataOut()).
El puntero MSD_BD_OUT.ADR se manipula para llenar los 512B del
msd_buffer y cuando todos los datos se escriben en la tarjeta SD llamando la funcin
Sector Write() (ver sdcard.c). En caso de error bCSWStatus se fija a 0x01 y dato
Sense con la clave de dato NOT READY se prepara el cdigo apropiado ASC, ASCQ.

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()

Esta funcin prepara para responder al comando Modo Sense. Se implementa


una respuesta bsica en esta versin del cdigo 00h y 0x03 es el tamao del dato (en
bytes) que sigue.

486

GUILLERMO DAVID HERRERO GONZLEZ

4.4.7.5.20.

void MSDMediumRemovalHandler()

Esta funcin prepara la respuesta al comando Prevent Allow Medium Removal.


No se espera una respuesta de datos slo se espera un CSW con comando de ejecucin
de estado. Como no se puede controlar la retirada del medio, repondemos con un
Success CSW.

4.4.7.5.21.

void MSDTestUnitReadyHandler()

Esta funcin prepara la respuesta al comando Test Unit Ready. No se espera


respuesta de datos, slo se enva un CSW basado en el estado actual de la tarjeta SD se
fija un valor de estado de error o de satisfactorio.

4.4.7.5.22.

void MSDVerifyHandler()

Esta funcin prepara la respuesta al comando Verify. No se espera respuesta de


datos, respondemos con un CSW satisfactorio. El comando no se procesa en esta
versin del cdigo.

4.4.7.5.23.

void MSDStopStartHandler()

Esta funcin prepara la respuesta al comando Start Stop Unit. No se espera


respuesta de datos, respondemos con un CSW satisfactorio. El comando no se procesa
en esta versin del cdigo.

487

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.8.

CDC.C: USB DISPOSITIVO DE COMUNICACIN

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;

Estados definidos en cdc.h


Puntero dedicado a la fuente
Puntero dedicado al destino
Longitud total tx
_ROM, _RAM

LINE_CODING line_coding; Buffer para almacenar lneas de informacin


CONTROL_SIGNAL_BITMAP control_signal_bitmap;

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.

Respuestas especficas de la clase

4.4.8.4.1.

void USBCheckCDCRequest(void)

Esta rutina chequea el paquete de datos setup para ver si este sabe como
manipularlo.

488

GUILLERMO DAVID HERRERO GONZLEZ

4.4.8.5.

Api del Usuario

4.4.8.5.1.

void CDCInitEP(void)

CDCInitEP inicializa los Endpoints CDC, buffer descriptores, estados internos


mquina y variables. Se tiene que llamar despus de que el host haya enviado una
repuesta SET_CONFIGURATION. Ver USBStdSetCfgHandler() en usb9.c para
ejemplos.

4.4.8.5.2.

byte getsUSBUSART(char *buffer, byte len)

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.

void putsUSBUSART(char *data)

Precondicin: cdc_trf_state tiene que estar en el estado CDC_TX_READY.


El string de caracteres que apunta data tiene que ser igual o menor de
255bytes.
Entrada: data: Puntero a un string de datos terminado con nulo. Si no se
encuentra, se envan 255bytes al host.
putsUSBUSART escribe un string de datos al USB incluyendo caracteres nulos.
Utilizar esta versin, puts, para transferir datos localizados en la memoria de datos.
Nota: El mecanismo de transferencia para dispositivo-a-host (put) es ms
flexible que el de host-a-dispositivo (get). Puede manipular un string de datos mayor
que el tamao mximo del Endpoint In bulk. Se utiliza un estado mquina para

489

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

transferir un long string de datos a travs de mltiples transacciones USB. Ver


CDCTxService() para ms detalles.

4.4.8.5.4.

void putrsUSBUSART(const rom char *data)

Precondicin: cdc_trf_state tiene que estar en el estado CDC_TX_READY.


El string de caracteres que apunta data tiene que ser igual o menor de
255bytes.
Entrada: data: Puntero a un string de datos terminado con nulo. Si no se
encuentra, se envan 255bytes al host.
putrsUSBUSART escribe un string de datos al USB incluidos los caracteres
nulos. Utilizar esta versin, puts, para transferir datos localizados en la memoria de
programa.
Nota: El mecanismo de transferencia para dispositivo-a-host (put) es ms
flexible que el de host-a-dispositivo (get). Puede manipular un string de datos mayor
que el tamao mximo del Endpoint In bulk. Se utiliza un estado mquina para
transferir un long string de datos a travs de mltiples transacciones USB. Ver
CDCTxService() para ms detalles.

4.4.8.5.5.

void CDCTxService(void)

CDCTxService une las transacciones dispositivo-a-host. Hay que llamar a esta


funcin una vez por cada loop del programa Main.

490

GUILLERMO DAVID HERRERO GONZLEZ

4.4.9.

HID.C: USB INTERFAZ CON HUMANOS

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.

[0] Protocolo de inicio [1] Protocolo de informe

Prototipos privados

void HIDGetReportHandler(void);
void HIDSetReportHandler(void);

4.4.9.4.

Declaraciones

#pragma code

4.4.9.5.

Respuestas especficas de la clase

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.

API del usuario

4.4.9.6.1.

void HIDInitEP(void)

HIDInitEP inicializa los Endpoints HID, buffer descriptores, estados internos


mquina y variables. Se tiene que llamar despus de que el host haya enviado una
repuesta SET_CONFIGURATION. Ver USBStdSetCfgHandler() en usb9.c para
ejemplos.

491

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4.4.9.6.2.

void HIDTxReport(char *buffer, byte len)

Precondicin: mHIDTxIsBusy() tiene que devolver falso. El valor de len tiene


que ser menor o igual que HID_INT_IN_EP_SIZE. Para un Endpoint interrupcin, el
tamao del buffer mximo es de 64bytes.
Entrada: buffer: Puntero al comienzo de la localizacin de bytes de datos.
len: Nmero de bytes que se van a transferir.
Utilizar esta macro para tranferir datos localizados en la memoria de datos.
Aplicacin tpica:
if(!mHIDTxIsBusy())
HIDTxReport(buffer, 3);

4.4.9.6.3.

byte HIDRxReport(char *buffer, byte len)

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

GUILLERMO DAVID HERRERO GONZLEZ

4.4.10.

MAIN.C

Este es el archivo de inicio. En l se incluyen las funciones necesariar para


establecer la comunicacin USB y las relativas a la aplicacin del usuario.

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

static void InitializeSystem(void);


void USBTasks(void);

4.4.10.3.1.

Remapeo de vectores

extern void _startup (void); #pragma code _RESET_INTERRUPT_VECTOR = 0x000800


void _reset (void)
{
_asm goto _startup _endasm
}

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

static void InitializeSystem(void)


InitializeSystem es una rutina centralizada de inicializacin. Todas las rutinas de
inicializacin se llaman desde aqu.
static void InitializeSystem(void)
{
ADCON1 |= 0x0F;

Por defecto todos los pines en digital

#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();

inicializacin del usuario

} 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();

se tiene que utilizar el mtodo obtener


Mtodo interrupcin u obtener

} end USBTasks

494

GUILLERMO DAVID HERRERO GONZLEZ

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

#pragma code high_vector=0x08


void interrupt_at_high_vector(void)
{
_asm goto high_isr _endasm
}
#pragma code
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm goto low_isr _endasm
}
#pragma code

4.4.11.3.

Declaraciones

4.4.11.3.1.

void high_isr(void)

#pragma interrupt high_isr


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.

LENGUAJE DE PROGRAMACIN VISUAL BASIC

5.1.

INTRODUCCIN

El lenguaje de programacin BASIC (Beginner's All purpose Symbolic


Instruction Code ) naci en el ao 1964 como una herramienta destinado a principiantes,
buscando una forma sencilla de realizar programas, empleando un lenguaje casi igual al
usado en la vida ordinaria ( en ingls), y con instrucciones muy sencillas y escasas.
Teniendo en cuenta el ao de su nacimiento, este lenguaje cubra casi todas las
necesidades para la ejecucin de programas. Tngase en cuenta que las mquinas
existentes en aquella poca estaban estrenando los transistores como elementos de
conmutacin, los ciclos de trabajo llegaban a la impensable cifra de 10.000 por segundo
y la memoria no pasaba de unos pocos Khz. en toroides de ferrita.
Los autores fueron los cientficos John G. Kemeny (Budapest, 1926 USA
1992) y Thomas E. Kurtz (Illinois 1928) Su trabajo original se llam True BASIC.
La evolucin del BASIC por los aos 70 fue escasa, dado el auge que tomaron
en aquella poca lenguajes de alto nivel como el FORTRAN y el COBOL. En 1978 se
defini una norma para unificar los Basics existentes crendose la normativa BASIC
STANDARD
Con la aparicin de los primeros ordenadores personales, dedicados
comercialmente al usuario particular, all por la primera mitad de los ochenta, el BASIC
resurgi como lenguaje de programacin pensado para principiantes, y muchos de estos
pequeos ordenadores domsticos lo usaban como nico sistema operativo (Sinclair,
Spectrum, Amstrad)
Con la popularizacin del PC, salieron varias versiones del BASIC que
funcionaban en este tipo de ordenadores (Versiones BASICA, GW-BASIC), pero todas
estas versiones del BASIC no hicieron otra cosa que terminar de rematar este lenguaje.
Los programadores profesionales no llegaron a utilizarlo, habida cuenta de las
desventajas de este lenguaje respecto a otras herramientas (PASCAL, C, CLIPPER). El
BASIC con estas versiones para PC lleg incluso a perder crdito entre los
profesionales de la informtica.
Las razones para ello eran obvias:
No era un lenguaje estructurado.
No existan herramientas de compilacin fiables.
No dispona de herramientas de intercambio de informacin.
No tena libreras.
No se poda acceder al interior de la mquina.
Un largo etctera de desventajas respecto a otros lenguajes de
programacin.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

5.2.

CARACTERSTICAS GENERALES DE VISUAL BASIC

Visual Basic es una herramienta de diseo de aplicaciones para Windows, en la


que estas se desarrollan en una gran parte a partir del diseo de una interface grfica. En
una aplicacin Visual Basic, el programa est formado por una parte de cdigo puro, y
otras partes asociadas a los objetos que forman la interface grfica.
Es por tanto un trmino medio entre la programacin tradicional, formada por
una sucesin lineal de cdigo estructurado, y la programacin orientada a objetos.
Combina ambas tendencias. Ya que no podemos decir que VB pertenezca por completo
a uno de esos dos tipos de programacin, debemos inventar una palabra que la defina:
PROGRAMACION VISUAL.
La creacin de un programa bajo Visual Basic lleva los siguientes pasos:
Anlisis. Es el estudio de las necesidades que han dado origen a la
creacin de ese programa. Es lo que se se llama Anlisis de la aplicacin.
Es la primera fase que debe tener siempre un programa y es tambin la
ms olvidada entre los programadores noveles. Una aplicacin no se
inicia con el teclado, sino sobre un papel.
Creacin de un interface de usuario. Este interface ser la principal va
de comunicacin hombre mquina, tanto para salida de datos como para
entrada. Ser necesario partir de una o varias ventanas (Formularios) a
las que le iremos aadiendo los controles necesarios.
Definicin de las propiedades de los controles. Se dar la forma,
posicin, y todas las caractersticas necesarias a los controles que
hayamos colocado en ese formulario. Estas propiedades determinarn la
forma esttica de los controles, es decir, como son los controles y para
qu sirven.
Generacin del cdigo asociado a los eventos que ocurran a estos
controles. A la respuesta a estos eventos (clic, doble clic, una tecla
pulsada, etc.) le llamamos Procedimiento, y deber generarse de acuerdo
a las necesidades del programa.
Generacin del cdigo del programa. Un programa puede hacerse
solamente con la programacin de los distintos procedimientos que
acompaan a cada objeto. Sin embargo, VB ofrece la posibilidad de
establecer un cdigo de programa separado de estos eventos. Este cdigo
puede introducirse en unos bloques llamados Mdulos, en otros bloques
llamados Funciones, y otros llamados Procedimientos. Estos
Procedimientos no responden a un evento acaecido a un control o
formulario, sino que responden a un evento producido durante la
ejecucin del programa.
No es necesario entender de momento lo anterior. Visual Basic introduce un
concepto nuevo de programacin, y es necesario cambiar hasta el argot del

501

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

programador. Posiblemente se le habrn acumulado demasiados trminos de una sola


vez. Es normal. A poco que siga leyendo ver las cosas mas claras cuando se explique
una por una.

5.3.

TIPOS DE DATOS

5.3.1.

CONSTANTES

Una constante es un valor que no cambia durante la ejecucin de un programa.


Se admiten valores decimales (base 10), hexadecimales (base 16) y octales (base 8). Un
nmero hexadecimal va precedido por &H y un nmero octal por &O (letra O, no
nmero 0).
Una constante de caracteres o constante alfanumrica es una cadena de
caracteres encerrada entre comillas dobles ().

5.3.2.

VARIABLES

Una variable contiene un valor que puede ser modificado a lo largo de la


ejecucin de una aplicacin.
Cada variable tiene atributos propios como:
Nombre: es el nombre que se utiliza para referirnos a su contenido en la
aplicacin.
Tipo: el tipo determina qu clase de valores se pueden almacenar en
cada variable.
mbito: especifica en qu parte de la aplicacin es conocida la variable
y por lo tanto puede ser utilizada.

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

GUILLERMO DAVID HERRERO GONZLEZ

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

Entero largo (4 bytes)

&

-2147483648 a 2147483647

Single

Coma flotante (4 bytes)

-3.40E+38 a 3.40E+38

Double

Coma flotante (8 bytes)

-1.79D+308 a 1.79D+308

Currency

Nmero c/ punto decimal fijo

9223372036854775807

String

Cadena de caracteres fija

(no)

Hasta 64Kbytes aprox.

String

Cadena de c. Variable

Hasta 231 caracteres aprox.

Byte

Carcter (1 byte)

(no)

0 a 255

Boolean

Boolean (2 bytes)

(no)

True o False

Date

Fecha y Hora (8 bytes)

(no)

1/1/100 a 3 1/12/9999

Object

Referencia a un objeto

(no)

Cq. Tipo de dato Object

Variant

Tipo por omisin

(no)

TIPO

503

RANGO

Numrico = Double
Cadena = String

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

5.3.2.3.

mbito

Se entiende por mbito o alcance de una variable el espacio de la aplicacin


donde sta es visible y, por lo tanto, se puede utilizar.
La figura siguiente indica, de forma resumida, los lugares donde se puede
declarar una variable:
Aplicacin: Variables utilizables por todos los mdulos (declaracin
Public en cualquier mdulo).
Formulario: Variables utilizadas dentro del mdulo (declaracin Dim o
Private en el mdulo).
Funciones y Procedimientos: Variables locales (Dim o Static).

5.3.3.

OPERADORES

La tabla que se muestra a continuacin presenta el conjunto de operadores


soportados, ordenados de mayor a menor prioridad cuando varios intervienen en una
misma expresin:
TIPO

OPERACIN

OPERADOR

Aritmticos

Exponenciacin
Cambio de signo
Multiplicacin, divisin
Divisin entera
Resto de div. entera
Suma, resta

^
*,/
\
Mod
+,-

Concatenacin

Enlazar cadenas

&

Relacional

Igual, distinto, menor, mayor, ...

=, <>, <, >, ...

Otros

Comparar dos cadenas de texto


Comparar dos referencias a objetos

Like
Is

Lgico

Negacin
And
Or inclusiva (Or)
Or Exclusiva (Xor)
Equivalencia (opuesto a Xor)
Implicacin

Not
And
Or
Xor
Eqv
Imp

504

GUILLERMO DAVID HERRERO GONZLEZ

5.3.4.

SENTENCIAS DE CONTROL

Las sentencias de control, denominadas tambin estructuras de control, permiten


tomar decisiones y realizar un proceso repetidas veces.
Visual Basic dispone, de forma concreta, de las siguientes estructuras de control:
If ... Then
If ... Then ... Else
Select Case
For ... Next
While ... Wend
Do ... Loop
Goto, With ... End With
Sintaxis: Cualquier expresin entre corchetes - []- es opcional.
De las expresiones entre llaves -{}- se puede elegir una, la necesaria segn el
caso.

5.3.4.1.

Sentencia If

Permite tomar una decisin referente al camino a seguir o accin a ejecutar en


un proceso, basndose en el resultado booleano (verdadero o falso) de una condicin.
Su sintaxis es:
If condicin Then
accin1
[Else
accin2]

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Donde expr-test es una expresin numrica o alfanumrica y las expresiones


lista-1, lista-2 pueden tener cualquiera de las formas siguientes:
expresin [, expresin] ...
expresin To expresin
Is operador-de-relacion expresin

O una combinacin de las anteriores separadas por comas.

5.3.4.3.

Sentencia ForNext

La sentencia For da lugar a un bucle, y permite ejecutar un conjunto de


sentencias cierto nmero de veces. Su sintaxis es:
For variable = expr-1 To expr-2 [Step expr-3]
[sentencias]
[Exit For]
[sentencias]
Next [variable [,variable] ...]

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

GUILLERMO DAVID HERRERO GONZLEZ

5.3.4.3.1.

Funcionamiento de la Sentencia For:

Cuando se ejecuta una sentencia For en la que el valor de expr-3 es positivo o no


se ha especificado, primero se asigna el valor de expr-1 a la variable y a continuacin se
comprueba si la variable es mayor que la expr-2, en cuyo caso se salta el cuerpo del
bucle y se contina en la sentencia que est a continuacin de Next.
En otro caso, se ejecutan las lneas de programa que haya entre la sentencia For
y la sentencia Next.
Por ltimo, la variable se incrementa en el valor de la expr-3, o en 1 unidad (por
defecto si Step no se especifica), volvindose a efectuar la comparacin entre la variable
y expr-2, y as sucesivamente.

5.3.4.4.

Sentencia WhileWend

Una sentencia o bucle While repite la ejecucin de un conjunto de sentencias


especificado mientras una determinada condicin sea cierta. La condicin se verifica
antes de ejecutar el conjunto de sentencias. Su sintaxis es:
While condicin [sentencias] Wend

Donde condicin es cualquier expresin de tipo numrico, relacional o lgico.


Al finalizar el bucle, se contina la ejecucin en la sentencia posterior a la
clusula Wend.

5.3.4.4.1.

Funcionamiento de la Sentencia While...Wend

La ejecucin de las sentencias de este tipo sucede as:


1. Se evala la condicin.
2. Si el resultado de la evaluacin es Falso, las sentencias que forman el
cuerpo de While no se ejecutan y se pasa el control a la siguiente
sentencia en el cdigo a Wend.
3. Si el resultado de la evaluacin es Verdadero, se ejecutan las sentencias
que forman el cuerpo de While y el proceso descrito se repite
posteriormente desde el punto 1.

507

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

5.3.4.5.

Sentencia DoLoop

La sentencia Do ... Loop proporciona una manera ms flexible y estructurada de


realizar los bucles. Repite la ejecucin de un conjunto de instrucciones mientras una
condicin dada sea cierta o hasta que una condicin dada sea cierta. La condicin puede
ser verificada antes o despus de ejecutarse el conjunto de sentencias:
Formato 1:
Do [{While|Until} condicin]

[sentencias]

[Exit Do]

[sentencias]
Loop

Formato 2:
Do

[sentencias]
[Exit Do]

[sentencias]

Loop [{While|Until} condicin]

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}

Un uso abusivo de esta sentencia puede dar lugar a aplicaciones difciles de


interpretar o mantener. Por ello, en programacin se utiliza solamente en ocasiones
excepcionales, pues la funcin que vaya a desempear Goto puede suplirse utilizando
cualquiera de las sentencias de control estructuradas que se han visto anteriormente.

508

GUILLERMO DAVID HERRERO GONZLEZ

5.4.

LIBRERAS EN VISUAL BASIC

Como en cualquier lenguaje de alto nivel, en VB tambin existen las libreras,


adems de los componentes.
Los componentes archivos ocx, son libreras que se programan desde un entorno
visual. Pueden ser desde tipos de botones para agregar al programa hasta la creacin, en
el programa, de un puerto serie.
Las libreras son conjuntos de funciones en un archivo dll, estos archivos los
utliza el sistema operativo Windows como driver de un dispositivo hasta para reconocer
el acceso a un puerto.

5.4.1.

LIBRERA DEL USB: MPUSBAPI.DLL

5.4.1.1.

Inroduccin

Para una mayor facilidad de desarrollo de aplicaciones basadas en el bus USB,


Microchip ha creado un archivo dll en el que proporciona las funciones de acceso al
puerto USB con un microcontrolador de la familia PIC18Fxx5x.
Para un funcionamiento correcto, se necesita el driver mchpusb.sys.
Este archivo sirve tanto para Visual Basic como para Visual C, entre otros.

5.4.1.2.

FUNCIONES

5.4.1.2.1.

MPUSBGetDLLVersion(Void)

Lee el nivel de revisin del MPUSAPI.dll. Es un nivel de revisin de 32bits.


Esta funcin no devuelve la versin del cdigo, no realiza nada con el USB.
Devuelve la versin de la dll en formato hexadecimal de 32bits.
MPUSBGetDLLVersion()

5.4.1.2.2.

MPUSBGetDeviceCount(pVID_PID)

Devuelve el nmero de dispositivo con VID_PID asignado.


pVID_PID: Input: cadena de caracteres del nmero de identificacin asignado.
MPUSBGetDeviceCount(vid_pid)

509

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

5.4.1.2.3.
MPUSBOpen(instance,
dwReserved)

pVID_PID,

pEP,

dwDir,

Devuelve el acceso al pipe del Endpoint con el VID_PID asignado.


Todas las pipes se abren con el atributo FILE_FLAG_OVERLAPPED. Esto
permite que MPUSBRead, MPUSBWrite y MPUSBReadInt tengan un valor de timeout.
Nota: el valor del time-out no tiene sentido en una pipe sncrona.
instance: Input: Un nmero de dispositivo para abrir. Normalmente, se utiliza
primero la llamada de MPUSBGetDeviceCount para saber cuantos
dispositivos hay.
Es importante entender que el driver lo comparten distintos dispositivos.
El nmero devuelto por el MPUSBGetDeviceCount tiene que ser igual o
menor que el nmero de todos los dispositivos actualmente conectados y
usando el driver genrico.
Ejemplo:
Si hay tres dispositivos con los siguientes PID_VID conectados:
Dispositivo tipo 0, VID 0x04d8, PID 0x0001
Dispositivo tipo 1, VID 0x04d8, PID 0x0002
Dispositivo tipo 2, VID 0x04d8, PID 0x0003
Si el dispositivo que nos interesa tiene VID=0x04d8 y PID=0x0002 el
MPUSBGetDeviceCount devolver un 1.
Al llamar la funcin tiene que haber un mecanismo que intente llamar
MPUSOpen() desde 0 hasta MAX_NUM_MPUSB_DEV. Se tiene que
contar el nmero de llamadas exitosas. Cuando este nmero sea igual al
nmero devuelto por MPUSBGetDeviceCount, hay que dejar de hacer las
llamadas porque no puede haber ms dispositivos con el mismo VID_PID.
pVID_PID: Input: String que contiene el PID&VID del dispositivo objetivo. El
formato es vid_xxxx&pid_yyyy. Donde xxxx es el valor del VID y el
yyyy el del PID, los dos en hexadecimal.
Ejemplo:
Si un dispositivo tiene un VID=0x04d8 y un PID=0x000b, el string de
entrada es: vid_0x04d8&pid_0x000b.
pEP: Input: String con el nmero del Endpoint que se va a abrir. El formato es
\\MCHP_EPz o \MCHP_EPz dependiendo del lenguaje de
programacin. Donde z es el nmero del Endpoint en decimal.
Ejemplo:
\\MCHP_EP1 o \MCHP_EP1

510

GUILLERMO DAVID HERRERO GONZLEZ

Este argumento puede ser NULL (nulo) para crear lazos con Endpoints
de funciones no especficas.
Las funciones
MPUSBReadInt.

especficas

son:

MPUSBRead,

MPUSBWrite,

Nota: Para utilizar MPUSBReadInt(), el formato de pEP tiene que ser


\\MCHP_EPz_ASYNC. Esta opcin slo est disponible para un Endpoint
interrupcin IN. La pipe de datos abierta con _ASYNC debe almacenar
datos con el intervalo especificado en el Endpoint descriptor con un mximo
de 100 recepciones. Cualquier otro dato recibido despus de llenar el buffer
del driver se ignora.
La aplicacin del usuario tiene que llamar MPUSBReadInt() a menudo
sin superar el mximo de 100.
dwDir: Especifica la direccin del Endpoint:
MP_READ: para MPUSBRead y MPUSBReadInt
MP_Write: para MPUSBWrite
dwReserved: por ahora nada.
MPUSBOpen(0, vid_pid, out_pipe, MP_WRITE, 0)

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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)

Cierra una determinada unin.


handle: Input: Identifica la pipe del Endpoint que se va a cerrar.
MPUSBClose (myOutPipe)

512

GUILLERMO DAVID HERRERO GONZLEZ

5.4.1.3.

TIPOS DE TRANSFERENCIAS

En este apartado se recomienda que funcin utilizar dependiendo del tipo de


transferencia.
Tipo

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

Interrupt: tipo interrupcin


Isochronous: tipo sncrono
Nota: Input y output se refiere a los parmetros designados en las llamadas
a estas funciones, que son lo opuesto a los sentidos comunes desde la perspectiva de una
aplicacin haciendo llamadas.

5.4.1.4.

Declaracin De Constantes Y Variables

Aqu aparecen las constantes y variables que el fabricante recomienda usar.


Todas son optativas, dejando la eleccin al programador.
Tambin, se comentan las pequeas variaciones que existen al declarar estas
variables en los distintos lenguajes.
MPUS_FAIL=0
MPUSB_SUCCESS=1
MP_WRITE=0
MP_READ=1
MAX_NUM_MPUSB_DEV=127
vid_pid= vid_04d8&pid_0011

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

5.4.1.5.

Declaracin de las funciones

En el ltimo punto de la librera, se comenta como incluir las funiones en varios


lenguajes de programacin.

5.4.1.5.1.

Se declara con #include "_mpusbapi.h". Los datos devueltos son:


DWORD
_MPUSBGetDLLVersion(void)
DWORD
_MPUSBGetDeviceCount(PCHAR pVID_PID)
HANDLE
_MPUSBOpen(DWORD instance, PCHAR pVID_PID, PCHAR pEP, DWORD
dwDir, DWORD dwReserved);
BOOLEAN
_MPUSBClose(HANDLE handle);
DWORD
_MPUSBRead(HANDLE handle, PVOID pData, DWORD dwLen, PDWORD
pLength, DWORD dwMilliseconds);
DWORD
_MPUSBWrite(HANDLE handle, PVOID pData, DWORD dwLen, PDWORD
pLength, DWORD dwMilliseconds);
DWORD
_MPUSBReadInt(HANDLE handle, PVOID pData, DWORD dwLen, PDWORD
pLength, DWORD dwMilliseconds);

5.4.1.5.2.

VB

Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi.dll" () As Long


Public Declare Function MPUSBGetDeviceCount Lib "mpusbapi.dll" (ByVal pVID_PID As
String) As Long
Public Declare Function MPUSBOpen Lib "mpusbapi.dll" (ByVal instance As Long, ByVal
pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As
Long) As Long
Public Declare Function MPUSBClose Lib "mpusbapi.dll" (ByVal handle As Long) As Long
Public Declare Function MPUSBRead Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData
As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As
Long
Public Declare Function MPUSBWrite Lib "mpusbapi.dll" (ByVal handle As Long, ByVal
pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As
Long) As Long
Public Declare Function MPUSBReadInt Lib "mpusbapi.dll" (ByVal handle As Long, ByVal
pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As
Long) As Long

514

GUILLERMO DAVID HERRERO GONZLEZ

5.4.1.5.3.

Delphi

Function MPUSBGetDLLVersion(): DWORD; cdecl;


Function MPUSBGetDeviceCount(pVID_PID: PCHAR) : DWORD; cdecl;
Function MPUSBOpen(instance: DWORD, pVID_PID: PCHAR, pEP: PCHAR, dwDir:
dwReserved: DWORD): HANDLE; cdecl;
Function MPUSBClose(handle: HANDLE): BOOLEAN; cdecl;
Function MPUSBRead(handle: HANDLE, pData: PVOID, dwLen: DWORD,
PDWORD, dwMilliseconds: DWORD): DWORD; cdecl;
Function MPUSBWrite(handle: HANDLE, pData: PVOID, dwLen: DWORD,
PDWORD, dwMilliseconds: DWORD): DWORD; cdecl;
Function MPUSBReadInt(handle: HANDLE, pData: PVOID, dwLen: DWORD,
PDWORD, dwMilliseconds: DWORD): DWORD; cdecl;
Implementation
Function MPUSBGetDLLVersion; cdecl; external MPUSAPI:Dll index1;
Function MPUSBGetDeviceCount; cdecl; external MPUSAPI:Dll index2;
Function MPUSBOpen; cdecl; external MPUSAPI:Dll index3;
Function MPUSBClose; cdecl; external MPUSAPI:Dll index4;
Function MPUSBRead; cdecl; external MPUSAPI:Dll index5;
Function MPUSBWrite; cdecl; external MPUSAPI:Dll index6;
Function MPUSBReadInt; cdecl; external MPUSAPI:Dll index7;

515

DWORD,

pLength:
pLength:
pLength:

6. INTERCONEXIN
USB-PC

519

6.

INTERCONEXIN USB-PC

6.1.

INTRODUCCIN

El USB se encuentra en todos los tipos de plataformas de ordenador conocidos.


En este captulo, nos centraremos en Windows por ser el ms difundido y en los
perifricos USB.
Para que cualquier sistema operativo reconozca un perifrico, necesita un driver.
Para escribir el driver en Windows, se necesitan altos conocimientos del sistema, as
como otras herramientas ineludibles de Microsoft, como el DDK (Driver Development
Kit), la documentacin (MSDN) y un compilador.

6.2.

ARQUITECTURA WINDOWS

A lo largo de las diferentes versiones de Windows, tanto la arquitectura como


los puntos de entrada han sufrido cambios. Windows 98 se unifica coincidiendo con
Windows NT.
Para conectar una aplicacin al USB, se requiere el llamado driver. La primera
cualidad de este software es la de controlar el dispositivo.
En el caso de una red, la parte de transferencia de datos est compartida por
varios usuarios; por eso, la parte que controla el hardware est integrada en el sistema.
Este recurso comn se denomina USB Driver Stack.
El driver ya no ejerce un control sobre el hardware, sino que viene a ser la
interfaz entre el stack y la aplicacin.

6.3.

CARGA EN WINDOWS DE UN MDULO USB

Veamos las operaciones realizadas por Windows cuando se conecta un


perifrico USB.
En cuanto se detecta la presencia de un perifrico, Windows realiza la
enumeracin, de forma que obtiene la informacin VID y PID. El sistema utiliza estos
datos para encontrar el driver que gestiona el perifrico. Si este ya se conoce, su
informacin se encuentra en el registro, de otro modo, esta se encontrar en un fichero
de tipo inf. Por esta razn, Windows pide para cada nuevo perifrico el disco que
contiene la informacin. Si encuentra varios ficheros .inf, el sistema busca en cada uno
de ellos el que contiene la informacin de instalacin del perifrico (VID/PID).
Las instrucciones para la carga del software necesario para este dispositivo se
encuentra en ese fichero que, como mnimo, debe indicar el nombre del fichero que
contiene el driver (con extensin .SYS), el GUID

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

El software se almacena en la carpeta de Windows, con lo que finaliza el


proceso de instalacin. Slo queda hacerse cargo del perifrico, para lo que Windows
ejecuta el driver xx.sys.
En las ltimas versiones de Windows, el sistema posee archivos .sys
genricos. Al conectar un perifrico, el sistema busca en una base de datos interna el
VID y el PID y, si encuentra el perifrico, instala el driver genrico que posee. As, al
conectar un perifrico nuevo, normalmente no pide el disco con el driver.

6.4.

EL DRIVER .SYS

Para dialogar con la aplicacin, es necesario que sta solicite al sistema la


apertura de un enlace.
La solucin ms aconsejable es proporcionar el GUID, que debe ser un
nmero nico para que la aplicacin pueda conectarse con su driver.
En cuanto el perifrico se conecta, el programa driver.sys se carga y se ejecuta, y
ser descargado en cuanto el perifrico se desconecte. Al llamarle, el sistema le
proporciona la direccin de la estructura en la que debe colocar las instrucciones de los
programas que van a controlar los circuitos virtuales.
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)

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.

DILOGO CON LA APLICACIN


La aplicacin utiliza el GUID para abrir un enlace virtual con el perifrico.

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

GUILLERMO DAVID HERRERO GONZLEZ

6.4.2.

GESTIN DE BUGS

En cuanto al hardware, el PC est constituido por un conjunto de elementos,


tales como la placa madre, tarjeta de video, y lo mismo ocurre para el software.
Aparte de Windows, no hay que olvidar a todos los drivers y programas de aplicacin
que se encuentran en ejecucin o que, en un momento u otro, han modificado el sistema.
Todos esto elementos interactan y Windows es permeable a ello. Existen otros
sistemas operativos que controlan mejor esto elementos.
Un bug (fallo de funcionamiento) puede ser la consecuencia de una concurrencia
de programas, no siendo el software que lo dispara forzosamente culpable.
Para determinar la causa del problema, es obligatorio anotar la configuracin del
sistema y efectuar pruebas cruzadas para encontrar los programas activos. La simple
constatacin de un fallo no aporta gran cosa para hallar la causa. Las lneas calientes
de los fabricantes de tarjetas ofrecen cuestionarios muy completos a los que hay que
responder antes de iniciar cualquier investigacin del problema por parte del servicio
tcnico.
A nivel USB, se han detectado problemas en los drivers tanto de Windows como
en los de los circuitos USB (driver en el sentido de controlador), as como en algunos
controladores USB con sus bios.
Actualmente, el sistema de seguridad contra los bugs de Windows, es el
certificado de garanta. A los fabricantes de perifricos que pagan una gran cantidad
econmica Microsoft les otorga su certificado, para que al instalar el driver no parezca
un mensaje en la pantalla diciendo que el perifrico puede ser no seguro. As, por
ejemplo, al instalar el driver de Microchip mchpusb.sys aparece este error, pero el driver
es totalmente compatible con cualquier versin de Windows.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Ms concretamente, el retorno puede hacerse tanto si ha terminado la peticin


como si no. En el primer caso, la peticin es sncrona y, en consecuencia, las acciones
se hacen detrs de otras, mientras que en el segundo caso, la peticin es asncrona.
El modo asncrono resulta ms complicado de implementar, ya que es necesario
gestionar el overlapped. Para ello, durante la peticin, sta pasa a un puntero para
indicar adnde debe retornar esta informacin el driver. Todo esto debe ser
cuidadosamente gestionado.
El driver de Microchip soporta ambos modos de acceso, la variacin reside en
las funciones de acceso utilizadas, como se explic en el captulo anterior.

6.4.3.3.

Modo De Acceso Mltiple

Esto no tiene lugar en el modo sncrono, puesto que se retorna a la aplicacin


cuando la peticin termina. Por el contrario, en el caso del modo asncrono, puede haber
varias peticiones en curso. El driver debe ser capaz de mantener la informacin
overlapped y de reenviar la informacin de fin (o error) al llamador. Todo esto es muy
coherente, pero complica la programacin en consecuencia. Para esta opcin, la
solucin ms adecuada viene a ser la lista encadenada.

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

GUILLERMO DAVID HERRERO GONZLEZ

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.

Gestin De Las Peticiones De La Aplicacin

La aplicacin enva sus peticiones al driver y este responde; el mtodo es simple;


adems, el fabricante que vende el producto proporciona tanto la aplicacin como el
driver. Por esta razn es difcil imaginar que la aplicacin pueda hacer peticiones que
estn fuera de las aceptadas por el driver, ms an cuando es el propio driver el que
proporciona los nmeros de cdigo de las funciones.

6.4.3.8.

Gestin De Las Peticiones Del Sistema

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Como aplicacin practica de la comunicacin por USB, se ha desarrollado un


coche controlado desde el ordenador por el puerto USB.
Este aparato, detecta objetos a una distancia de 20 a 80cm y al chocarse con
ellos. Puede modificar su velocidad, direccin y sentido.
La velocidad y el sentido se modifican gracias a dos motores de corriente
continua controlados con el microcontrolador y el driver L293D. La forma de modificar
la velocidad es por medio de la modificacin de anchura del pulso (PWM).
La direccin se controla con un motor paso a paso, ste necesita unos pulsos de
control para poder moverse un determinado ngulo, que depende del motor.
Adems, se encendern dos luces delanteras y dos traseras y un zumbador para
simular el claxon.
En ste captulo, se pretende explicar desde el porqu del diseo de la placa a la
aplicacin de control realizada en el ordenador.

7.2.

CIRCUITO ELCTRICO

En este punto, se analizarn todos los componentes que se han utilizado,


comentando sus caractersticas y el motivo de su uso.
La alimentacin del puerto USB slo se utiliza para alimentar el
microcontrolador y el L293D, debido a la demanda excesiva del circuito y para que el
micro tenga una tensin estable que no se vea afectada por el ruido generado por los
motores de corriente continua.
Se han utilizado dos fuentes de alimentacin debido a la gran demanda de
corriente del cicuito, y que el autor no dispone de una fuente de alimentacin de tanta
potencia. Se pueden unir las dos fuentes cuando se pueda utilizar una fuente de gran
potencia.
Se han unido las masas para que el microcontrolador tenga un punto de
referencia, el nivel bajo 0V.
El motivo de la conexin de un condensador de 100nF entre los puntos de la
fuente de alimentacin, es para filtrar el posible error producido por el ruido generado
por las altas frecuencias del puerto USB y por los motores.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.2.1.

ESQUEMA ELCTRICO DEL CIRCUITO

528

GUILLERMO DAVID HERRERO GONZLEZ

7.2.2.

COMPONENTES

7.2.2.1.

Microcontrolador

El componente ms importante es el microcontrolador PIC18F2455, dentro de la


familia PIC18Fxx5x se ha elegido este, por ser el que ms se adecua a nuestra
aplicacin por ser el de menor memoria y por ser el de menor salidas. Estas dos
caractersticas implican que sea el de menor precio.
El oscilador de entrada es un XTAL de 4MHz, los condensadores de 27pF se
utilizan para excitar el cristal y generar la onda cuadrada adecuada para el micro. Este
circuito se conecta, segn el fabricante, en los terminales OSC1 y OSC2.
El condensador electroltico de 47F conectado al terminal VUSB es una
exigencia del fabricante para estabilizar la tensin del USB.
Los diodos LED conectados en los terminales RC6 y RC7, en realidad, es un
LED bicolor de tres terminales. Utilizado para indicar, en rojo que el dispositivo est
alimentado, y en verde cuando se ha configurado el puerto USB. Las resistencias
conectadas entre el micro y el LED, sirven para limitar la tensin que alimenta al LED.
El resto de caractersticas se han comentado a lo largo de esta memoria.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.2.2.3.

L293D

El L293D es un cudruple puente de alta corriente, diseado para proporcionar


la doble direccin en corrientes mayores de 600mA y tensiones de 4,5V a 36V. Se ha
diseado para controlar inducciones como las de un relee, un motor
Las entradas son compatibles con la lgica TTL.
Las entradas se activan en parejas, 1A y 2A se activan con la entrada de
habilitacin 1,2EN; y 3A y 4A con 3,4EN. Cuando una entrada y la de habilitacin
estn en un nivel alto, el driver (la salida) tambin, activndose en fase con la entrada.
Cuando la entrada est en un nivel bajo y la de habilitacin en alto, el driver estar en
bajo. El ltimo caso, cuando la entrada est en cualquier nivel y la de habilitacin en
bajo, el driver se encuentra en un estado de alta impedancia.
Hay que usar unos diodos externos para suprimir el periodo de descarga de las
inducciones. En la aplicacin son los diodos rectificadores 1N4007, que soportan una
tensin y una corriente mucho ms alta que la del circuito.
El integrado posee dos terminales de alimentacin, uno para la alimentacin
TTL, Vcc (terminal 18), conectado a la alimentacin del puerto USB; y otro para la del
circuito que alimenta los componentes conectados en las salidas, VS (terminal 8),
conectado a la fuente externa de tensin. Esta conexin se ha realizado para que el
L293D tenga la tensin del USB de referencia ya que es con la que trabaja el
microcontrolador.

7.2.2.4.

Sensor De Distancia

El Sharp GP2Y0A02YK es un sensor de infrarrojos que proporciona una lectura


continua de la distancia medida como una tensin analgica dentro de un rango de 20 a
80cm. La tensin de alimentacin es de 5V y la tensin de salida vara unos 2V de
diferencia entre el margen mnimo y el mximo de la distancia medida, actualizndose
cada 39ms. El encapsulado es similar al de otros sensores Sharp, pero presenta una
mayor distancia entre la lente y el sensor con el fin de aumentar el rango de trabajo.
La salida de este sensor se conecta a la entrada AN0 para que el microcontrolador
convierta la tensin recibida en un dato digital por medio de conversor A/D.

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

GUILLERMO DAVID HERRERO GONZLEZ

7.2.2.6.

Zumbador

El zumbador es un componente, que al alimentarlo emite sonido. El que se


utiliza en la aplicacin es de 6V, pudindose alimentar a 5V como el resto del circuito.
En la aplicacin se usa para simular el claxon del coche. Se conecta en una
salida del ULN2803 para proporcionar la corriente necesaria para su funcionamiento.

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

El conector USB utilizado es del tipo B hembra, para impedir la recirculacin al


estar prohibida, como se explica en el captulo referente a la conexin USB.
La alimentacin del USB es la encargada de suministrar la energa al
microcontrolador, por eso el terminal 1 del conector se une a la alimentacin del micro,
a los finales de carrera y al L293D.
Como en cualquier circuito que utilice varias fuentes o con algn tipo de
transmisin, hay que conectar las masas para tener el mismo punto de referencia.
Los dos terminales del conector sobrantes, el 2 y el 3, se conectan directamente
al microcontrolador en los terminales D- y D+, respectivamente por ser los mismos que
los del conector.

531

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.2.2.9.

Motores De Corriente Continua

Son de los ms comunes y econmicos, y se pueden encontrar en la mayora de


los juguetes a pilas, constituidos, por lo general, por dos imanes permanentes fijados en
la carcasa y una serie de bobinados de cobre ubicados en el eje del motor, que
habitualmente suelen ser tres.
El funcionamiento se basa en la interaccin entre el campo magntico del imn
permanente y el generado por las bobinas, ya sea una atraccin o una repulsin hacen
que el eje del motor comience su movimiento.
Cuando una bobina es recorrida por la corriente elctrica, esta genera un campo
magntico y como es obvio este campo magntico tiene una orientacin es decir dos
polos un polo NORTE y un polo SUR, de esta forma:
S

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

El torque (par motor) es simplemente la fuerza de giro, podramos llamarle la


potencia que este motor tiene, la cual depende de varios factores, como ser; la cantidad
de corriente, el espesor del alambre de cobre, la cantidad de vueltas del bobinado, la
tensin etc. Esto es algo que viene determinado por el fabricante, y que nosotros poco
podemos hacer, ms que jugar con uno que otro parmetro que ahora se describen.
La imagen anterior es slo a modo descriptivo, ya que por lo general suelen
actuar las dos fuerzas, tanto atraccin como repulsin, y ms si se trata de un motor con
bobinas impares. Estos motores disponen de dos bornes que se conecten a la fuente de
alimentacin y segn la forma de conexin el motor girar en un sentido u otro.

532

GUILLERMO DAVID HERRERO GONZLEZ

7.2.2.9.1.

Control Del Sentido De Giro

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

Con fuente simple:

12V

12V

Otra solucin, es sustituir los interruptores por los relees correspondientes e


idear un par de circuitos para lograr el mismo efecto... Aunque esta ltima opcin es una
de las ms prcticas, tiene sus inconvenientes ya que los relees suelen presentar
problemas mecnicos y de desgaste, lo ideal sera disponer de un circuito un poco ms
slido, quitando los relees y haciendo uso de transistores, estos ltimos conectados en
modo corte y saturacin, as actan como interruptores.
Al usar una fuente simtrica, ser necesario el uso de dos transistores
complementarios es decir uno PNP y otro NPN, de este modo slo es necesario un
terminal de control, el cual puede tomar valores lgicos "0" y "1":

+Vcc

Control
GND
-Vcc

533

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Al utilizar una fuente de alimentacin simple la cosa se complica un poco ms.


Estos circuitos son conocidos como puente en H o H-Bridge.
+Vcc

+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.

El L293 Como Driver De Un Motor De Corriente Continua

Existen dos posibilidades de control, una es controlar los motores en un slo


sentido de giro, es decir, hacer que gire o detenerlo, en este caso tienes posibilidad de
controlar hasta 4 motores.
Aqu slo se representa la mitad del integrado, la otra mitad es lo mismo, slo
cambia el nmero de los pines.

M1

M2

+Vs
GND
A
11
10

14

B
15
16
9

1/2 L293
4, 5, 12, 13

534

+Vcc
Ven

GUILLERMO DAVID HERRERO GONZLEZ

Con los terminales A y B se controla el encendido del motor correspondiente,


Con Ven se habilita o no los terminales de control A y B, Ven debe estar en nivel alto si
se quiere utilizar los terminales de control A y B. Finalmente la forma de control sera
como se ve en la siguiente tabla:
Ven

M1

M2

Parado

Encendido

Encendido

Parado

Alta
Impedancia

Alta
Impedancia

+Vcc es el terminal de alimentacin compatible con la seal de control A y B, o


sea +5V, Vs tiene los niveles de tensin requeridos por el motor (12, 15, 20, hasta 36v).
D1 y D2, son para proteger al integrado de las tensiones generadas por la induccin de
las bobinas del motor.
Un motor (M1) esta unido a +Vs, mientras que el otro (M2) esta a GND, se
puede utilizar cualquiera de las dos configuraciones.
El otro mtodo de control, requiere dos de los 4 driver del integrado, la forma de
conexin sera:

+Vs

B
2

16
1

1/2 L293
4, 5, 12, 13

535

+Vcc
Ven

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

La tabla de la verdad del circuito indica claramente como se puede controlar el


motor, en un sentido o en otro, detenerlo o dejarlo libre, alta impedancia, se refiere a
que cualquier seal en los terminales de control A, B, C y D no tendrn efecto alguno
sobre el motor, es decir que ha quedado liberado totalmente.
Ven

Funcin del motor

Sentido 1

Sentido 2

C=D

Parado

Motor Libre

El mtodo de conexin utilizado en la aplicacin es el segundo, ya que se


necesitan dos motores en la aplicacin y se puede invertir el sentido.

7.2.2.9.3.

Control De La Velocidad

Modulacin De Ancho De Pulso (PWM)


La modulacin de ancho de pulso bsicamente consiste en enviar a los
terminales de control un tren de pulsos los cuales varan en mayor o menor medida el
tiempo en que se mantiene el nivel alto de esos pulsos, manteniendo la frecuencia
constante, logrando que la tensin media que detecta el motor sea mayor o menor
dependiendo del tiempo en el que la seal permanezca en nivel alto.

Con esta forma de control la cantidad de corriente sigue siendo la misma, la


tensin no vara y en consecuencia el torque del motor se mantiene.
Un circuito de ejemplo puede ser:

T1
Salida
R1
R2

T2

1
0

T1>T2
T1=0,7(R1+R2)C
T2=0,7R2C

En el cual puedes reemplazar R1 por un potencimetro y as controlar los


tiempos de los niveles de salida.

536

GUILLERMO DAVID HERRERO GONZLEZ

En la aplicacin, se utiliza este mtodo para variar la velocidad. No se necesita


ningn circuito adicional ya que el microcontrolador genera una onda modulada en los
terminales CCP1 y CCP2 como se ha visto en captulos anteriores.

Modulacin Por Frecuencia De Pulsos (PFM)


Otro mtodo de variar la frecuencia de pulso en los terminales de control, lo cual
puedes lograr fcilmente con un circuito astable que bien podra ser un 555, y utilizar un
potencimetro para variar la frecuencia de los pulsos:

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

Aumento Del Par Motor

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.2.2.10.

Motores Paso A Paso

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

Motor paso a paso unipolar:


1a
Com1
1b

2a

2b

Mientras los Unipolares disponen de dos bobinas independientes los Bipolares


parecieran tener 4 debido al terminal central que es el comn de cada par de bobinas,
pues a eso se debe aquello de los 6 cables y que si unes los terminales Com1 y Com2
tienes un terminal comn y 4 terminales de control (es decir 5 cables).

538

GUILLERMO DAVID HERRERO GONZLEZ

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

+Vcc GND +Vcc GND

Paso 2

+Vcc GND GND +Vcc

Paso 3

GND +Vcc GND +Vcc

Paso 4

GND +Vcc +Vcc GND

Recuerda que 1a y 1b corresponden a una misma bobina, mientras 2a y 2b


corresponden a la otra.
Para invertir la polaridad se necesita la interfaz para controlar estos motores, ya
que en la mayora de los casos se hace a travs de un microcontrolador, o por medio del
PC y como estos entregan muy poca corriente hay que amplificarla.
Una de las mejores opciones para controlar estos motores es hacer uso del Driver
L293D que ya lo mencionamos anteriormente, el circuito sera:
1a
1b
2a
2b
Enable
GND

+Vss
GND

+Vs
GND
+Vss
D1 D2
1

L1

L2
2

D3 D4

D5 D6

+Vs

C1

539

D7 D8

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

Si se unen los terminales Com1 y Com2, entonces quedas con un motor de 5


cables.
Com

A
B

Aqu la resistencia entre cualquier terminal y el comn es la misma y


aproximadamente la mitad de la resistencia entre los extremos de las bobinas.
Como unimos los cables comunes de cada bobina los cuatro cables restantes
sern A, B, C y D, y para saber cual es cual:
1. se conecta el terminal comn al positivo de la fuente de alimentacin
2. se toma uno de los 4 cables sobrantes, se nombra como A y se conecta a
GND, quedando el motor enclavado en una sola posicin,
3. se conecta uno de los otros cables a GND. Aqu pueden ocurrir 3 cosas:
Que el motor gire en sentido antihorario, el cable es el B
Que gire en sentido horario, el cable es el D
Si no pasa nada es el C
Lo que se necesita es un circuito para controlar el motor; una manera sencilla y
econmica es mediante el ULN2803:
+12V

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

En el esquema funciona con el puerto paralelo, los 4 diodos 1N4148, y el diodo


zener de 12V sirven para proteger al integrado.
Los bobinados del motor requieren un pulso de seal negativa para ser activados,
como el ULN tiene sus salidas invertidas, cada vez que enves un "1" por el pin INn se
transformar en "0" a la salida, es decir en el pin OUTn correspondiente.
En la aplicacin, los pulsos los enva el microcontrolador, por lo que no se
necesita ningn diodo.

541

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Secuencias De Control De Los Motores Paso A Paso Unipolares


Estas secuencias siguen el orden indicado en cada tabla para hacer que el motor
gire en un sentido, si se desea que gire en sentido opuesto, slo se debe invertir dicha
secuencia.
Existen 3 formas de controlar estos motores-PaP, la primera es realizar una
secuencia que activa una bobina por pulso, se conoce como wave drive:
N de Pasos A B C D
Paso 1

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

GUILLERMO DAVID HERRERO GONZLEZ

En estas dos formas de control vistas anteriormente se respetan la cantidad de


pasos preestablecidos para cada motor, por Ej., si tiene un ngulo de giro de 90, con 4
pasos das una vuelta completa, pero tambin puedes hacerlo con 8 pasos, para lo cual se
utiliza la secuencia de medio paso:
N de Pasos A B C D
Paso 1

Paso 2

Paso 3

Paso 4

Paso 5

Paso 6

Paso 7

Paso 8

Esta es una combinacin de las dos anteriores.


En cuanto a la fuerza de giro, slo decir que, en este caso, es bueno tener en
cuenta la inercia del motor cuando este se encuentre en movimiento.

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.2.3.

ESQUEMA ELCTRICO DE LA PLACA IMPRESA


El esquema de montaje despus de realizar la placa impresa, sera:

Los componentes externos se unen a la placa por medio de conectores.


Las lneas azules existentes en el interior del integrado L293, son puentes.
Como se ha mencionado anteriormente, la alimentacin es del tipo corriente
continua de 5V.

544

GUILLERMO DAVID HERRERO GONZLEZ

7.3.

FIRMWARE DEL MICROCONTROLADOR

Con firmware se refiere al programa realizado en C18 para el microcontrolador.


Este programa, es una modificacin del software cedido por Microchip para la
comunicacin por medio del USB. Se parte del programa de la clase genrica y se
realizan modificaciones, segn lo indicado anteriormente. En este apartado slo
aparecen las libreras o macros modificadas.
Como en el resto de la memoria, el cdigo aparece en verde con el tipo de letra
Comic Sans MS y los comentarios en Times New Roman.

7.3.1.

MAIN.C

El archivo main.c es el cdigo que se ejecuta al iniciar el microcontrolador. En


l, se configuran los fuses, el USB

7.3.1.1.

Incluye

En el apartado de los #include, se aade las libreras necesarias para la ejecucin


del cdigo de main.c.
La librera p18f2455.h contiene las descripciones de los puertos, terminales,
registros, etctera; tiles para configurar y ejecutar aplicaciones.
#include <p18f2455.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include "io_cfg.h"

// Requerida
// Requerida
// Requerida

#include "system\usb\usb_compile_time_validation.h"
#include "user\user.h"

// Opcional
// Modificable

Despus de los #include, aparecen los fuses de configuracin descritos


anteriormente.
En la aplicacin se utiliza un cristal de cuarzo de 4MHz, por lo que FOSC se ha
configurado como oscilador XT para el micro y para el USB; PLLDIV sin prescaler
para que al PLL le lleguen los 4MHZ directamente; el CPUDIV sin prostscaler para la
seal del reloj y postscaler de 1:2 para la seal del PLL y el USBDIV como 2 al llegar
la fuente de los 96MHz del PLL.
#pragma config PLLDIV=1
#pragma config CPUDIV=OSC1_PLL2
#pragma config USBDIV=2
#pragma config FOSC=XT_XT

545

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

El camino que sigue la seal de reloj en el diagrama del reloj es:

Este sistema se debe a la versatilidad y posibilidades que ofrece este micro.


En OSC1 y OSC2 se conecta el cristal, en este caso de 4MHz, pero, para el
USB, admite: 4, 8, 16, 20, 24, 40 y 48MHz.
Este cristal es el mismo que genera la frecuencia de 48MHz necesaria para el
USB y para el reloj del PIC, que puede ser la misma o no, esto quiere decir que el USB
puede funcionar a 48MHz mientras que el PIC trabaja a 4MHz.
Despus del disparador Smicht del Primary Oscillator (oscilador primario), salen
tres lneas en paralelo que van a distintos mdulos.
La lnea superior va directamente al switch USBDIV que, si est a cero, indica
que la frecuencia base original del cristal va directamente al USB. Esto es posible si el
cristal es de 48MHz, los dems hay que tratarlos.
El USB clock source tiene en la entrada un Prescaler del PLL, o sea un divisor
de frecuencia. En su salida se obtendr una seal FOSC dividida por 1, 2, 3, 4, 5, 6, 10
12. Con PLLDIV se selecciona la deseada para obtener siempre 4MHz.
As si el cristal es de 12MHz y se configura el PLLDIV con un 3 (010), se
obtendrn 4MHz. En la aplicacin se configura con un 1 para que no exista divisin.
La salida de este multiplexor se conecta al PLL de 96MHz, por eso siempre hay
que introducir 4MHz.
Como los 96MHz son el doble de los necesarios, se divide por 2 para el USB.
Esta seal tambin se conecta a un Postscaler, otro divisor de 2, 3, 4 6 y cuyas
salidas se conectan al CPUDIV. En nuestro caso, CPUDIV=OSC1_PLL2 por lo que
este divisor se selecciona a 1:2, siendo 48MHz una posible frecuencia de oscilacin del
microcontrolador.

546

GUILLERMO DAVID HERRERO GONZLEZ

Como, en la aplicacin, FOSC=XT_XT, indica que FOSC3:FOSC0 valen 0,


siendo la seal definitiva de la CPU los 4MHz del cristal de entrada.
Por ltimo, llega al multiplexor FSEN la seal del reloj primario (Primary
Clock) dividida por 4 junto con la de la salida del USBDIV. Con este multiplexor se
selecciona la seal de reloj primario o las del PLL o del Cristal dependiendo de la
configuracin. En la aplicacin la seal proviene del PLL.
Continuando con los fuses, como no se utilizan, la mayora se configuran como
OFF, excepto CCP2MX y VREGEN que se configuran como ON. El primero, porque la
salida PWM2 se quiere en el pin RC1. Y el segundo, porque el USB est activo y se
necesita su regulador de tensin.
#pragma config FCMEM=OFF
#pragma config IESO=OFF
#pragma config PWRT=OFF
#pragma config BOR=OFF
#pragma config WDT=OFF
#pragma config MCLRE=OFF
#pragma config PBADEN=OFF
#pragma config STVREN=OFF
#pragma config LVP=OFF
#pragma config XINST=OFF
#pragma config DEBUG=OFF
#pragma config CCP2MX=ON
#pragma config VREGEN=ON

7.3.1.2.

Variables

En este archivo, no se declaran variables ya que las necesarias se han declarado


en las libraras.
#pragma udata

7.3.1.3.

//Coloca las variables en la memoria de datos

Prototipos privados

Los prototipos privados son las funciones que se utilizan dentro de un mismo
archivo.
static void InitializeSystem(void);
void USBTasks(void);

547

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.1.4.

Remapeo Del vector

En esta parte del cdigo, el compilador modifica el vector de inicio y el de


interrupcin, mediante una rutina en ensamblador.
extern void _startup (void);
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code

7.3.1.5.

Declaraciones

#pragma code

7.3.1.5.1.

//Vector de inicio
//Vector de interrupcin
//Vector de reset

//Coloca lo siguiente en la memoria de programa

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.

//Salta a la rutina InitializeSystem(), existente en este mismo archivo

// USB Tasks dentro de este mismo archivo


// Salta a la rutina Aplicacin() de user\user.c

void InitializeSystem(void)

static 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

// Se define el puerto, se declara el terminal


//como puerto de entrada en io_cfg.h

//Salta a la rutina de usbdrv.h


// Salta a la rutina de user\user.c

GUILLERMO DAVID HERRERO GONZLEZ

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.

//Se tiene que usar el mtodo de muestreo


//Se puede usar el mtodo de muestreo o el de interrupcin
//Si se define la clase CDC salta a la rutina indicada

USBCFG.H

Las nicas modificaciones realizadas en esta librera corresponden con el


descriptor de la interfaz. El resto del cdigo se ha comentado y analizado anteriormente.
#ifndef USBCFG_H
#define 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

/* Parameter definitions are defined in usbdrv.h */


#define MODE_PP
_PPBM0
#define UCFG_VAL
_PUEN|_TRINT|_FS|MODE_PP

Como no se utilizan las entradas autoalimentadas ni las dependientes del bus


USB, las siguientes definiciones se ponen como comentarios, para que el compilador las
ignore.
//#define USE_SELF_POWER_SENSE_IO
//#define USE_USB_BUS_SENSE_IO

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.2.3.

Localizaciones De Los Endpoints

7.3.2.3.1.

Identificador De La Interfaz

Es el nombre que se da a la interfaz para diferenciarlas entre las existentes.


En la aplicacin slo hay una interfaz, por lo que se nombra con el primer
nmero, el cero.
#define USBGEN_INTF_ID

7.3.2.3.2.

0x00

Endpoints

Son los Endpoints que se utilizan en esta interfaz y su descripcin.


Como slo se utiliza uno en toda la aplicacin, es el Endpoint 1.
#define USBGEN_UEP

UEP1

El Endpoint 1 se va a usar tanto en entrada como en salida con un buffer de 8


bytes. El tamao de los buffers tiene que ser mayor que el nmero de bytes que se
esperan transmitir.
#define USBGEN_BD_OUT
#define USBGEN_OUT_EP_SIZE
#define USBGEN_BD_IN
#define USBGEN_IN_EP_SIZE

ep1Bo
8
ep1Bi
8

Se define el nmero total de Endpoints utilizados en todas las interfaces.


#define MAX_EP_NUMBER

7.3.3.

// UEP1

USBDSC.H

En esta librera, como en la anterior, slo se modifica las caractersticas relativas


a los descriptores de la conexin.
#ifndef USBDSC_H
#define USBDSC_H

7.3.3.1.

Incluye

#include "system\typedefs.h"
#include "autofiles\usbcfg.h"
#include "system\usb\usb.h"

550

GUILLERMO DAVID HERRERO GONZLEZ

7.3.3.2.

Definiciones

Se declara una estructura llamada CFG01 con los descriptores de la


comunicacin, como slo hay una se nombra 01.
#define CFG01 rom struct
{
USB_CFG_DSC
cd01;
USB_INTF_DSC
i00a00;
USB_EP_DSC
ep01o_i00a00;
USB_EP_DSC
ep01i_i00a00;
} cfg01

7.3.3.3.

\
\
\
\
\

Funciones Externas

extern rom USB_DEV_DSC device_dsc;


extern CFG01;
extern rom const unsigned char *rom USB_CD_Ptr[];
extern rom const unsigned char *rom USB_SD_Ptr[];
#endif //USBDSC_H

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.

Descriptor Del Dispositivo

sizeof(USB_DEV_DSC),
DSC_DEV,
0x0200,
0x00,
0x00,
0x00,
EP0_BUFF_SIZE,
0x04D8,
0x8008,
0x0000,
0x01,
0x02,

Tamao del descriptor en bytes


Descriptor tipo DEVICE
Nmero de versin del USB en formato BCD
Cdigo de Clase
Cdigo Subclase
Cdigo Protocolo
Tamao de paquete mximo para el EP0, ver usbcfg.h
ID Fabricante
ID Producto, elegido por el programador
Nmero de versin del dispositivo en formato BCD
String ndice de fabricante
String ndice del producto

551

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

0x00,
0x01

String ndice del nmero de serie del dispositivo


Nmero de configuraciones posible

};

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,

Tamao del descriptor en bytes


Tipo del descriptor CONFIGURACIN
Longitud total de datos de esta configuracin
Nmero de interfaces en esta configuracin
Valor del ndice de esta configuracin
String ndice de configuracin
Atributos, ver usbdefs_std_dsc.h
Consumo mximo de corriente (2X mA)

Descriptor de la interfaz
sizeof(USB_INTF_DSC),
DSC_INTF,
0,
0,
2,
0,
0,
0,
0,

Tamao del descriptor en bytes


Tipo de descriptor INTERFACE
Nmero de Interface
Nmero alterno de configuracin
Nmero de Endpoints en esta interfaz
Cdigo de la Clase
Cdigo de la Subclase
Cdigo del Protocolo
String ndice de interfaz

Descriptor Del Endpoint


Se define el Endpoint 1 tanto en entrada como en salida del tipo Bulk, con la
clase genrica y el buffer asignado.
sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,USBGEN_OUT_EP_SIZE,0x00,
sizeof(USB_EP_DSC),DSC_EP,_EP01_IN,_BULK,USBGEN_IN_EP_SIZE,0x00,
};

Descriptor Del Idioma Del Dispositivo


rom struct{byte bLength;byte bDscType;word string[1];}sd000={
sizeof(sd000),DSC_STR,0x0409};

Descriptor Del Nombre Del Fabricante


rom struct{byte bLength;byte bDscType;word string[25];}sd001={
sizeof(sd001),DSC_STR,
'G','H','G'};

552

GUILLERMO DAVID HERRERO GONZLEZ

Descriptor Del Nombre Del Dispositivo


rom struct{byte bLength;byte bDscType;word string[25];}sd002={
sizeof(sd002),DSC_STR,
'C','o','c','h','e','c','i','t','o',' ','l','e','r',''};

Almacena los descriptores en variables externas.


rom const unsigned char *rom USB_CD_Ptr[]={&cfg01,&cfg01};
rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002};

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

Define los puertos utilizados con el nombre del componente conectado.


#define Distancia
#define Fin1
#define Fin2
#define Fin3

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

#define Dmas
#define Verde
#define Rojo

7.3.5.4.

PORTCbits.RC5
PORTCbits.RC6
PORTCbits.RC7

USB

Define los puertos relativos al USB, este cdigo no se ha modificado.


#define tris_usb_bus_sense TRISAbits.TRISA1

// 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

GUILLERMO DAVID HERRERO GONZLEZ

7.3.7.

USER.C
Este archivo se ha creado para la aplicacin, siendo totalmente nuevo.

La mayor parte de las funciones empiezan con if (!OFF), esta instruccin


comprueba si la variable OFF es distinta de uno. Esta variable es la encargada de
determinar si se ha recibido la instruccin de encender el coche o no.

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.

//Define un buffer intermedio para las transmisiones de entrada


//Define un buffer intermedio para las transmisiones de salida
//Define una variable para determinar si el coche est encendido
//o apagado. Si OFF=1 el coche est apagado

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.7.4.

Declaraciones

En este apartado se realiza el cdigo propio del usuario.


#pragma code

7.3.7.4.1.

void Inicializacion(void)

Esta rutina inicializa el sistema del usuario.


void Inicializacion(void)
{
TRISA=0x0F;
TRISB=0;
TRISC=0;
PORTA=0;
PORTB=0;
PORTC=0;
Rojo=0x01;

//Configura los puertos como E/S dependiendo de su uso

//Enciende el LED bicolor con el color rojo para indicar que el


//dispositivo tiene corriente
//Inicializacin del conversor analgico, todo E/S digitales

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)

Este es el lugar para colocar las rutinas del usuario.


Dependiendo del comando recibido por el USB el microcontrolador har una
cosa u otra.
void Aplicacion(void)
{
BlinkUSBStatus();
if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return;
//si el disposiivo no est configurado vuelve
if (USBGenRead((char *)input_buffer,3))
{
//Comprueba si ha recibido algn dato
chequeo();
}
}

556

GUILLERMO DAVID HERRERO GONZLEZ

7.3.7.4.3.

void chequeo(void)

Esta funcin es la que se encarga de determinar un comando y saltar a la funcin


adecuada.
void chequeo(void)
{ switch (input_buffer[0]) //reconoce el comando y salta a la funcin determinada por este.
{
case 0x01:
Mdelante();
break;
case 0x02:
Mdetras();
break;
case 0x03:
Giroizq();
break;
case 0x04:
Giroder();
break;
case 0x05:
Sensores();
break;
case 0x06:
Claxon();
break;
case 0x07:
LucesON();
break;
case 0x08:
Paro();
break;
case 0x09:
Apagado();
break;
case 'a':
Velocidad();
break;
case 'b':
LucesOFF();
break;
case 'c':
Encendido();
break;
}
}

557

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.7.4.4.

void enviar(void)

Esta funcin se encarga de enviar un dato por el USB


void enviar(char datos)
{
if (!mUSBGenTxIsBusy())
//Comprueba que se pueden enviar datos
USBGenWrite((byte *)&output_buffer,datos);
//Enva los datos
}

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.

//Comprueba que el coche no est apagado


//Activa la velocidad deseada
//Se encienden los motores CC, para que el coche avance

void Mdetras(void)

Esta funcin activa las salidas oportunas para que los motores retrocedan
void Mdetras(void)
{
if (!OFF)
{
Velocidad();
Sentido1=0;
Sentido2=1;
}
}

//Activa la velocidad deseada


//Se encienden los motores CC, para que el coche retroceda

558

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.7.4.11.

void ANOpen(char c)

Esta funcin activa/desactiva el conversor A/D especificado en c.


void ANOpen(void)
{
OpenADC(ADC_FOSC_2 & ADC_RIGHT_JUST
ADC_INT_OFF & ADC_VREFPLUS_VDD, 14);
Delay10TCYx(5);

&

ADC_20_TAD,ADC_CH0

&

//Retraso para que se inice el CA/D

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)

Esta funcin activa el zumbador durante un periodo de tiempo modificable.


void Claxon(void)
{
if (!OFF)
{
Zumbador=1;
Delay10KTCYx(30);

Zumbador=0;

//Como el Xtal es de 4MHz, el ciclo de instruccin dura 1ms,


//esta rutina
//realiza un retardo de 30000 ciclos de instruccin.

562

GUILLERMO DAVID HERRERO GONZLEZ

7.3.7.4.14.

void Apagado(void)

Esta funcin apaga el coche.


void Apagado(void)
{
Sentido1=0;
Sentido2=0;
Bombillas=0;
LED2=0;
LED1=0;
OFF=1;
}

7.3.7.4.15.

void Encendido(void)

Esta funcin enciende el coche.


void Encendido(void)
{
OFF=0;
}

7.3.7.4.16.

void LucesON(void)

Esta funcin enciende las luces del coche.


void LucesON(void)
{
if (!OFF)
{
Bombillas=1;
LED2=1;
LED1=1;
}
}

7.3.7.4.17.

void LucesOFF(void)

Esta funcin apaga las luces del coche.


void LucesOFF(void)
{ if (!OFF)
{
Bombillas=0;
LED2=0;
LED1=0;
}
}

563

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.3.7.4.18.

void BlinkUSBStatus(void)

Esta funcin enciende el led bicolor en rojo cuando el dispositivo no se ha


configurado y en verde cuando ya lo est.
void BlinkUSBStatus(void)
{
if(usb_device_state == CONFIGURED_STATE)
{
PORTCbits.RC7=1;
PORTCbits.RC6=0;
}
else
{
PORTCbits.RC6=1;
PORTCbits.RC7=0;
}
}

564

GUILLERMO DAVID HERRERO GONZLEZ

7.4.

SOFTWARE DEL ORDENADOR

La descripcin de la aplicacin se realizar en aparatados. Cada apartado ser un


form o un mdulo.
Los form se mostrarn compilados y sin compilar y una tabla en la que
aparezcan los objetos utilizados. En la tabla se comentarn las propiedades del objeto,
slo las que tengan una especial relevancia en la aplicacin.
Despus de la descripcin de los objetos, se analizar el cdigo que, como en el
resto de la memoria, aparecer en Comics Sans MS y los comentarios en Times New
Roman.

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

Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi.dll" () As Long


Public Declare Function MPUSBGetDeviceCount Lib "mpusbapi.dll" (ByVal pVID_PID As
String) As Long
Public Declare Function MPUSBOpen Lib "mpusbapi.dll" (ByVal instance As Long, ByVal
pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As
Long) As Long
Public Declare Function MPUSBClose Lib "mpusbapi.dll" (ByVal handle As Long) As Long
Public Declare Function MPUSBRead Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData
As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As
Long
Public Declare Function MPUSBWrite Lib "mpusbapi.dll" (ByVal handle As Long, ByVal
pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As
Long) As Long
Public Declare Function MPUSBReadInt Lib "mpusbapi.dll" (ByVal handle As Long, ByVal
pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As
Long) As Long

565

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.1.2.

Funcin De Recuperacin De Datos Almacenados

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any,
pSrc As Long, ByVal ByteLen As Long)

Con esta funcin se recuperan los datos de un puntero y las posiciones de


memoria siguientes que indiquemos.
Los argumentos son:
pDst: variable en la cual se van a almacenar los datos de la direccin.
pSrc: variable con la direccin de memoria.
ByteLen: nmero de bytes que hay que recuperar.

7.4.1.3.

Constantes Para La WIN32 API

Public Const INVALID_HANDLE_VALUE = -1


Public Const ERROR_INVALID_HANDLE = 6&

7.4.1.4.

Constantes De Conectividad Con El PIC

Public Const vid_pid = "vid_04d8&pid_8008"

Vendor id (Microchip) y Perifrico id. La identificacin del perifrico se ha


puesto la misma que la del firmware.
Public Const out_pipe = "\MCHP_EP1"
Public Const in_pipe = "\MCHP_EP1"

7.4.1.5.

'Las comunicaciones las hacemos con el Endpoint 1

IN_PIPE Y OUT_PIPE Variables Pblicas

Public myInPipe As Long


Public myOutPipe As Long

7.4.1.6.

Variables Pblicas Del Programa

Public rec(8) As Byte


Public DatosDistancia(1, 7) As Integer

7.4.1.7.

Apertura De Las Comunicaciones

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

GUILLERMO DAVID HERRERO GONZLEZ

7.4.1.8.

Cierre De Las Comunicaciones

Sub CloseMPUSBDevice()
MPUSBClose (myOutPipe)
MPUSBClose (myInPipe)
End Sub

Con esta funcin se cierran las pipe abiertas anteriormente.

7.4.1.9.

Funcin Enviar

Function Send(ByRef SendData() As Byte, bytes As Integer) As Long


Dim SentDataLength As Long
Call MPUSBWrite(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000)
'VarPtr()= puntero a la variable
End Function

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.1.10.

Funcin Recibir

Function recibir(ByRef s() As Byte, ByRef Datos As Long) As Long


Dim direcciones As Long
Call MPUSBRead(myInPipe, VarPtr(s(0)), Datos, Datos, 1000)
direcciones = VarPtr(s(0))
CopyMemory ByVal VarPtr(rec(0)), ByVal direcciones, Datos 'recupera
almacenado en la direccin de memoria de rec

el

dato

End Function

La funcin MPUSBRead se llama con Call porque no se aprovechan los datos


devueltos.
En la variable direcciones, se almacena la primera direccin de memoria del
buffer de entrada s(), para poder guardar los datos recibidos en la variable rec()
mediante la funcin CopyMemory (comentada anteriormente).
Los argumentos se defienen con ByVal, es decir, por valor. Se utiliza esta
definicin cuando no se quiere que el valor del argumento de llamada cambie con el
valor del argumento de la funcin.

7.4.2.

FORMULARIO INICIO

Este es el formulario principal del programa. En l se encuentran las funciones


relativas al movimiento del coche as como las de las luces y el claxon. Tambin se
encuentra el men para encender y apagar el coche y abrir el resto de form.
Form Inicio Sin Compilar

568

GUILLERMO DAVID HERRERO GONZLEZ

Form Inicio Compilado

Objetos Del Form Inicio


Objeto

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

Cdigo Del Form Inicio

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

GUILLERMO DAVID HERRERO GONZLEZ

7.4.2.1.2.

Funcin Avanza_Click

Public Sub Avanza_Click()


Send_Buf(0) = 1
Send_Buf(1) = velocidad(0)
Send_Buf(2) = velocidad(1)
Send Send_Buf, 3
End Sub

Esta funcin se activa cuando se hace clic en el botn Avanza. Es la encargada


de enviar el cdigo de instruccin 1 relativo al comando para activar los motores de CC
para que el coche avance.
Los otros dos datos que enva es la velocidad.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.3.

Funcin Claxon_Click

Public Sub Claxon_Click()


Send_Buf(0) = 6
Send Send_Buf, 1
End Sub

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

Public Sub Derecha_Click()


Send_Buf(0) = 4
Angulo = Angulo + TextGiro.Text \ 2
Send_Buf(1) = TextGiro.Text \ 2
Send Send_Buf, 2
End Sub

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.2.1.5.

Funcin Form_Load

Private Sub Form_Load()


OpenMPUSBDevice 'abre comunicaciones
If
(myOutPipe
=
INVALID_HANDLE_VALUE)
Or
INVALID_HANDLE_VALUE) Then
MsgBox "No se ha comunicado con el dispositivo", 0 + 16, "Error"
End
End If

(myInPipe

'Cargamos los datos del sensor de distancia


Open "distancia.ghg" For Input As #1
While EOF(1) <> True
Input #1, DatosDistancia(0, i)
Input #1, DatosDistancia(1, i)
i=i+1
Wend
Close #1
Sensor.Visible = True
End Sub

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

Private Sub Form_Unload(Cancel As Integer)


Send_Buf(0) = 9
Send Send_Buf, 1
CloseMPUSBDevice 'cierra comunicaciones
End Sub

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

GUILLERMO DAVID HERRERO GONZLEZ

7.4.2.1.7.

Funcin Izquierda_Click

Public Sub Izquierda_Click()


Send_Buf(0) = 3
Angulo = Angulo - TextGiro.Text \ 2
Send_Buf(1) = TextGiro.Text \ 2
Send Send_Buf, 2
End Sub

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

Public Sub Luces_Click()


If lucesON = False Then
Send_Buf(0) = 7
Luces.Picture = Lon.Picture
Send Send_Buf, 1
lucesON = True
Else
Luces.Picture = off.Picture
Send_Buf(0) = Asc("b")
Send Send_Buf, 1
lucesON = False
End If
End Sub

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.2.1.9.

Menu_Click

Public Sub Menu_Click(Index As Integer)


Select Case Index
Case 0:
Izquierda.Enabled = True
Derecha.Enabled = True
Avanza.Enabled = True
Retrocede.Enabled = True
Paro.Enabled = True
Luces.Enabled = True
Claxon.Enabled = True
Sensor.sensores.Enabled = True
ScrollVelocidad.Enabled = True
TextVelocidad.Enabled = True
ScrollGiro.Enabled = True
TextGiro.Enabled = True
Ajuste.Izquierda.Enabled = True
Ajuste.Derecha.Enabled = True
Send_Buf(0) = Asc("c")
Send Send_Buf, 1
Case 1:
Izquierda.Enabled = False
Sensor.sensores.Enabled = False
Derecha.Enabled = False
Avanza.Enabled = False
Retrocede.Enabled = False
Paro.Enabled = False
Luces.Enabled = False
Luces.Picture = off.Picture
lucesON = False
Claxon.Enabled = False
ScrollVelocidad.Enabled = False
TextVelocidad.Enabled = False
ScrollGiro.Enabled = False
TextGiro.Enabled = False
Send_Buf(0) = 9
Send Send_Buf, 1
Case 2:
Sensor.sensores.Enabled = False
Sensor.Distancia.Caption = ""
Comandos.Visible = True
Case 3:
Ajuste.Visible = True
Case 4:

574

GUILLERMO DAVID HERRERO GONZLEZ

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

Public Sub Paro_Click()


Send_Buf(0) = 8
Send Send_Buf, 1
If Angulo < 0 Then
Send_Buf(0) = 3
Send_Buf(1) = -Angulo
Send Send_Buf, 2
End If
If Angulo > 0 Then
Send_Buf(0) = 4
Send_Buf(1) = Angulo
Send Send_Buf, 2
End If
Angulo = 0
End Sub

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.2.1.11.

Retrocede_Click

Public Sub Retrocede_Click()


Send_Buf(0) = 2
Send_Buf(1) = velocidad(0)
Send_Buf(2) = velocidad(1)
Send Send_Buf, 3
End Sub

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

Public Sub ScrollGiro_Change()


TextGiro.Text = ScrollGiro.Value
End Sub

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

Public Sub ScrollVelocidad_Change()


TextVelocidad.Text = ScrollVelocidad.Value
End Sub

Esta funcin se activa cuando se hace cambia el valor del ScrollVelocidad.


Cambia el dato del textbox TextVelocidad al valor del scroll.
Esta funcin es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.14.

Funcin sensores_Click

Private Sub sensores_Click()


Sensor.Visible = True
End Sub

Esta funcin se activa cuando se hace clic en el botn sensores. Abre el form
Sensor.

576

GUILLERMO DAVID HERRERO GONZLEZ

7.4.2.1.15.

Funcin TextGiro_Change

Private Sub TextGiro_Change()


If TextGiro.Text Like "#" Or TextGiro.Text Like "##" Then
introducido es un nmero y est dentro del rango permitido
If TextGiro.Text >= 0 Then
If TextGiro.Text <= 60 Then
ScrollGiro.Value = TextGiro.Text
Else
MsgBox "ngulo de giro incorrecto", 0 + 16, "Error"
ScrollGiro.Value = 1
TextGiro.Text = 1
End If
Else
MsgBox "ngulo de giro incorrecto", 0 + 16, "Error"
ScrollGiro.Value = 1
TextGiro.Text = 1
End If
Else
MsgBox "ngulo de giro incorrecto", 0 + 16, "Error"
ScrollGiro.Value = 1
TextGiro.Text = 1
End If
End Sub

'Comprueba que el dato

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

Private Sub TextVelocidad_Change()


Dim dato As Integer
Dim resto As Integer
Dim resHex As String
If TextVelocidad.Text Like "#" Or TextVelocidad.Text Like "##" Or
TextVelocidad.Text Like "###" Then
'Comprueba que el dato introducido es un nmero
If TextVelocidad.Text >= 0 Then
'y est dentro del rango permitido
If TextVelocidad.Text <= 100 Then
ScrollVelocidad.Value = TextVelocidad.Text
dato = TextVelocidad.Text * 5.115 + 511.5
resHex = ""
Do
resto = dato Mod 16
dato = dato \ 16
Select Case resto

577

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

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
Rutina para comprobar el dato enviado
If resHex Like "1??" Then
Send_Buf(2) = 1
Send_Buf(1) = TextVelocidad.Text * 5.115 + 255.5
Else
If resHex Like "2??" Then
Send_Buf(2) = 2
Send_Buf(1) = TextVelocidad.Text * 5.115 - 0.5
Else
If resHex Like "3??" Then
Send_Buf(2) = 3
Send_Buf(1) = TextVelocidad.Text * 5.115 - 256.5
Else
Send_Buf(1) = TextVelocidad.Text * 5.115
Send_Buf(2) = 0
End If
End If
End If
Else
MsgBox "Velocidad incorrecta", 0 + 16, "Error"
ScrollVelocidad.Value = 0
TextVelocidad.Text = 0

579

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Esta funcin se activa cuando cambia el valor del texto de TextVelocidad.


Comprueba que el valor introducido es vlido, si no lo es cambia su valor y el de
ScrollVelocidad a cero y emite un mensaje de error. Si es correcto lo enva al
microcontrolador.
Como el valor de la velocidad se introduce en tantos por cien, hay que
transformarlo a su valor, por eso se multiplica por 10,23 ya que el 100% corresponde
con el valor 1023.
Despus de calcular el valor de la velocidad o, lo que es lo mismo, del
DutyCicle, se transforma a hexadecimal para poder enviar los diez bits del ciclo de
trabajo.
Una vez en hexadecimal, se determina el valor de byte alto y, al valor de la
velocidad se le resta el valor correspondiente al byte alto para calcular el byte bajo.

580

GUILLERMO DAVID HERRERO GONZLEZ

7.4.2.1.17.

Funcin Form_KeyPress

Private Sub Form_KeyPress(KeyAscii As Integer)


Select Case KeyAscii
Case 105:
If Avanza.Enabled = True Then
Avanza_Click
End If
Case 108:
If Avanza.Enabled = True Then
Derecha_Click
End If
Case 107:
If Avanza.Enabled = True Then
Retrocede_Click
End If
Case 106:
If Avanza.Enabled = True Then
Izquierda_Click
End If
Case 122:
If Avanza.Enabled = True Then
Paro_Click
End If
Case 120:
If Avanza.Enabled = True Then
Luces_Click
End If
Case 100:
If Avanza.Enabled = True Then
Claxon_Click
End If
Case 116:
If Avanza.Enabled = True Then
TextVelocidad.Text = TextVelocidad.Text - 5
End If
Case 121:
If Avanza.Enabled = True Then
TextVelocidad.Text = TextVelocidad.Text + 5
End If
Case 102:
If Avanza.Enabled = True Then
TextGiro.Text = TextGiro.Text + 1
End If
Case 103:

581

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

End Select
End Sub

If Avanza.Enabled = True Then


TextGiro.Text = TextGiro.Text - 1
End If

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

GUILLERMO DAVID HERRERO GONZLEZ

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

Form Ajuste Compilado

583

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Objetos Del Form Ajuste


Objeto

Nombre

CommandButton

Izquierda

CommandButton

Derecha

CommandButton

AjDistancia

Timer

Medidas

Timer

TimerDistancia

CommonDialog

CommonDialog

7.4.3.1.

Cdigo Del Form Ajuste

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

Public Sub Derecha_Click()


Send_Buf(0) = 4
Send_Buf(1) = 1
Send Send_Buf, 2
Inicio.Angulo = 0
End Sub

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

GUILLERMO DAVID HERRERO GONZLEZ

7.4.3.1.3.

Funcin Izquierda_Click

Public Sub Izquierda_Click()


Send_Buf(0) = 3
Send_Buf(1) = 1
Send Send_Buf, 2
Inicio.Angulo = 0
End Sub

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

Public Sub AjDistancia_Click()


TimerDistancia.Enabled = True
End Sub

Esta funcin se activa cuando se hace clic en el botn AjDistancia. Activa el


timer TimerDistancia para que ejecute sus instrucciones.

7.4.3.1.5.

Funcin TimerDistancia_Timer

Private Sub TimerDistancia_Timer()


Select Case contador
Case 0:
TimerDistancia.Interval = 1000
MsgBox "Situe un objeto a 10cm", vbInformation + vbOKOnly, "Instrucciones"
i=0
Medidas.Enabled = True
contador = contador + 1
Case 1:
MsgBox "Situe un objeto a 20cm", vbInformation + vbOKOnly, "Instrucciones"
i=1
contador = contador + 1
Case 2:
MsgBox "Situe un objeto a 30cm", vbInformation + vbOKOnly, "Instrucciones"
i=2
contador = contador + 1
Case 3:
MsgBox "Situe un objeto a 40cm", vbInformation + vbOKOnly, "Instrucciones"
i=3

585

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Esta funcin se activa cuando se completa el intervalo del timer TimerDistancia.


El temporizador comienza con un intervalo de 10ms para que, al pulsar el botn,
se active directamente el timer. Depus se cambia el intervalo a 1s para que el programa
haga varias medidas de la misma distancia.

586

GUILLERMO DAVID HERRERO GONZLEZ

Al concluir el periodo, realiza la medida de una distancia dependiendo del valor


de contdor, que se incrementa en cada medida.
La variable i es el ndice del valor de la matriz donde se almacenan las medidas.
En el caso que contador valga 0, se activa el timer Medidas, que es el encargado
de realizar las medidas en intervalos de 50ms.
En el caso que contador valga 8, ya se han realizado todas las medidas de las
distancias soportadas por el sensor. Por eso, los resultados se almacenan en el archivo
distancia.ghg gracias al componente CommonDialog.

7.4.3.1.6.

Funcin Medidas_Timer

Private Sub Medidas_Timer()


Dim lectura(0 To 64) As Byte
Send_Buf(0) = 5
Send Send_Buf, 1
recibir lectura, 3
If DatosDistancia(0, i) <= rec(1) Then
DatosDistancia(0, i) = rec(1)
End If
If DatosDistancia(1, i) <= rec(0) Then
DatosDistancia(1, i) = rec(0)
End If

'Enviamos la orden de leer los sensores

'Almacenamos el byte alto ms alto de los ledos

'Almacenamos el byte bajo ms alto de los ledos

End Sub

Esta funcin se activa cuando se completa el intervalo del temporizador


Medidas. Esta funcin realiza las medidas de cada distancia guardando la mayor, que
ser el valor mximo del intervalo de la medida de la distancia.

587

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.4.

FORM SENSOR

En este form aparecen dibujos indicando el lugar de choque del coche y la


distancia que detecta hasta el prximo obstculo.
Form Sensor Sin Compilar

Form Sensor Compilado

588

GUILLERMO DAVID HERRERO GONZLEZ

Objetos Del Form Ajuste


Objeto

Nombre

Timer

Sensores

Label
Image
Image

Distancia
Imagen
Image1

PictureBox

Derecho

PictureBox

Izquiedo

PictureBox

Trasero

PictureBox

Delantero

PictureBox

Ninguno

7.4.4.1.

Cdigo del Form Ajuste

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

Public Sub Sensores_Timer()


Dim lectura(0 To 64) As Byte
Dim resBin As String
Dim resto As Integer
Dim caracteres As Integer
DoEvents

'Realiza las funciones almacenadas en la pila antes de realizar


'la rutina del temporizador, para no bloquear el microprocesador

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

If rec(0) >= DatosDistancia(1, 0) Then


Distancia.Caption = "Objeto a menos de 10cm"
Else
If rec(0) >= DatosDistancia(1, 1) Then
Distancia.Caption = "Objeto entre 10 y 20cm"
Else
Distancia.Caption = "Objeto entre 20 y 30cm"
End If
End If
Else
If rec(0) >= DatosDistancia(1, 2) Then
Distancia.Caption = "Objeto entre 20 y 30cm"
Else
If rec(0) >= DatosDistancia(1, 3) Then
Distancia.Caption = "Objeto entre 30 y 40cm"
Else
If rec(0) >= DatosDistancia(1, 4) Then
Distancia.Caption = "Objeto entre 40 y 50cm"
Else
If rec(0) >= DatosDistancia(1, 5) Then
Distancia.Caption = "Objeto entre 50 y 60cm"
Else
If rec(0) >= DatosDistancia(1, 6) Then
Distancia.Caption = "Objeto entre 60 y 70cm"
Else
If rec(0) >= DatosDistancia(1, 7) Then
Distancia.Caption = "Objeto entre 70 y 80cm"
Else
Distancia.Caption = "Objeto a ms de 80cm"
End If
End If
End If
End If
End If
End If
End If
End If
'Rutina para saber que sensor est activo
Conversor decimal a binario
resBin = ""
Do
resto = rec(2) Mod 2
rec(2) = rec(2) \ 2
If resto = 0 Then

590

GUILLERMO DAVID HERRERO GONZLEZ

resBin = "0" + resBin


Else
resBin = "1" + resBin
End If
Loop Until rec(2) < 2
If rec(2) = 1 Then
resBin = "1" + resBin
End If
caracteres = Len(resBin)
Select Case caracteres
Case 0
resBin = "0000"
Case 1
resBin = "000" + resBin
Case 2
resBin = "00" + resBin
Case 3
resBin = "0" + resBin
Case 4
resBin = resBin
End Select
If resBin Like "?01?" Then
Imagen.Picture = izquierdo.Picture
Else
If resBin Like "?10?" Then
Imagen.Picture = derecho.Picture
Else
If resBin Like "1???" Then
Imagen.Picture = trasero.Picture
Else
If resBin Like "?11?" Then
Imagen.Picture = delantero.Picture
Else
Imagen.Picture = ninguno.Picture
End If
End If
End If
End If
End Sub

591

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Esta rutina se activa cada 50ms (intervalo de Sensores). Comienza recibiendo la


lectura de los finales de carrera y del sensor de distancia.
Al calibrar el sensor de distancia, se han hallado los intervalos de cada 10cm.
Comparando el dato recibido con el calculado se averigua la distancia del objeto.
Para saber que sensor est activo, el dato recibido se transforma a binario y se
comprueba el valor de cada bit. La nica excepcin es saber si el coche se ha chocado
de frente, por que se tienen que haber activado los finales de carrera 1 y 2.

7.4.5.

FORM COMANDOS

En este form aparece la barra de comandos y los comandos para enviar al


microcontrolador.
Form Comandos Sin Compilar

Form Comandos Compilado

592

GUILLERMO DAVID HERRERO GONZLEZ

Objetos Del Form Comandos


Objeto

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Label

Label6

Index
Caption

Label

Label6

Index
Caption

Label

Label6

Index
Caption

Label

Label6

Index
Caption

7.4.5.1.

Cdigo Del Form Comandos

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

Private Sub Comandos_Click()


Dim i As Integer
For i = 0 To contComando
comando(i) = ""
Next

'Reinicio variables

contComando = 0
Comandos.Text = ""
End Sub

Esta funcin se activa cuando se hace clic en el textBox Comandos. Borra el


texto del textBox y reinicia las variables.

7.4.5.1.3.

Funcin Comandos_KeyPress

Private Sub Comandos_KeyPress(KeyAscii As Integer)


Dim i As Integer
If KeyAscii = 8 Then

'Comprueba si se ha pulsado la
tecla de borrar y borra el caracter anterior

If contComando > 0 Then


contComando = contComando - 1
End If
Else

594

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

Private Sub EnvioComando_Click()


Dim i As Integer
Dim dato As Integer
Select Case comando(0)
Case 1:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Avanza_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case 2:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Retrocede_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case 3:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Izquierda_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If

596

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

MsgBox "Comando no reconocido", 0 + 16, "Error"


End If
Case 8:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Paro_Click
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case 9:
If comando(1) = "" Then
If Inicio.Avanza.Enabled = True Then
Inicio.Menu_Click (1)
Else
MsgBox "El coche est apagado", 0 + 16, "Error"
End If
Else
MsgBox "Comando no reconocido", 0 + 16, "Error"
End If
Case "a":
If comando(1) = "_" Then
If Inicio.Avanza.Enabled = True Then
If comando(4) = "" Then
If comando(3) = "" Then
dato = comando(2)
Inicio.ScrollVelocidad.Value = dato
Else
dato = comando(2) * 10
dato = comando(3) + dato
Inicio.ScrollVelocidad.Value = dato
End If
Else
dato = comando(2) * 100
dato = comando(3) * 10 + dato
If comando(4) > 0 Then
MsgBox "Comando no reconocido", 0 + 16, "Error"
Else
dato = comando(4) + dato
Inicio.ScrollVelocidad.Value = dato

598

GUILLERMO DAVID HERRERO GONZLEZ

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

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

Esta funcin se activa cuando se hace clic en el botn EnvioComando.


Dependiendo del comando pulsado, realiza la funcin que le corresponda.
Antes de realizar cualquier funcin, comprueba que el comando sea correcto, si
no emite un mensaje de error.
Cada comando correcto salta a la funcin definida para el objeto que la active,
por ejemplo, si el comando es el 1 salta a la funcin Avanza_Click del form Inicio.

601

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7.4.5.1.5.

Funcin Form_Unload

Private Sub Form_Unload(Cancel As Integer)


If Inicio.Avanza.Enabled = True Then
Sensor.Sensores.Enabled = True
End If
End Sub

Esta funcin se activa cuando se cierra el form Comandos. Activa el timer


Sensores del form Sensor.

7.5.

DRIVER COCHECITO.INF

Para realizar el driver de la aplicacin, se ha partido del driver del PicUSB


descargado de la pgina www.hobbypic.com.
Este driver, es una adaptacin del de Microchip. La nica diferencia es que, una
vez que el ordenador reconozca el hardware, aparece un icono en el adminisrador de
dispositivos en lugar de una interrogacin.
El archivo .inf sera:
[Version]
Signature="$WINDOWS NT$"
Class=%ClassName%
ClassGuid={4D36E911-E325-11CE-BFC1-08002BE10318}
Provider=%MFGNAME%
DriverVer=03/10/2005,1.0.0.0
CatalogFile=picusb.cat
[DestinationDirs]
DefaultDestDir = 12
PicUSB.ClassCopyFiles = 11
;-----------------------------------------------------------------------------; Class installation sections
;-----------------------------------------------------------------------------[ClassInstall32]
AddReg=PicUSB.ClassReg
CopyFiles=PicUSB.ClassCopyFiles
[PicUSB.ClassReg]
HKR,,,0,%ClassName%
HKR,,Class,,%ClassDesc%
HKR,,Icon,,11
HKR,,Installer32,,"picusbci.dll,PicUSBClassInstaller"

602

GUILLERMO DAVID HERRERO GONZLEZ

[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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

;-----------------------------------------------------------------------------; Windows 98/Me Sections


;-----------------------------------------------------------------------------[DriverInstall]
AddReg=DriverAddReg
CopyFiles=DriverCopyFiles,StubCopyFiles
DriverVer=09/26/2005,1.0.0.0
[DriverAddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,"wdmstub.sys,mchpusb.sys"
[StubCopyFiles]
wdmstub.sys
;-----------------------------------------------------------------------------; String Definitions
;-----------------------------------------------------------------------------[Strings]
MFGNAME="GHG"
INSTDISK="Cochecito ler"
DESCRIPTION="Cochecito ler"
SVCDESC="Coche Device Driver"
ClassName="USB Devices GHG"
ClassDesc="Coche Sample Device"

Las palabras en rojo son los datos que se han modificado.


Darse cuenta de que la identificacin del fabricante y la del dispositivo tiene que
ser la misma.

604

GUILLERMO DAVID HERRERO GONZLEZ

7.6.

CONTROL WIIMOTE

7.6.1.

INTRODUCCIN

El WiiMote es el mando de control de la videoconsola de Nintendo Wii. Este


mando dispone de unos acelermetros que determinan la velocidad y el sentido del
movimiento del mismo; adems, un chip encargado de hacer fotos que, por medio de la
triangulacin, determina si el mando se acerca o se aleja de la fuente de luz y si est
bocarriba o no.
En la aplicacin no se aprovechan estos sensore y se utilizan los botones que
disopone.
La comunicacin con el ordenador se hace por medio de Bluetooth, con lo que
se pueden gobernar el ordenador hasta una distancia aproximada de 10m.

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.

Microcontroladores PIC. Diseo prctico de aplicaciones 2 parte. Angulo


Usategui y otros.
El Bus USB Gua del Desarrollador. Xavier Fernard.
MPLAB C18 C Compiler Libraries. Microchip.
MPLAB C18 C Compiler Getting Started. Microchip.
MPLAB C18 C Compiler Users Guide. Microchip.
MPLAB IDE Users Guide. Microchip.
MPASM Assambler, MPLINK Object Linker, MPLIB Object Librarian Users
Guide. Microchip.
PIC18 Configuration Settings Addendum. Microchip.
PIC18F2455/2550/4455/4550. Datasheet de Microchip.
Cmo programar en C++. Harvey M. Deitel y Paul J. Deitel.
Programacin en Lenguaje C. Mara Luisa Prez Delgado
Universal Serial Bus Specification Revision 2.0. Compac, HP, Intel y otros.
Implementacin de un sistema de desarrollo utilizando los microcontroladores
PIC Microchip Tecnology. Manuel Fernando Campos Cerda, Ramiro Castaeda Prez y
Arturo Csar Contreras Torres.
Curso Programacin en C microcontroladores PIC. Introduccin al MPLAB
C18. Andrs Prieto-Moreno Torres.
Constructopedia. Robotics Invention System 2.0. Lego Mindstorms.
Lego Mindstorm Interfacing. Don Wilcher.
Extreme Mindstorms. An advanced guide to Lego Mindstorms. Dave Baum,
Michael Gasperi, Ralph Hempel y Luis Villa.

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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

GUILLERMO DAVID HERRERO GONZLEZ

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

En este apartado, se realizan los clculos relativos a la modulacin de ancho de


pulso y al tiempo de conversin analgica.

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

En la aplicacin, se desea una resolucin mxima de la onda para poder elegir


entre un mayor nmero de ciclos de trabajo. Con esto, se podr modificar la velocidad
de una forma ms precisa.
La resolucin mxima que admite el microcontrolador son 10bits.
La frecuencia de oscilacin (FOSC) es 1MHz, ya que la configuracin del
oscilador no modifica la onda de la entrada que es un cristal de 4MHz. Como la
frecuencia de oscilacin es la frecuencia de la entrada dividido por 4, obtenemos 1MHz.
Con estos datos, se obtiene una frecuencia del PWM (FPWM) de 975,5625Hz o,
un periodo de 0,001024s.
Una vez obtenido el periodo y eligiendo un prescaler del TMR2 de 1, sin
divisin, obtenemos un valor para PR2 de 255 o, en hexadecimal de FF. Este dato
obtenido, es el que se utiliza en la programacin a la hora activar el PWM2.

1.2.

CONVERSOR A/D

En el captulo del microcontrolador, en el apartado del conversor A/D, se


comenta que el tiempo mnimo de adquisicin es de 2,45s.
En las caractersticas del sensor de distancia, se comenta que necesita un tiempo
de 39ms para realizar una medida.
Al configurar el conversor A/D se elegir el tiempo de adquisicin ms alto
posible aproximndose a los 39ms. Este tiempo de adquisicin es de 20 veces el tiempo
de adquisicin, que sigue siendo del orden de microsegundos por lo que es mucho
menor que el tiempo del sensor.

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

Placa fotopositiva de 80x100mm

Proyecto: Conexin al puerto USB mediante un microcontrolador


Emplazamiento: E.T.S.I.I. de Bjar

Fecha: Junio 2007

Plano: Chasis

Escala: 1:2

Peticionario: Departamento de tecnologa aplicada


N de Plano: 4

Ingeniero: Guillermo David Herrero Gonzlez

D. PLIEGO DE CONDICIONES

639

1. PLIEGO
DE
CONSTRUCTIVAS
1.1.

CONDICIONES

ESPECFICAS

DESCRIPCIN DEL PRODUCTO

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

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

travs de la mscara. Este proceso se puede hacer mediante una


mquina insoladora.
Estas mquinas llevan lmparas fluorescentes que irradian
luz actnica, una vez alineado el conjunto mscara-placa y pegado
por las esquinas con papel celofn, se coloca en la mquina, que
lleva una bomba que permite hacer el vaco entre dos planchas
transparentes para que la imagen a transferir est en estrecho
contacto con la emulsin fotosensible del cobre de la placa.
El tiempo de insolacin en la mquina suele durar entre 3 y
5 minutos, dependiendo del tipo de lmpara y del tipo de placa.
b) Revelado: cosiste en la disolucin de la zona de emulsin
debilitada por la accin de la luz, en este caso sern las zonas
insoladas.
El revelado se realizar con una disolucin de 1 litro de
agua con una base disuelta como sosa custica o hidrxido sdico
(NaOH) o cloruro frrico.
La forma de realizar el revelado es moviendo la placa de
una forma lenta pero constante dentro de una cubeta de plstico
con la disolucin anterior. Esto se puede hacer introduciendo la
placa en el lquido y moviendo la cubeta, o sujetando la placa con
una pinza de plstico por un extremo y haciendo movimiento de
vaivn.
El tiempo de revelado depende de la temperatura del agua y
de la concentracin de la base.
La fase de revelado concluye cuando se vea ntidamente el
dibujo del circuito sobre la placa, que se sacar de la cubeta, se
lavar con agua y ya quedar lista para el atacado o el grabado.
c) Grabado y atacado: este proceso consiste en eliminar el cobre
descubierto en el revelado el tiempo de grabado suele ser de 2
minutos y se ha ce en una cubeta al igual que el revelado que debe
ser de plstico para no ser atacada por el cido.
Se utiliza para el atacado el siguiente compuesto: 100
gramos de agua, 100 gramos de agua oxigenada de 110 volmenes,
y 200 gramos de cido clorhdrico rebajado.
El proceso de grabado tambin es visible, al igual que el de
revelado. Una vez concluido se lava la placa con agua, se seca y se
elimina la emulsin de encima de las pistas de cobre que han
quedado, frotando con un papel humedecido en alcohol.
d) Taladrado: una vez terminados los tres procesos anteriores se
puede aplicar un barniz que evita que el cobre se oxide y facilita el
proceso de soldadura, y posteriormente se procede a hacer los
taladros en los nodos para poder insertar los componentes.
Se marcarn todos los nodos sobre el cobre de la placa con
un punzn, ejerciendo una cierta presin hasta que quede una

640

GUILLERMO DAVID HERRERO GONZLEZ

muesca. Conviene utilizar un banco con un brazo o soporte vertical


que sujete el taladro, para evitar vibraciones y desplazamientos.
Para los componentes con terminales finos se utilizar una broca
de 1mm, para los terminales gruesos una de 1,5 mm y para los
taladros de sujecin de la placa, una de 3,5 o 4 mm. Por ltimo, se
revisar la placa comparndola con el clich, por si se ha olvidado
hacer algn taladro.
e) Soldadura: Se emplea hilo de aleacin Sn-Pb al 60% de estao y
al 40 % de plomo, que lleva incorporada otra sustancia llamada
flux, que sirve para facilitar la soldadura.
Este proceso se lleva a cabo, una vez insertados los
componentes en sus nodos, con una herramienta llamada soldador,
que se conecta a la red elctrica y mediante una resistencia calienta
la punta.
El orden de soldado es:
1. Los puentes, realizndolos con sobrantes de los
terminales, puentes o cable de entre 0,5mm y 1mm
2. Zcalos
3. Resistencias
4. Condensadores
5. Resto de componentes
6. Conectores
Para realizar la soldadura, es necesario aplicar calor con la
punta del soldador a las dos superficies a unir, aplicando el hilo de
estao en la unin que ya estar caliente. El estao se fundir y
fluir por toda la zona gracias a la resina que lleva incorporada.
Posteriormente, se dejar enfriar procurando no mover la zona
soldada hasta que se alcance la temperatura ambiente. Por ltimo,
una buena soldadura presenta un aspecto uniforme y brillante,
envuelve todo el nodo y el terminal correspondiente dejando ver su
forma.
Despus de realizar la soldadura hay que cortar los
terminales del extremo sobrante para correspondiente conexin.
f) Compilado y programado: Se procede a compilar el firmware del
microcontrolador con el compilador MPLAB C18 y la
programacin del mismo con un programador de
microcontroladores y el software WinPic 800.
g) Ensamblado: El ltimo paso para la realizacin de la palca es la
introduccin de los integrados en sus respectivos zcalos y la
conexin de los componentes externos en sus respectivos
conectores.

641

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Fases para la obtencin del chasis:


a) Corte: El corte del metacrilato se realizar por medio de una sierra
mecnica o manual de metal. Siguiendo los planos.
b) Taladrado: El taladrado se realizar por medio de una taladradora
con broca para metal segn lo indicado en los planos.
c) Ensamblado: la unin de las piezas se realizar con pegamento
rpido para metacrilato y tornillos de distintos tipos, siguiendo las
indicaciones de los planos. Antes de introducir un tirafondo habr
que realizar un agujero con el taladro de un dimetro inferior al del
tornillo.
Unin de la placa al chasis mediante los separadores y tornillos M3.
Conexin de los motores y sensores a la placa.
Comprobacin del correcto funcionamiento:
9 Si al mandar la instruccin de avanzar o retroceder, una rueda se
mueve en un sentido y la otra en el contrario, hay que cambiar los
polos del motor de la rueda que gire en el sentido contrario a la
orden correspondiente.
9 Si al mandar la orden de avanzar o retroceder, el coche se mueve
en el otro sentido, se pueden cambiar los polos de las dos ruedas o,
en el firmware intercambiar el nombre de las instrucciones,
Mdelante se llamara Mdetras y al contrario.
Si se ha modificado el firmware, se compila y se programa
el microcontrolador.
9 Si al mandar la orden de giro a la izquierda o a la derecha, el coche
gira en sentido contrario, hay que cambiar el nombre de las
funciones del firmware, Giroder pasara a llamarse Giroizq y al
contrario.
Una vez modificado el firmware, se compila y se programa
el microcontrolador.

642

GUILLERMO DAVID HERRERO GONZLEZ

1.3.

PLAZOS Y ORDEN DE EJECUCIN


1. Diseo de placas de circuito impreso mediante programa informtico
Proteus.
2. Impresin del diseo en papel vegetal para su posterior tratado mediante
impresora lser o de inyeccin.
3. Exposicin a la luz actnica de la placa presensibilizada a travs de mscara,
mediante una insoladora.
4. Revelado de la placa mediante una disolucin de 1 litro de agua con una
base o con NaOH y posterior limpieza con chorro de arena.
5. Eliminacin del cobre descubierto en el revelado mediante una
concentracin de agua y cido clorhdrico.
6. Aplicacin de barniz que evita que el cobre se oxide y facilite el proceso de
soldadura.
7. Marcado de todos los nodos sobre el cobre de la placa.
8. Taladrado de la placa con una broca de 1mm o de 1,5mm para terminales
gruesos.
9. Colocacin de los componentes en los nodos de las placas.
10. Soldadura de los componentes a la placa mediante hilo de aleacin Sn-Pb al
60% de Sn y al 40% de Pb.
11. Corte del extremo sobrante del terminal del componente.
12. Realizacin de pruebas.
13. Corte del metacrilato para el chasis.
14. Taladro del metacrilato con brocas con el tamao indicado en los planos.
15. Unin de las piezas de metacrilato segn lo indicado en los planos.
16. Unin de la placa al chasis mediante separadores metlicos.
17. Conexin de los motores y sensores.
18. Prueba del montaje total.

643

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

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.

5. Gafas de seguridad cmodas y ligeras, disponen de una moldura de PVC


suave y de unos cristales de policarbonato. Tienen la homologacin 2092
nivel 1, proporcionan proteccin contra el polvo, salpicadura de sustancias
qumicas y metal fundido.
6. Guantes para soldadura TIG en cuero mordiente, con una manopla de cuero
al cromo que ofrece gran libertad de movimientos sin dejar de proporcionar
una proteccin completa.
7. Punzn para pistas. Para utilizarlo con placas de pistas. Proporciona un
mtodo simple de interrumpir las pistas de cobre. Despus de introducir el
punzn, girar dentro del orificio en el punto donde se requiera interrumpir la
pista. Unas pocas vueltas en el sentido de las agujas del reloj producen un
corte limpio.
8. Juego de brocas acero.
9. Soldador de 40W con punta normal. Su calentamiento es permanente y
posee una alta inercia trmica. Tanto en el momento de la soldadura como en
las pausas de esta labor, el soldador permanece conectado a la corriente
elctrica. Resulta adecuado para trabajos repetitivos y numerosos.
10. Carrete de hilo de estao-plomo con una proporcin del 60%-40%
respectivamente.
11. Flux en frasco de 20ml con pincel exento de residuos.

644

GUILLERMO DAVID HERRERO GONZLEZ

1.4.2.

MATERIALES PARA LA REALIZACIN DE LA PLACA


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

Placa fotosensibilizada para fabricacin de PCBs de una cara de 80x100mm


Microinterruptores conmutadores de tipo Final de Carrera
Diodos de potencia: 1N4007
Driver: ULN2803
Driver: U293D
Condensador electroltico de 47F y 25V
Condensadores cermico de 27pF y 100nF
Condensador cermico de 100nF
Resistencias de 1/4W de 1K y 10K
Diodo LED bicolor de tres terminales
Diodos LED rojo superbrillantes
Motores de corriente continua de 5V con su reductora
Motor Paso a Paso bipolar de 5V con su reductora
Cristal de cuarzo de 4MHz
Zumbador de 5V
Sensor de distancia tipo GP2Y0A21YK
Bombillas
Conectores de 2 y 3 terminales
Conector USB tipo B hembra para circuito impreso
Zcalo de perfil bajo estaado: 16, 18 y 28 pines
Separadores hexagonales metlicos

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

MATERIALES PARA LA REALIZACIN DEL CHASIS


1.
2.
3.
4.
5.
6.
7.

Metacrilato
Engranajes
Pegamento rpido para metacrilato
Ejes de acero
Ruedas de caucho sinttico
Arandelas de acero
Anillas de retencin

645

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

1.5.

REALIZACIN DE LAS PRUEBAS

Se realizarn ensayos de funcionamiento de sistema de forma parcial; en ellas


hay que comprobar su funcionamiento para el sistema dentro del rango determinado de
funcionamiento.
Posteriormente, se realizarn pruebas con el sistema global de funcionamiento.
Gracias a ello se podr determinar el correcto funcionamiento del sistema global.

646

E. PRESUPUESTO

649

1.

PRESUPUESTO DE LA PARTE ELCTRICA

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

Unidades Precio Unitario Precio Total


8
0,07
0,56
1
0,80
0,80
2
0,50
1,00
2
0,03
0,06
3
0,03
0,09
2
0,08
0,16
1
0,09
0,09
1
0,12
0,12
2
5,54
11,08
1
29,27
29,27
1
0,84
0,84
1
0,56
0,56
1
3,61
3,61
1
9,58
9,58
1
2,70
2,70
3
2,55
7,65
1
19,53
19,53
2
0,38
0,76
6
0,24
1,44
6
0,60
3,60
1
1,55
1,55
1
4,45
4,45
4
0,27
1,08
1
2,70
2,70
1
2,70
2,70
1
0,81
0,81
8
0,84
6,72
1
14,75
14,75
1
0,26
0,26
1
0,14
0,14
1
0,11
0,11
128,77
Total sin I.V.A.
20,61
16% IVA
149,38
Total ()

CONEXIN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2.

PRESUPUESTO DE LA PARTE MECNICA

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

Unidades Precio Unitario Precio Total


1
9,00
9,00
1
10,00
10,00
1
12,00
12,00
1
12,00
12,00
1
15,00
15,00
1
1,75
1,75
16
0,30
4,80
8
0,30
2,40
6
0,30
1,80
68,75
Total sin I.V.A.
11,00
16% IVA
Total ()

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

El objetivo principal del proyecto es la comunicacin mediante el puerto USB de


un microcontrolador y el ordenador.
Dado que este tema es muy actual (la familia de PICs sali al mercado en abril
del pasado ao), existe muy poca informacin en espaol de este tema, tanto para el
micro como para el ordenador.
El proceso de bsqueda de informacin ha sido muy largo y con el impedimento
del idioma. Adems, la necesidad de aprender otro lenguaje de programacin para el
microcontrolador que, aunque no sea el mejor, es el nico con una versin gratuita.
Para el desarrollo del firmware, se ha encontrado muchos ejemplos en lenguaje
CCS, otro tipo de C para microcontroladores, se ha intentado adaptar al C18 ya que el
CCS tiene unas libreras ms sencillas para desarrollar aplicaciones con el USB. Como
no se logr, se estudi la norma USB2.0 para entender mejor los pasos para configurar
el puerto USB del microcontrolador ya que el fabricante no cede muchas instrucciones
de cmo hacerlo.
Una vez entendido los pasos, partiendo de los ejemplos de Microchip, se
estudiaron todas las libreras para saber que hay que modificar para desarrollar una
comunicacin adaptada a cada aplicacin.
Una vez lograda la comunicacin del micro con el ordenador se tuvo que realizar
otra en sentido contrario, del ordenador al microcontrolador. Por los motivos expuestos
anteriormente, se estudi la librera MPUSBAPI.dll en otros lenguajes de programacin
como el Delphi.
Al conseguir comunicar el ordenador con el microcontrolador por medio del
Visual Basic, se observ que no se puede realizar la conexin sin trabajar con punteros.
Esto fue novedoso ya que el VB no se desarroll para trabajar con este tipo de variables.
Al lograr la comunicacin bidireccional, se desarroll el coche para demostrar
de una forma visible que la transmisin de datos es real y no se est simulando.
Como conclusin de este trabajo fin de carrera, comentar las experiencias
obtenidas del autor:
Conocer el puerto USB y sus caractersticas.
Aprender un nuevo lenguaje de programacin de PICs.
Ampliar los conocimientos del Visual Basic.
Conocer la gama mejorada de los PICs con todas sus novedades y
mejoras.
Ampliar los conocimientos en redes informticas.

Por ltimo, agradecer al tutor D. Jos Torreblanca Gonzlez su aceptacin y


tutela de este trabajo fin de carrera.

También podría gustarte