CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

655
UNIVERSIDAD DE SALAMANCA E.T.S. DE INGENIERÍA INDUSTRIAL DE BÉJAR DEPARTAMENTO DE FÍSICA APLICADA ÁREA DE TECNOLOGÍA ELECTRÓNICA TRABAJO FIN DE CARRERA CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR AUTOR: GUILLERMO DAVID HERRERO GONZÁLEZ TUTOR: JOSÉ TORREBLANCA GONZÁLEZ BÉJAR, JUNIO 2007

description

CONEXIÓN AL PUERTO USBMEDIANTE UNMICROCONTROLADOR

Transcript of CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Page 1: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

UNIVERSIDAD DE SALAMANCA E.T.S. DE INGENIERÍA INDUSTRIAL DE BÉJAR

DEPARTAMENTO DE FÍSICA APLICADA ÁREA DE TECNOLOGÍA ELECTRÓNICA

TRABAJO FIN DE CARRERA

CONEXIÓN AL PUERTO USB MEDIANTE UN

MICROCONTROLADOR AUTOR: GUILLERMO DAVID HERRERO GONZÁLEZ TUTOR: JOSÉ TORREBLANCA GONZÁLEZ

BÉJAR, JUNIO 2007

Page 2: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 3: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

UNIVERSIDAD DE SALAMANCA E.T.S. DE INGENIERÍA INDUSTRIAL DE BÉJAR

DEPARTAMENTO DE FÍSICA APLICADA ÁREA DE TECNOLOGÍA ELECTRÓNICA

TRABAJO FIN DE CARRERA

CONEXIÓN AL PUERTO USB MEDIANTE UN

MICROCONTROLADOR AUTOR: GUILLERMO DAVID HERRERO GONZÁLEZ TUTOR: JOSÉ TORREBLANCA GONZÁLEZ

BÉJAR, JUNIO 2007

Page 4: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 5: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

D. Guillermo David Herrero González, autor del presente proyecto, comparte su autoría con su tutor D. José Torreblanca González, para los efectos que pudieran derivarse de su utilización para posteriores trabajos o proyectos fin de carrera.

Por lo tanto, tiene toda la autorización para poder reproducir, copiar y modificar dicho proyecto.

Béjar, Junio de 2007.

Fdo: D. Guillermo David Herrero González

Page 6: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 7: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

v

ÍNDICE A. MEMORIA 1. Introducción_______________________________________________ 29

1.1. Objeto _____________________________________________________ 29 1.2. Descripción _________________________________________________ 29

1.2.1. Capítulo 2: Nociones Básicas De La Norma USB 2.0 ____________________30 1.2.2. Capítulo 3: Microcontroladores______________________________________30 1.2.3. Capítulo 4: Lenguaje De Programación C18____________________________30 1.2.4. Capítulo 5: Lenguaje De Programación Visual Basic _____________________30 1.2.5. Capítulo 6: Interconexión USB-PC___________________________________31 1.2.6. Capítulo 7: Aplicación_____________________________________________31 1.2.7. Cálculos________________________________________________________32 1.2.8. Planos _________________________________________________________32 1.2.9. Pliego De Condiciones ____________________________________________32 1.2.10. Condiciones ____________________________________________________32

2. Nociones Básicas De La Norma USB 2.0________________________ 35 2.1. Introducción ________________________________________________ 35

2.1.1. Motivación _____________________________________________________35 2.2. Vocabulario ________________________________________________ 36 2.3. Historia ____________________________________________________ 38

2.3.1. Utilización Prevista _______________________________________________38 2.4. Arquitectura________________________________________________ 39

2.4.1. Descripción Del Sistema USB_______________________________________39 2.4.2. Arquitectura Del Bus______________________________________________39 2.4.3. Interfaz Física ___________________________________________________40

2.4.3.1. Aspecto Eléctrico _____________________________________________40 2.4.3.2. Alimentación ________________________________________________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. Detección De Errores __________________________________________42 2.4.3.8. Gestión De Errores ____________________________________________42 2.4.3.9. Configuración 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. Asignación De La Banda De Paso _______________________________44 2.4.3.16. USB Device ________________________________________________44 2.4.3.17. Características De Un Periférico ________________________________44

2.5. Formatos De Los Paquetes ____________________________________ 45 2.5.1. Token__________________________________________________________45 2.5.2. Token Especial: Transacción Split ___________________________________45

2.5.2.1. Transacciones Split____________________________________________46 2.5.2.2. Paquetes Start-Of-Frame (SOF) __________________________________48

Page 8: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

vi

2.6. Estados Del USB ____________________________________________ 49 2.6.1. Por Defecto _____________________________________________________50 2.6.2. Direccionado ____________________________________________________51 2.6.3. Configuración ___________________________________________________51

2.7. Enumeración Del Bus ________________________________________ 51 3. Microntroladores ___________________________________________ 55

3.1. Introducción A Los Microcontroladores _________________________ 55 3.1.1. Controlador Y Microcontrolador_____________________________________55 3.1.2. Diferencia Entre Microprocesador Y Microcontrolador ___________________56 3.1.3. Aplicaciones De Los Microcontroladores ______________________________57 3.1.4. El Mercado De Los Microcontroladores _______________________________58

3.2. ¿Qué Microcontrolador Emplear?______________________________ 59 3.2.1. Recursos Comunes A Todos Los Microcontroladores ____________________61

3.2.1.1. Arquitectura Básica ___________________________________________61 3.2.1.2. El Procesador O CPU__________________________________________62 3.2.1.3. Memoria ____________________________________________________62 3.2.1.4. ROM Con Máscara____________________________________________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 Guardián O “Watchdog”___________________________________66 3.2.2.3. Protección Ante Fallo De Alimentación 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 Analógico ________________________________________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 Comunicación _____________________________________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 Elección __________________________ 69 3.3.1. Características Relevantes__________________________________________70

3.3.1.1. Arquitectura _________________________________________________70 3.3.1.2. Segmentación ________________________________________________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 Económicas____________________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 Básica: PIC16C5X Con Instrucciones De 16bits__________74 3.3.2.3. Gama Media. PIC16CXXX Con Instrucciones De 16bits ______________76

Page 9: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

vii

3.3.2.4. Gama Alta: PIC17CXXX Con Instrucciones De 16bits________________77 3.3.2.5. Gama Mejorada: PIC18FXXXX _________________________________78

3.4. Familia PIC18Fxx5x _________________________________________ 79 3.4.1. Diagrama de Pines________________________________________________79 3.4.2. Perspectiva General Del Dispositivo__________________________________81 3.4.3. Configuración 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 Cerámicos ______________________________92 3.4.3.2.3. Señal 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. Configuración 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 Energía En Varias Fuentes De Reloj ____________________________________________103 3.4.3.6. Retraso En El Inicio __________________________________________104

3.4.4. Modos De Control De Energía _____________________________________105 3.4.4.1. Seleccionar Los Modos De Control De Energía_____________________106

3.4.4.1.1. Fuentes Del Reloj ________________________________________106 3.4.4.1.2. Comienzo De Los Modos De Control De Energía _______________106 3.4.4.1.3. Transiciones De Reloj Y Puntero De Estado ___________________107 3.4.4.1.4. Múltiples Comandos SLEEP _______________________________107

3.4.4.2. Modos De Ejecución _________________________________________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 Interrupción ________________________________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 Tensión (POR) _____________________________119 3.4.5.4. Reset Por Cese De Tensión (BOR)_______________________________120

3.4.5.4.1. Software Que Activa El BOR_______________________________120 3.4.5.4.2. Detección 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

Page 10: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

viii

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. Organización De La Memoria______________________________________123

3.4.6.1. Organización De La Memoria De Programa _______________________124 3.4.6.1.1. Contador De Programa ____________________________________125 3.4.6.1.2. Devolver La Dirección De La Pila ___________________________125 3.4.6.1.3. Pila De Almacenamiento Rápido ____________________________128 3.4.6.1.4. Operaciones De Búsqueda En Las Tablas De Memoria De Programa ____________________________________129

3.4.6.2. Ciclos Instrucción En Los PIC18 ________________________________130 3.4.6.2.1. Esquema De Reloj _______________________________________130 3.4.6.2.2. Instrucción 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. Organización 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 Propósito General ___________________136 3.4.6.3.5. Registros De Función Específica ____________________________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. Límites 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. Verificación De La Escritura _______________________________158 3.4.7.5.3. Finalización Inesperada De La Operación 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. Verificación De La Escritura ___________________________________162 3.4.8.5. Operación Con Código De Protección ____________________________162

Page 11: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

ix

3.4.8.6. Protección 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. Introducción ________________________________________________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. Interrupción TMR0__________________________________________181 3.4.10.9. Interrupción Al Cambiar PORTB_______________________________181 3.4.10.10. Almacenamiento De Datos Durante La Interrupción _______________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. Módulo 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. Conmutación En La Asignación Del Prescaler_________________203 3.4.12.4. Interrupción Timer0 _________________________________________203

3.4.13. Módulo 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. Opción De Baja Potencia Timer1 ___________________________209 3.4.13.3.3. Consideraciones Del Layout Del Oscilador Timer1_____________209

3.4.13.4. Interrupción 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. Módulo Timer2 ________________________________________________213 3.4.14.1. Operaciones Del Timer2______________________________________214 3.4.14.2. Interrupción Timer2 _________________________________________215 3.4.14.3. Salida Del TMR2 ___________________________________________215

3.4.15. Módulo Timer3 ________________________________________________216 3.4.15.1. Operaciones Del Timer3______________________________________218 3.4.15.2. Modo De Lectura/Grabación De 16bit ___________________________218 3.4.15.3. Usar El Oscilador Timer1 como Fuente De Reloj Timer3 ____________219 3.4.15.4. Interrupción Timer3 _________________________________________219 3.4.15.5. Reset Del Timer3 usando El Disparador Especial De Acontecimientos Del CCP _________________________________220

3.4.16. Módulos Captura/Comparación/PWM (CCP) _________________________221 3.4.16.1. Configuración Del Módulo CCP _______________________________222

3.4.16.1.1. Recursos De Los Módulos CCP Y Del Temporizador ___________222 3.4.16.1.2. CCP2 Asignación De Pin _________________________________223

Page 12: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

x

3.4.16.2. MODO CAPTURA _________________________________________224 3.4.16.2.1. Configuración Del Pin CCP _______________________________224 3.4.16.2.2. Selección De Modo Timer1/Timer3 _________________________224 3.4.16.2.3. Interrupción Por Software_________________________________224 3.4.16.2.4. CCP Prescaler__________________________________________224

3.4.16.3. Modo Comparación _________________________________________225 3.4.16.3.1. Tipo De Conexión CCP __________________________________225 3.4.16.3.2. Selección De Modo Timer1/Timer3 _________________________226 3.4.16.3.3. Modo De Interrupción 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. Configuración Del PWM _________________________________230

3.4.17. Módulo Mejorado De Captura/Comparación/PWM (ECCP)______________232 3.4.17.1. Salidas Y Configuración Del ECCP_____________________________232

3.4.17.1.1. Recursos Del Temporizador Y Módulo ECCP_________________232 3.4.17.2. Modos Captura Y Comparación________________________________234

3.4.17.2.1. Disparador De Acontecimiento Especial _____________________234 3.4.17.3. El Modo Estándar 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 Energía______________248 3.4.17.4.11. Efectos De Un Reset____________________________________249

3.4.18. Bus Serie Universal (USB) _______________________________________250 3.4.18.1. Descripción Del Periférico 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 Configuración 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 Dirección Del USB (UADDR) ___________________261 3.4.18.2.6. Registros Del Número 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 Configuración De Los BD ________________________264 3.4.18.4.2. Byte De Cuenta De BD___________________________________268 3.4.18.4.3. Validación De La Dirección 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

Page 13: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xi

3.4.18.6. Modos De Energía Del USB __________________________________279 3.4.18.6.1. Sólo Energía En El Bus __________________________________279 3.4.18.6.2. Sólo Self-Power ________________________________________279 3.4.18.6.3. Energía 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. Descripción 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. Energía _______________________________________________283 3.4.18.9.5. Enumeración___________________________________________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. Configuración 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. Módulo Convertidor De 10-Bit Analógico A Digital (A/D) ______________294 3.4.20.1. Requisitos De La Adquisición A/D _____________________________300 3.4.20.2. Seleccionar Y Configuración El Tiempo De Adquisición Tiempo _____301 3.4.20.3. Seleccionar El Reloj De Conversión A/D ________________________302 3.4.20.4. Operación En Los Modos De Ahorro De Energía __________________303 3.4.20.5. Configuración De Los Pines De Los Puertos Analógicos ____________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. Módulo Comparador ____________________________________________307 3.4.21.1. Configuración Del Comparador ________________________________309 3.4.21.2. Operaciones Del Comparador _________________________________309 3.4.21.3. Referencia Del Comparador___________________________________309

3.4.21.3.1. Señal De Referencia Externa ______________________________310 3.4.21.3.2. Señal 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 Conexión De Las Entradas Analógicas _______312

3.4.22. Módulo Comparador De Tensión De Referencia_______________________314 3.4.22.1. Configuración Del Módulo Comparador De Tensión De Referencia____314 3.4.22.2. Exactitud/Error De La Tensión De Referencia_____________________316 3.4.22.3. Operación En Modo SLEEP___________________________________316 3.4.22.4. Efectos De Un Reset_________________________________________316 3.4.22.5. Consideraciones De La Conexión ______________________________317

3.4.23. Detector De Alta/Baja Tensión (HLVD) _____________________________318

Page 14: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xii

3.4.23.1. Operación _________________________________________________319 3.4.23.2. Configuración Del HLVD ____________________________________320 3.4.23.3. Consumición 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. Características Especiales De La CPU_______________________________324 3.4.24.1. Bits De Configuración _______________________________________325 3.4.24.2. Temporizador Del Perro Guardián (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 Guardián ___________________341 3.4.24.4.2. Salir De La Operación A Prueba De Fallos ___________________341 3.4.24.4.3. Interrupciones De FSCM Dentro De Los Modos De Ahorro De Energía ____________________________________________342 3.4.24.4.4. POR O Reinicio Del Sleep ________________________________342

3.4.24.5. Verificación Del Programa Y Código De Protección________________343 3.4.24.5.1. Memoria De Programa Código De Protección _________________345 3.4.24.5.2. Datos EEPROM Código De Protección ______________________347 3.4.24.5.3. Configuración Del Registro De Protección ___________________347

3.4.24.6. Localizaciones De Identificación _______________________________347 3.4.24.7. Programación Serie In-Circuit _________________________________347 3.4.24.8. Depuración In-Circuit________________________________________347 3.4.24.9. Características Especiales De Icport (Señalando Paquetes Solamente) __348

3.4.24.9.1. Puerto Dedicado ICD/ICSP _______________________________348 3.4.24.9.2. Emulación De 28 Pines___________________________________349

3.4.24.10. Suministro Único De La Programación ICSP ____________________349 3.5. Fuses De Programación 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 Tensión (BOR): ______________353 3.5.1.9. Bits De Tensión BOR: ________________________________________353 3.5.1.10. Bit De Permiso Del Regulador De Tensión 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 Código De Protección En El Bloque 0: ____________________356

Page 15: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xiii

3.5.1.22. Bit Del Código De Protección En El Bloque 1: ____________________356 3.5.1.23. Bit Del Código De Protección En El Bloque 2: ____________________356 3.5.1.24. Bit Del Código De Protección En El Bloque De Inicio:______________356 3.5.1.25. Bit Del Código De Protección En La EEPROM De Datos: ___________356 3.5.1.26. Bit De Protección Contra Escritura 0: ___________________________356 3.5.1.27. Bit De Protección Contra Escritura 1: ___________________________356 3.5.1.28. Bit De Protección Contra Escritura 2: ___________________________357 3.5.1.29. Bit De Protección Contra Escritura En El Bloque De Inicio:__________357 3.5.1.30. Bits De Protección Contra Escritura En Los Registros De Configuración: __________________________________________357 3.5.1.31. Bits De Protección Contra Escritura En La EEPROM De Datos: ______357 3.5.1.32. Bit De Protección De La Lectura De Tabla Del Bloque 0:____________357 3.5.1.33. Bit De Protección De La Lectura De Tabla Del Bloque 1:____________357 3.5.1.34. Bit De Protección De La Lectura De Tabla Del Bloque 2:____________358 3.5.1.35. Protección 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 Tensión (BOR): ______________360 3.5.2.9. Bits De Tensión BOR: ________________________________________360 3.5.2.10. Bit De Permiso Del Regulador De Tensión 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 Código De Protección En El Bloque 0: ____________________362 3.5.2.22. Bit Del Código De Protección En El Bloque 1: ____________________363 3.5.2.23. Bit Del Código De Protección En El Bloque 2: ____________________363 3.5.2.24. Bit Del Código De Protección En El Bloque 3: ____________________363 3.5.2.25. Bit Del Código De Protección En El Bloque De Inicio:______________363 3.5.2.26. Bit Del Código De Protección En La EEPROM De Datos: ___________363 3.5.2.27. Bit De Protección Contra Escritura 0: ___________________________363 3.5.2.28. Bit De Protección Contra Escritura 1: ___________________________363 3.5.2.29. Bit De Protección Contra Escritura 2: ___________________________364 3.5.2.30. Bit De Protección Contra Escritura 3: ___________________________364 3.5.2.31. Bit De Protección Contra Escritura En El Bloque De Inicio:__________364 3.5.2.32. Bits De Protección Contra Escritura En Los Registros De Configuración: __________________________________________364 3.5.2.33. Bits De Protección Contra Escritura En La EEPROM De Datos: ______364 3.5.2.34. Bit De Protección De La Lectura De Tabla Del Bloque 0:____________364 3.5.2.35. Bit De Protección De La Lectura De Tabla Del Bloque 1:____________365 3.5.2.36. Bit De Protección De La Lectura De Tabla Del Bloque 2:____________365 3.5.2.37. Bit De Protección De La Lectura De Tabla Del Bloque 3:____________365

Page 16: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xiv

3.5.2.38. Protección 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 Tensión (BOR): ______________368 3.5.3.9. Bits De Tensión BOR: ________________________________________368 3.5.3.10. Bit De Permiso Del Regulador De Tensión 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 Programación (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 Código De Protección En El Bloque 0: ____________________371 3.5.3.23. Bit Del Código De Protección En El Bloque 1: ____________________371 3.5.3.24. Bit Del Código De Protección En El Bloque 2: ____________________371 3.5.3.25. Bit Del Código De Protección En El Bloque De Inicio:______________371 3.5.3.26. Bit Del Código De Protección En La EEPROM De Datos: ___________371 3.5.3.27. Bit De Protección Contra Escritura 0: ___________________________371 3.5.3.28. Bit De Protección Contra Escritura 1: ___________________________371 3.5.3.29. Bit De Protección Contra Escritura 2: ___________________________372 3.5.3.30. Bit De Protección Contra Escritura En El Bloque De Inicio:__________372 3.5.3.31. Bits De Protección Contra Escritura En Los Registros De Configuración: __________________________________________372 3.5.3.32. Bits De Protección Contra Escritura En La EEPROM De Datos: ______372 3.5.3.33. Bit De Protección De La Lectura De Tabla Del Bloque 0:____________372 3.5.3.34. Bit De Protección De La Lectura De Tabla Del Bloque 1:____________372 3.5.3.35. Bit De Protección De La Lectura De Tabla Del Bloque 2:____________373 3.5.3.36. Protección 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 Tensión (BOR): ______________375 3.5.4.9. Bits De Tensión BOR: ________________________________________375 3.5.4.10. Bit De Permiso Del Regulador De Tensión 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

Page 17: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xv

3.5.4.14. Bit De Permiso De La Potencia Del Oscilador Timer 1: _____________376 3.5.4.15. Bit De Permiso PORTB A/D:__________________________________377 3.5.4.16. CCP2 MUX Bit: ____________________________________________377 3.5.4.17. Bit De Permiso Del Reset Por Llenado/Vaciado De La Pila:__________377 3.5.4.18. Bit De Permiso Del ICSP: ____________________________________377 3.5.4.19. Bit De Permiso Del Debug En-Circuito/Puerto De Programación (ICPORT):_____________________________________377 3.5.4.20. Bit De Permiso Del Juego De Instrucciones Extendido: _____________377 3.5.4.21. Bit De Permiso Del Debugger Oculto:___________________________377 3.5.4.22. Bit Del Código De Protección En El Bloque 0: ____________________378 3.5.4.23. Bit Del Código De Protección En El Bloque 1: ____________________378 3.5.4.24. Bit Del Código De Protección En El Bloque 2: ____________________378 3.5.4.25. Bit Del Código De Protección En El Bloque 3: ____________________378 3.5.4.26. Bit Del Código De Protección En El Bloque De Inicio:______________378 3.5.4.27. Bit Del Código De Protección En La EEPROM De Datos: ___________378 3.5.4.28. Bit De Protección Contra Escritura 0: ___________________________378 3.5.4.29. Bit De Protección Contra Escritura 1: ___________________________379 3.5.4.30. Bit De Protección Contra Escritura 2: ___________________________379 3.5.4.31. Bit De Protección Contra Escritura 3: ___________________________379 3.5.4.32. Bit De Protección Contra Escritura En El Bloque De Inicio:__________379 3.5.4.33. Bits De Protección Contra Escritura En Los Registros De Configuración: _____________________________________________379 3.5.4.34. Bits De Protección Contra Escritura En La EEPROM De Datos: ______379 3.5.4.35. Bit De Protección De La Lectura De Tabla Del Bloque 0:____________380 3.5.4.36. Bit De Protección De La Lectura De Tabla Del Bloque 1:____________380 3.5.4.37. Bit De Protección De La Lectura De Tabla Del Bloque 2:____________380 3.5.4.38. Bit De Protección De La Lectura De Tabla Del Bloque 3:____________380 3.5.4.39. Protección Contra La Lectura De Tabla Del Bloque De Inicio:________380

4. Lenguaje De Programación C18 _____________________________ 383 4.1. Introducción _______________________________________________ 383 4.2. Compilador MPLAB C18 ____________________________________ 383

4.2.1. Introducción ___________________________________________________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

Page 18: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xvi

4.3. Librerías Del C18___________________________________________ 390 4.3.1. Abreviaturas en las librerías de Microchip ____________________________390 4.3.2. Adc.H: Librería De Los Conversores A/D ____________________________393

4.3.2.1. Descripción De Las Funciones__________________________________393 4.3.3. Pwm.H: Funciones Del PWM Y EPWM _____________________________397

4.3.3.1. Descripción De Las Funciones__________________________________397 4.3.4. Timers.h: Funciones de los temporizadores ___________________________399

4.3.4.1. Descripción de las funciones ___________________________________399 4.3.5. Delays.H: Retrasos Por Software ___________________________________404

4.3.5.1. Descripción De Las Funciones__________________________________404 4.3.6. Librerías del USB ______________________________________________406

4.3.6.1. Usb.h _____________________________________________________406 4.3.6.2. Usbcfg.h: Configuración ______________________________________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. Distribución de los Endpoint _______________________________409

4.3.6.3. Usbdefs_std_dsc.h: Definiciones estándar 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. Librerías 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 públicos _______________________________________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 públicos _______________________________________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 públicos _______________________________________427

4.3.6.10. Usbgen.h: USB Genérico _____________________________________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 Públicos ______________________________________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

Page 19: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xvii

4.3.6.11.5. Prototipos públicos ______________________________________436 4.3.6.12. Cdc.h: Dispositivos De Comunicación___________________________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 públicos ______________________________________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. Potenciómetro__________________________________________446 4.3.6.14.7. SPI: Líneas 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: Validación Del Tiempo De Compilado _______________________________________448

4.3.6.16.1. Incluye _______________________________________________448 4.3.6.16.2. Validación del USB _____________________________________448

4.3.7. Librerías 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. Función 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

Page 20: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xviii

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 genérico __________________________________________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 específicas 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

Page 21: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xix

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 comunicación _____________________________488 4.4.8.1. Incluye ____________________________________________________488 4.4.8.2. Variables___________________________________________________488 4.4.8.3. Declaraciones _______________________________________________488 4.4.8.4. Respuestas específicas 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 específicas 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 interrupción______________________________________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 Programación Visual Basic ______________________ 499 5.1. Introducción _______________________________________________ 499 5.2. Características 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

Page 22: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xx

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 For…Next _________________________________________506

5.3.4.3.1. Funcionamiento de la Sentencia For: _________________________507 5.3.4.4. Sentencia While…Wend ______________________________________507

5.3.4.4.1. Funcionamiento de la Sentencia While...Wend _________________507 5.3.4.5. Sentencia Do…Loop _________________________________________508 5.3.4.6. Sentencia Goto ______________________________________________508

5.4. Librerías En Visual Basic ____________________________________ 509 5.4.1. Librería Del USB: MPUSBAPI.dll __________________________________509

5.4.1.1. Inroducción_________________________________________________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. Declaración De Constantes Y Variables __________________________513 5.4.1.5. Declaración 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. Interconexión USB-PC _____________________________________ 519 6.1. Introducción _______________________________________________ 519 6.2. Arquitectura Windows ______________________________________ 519 6.3. Carga En Windows De Un Módulo USB ________________________ 519 6.4. El Driver .sys ______________________________________________ 520

6.4.1. Diálogo Con La Aplicación________________________________________520 6.4.2. Gestión De Bugs ________________________________________________521 6.4.3. Características 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 Múltiple _____________________________________522 6.4.3.4. Paso De Datos ______________________________________________522 6.4.3.5. Limitación de 4Kbytes ________________________________________523 6.4.3.6. Múltiples Periféricos _________________________________________523 6.4.3.7. Gestión De Las Peticiones De La Aplicación_______________________523 6.4.3.8. Gestión De Las Peticiones Del Sistema ___________________________523

6.5. El Driver De Microchip______________________________________ 524

Page 23: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xxi

7. Aplicación _______________________________________________ 527 7.1. Introducción _______________________________________________ 527 7.2. Circuito Eléctrico___________________________________________ 527

7.2.1. Esquema Eléctrico 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. Características Importantes________________________________543

7.2.3. Esquema Eléctrico 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. Definición 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 Configuración 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

Page 24: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xxii

7.3.5.4. USB ______________________________________________________554 7.3.6. User.h ________________________________________________________554

7.3.6.1. Prototipos Públicos___________________________________________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. Módulo ApiUsb.bas _____________________________________________565

7.4.1.1. Funciones De La Mpusbapi.Dll _________________________________565 7.4.1.2. Función De Recuperación 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 Públicas ________________________566 7.4.1.6. Variables Públicas 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. Función Enviar ______________________________________________567 7.4.1.10. Función Recibir ____________________________________________568

7.4.2. Formulario Inicio________________________________________________568 7.4.2.1. Código Del Form Inicio _______________________________________570

7.4.2.1.1. Variables Globales _______________________________________570 7.4.2.1.2. Función Avanza_Click ____________________________________571 7.4.2.1.3. Función Claxon_Click ____________________________________571 7.4.2.1.4. Función Derecha_Click ___________________________________571 7.4.2.1.5. Función Form_Load ______________________________________572 7.4.2.1.6. Función Form_Unload ____________________________________572 7.4.2.1.7. Función Izquierda_Click __________________________________573 7.4.2.1.8. Función Luces_Click _____________________________________573 7.4.2.1.9. Menu_Click ____________________________________________574 7.4.2.1.10. Función Paro_Click _____________________________________575 7.4.2.1.11. Retrocede_Click ________________________________________576 7.4.2.1.12. Función ScrollGiro_Change _______________________________576 7.4.2.1.13. Función ScrollVelocidad_Change __________________________576 7.4.2.1.14. Función sensores_Click __________________________________576

Page 25: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

xxiii

7.4.2.1.15. Función TextGiro_Change ________________________________577 7.4.2.1.16. Función TextVelocidad __________________________________577 7.4.2.1.17. Función Form_KeyPress _________________________________581

7.4.3. Form Ajuste____________________________________________________583 7.4.3.1. Código Del Form Ajuste ______________________________________584

7.4.3.1.1. Variables_______________________________________________584 7.4.3.1.2. Función Derecha_Click ___________________________________584 7.4.3.1.3. Función Izquierda_Click __________________________________585 7.4.3.1.4. Función AjDistancia_Click ________________________________585 7.4.3.1.5. Función TimerDistancia_Timer _____________________________585 7.4.3.1.6. Función Medidas_Timer___________________________________587

7.4.4. Form Sensor ___________________________________________________588 7.4.4.1. Código del Form Ajuste _______________________________________589

7.4.4.1.1. Declaración De Variables__________________________________589 7.4.4.1.2. Función Sensores_Timer __________________________________589

7.4.5. Form Comandos ________________________________________________592 7.4.5.1. Código Del Form Comandos ___________________________________594

7.4.5.1.1. Declaración De Variables__________________________________594 7.4.5.1.2. Función Comandos_Click _________________________________594 7.4.5.1.3. Función Comandos_KeyPress ______________________________594 7.4.5.1.4. Función EnvioComando_Click______________________________596 7.4.5.1.5. Función Form_Unload ____________________________________602

7.5. Driver Cochecito.inf_________________________________________ 602

7.6. Control WiiMote ___________________________________________ 602 7.6.1. Introducción ___________________________________________________606 7.6.2. Programa de Control _____________________________________________606

7.6.2.1. Programa_______________________________________________ 606

8. Bibliografía ______________________________________________ 609 8.1. Libros ____________________________________________________ 609 8.2. Apuntes ___________________________________________________ 610 8.3. Páginas Web_______________________________________________ 610

B. CÁLCULOS

1. Cálculos _________________________________________________ 615 1.1. PWM _____________________________________________________ 615 1.2. Conversor A/D _____________________________________________ 615

C. PLANOS

Plano 1: Esquema del circuito eléctrico _____________________________619

Plano 2: Esquema eléctrico 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

Page 26: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

xxiv

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 Específicas Y Constructivas ______________ 639 1.1. Descripción Del Producto ____________________________________ 639 1.2. Forma De Ejecución ________________________________________ 639 1.3. Plazos Y Orden De Ejecución_________________________________ 643 1.4. Materiales _________________________________________________ 644

1.4.1. Materiales Del Laboratorio Necesarios Para La Parte Eléctrica ____________644 1.4.2. Materiales Para La Realización De La Placa___________________________645 1.4.3. Materiales De Laboratorio Necesarios Para La Parte Mecánica ___________645 1.4.4. Materiales Para La Realización Del Chasis____________________________645

1.5. Realización De Las Pruebas __________________________________ 646

E. PRESUPUESTO

1. Presupuesto De La Parte Eléctrica ____________________________ 649

2. Presupuesto De La Parte Mecánica ___________________________ 650

3. Totalizaciones ____________________________________________ 650

F. CONCLUSIÓN

1. Conclusión _______________________________________________ 653

Page 27: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

A. MEMORIA

Page 28: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 29: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

1. INTRODUCCIÓN

Page 30: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 31: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

29

1. INTRODUCCIÓN

1.1. OBJETO Como Trabajo Final de Carrera se ha tratado la comunicación de un

microcontrolador PIC al ordenador por medio del puerto USB. En el presente proyecto se trata de hacer una aplicación práctica del tipo de comunicación antes citado.

El proyecto ha sido propuesto y tutorado dentro del departamento de Física Aplicada en el área de Tecnología Electrónica por José Torreblanca González.

Los grandes grupos en los que se divide el proyecto son:

Estudio de la norma del USB. Estudio de la familia de microcontroladores PIC18Fxx5x. Realización práctica de la aplicación.

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 fácil comprensión.

1.2. DESCRIPCIÓN La utilidad principal de este proyecto es el control de sensores y motores a través

del ordenador por medio del puerto USB. El microcontrolador PIC18F2455 es el encargado de la conexión USB y de ejecutar las órdenes recibidas desde el ordenador.

El microcontrolador realizará la conversión analógico-digital necesaria para la lectura del sensor de distancia. Además, de enviar los pulsos necesarios para activar el motor paso a paso.

El micro, también se encarga de la modulación 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 teórica, haciendo un estudio de todos los puntos necesarios para comprender correctamente las comunicaciones UBS la programación, tanto del host (ordenador) como del microcontrolador; y de forma práctica al realizar un coche que se controle desde el ordenador por medio del puerto USB.

A continuación se describe el contenido de cada uno de los capítulos que componen el proyecto.

Page 32: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

30

1.2.1. CAPÍTULO 2: NOCIONES BÁSICAS DE LA NORMA USB 2.0 La memoria comienza con un estudio del USB, las transmisiones entre host

(ordenador), hub (dispositivo concentrador) y periférico. Dando especial importancia al significado del vocabulario específico de la conexión.

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 comprensión de la conexión al menor nivel existente.

Al trabajar con microcontroladores que poseen puerto USB todos los pasos citados en el párrafo anterior, no se observan ya que el chip lo realiza internamente. Lo único que hay que realizar es una correcta configuración.

1.2.2. CAPÍTULO 3: MICROCONTROLADORES En este capítulo 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. CAPÍTULO 4: LENGUAJE DE PROGRAMACIÓN C18 Para la programación del micro se recurrirá al lenguaje C18 ya que el fabricante

Microchip concede una licencia gratuita de estudiante y el uso de librerías específicas para las distintas clases de dispositivos y los distintos tipos de comunicación. Resultando éste más sencillo que el lenguaje Assambler, comúnmente utilizado en la programación de todas las gamas de microcontroladores PIC y dsPIC de Microchip.

En este capítulo, se analizan las funciones más importantes, los tipos de datos, punteros y las librerías utilizadas para la configuración del microcontrolador en la aplicación. Haciendo especial hincapié en las relativas al puerto USB.

1.2.4. CAPÍTULO 5: LENGUAJE DE PROGRAMACIÓN VISUAL BASIC El siguiente tema tratado en la memoria, es la programación del host; para ella,

se recurrirá al lenguaje Visual Basic 6, ya que es un lenguaje muy extendido y muy sencillo, con un gran número de librerías y módulos.

Como en el capítulo anterior, en este, se hace un análisis de las funciones más importantes, tipos de datos, etc. Para poder comprender el software de control del coche.

Page 33: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

31

Para realizar una comunicación con USB, no existen librerías comunes específicas, 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 librería.

1.2.5. CAPÍTULO 6: INTERCONEXIÓN USB-PC Otro tema muy importante es la realización de un driver. Al utilizar la librería

anterior, se necesita un driver que la reconozca, por ello Microchip ha creado uno genérico que reconoce los comandos de la librería.

En este capítulo, se analizan las características que tiene que tener un driver comentando las del driver de Microchip.

1.2.6. CAPÍTULO 7: APLICACIÓN 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, dirección y velocidad.

Para la variación del sentido se ha utilizado un motor de tipo paso a paso bipolar. Para una mayor comprensión 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 modificación de la velocidad, se ha recurrido a la modulación de ancho de pulso (PWM) ya que el microcontrolador posee un puerto que, una vez configurado correctamente, crea este tipo de onda. Para la detección de distancias se ha utilizado el sensor de Sharp GP2Y0A02YK que crea una variación de la tensión dependiendo de la distancia a la que se encuentre el objeto. Se ha conectado a una entrada de tipo analógico del microcontrolador para aprovechar al máximo las características 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 modulación de ancho de pulso.

El siguiente punto de este capítulo, es la explicación de la adaptación del software que cede Microchip a la aplicación. Se comentan todos los archivos modificados.

Después, se estudia el software del host, realizado en Visual Basic.

Por último, el driver creado para la aplicación.

Page 34: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

32

1.2.7. CÁLCULOS Se realizan los cálculos necesarios para el proyecto.

Al ser un proyecto de electrónica digital, en especial de microcontroladores, sólo se realizan los cálculos relativos a los motores de corriente continua (para poder seleccionar entre más valores de velocidad) y al conversor A/D (para que no realice conversiones innecesarias).

1.2.8. PLANOS En este capítulo, se incluyen los planos tanto de la parte eléctrica como de la

mecánica para la realización del coche.

La parte eléctrica se compone de los planos: general, el de diseño de la placa en transparencia, y de montaje de los sensores.

La parte mecánica 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 reproducción del coche,

tanto de la placa electrónica como de la parte mecánica.

1.2.10. CONDICIONES Con este último apartado se pretende explicar los problemas que han surgido en

la realización de la aplicación y las experiencias obtenidas.

Page 35: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

2. NOCIONES BÁSICAS DE LA

NORMA USB 2.0

Page 36: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 37: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

35

2. NOCIONES BÁSICAS DE LA NORMA USB 2.0

2.1. INTRODUCCIÓN Para entender el funcionamiento del USB, es necesario estudiar la especificación

de este bus. Los fabricantes involucrados en la norma crearon un documento que constituye la referencia. Aunque en estos momentos se está creando la versión 3.0 del bus, en el presente capítulo se va a tratar la versión 2.0 ya que es la más rápida 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 creído más importantes para una comprensión fácil y rápida 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 informático: Compac, Hewlett-Packard, Intel, Lucent, Microsoft; NEC y Philips. Adoptando las mejores características de los diferentes tipos de comunicación de cada empresa.

2.1.1. MOTIVACIÓN Las motivaciones que han inspirado la creación del Universal Serial Bus ver. 1.0

son tres: conexión del PC al teléfono, facilidad de uso y expansión de entrada/salida.

Las motivaciones a mejorar la versión y crear así la 2.0 han sido: la evolución de los ordenadores y de su velocidad, la mejora de los periféricos, la demanda de las imágenes digitales y la necesidad de una mayor velocidad de transmisión de datos.

Las periódicas revisiones de la norma se realizan para que los desarrolladores no fabriquen unos periféricos con una interfaz obsoleta.

Page 38: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

36

2.2. VOCABULARIO El vocabulario aquí expuesto es una lista de términos informáticos muy

utilizados en la comunicación por USB. No se incluyen todos los que aparecen en la norma, sino los que el autor ha creído 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 unión abstracta entre el Endpoint y el software del host.

Endpoint o Device Endpoint: La porción direccionable de un dispositivo USB que es la fuente o el lugar de llegada de la comunicación entre el host y el dispositivo.

Dirección del Endpoint: Combinación del número del Endpoint y del sentido en un dispositivo USB. Cada dirección del Endpoint soporta transferencias de datos en una dirección.

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.

Número 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 número de Endpoint.

Dirección del dispositivo: Es un valor de 7bits que representa la dirección del dispositivo del USB. La dirección 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 dirección del dispositivo.

Handshake Packet: Un paquete que reconoce o rechaza una condición específica.

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 identificación y comunicación.

MSb: Bit más significativo.

MSB: Byte más significativo.

LSb: Bit menos significativo.

LSB: Byte menos significativo.

Page 39: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

37

Protocolo: Conjunto específico de reglas, procedimientos o conversaciones relacionadas con el formato y el tiempo de transmisión de datos entre dos dispositivos.

Sample: Unidad más pequeña con la que puede operar un Endpoint.

Sample Rate (Fs): Número de samples por segundo, expresado en hercios (Hz).

Start-Of-Frame (SOF): Primera transacción 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 transmisión 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 detección 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 número 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 función, por esta dirección, 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 función.

En un reset o reinicio, la dirección por defecto es cero y la tiene que programar el host durante el proceso de enumeración. La dirección cero está reservada como dirección por defecto y no se puede asignar para otro uso.

LSb MSb

Addr 0 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 más de un Endpoint.

Excepto el Endpoint 0, los números de los Endpoint son funciones específicas.

El campo del Endpoint se define en los tokens IN, SETUP y OUT y en el especial PING.

Page 40: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

38

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

Los dispositivos de baja velocidad soportan un máximo de tres pipes por función: un pipe de control con el Endpoint 0 y otras 2 adicionales (otras 2 de control, una de control y un Endpoint interrupción o dos Endpoint interrupción).

Las funciones de media y alta velocidad soportan un máximo de 16 Endpoints IN y OUT.

LSb MSb

Endp 0 Endp 1 Endp 2 Endp 5

2.3. HISTORIA El USB se ha concebido como un estándar industrial de expansión para el PC, en

particular en el ámbito de la telefonía y productos de consumo.

Los criterios para la definición de su arquitectura son:

facilidad de uso para la expansión de un periférico 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 síncrono

(audio, video) o asíncrona (mensajes). fácil integración en las nuevas tecnologías de periféricos. compatibilidad con las configuraciones del PC. estándares de interfaz para una difusión rápida del producto. posibilidad de crear nuevas clases de periféricos con el fin de aumentar la

capacidad del PC.

2.3.1. UTILIZACIÓN PREVISTA En su versión de 1,5Mbits/s, el USB se sitúa en la zona de baja velocidad (low

speed). Las aplicaciones son, entre otras, gestión del teclado, del ratón, de los periféricos de juegos… En general, de la clase HID (dispositivos de interacción con el humano).

Este tipo de periférico debe ser barato, conectable y desconectable en caliente (en funcionamiento) y fácil de utilizar. Asimismo, se podrán conectar varios dispositivos al mismo tiempo.

En su versión de 12Mbits/s, el USB se sitúa en la zona de “toda velocidad” (full speed). Las aplicaciones son, entre otras, ISDN (RDSI, teléfono digital), PBX (teléfono), audio…

Para este tipo de periférico, además de las características mencionadas anteriormente, tiene que ofrecer garantías sobre el tiempo de tránsito de la información y la banda de paso. El tipo de transmisión síncrona permite garantizar estos criterios.

Page 41: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

39

Y, en su última versión, 480Mbits/s, el USB se sitúa en la zona de alta velocidad (high speed). Las aplicaciones son, video de calidad, imágenes, almacenamiento masivo…

Con este tipo de periférico se necesitan todas las características anteriores más una ancha banda de paso, para una alta velocidad.

Como conclusión de este apartado, se incluye una lista de las principales características del bus:

banda de paso desde algunos kilobits hasta centenas de megabits. transferencia síncrona y asíncrona en el mismo bus. varios tipos de periféricos en el mismo bus. posibilidad de conectar hasta 127 periféricos. 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 expansión.

2.4. ARQUITECTURA

2.4.1. DESCRIPCIÓN 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 periférico u otro hub. Sólo hay un host.

Los periféricos comparten la banda de paso del USB. El protocolo se basa en el llamado paso de testigo (token). El ordenador proporciona el testigo al periférico seleccionado y seguidamente, éste le devuelve el testigo en su respuesta.

Este bus permite la conexión y desconexión en caliente, sin apagar el equipo.

2.4.2. ARQUITECTURA DEL BUS La figura muestra la topología del bus, que viene a estar representado por un

árbol, en donde el PC sería la raíz y los periféricos las hojas.

Page 42: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

40

2.4.3. INTERFAZ FÍSICA

2.4.3.1. Aspecto Eléctrico A nivel eléctrico el cable USB transfiere la señal y la alimentación sobre cuatro

hilos.

A nivel de señal, se trata de un par tranzado con una impedancia característica 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 común (CCMR, es la tensión diferencial entre la tensión común). El reloj se transmite en el flow de datos, la codificación 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 alimentación, el cable proporciona la tensión nominal de 5V. Es necesario definir bien el diámetro del hilo con el fin de que no se produzca una caída de tensión demasiado importante en el cable. Una resistencia de terminación instalada en la línea de datos permite detectar el puerto conocer su configuración (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 configuración en bucle. Se distinguen fácilmente: 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 periférico 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 señal, de este modo, cuando se enchufa, la masa siempre hace contacto antes.

2.4.3.2. Alimentación La especificación abarca dos aspectos de consumo: distribución en función del

consumo especificado por cada periférico USB y control de consumo integrado en la gestión global del PC.

2.4.3.3. Consumo Cada sección puede proporcionar una determinada potencia máxima siendo el

PC el encargado de suministrar la energía. Además, el periférico puede estar autoalimentado (self powered).

Por otro lado, el hub puede distribuir la corriente procedente del PC a los periféricos.

Page 43: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

41

2.4.3.4. Control De Consumo El ordenador controla el consumo, teniendo capacidad de poner en reposo

(suspend) o en marcha a un periférico USB. En reposo, éste reduce su consumo (si puede), quedando la parte del USB siempre funcional. Esta gestión está orientada específicamente a los equipos portátiles.

2.4.3.5. Protocolo Del USB Una transacción sobre el bus necesita al menos tres paquetes. Cada transacción

comienza por el envío por parte del host de un paquete que indica el tipo, la dirección de la transacción, la dirección del USB y su punto terminal (Endpoint). Este paquete recibe el nombre de token packet (paquete testigo).

A continuación, el transmisor envía su paquete de datos, o indica que no tiene paquetes que transmitir, por último, el destinatario envía un paquete indicando que ha recibido bien el paquete de datos.

Recibe el nombre de pipe el enlace virtual entre el host y un periférico USB, con su Endpoint (un periférico 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 número del Endpoint y el tamaño de los paquetes. Estos enlaces se definen durante la inicialización del USB. Siempre existe un enlace virtual 0 que permite tener acceso a la información de configuración del periférico USB (estado, control e información).

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 características:

señal diferencial, en donde la pantalla (blindaje) protege los hilos.

CRC (control) sobre la información de control y datos. detección de conexión y desconexión del periférico recuperación automática en cado de error, gestión del tiempo de

recuperación (timeout). gestión del flujo de datos, de los buffers y del modo síncrono. construcción que le hace independiente de las funciones, de los datos y

del control.

Page 44: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

42

2.4.3.7. Detección De Errores La detección de errores se basa en el control CRC, efectuado sobre los datos y

sobre la información 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 recuperación, la información de error se transfiere al nivel superior (aplicación).

2.4.3.8. Gestión De Errores El protocolo puede controlar los errores por hardware o por software.

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

2.4.3.9. Configuración Del Sistema Un periférico puede ser enchufado o desenchufado en cualquier momento.

La enumeración (búsqueda de los periféricos) no sólo 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 (vía hub) direcciona el periférico con una dirección por defecto. Mediante un paquete de control, le da su dirección. Si se trata de un hub, el procedimiento es el mismo para el propio hub, después para cada uno de los periféricos conectados al hub y declarados por él al host.

En cuanto a la descripción del hub, esta “multitoma” es un dispositivo activo, que incluye un microprocesador, la memoria y todas las interfaces necesarias para la gestión de los otros puertos (que vayan hacia un periférico USB o hacia otro hub).

Los hubs activos proporcionan la alimentación a partir de una fuente externa, mientras que los hubs pasivos proporcionan la alimentación a partir de la fuente procedente del USB raíz.

Page 45: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

43

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 transmisión de datos voluminosos, pero con pocas restricciones a nivel de duración de la transmisión; por ejemplo, durante una impresión.

Interrupt: modo utilizado para transmisiones de pequeños paquetes rápidos, orientado a percepciones humanas (ratón, 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 sólo soporta uno de los tipos anteriores.

2.4.3.11. Tipo Control Los datos de control sirven para configurar el periférico en el momento de

conectarse al USB. Algunos drivers específicos pueden utilizar este enlace para transmitir su propia información de control. Este enlace no tiene pérdida de datos, puesto que los dispositivos de detección de recuperación de errores están activos a nivel USB.

2.4.3.12. Tipo Bulk Este modo se utiliza para la transmisión de importantes cantidades de

información. Como el tipo Control, este enlace no tiene pérdida de datos. La banda de paso otorgada a este tipo de transmisión depende de los demás periféricos, siendo la menos prioritaria.

2.4.3.13. Tipo Interrupt Este tipo de transmisión garantiza la transferencia de pequeñas cantidades de

datos. El tiempo de respuesta no puede ser inferior al valor especificado por la interfaz. El ratón o cualquier otro dispositivo apuntador es una aplicación típica de este modo de transmisión.

2.4.3.14. Tipo Isochronous Este tipo de transmisión funciona en tiempo real. La banda de paso así como el

retardo están garantizados. Es el modo de mayor prioridad.

La transmisión de la voz es un ejemplo de esta aplicación. Si esta no se transmite correctamente, pueden llegar a oírse parásitos (glitch) y la aplicación puede detectar ciertos errores de los llamados underruns.

Page 46: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

44

2.4.3.15. Asignación De La Banda De Paso La banda de paso se asigna en función de las pipes.

Los periféricos deben contar con memoria intermedia de datos (buffers), tanto mayores cuanto más 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 asignación queda bloqueada, es decir, si una nueva asignación pudiera llegar a perturbar las asignaciones existentes, esta no será autorizada (bloqueada).

Cuando finaliza un pipe, la banda de paso puede asignarse a oro periférico.

2.4.3.16. USB Device Los periféricos (devices) se clasifican en función de las operaciones que pueden

realizar: class hub, para los periféricos de extensión; class text, para las interfaces de texto (impresoras)…

2.4.3.17. Características De Un Periférico El Endpoint 0 proporciona esta información por medio de los descriptores. Se

encuentran clasificadas en tres grupos:

Estándar: comunes a todos los periféricos (identificación del fabricante, clase del producto, consumo, descripción de los Endpoints.

Clase: específicas del tipo de periférico. Fabricante: específicas del producto; el fabricante puede incluir la

información que desee.

Page 47: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

45

2.5. FORMATOS DE LOS PAQUETES En este apartado se profundiza en la descripción 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 dirección y de Endpoint solamente identifican el Endpoint que recibirá el paquete siguiente de datos. En las transacciones IN, estos campos sólo 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 transacción de datos de una función al host. Los PIDs OUT y SETUP definen una transacción de datos del host a la función. Un PID PING define un protocolo de intercambio de la función al host.

LSb MSbCampo PID ADDR ENDP CRC5BITs 8 7 4 5

Los paquetes token tienen cinco bits CRC que cubren los campos dirección y

Endpoint. El CRC no cubre el PID, su propósito es chequea el campo. Los paquetes token y SOF están delimitados por un EOP después de tras bytes de paquete de datos. Si un paquete se decodifica como otro token o SOF valido pero no termina con un EOP después de tres bytes, esto se tiene que considerar inválido y el receptor lo tiene que ignorar.

2.5.2. TOKEN ESPECIAL: TRANSACCIÓN SPLIT El USB define un token especial para las transacciones Split. Es un paquete

token de 4 bytes. Esta transacción split proporciona tipos de transferencia y envío de información adicionales. El token de transacciones Split se utiliza para que se soporte el intercambio de archivos entre el host comunicándose con el hub que opera a high-speed con dispositivos full-/low-speed en alguno de sus puertos. Hay dos tipos de split: una transacción split de inicio (start-split) (SSPLIT) y transacción split completa (complete-split) (CSPLIT). Un campo en el token especial SPLIT, define las siguientes secciones.

Page 48: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

46

2.5.2.1. Transacciones Split Una transacción 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 través del hub y algún Endpoint del dispositivo low-/full-speed. Las Split permiten que el hub reciba el estado de transacción completa. Con esto puede que el host comience una transacción full-/low-speed a través de una high-speed sin tener que esperar a que procese/complete la de baja velocidad.

Una transacción high-speed tiene dos partes: una start-speed y otra complete-speed. Las transacciones Split sólo se definen para usarse entre el host y el hub. Ningún otro dispositivo high-speed o low-/full-speed puede usar este tipo de intercambio.

Los paquetes genéricos start-split se componen de dos paquetes en la fase token: el token especial SPLIT y el token full-/low-speed. Dependiendo de la dirección de transferencia de datos y de cómo está definido el protocolo de intercambio, después de la fase de token está, opcionalmente, un paquete de datos y otro de protocolo. La transacción start-split puede ser de 2, 3 ó 4 paquetes determinados por el tipo de transferencia específica y la dirección de los datos.

Fase Token

ProtocoloTokenSSPLI

TokenFS/LS DATAx

La transacción genérica 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 dirección y el tipo especificado de transacción. Las complete-split pueden ser de 2 ó 3 paquetes determinados por el tipo de transferencia específica y la dirección.

TokenSSPLI

TokenFS/LS

Fase Token

Protocolo

DATAx

o

El resultado de una transacción Split se devuelve con una transacción complete-

split. El host emite una start-split (indicado con 1) al hub que puede proceder con otra transacción high-speed. El start-split provoca que el hub mande un Token IN full-/low-speed algo después (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,

Page 49: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

47

algo después, envía 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.

Host Hub Dispositivo

TOKEN IN

ACK

DATA 0

CSPLIT

DATA 0

TOKEN IN

SSPLIT

TOKEN IN

1startsplit

3complete

split

2Full-/Low-Speed

BusHigh-Speed

BusFull-/Low-Speed

Una transacción OUT normal full-/low-speed es similar a “invertir” una start-split y complete-split.

Ejemplo de transferencia interrupción OUT: el host envía una transacción start-split consistente en un paquete token especial SSPLIT, un token OUT y un paquete de datos. El hub, algo después manda el token OUT y el paquete de datos al bus full-/low-speed. El dispositivo responde con un protocolo. Algo después, el host envía la transacción complete-split y el hub responde con los resultados (datos full-/low-speed o protocolo) que el dispositivo ha cedido.

Host Hub Dispositivo

1startsplit

3complete

split

2Full-/Low-Speed

BusHigh-Speed

BusFull-/Low-Speed

SSPLIT

TOKEN OUT

DATA 0

ACK

TOKEN OUT

DATA 0

CSPLIT

ACK

TOKEN OUT

Page 50: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

48

2.5.2.2. Paquetes Start-Of-Frame (SOF) El host envía los SOF con un ratio nominal cada 1,00ms±0,0005ms en un bus

full-speed y 125μs±0,0625μs en uno high-speed. Los paquetes SOF consisten en un PID indicando el tipo de paquete seguido de un número de frame de 11bits.

LSb MSbCampo PID FrameNumber CRC5Bits 8 11 5

El token SOF comprende la transacción token-only que distribuye un marcador

SOF y acompaña 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 función recepción para generar un paquete de retorno, por tanto, un envío SOF a una función no tiene garantías.

El paquete SOF entrega dos trozos de información de tiempo. Una función informa que ha ocurrido un SOF cuando este detecta el PID SOF.

En el Apéndice A del archivo de la norma del USB2.0 hay más información sobre el orden de transferencia de paquetes en las transmisiones USB.

Page 51: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

49

2.6. ESTADOS DEL USB Los distintos pasos hasta que el dispositivo se pueda utilizar son:

Page 52: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

50

Unido Alimentado Por Defecto Direccionado Configurado Reposo

No - - - - - USB no unido

Si No - - - - USB sin alimentación

Si Si No - - - USB unido, con alimentación pero no reseteado

Si Si Si No - -

No tiene dirección, el dispositivo responde con la dirección por defecto

Si Si Si Si No - Tiene una única dirección pero no se ha configurado

Si Si Si Si Si No El host puede usar el dispositivo

Si Si - - - Si

Dispositivo al mínimo. Unido, alimentado y sin actividad en 3ms. Puede estar direccionado y configurado. Se ha puesto en reposo porque el host no ha mandado órdenes.

2.6.1. POR DEFECTO Después de alimentar el dispositivo, puede que no responda ante una transacción

hasta que reciba un reset por el bus. Después del reset, el dispositivo tiene la dirección por defecto.

Cuando se completa el reset, el dispositivo funciona con su velocidad correcta. La elección de la velocidad para, low- y full-speed (baja y media velocidad), se determina con las resistencias de terminación.

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. Después del reset, el dispositivo debe responder correctamente a la configuración del dispositivo y a las preguntas de los descriptores y devolver la información adecuada.

Page 53: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

51

2.6.2. DIRECCIONADO Todos los dispositivos USB utilizan la dirección por defecto cuando se

alimentan inicialmente o después de un reset. A cada dispositivo le asigna una única dirección el host al unirlo o después de un reset. El dispositivo mantiene esta dirección cuando se pone en reposo.

Un dispositivo USB responde por la pipe por defecto cuando se le asigna una dirección o está en una por defecto.

2.6.3. CONFIGURACIÓN Antes de utilizar el dispositivo, se tiene que configurar. Desde el punto de vista

del dispositivo, la configuración involucra la respuesta a un SetConfiguration() con un valor de configuración distinto de cero.

Al configurar o reconfigurar un dispositivo se logran todos los estados y valores de configuración asociados a los Endpoint en la interfaz.

2.7. ENUMERACIÓN DEL BUS Cuando se une o se quita un dispositivo USB del bus, el host realiza un proceso

conocido como enumeración 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 inserción y para que la alimentación 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 señal de reset se ha completado, el puerto se activa. El dispositivo USB está en el estado “por defecto” y no puede consumir más de 100mA del VBUS. Todos estos registros y estados se han reseteado y responden al estado “Por Defecto”.

5. El host asigna una dirección única al dispositivo USB, trasladando al dispositivo al estado “Direccionado”.

6. Antes de que el dispositivo tenga una única dirección, se accede a la pipe de control por defecto por la dirección por defecto. El host lee el descriptor del dispositivo para determinar cual es el máximo del tamaño de los datos útiles que utiliza el dispositivo en la pipe por defecto.

Page 54: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

52

7. El host lee la información de configuración del dispositivo leyendo la configuración de 0 hasta n-1, donde n es el número de configuraciones. Este proceso puede tardar varios milisegundos.

8. Basándose en la información de configuración y cómo se debe usar el dispositivo USB, el host asigna un valor de configuración al dispositivo. El dispositivo está en el estado “Configurado” y todos los Endpoints de esta configuración están como se indica en sus características. El dispositivo USB puede que no tenga la energía que indica en sus características. Desde el punto de vista del dispositivo, está listo para usarse.

Page 55: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

3. MICROCONTROLADORES

Page 56: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 57: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

55

3. MICRONTROLADORES

3.1. INTRODUCCIÓN A LOS MICROCONTROLADORES Los microcontroladores están conquistando el mundo. Están 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 teléfonos, en los hornos microondas y los televisores de nuestro hogar. Pero la invasión acaba de comenzar y el nacimiento del siglo XXI será testigo de la conquista masiva de estos diminutos computadores, que gobernarán 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 límites prefijados, genera las señales 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 través del tiempo, su implementación física ha variado frecuentemente. Hace tres décadas, los controladores se construían exclusivamente con componentes de lógica 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 corazón (chip) de un circuito integrado.

Un microcontrolador es un circuito integrado, de alta escala de integración, 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. Líneas de E/S para comunicarse con el exterior. Diversos módulos para el control de periféricos (temporizadores, Puertos

Serie y Paralelo, CAD: Conversores Analógico/Digital, CDA: Conversores Digital/Analógico, etc.).

Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema.

Page 58: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

56

Los productos que para su regulación 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 número de elementos disminuye el riesgo de averías y se precisan menos ajustes.

Reducción del tamaño en el producto acabado: La integración del microcontrolador en un chip disminuye el volumen, la mano de obra y los stocks.

Mayor flexibilidad: las características de control están programadas por lo que su modificación sólo 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 tamaño 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), también 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 líneas de sus buses de direcciones, datos y control, para permitir conectarle con la Memoria y los Módulos de E/S y configurar un computador implementado por varios circuitos integrados. Se dice que un microprocesador es un sistema abierto porque su configuración es variable de acuerdo con la aplicación a la que se destine.

Page 59: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

57

Si sólo se dispusiese de un modelo de microcontrolador, éste debería tener muy potenciados todos sus recursos para poderse adaptar a las exigencias de las diferentes aplicaciones. Esta potenciación supondría en muchos casos un despilfarro. En la práctica cada fabricante de microcontroladores oferta un elevado número de modelos diferentes, desde los más sencillos hasta los más poderosos. Es posible seleccionar la capacidad de las memorias, el número de líneas de E/S, la cantidad y potencia de los elementos auxiliares, la velocidad de funcionamiento, etc. Por todo ello, un aspecto muy destacado del diseño es la selección del microcontrolador a utilizar.

3.1.3. APLICACIONES DE LOS MICROCONTROLADORES Cada vez existen más productos que incorporan un microcontrolador con el fin

de aumentar sustancialmente sus prestaciones, reducir su tamaño y coste, mejorar su fiabilidad y disminuir el consumo.

Algunos fabricantes de microcontroladores superan el millón de unidades de un modelo determinado producidas en una semana. Este dato puede dar una idea de la masiva utilización de estos componentes.

Los microcontroladores están siendo empleados en multitud de sistemas presentes en nuestra vida diaria, como pueden ser juguetes, horno microondas, frigoríficos, televisores, computadoras, impresoras, módems, el sistema de arranque de nuestro coche, etc. Y otras aplicaciones con las que seguramente no estaremos tan familiarizados como instrumentación electrónica, control de sistemas en una nave espacial, etc. Una aplicación típica podría emplear varios microcontroladores para controlar pequeñas partes del sistema. Estos pequeños controladores podrían comunicarse entre ellos y con un procesador central, probablemente más potente, para compartir la información y coordinar sus acciones, como, de hecho, ocurre ya habitualmente en cualquier PC.

Page 60: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

58

3.1.4. EL MERCADO DE LOS MICROCONTROLADORES Aunque en el mercado de la microinformática la mayor atención la acaparan los

desarrollos de los microprocesadores, lo cierto es que se venden cientos de microcontroladores por cada uno de aquéllos.

Existe una gran diversidad de microcontroladores. Quizá la clasificación más 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 razón de esta tendencia es que los microcontroladores de 4 y 8 bits son apropiados para la gran mayoría de las aplicaciones, lo que hace absurdo emplear micros más potentes y consecuentemente más caros. Uno de los sectores que más tira del mercado del microcontrolador es el mercado automovilístico. De hecho, algunas de las familias de microcontroladores actuales se desarrollaron pensando en este sector, siendo modificadas posteriormente para adaptarse a sistemas más genéricos. El mercado del automóvil es además uno de los más exigentes: los componentes electrónicos deben operar bajo condiciones extremas de vibraciones, choques, ruido, etc. y seguir siendo fiables. El fallo de cualquier componente en un automóvil puede ser el origen de un accidente.

En cuanto a las técnicas de fabricación, cabe decir que prácticamente la totalidad de los microcontroladores actuales se fabrican con tecnología CMOS 4 (Complementary Metal Oxide Semiconductor). Esta tecnología supera a las técnicas anteriores por su bajo consumo y alta inmunidad al ruido.

La distribución de las ventas según su aplicación es la siguiente:

Una tercera parte se absorbe en las aplicaciones relacionadas con los computadores y sus periféricos.

La cuarta parte se utiliza en las aplicaciones de consumo (electrodomésticos, juegos, TV, vídeo, 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 automoción.

También los modernos microcontroladores de 32 bits van afianzando sus posiciones en el mercado, siendo las áreas de más interés el procesamiento de imágenes, las comunicaciones, las aplicaciones militares, los procesos industriales y el control de los dispositivos de almacenamiento masivo de datos.

Page 61: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

59

3.2. ¿QUÉ MICROCONTROLADOR EMPLEAR? A la hora de escoger el microcontrolador a emplear en un diseño concreto hay

que tener en cuenta multitud de factores, como la documentación y herramientas de desarrollo disponibles y su precio, la cantidad de fabricantes que lo producen y por supuesto las características del microcontrolador (tipo de memoria de programa, número de temporizadores, interrupciones, etc.):

Costes. Como es lógico, 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 más 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 además el coste del empaquetado, el de los otros componentes, el diseño 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.

Aplicación. Antes de seleccionar un microcontrolador es imprescindible analizar los requisitos de la aplicación:

Procesamiento de datos: puede ser necesario que el microcontrolador realice cálculos críticos en un tiempo limitado. En ese caso debemos asegurarnos de seleccionar un dispositivo suficientemente rápido para ello. Por otro lado, habrá que tener en cuenta la precisión 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 más barata y quizá suficiente es usar librerías para manejar los datos de alta precisión.

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 señales a controlar. Una vez realizado este análisis puede ser necesario añadir periféricos hardware externos o cambiar a otro microcontrolador más adecuado a ese sistema.

Consumo: algunos productos que incorporan microcontroladores están alimentados con baterías y su funcionamiento puede ser tan vital como activar una alarma antirrobo. Lo más conveniente en un caso como éste puede ser que el microcontrolador esté en estado de bajo consumo pero que despierte ante la activación de una señal (una interrupción) y ejecute el programa adecuado para procesarla.

Page 62: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

60

Memoria: para detectar las necesidades de memoria de nuestra aplicación debemos separarla en memoria volátil (RAM), memoria no volátil (ROM, EPROM, etc.) y memoria no volátil modificable (EEPROM). Este último tipo de memoria puede ser útil para incluir información específica de la aplicación como un número de serie o parámetros de calibración. 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 versión preliminar, aunque sea en seudo-código, de la aplicación y a partir de ella hacer una estimación de cuánta memoria volátil y no volátil es necesaria y si es conveniente disponer de memoria no volátil modificable.

Ancho de palabra: el criterio de diseño debe ser seleccionar el microcontrolador de menor ancho de palabra que satisfaga los requerimientos de la aplicación. Usar un microcontrolador de 4 bits supondrá una reducción en los costes importante, mientras que uno de 8 bits puede ser el más 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).

Diseño de la placa: la selección de un microcontrolador concreto condicionará el diseño de la placa de circuitos. Debe tenerse en cuenta que quizá usar un microcontrolador barato encarezca el resto de componentes del diseño.

Los microcontroladores más 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 todavía sea muy popular.

8051 (Intel y otros). Es sin duda el microcontrolador más popular. Fácil 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 periféricos. Son microcontroladores de altísimas prestaciones.

Page 63: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

61

PIC (MicroChip). Familia de microcontroladores que gana popularidad día a día. 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 número 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 características básicas son muy parecidas. Todos deben disponer de los bloques esenciales Procesador, memoria de datos y de instrucciones, líneas de E/S, oscilador de reloj y módulos controladores de periféricos. Sin embargo, cada fabricante intenta enfatizar los recursos más idóneos 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 según el modelo seleccionado.

3.2.1.1. Arquitectura Básica Aunque inicialmente todos los microcontroladores adoptaron la arquitectura

clásica 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 través de un sistema de buses único (direcciones, datos y control).

La arquitectura Harvard dispone de dos memorias independientes una, que contiene sólo instrucciones y otra, sólo datos. Ambas disponen de sus respectivos sistemas de buses de acceso y es posible realizar operaciones de acceso (lectura o escritura) simultáneamente en ambas memorias.

Los microcontroladores PIC responden a la arquitectura Harvard.

Page 64: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

62

3.2.1.2. El Procesador O CPU Es el elemento más importante del microcontrolador y determina sus principales

características, tanto a nivel hardware como software.

Se encarga de direccionar la memoria de instrucciones, recibir el código OP de la instrucción en curso, su decodificación y la ejecución de la operación que implica la instrucción, así como la búsqueda 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 número de procesadores usados en los microcontroladores están basados en la filosofía CISC (Computadores de Juego de Instrucciones Complejo). Disponen de más de 80 instrucciones máquina en su repertorio, algunas de las cuales son muy sofisticadas y potentes, requiriendo muchos ciclos para su ejecución.

Una ventaja de los procesadores CISC es que ofrecen al programador instrucciones complejas que actúan como macros.

RISC: Tanto la industria de los computadores comerciales como la de los microcontroladores están decantándose hacia la filosofía RISC (Computadores de Juego de Instrucciones Reducido). En estos procesadores el repertorio de instrucciones máquina 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, además de ser reducido, es “específico”, o sea, las instrucciones se adaptan a las necesidades de la aplicación prevista. Esta filosofía se ha bautizado con el nombre de SISC (Computadores de Juego de Instrucciones Específico).

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 volátil, tipo ROM, y se destina a contener el programa de instrucciones que gobierna la aplicación. Otra parte de memoria será tipo RAM, volátil, 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 sólo se destina a una tarea en la memoria ROM, sólo hay que almacenar un único programa de trabajo.

La RAM en estos dispositivos es de poca capacidad pues sólo debe contener las variables y los cambios de información que se produzcan en el transcurso del programa.

Page 65: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

63

Por otra parte, como sólo 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 están habituados a manejar Megabytes de memoria, pero, los diseñadores con microcontroladores trabajan con capacidades de ROM comprendidas entre 512 bytes y 8 k bytes y de RAM comprendidas entre 20 y 512 bytes.

Según el tipo de memoria ROM que dispongan los microcontroladores, la aplicación y utilización de los mismos es diferente. Se describen las cinco versiones de memoria no volátil que se pueden encontrar en los microcontroladores del mercado.

3.2.1.4. ROM Con Máscara Es una memoria no volátil de sólo lectura cuyo contenido se graba durante la

fabricación del chip. El elevado coste del diseño de la máscara sólo 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 volátil de sólo 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 versión OTP es recomendable cuando es muy corto el ciclo de diseño del producto, o bien, en la construcción de prototipos y series muy pequeñas.

Tanto en este tipo de memoria como en la EPROM, se suele usar la encriptación mediante fusibles para proteger el código 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 grabación 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 cápsulas son de material cerámico y son más caros que los microcontroladores con memoria OTP que están hechos con material plástico.

Page 66: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

64

3.2.1.7. EEPROM Se trata de memorias de sólo lectura, programables y borrables eléctricamente

EEPROM (Electrical Erasable Programmable Read OnIy Memory). Tanto la programación como el borrado, se realizan eléctricamente desde el propio grabador y bajo el control programado de un PC. Es muy cómoda y rápida la operación 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 número de veces que puede grabarse y borrarse una memoria EEPROM es finito, por lo que no es recomendable una reprogramación continua. Son muy idóneos para la enseñanza y la Ingeniería de diseño.

Se va extendiendo en los fabricantes la tendencia de incluir una pequeña zona de memoria EEPROM en los circuitos programables para guardar y modificar cómodamente una serie de parámetros 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 volátil, de bajo consumo, que se puede escribir y

borrar. Funciona como una ROM y una RAM pero consume menos y es más pequeña.

A diferencia de la ROM, la memoria FLASH es programable en el circuito. Es más rápida 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 volátil. Es más veloz y tolera más 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 automóvil permite que pueda modificarse el programa durante la rutina de mantenimiento periódico, compensando los desgastes y otros factores tales como la compresión, la instalación de nuevas piezas, etc. La reprogramación del microcontrolador puede convertirse en una labor rutinaria dentro de la puesta a punto.

Page 67: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

65

3.2.1.9. Puertos De Entrada Y Salida La principal utilidad de las terminales que posee la cápsula que contiene un

microcontrolador es soportar las líneas de E/S que comunican al computador interno con los periféricos exteriores.

Según los controladores de periféricos que posea cada modelo de microcontrolador, las líneas de E/S se destinan a proporcionar el soporte a las señales 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 sincronización de todas las operaciones del sistema.

Generalmente, el circuito de reloj está incorporado en el microcontrolador y sólo 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 cerámico 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 energía.

3.2.2. RECURSOS ESPECIALES Cada fabricante oferta numerosas versiones de una arquitectura básica de

microcontrolador. En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. La labor del diseñador es encontrar el modelo mínimo que satisfaga todos los requerimientos de su aplicación. De esta forma, minimizará el coste, el hardware y el software.

Los principales recursos específicos que incorporan los microcontroladores son:

Temporizadores o “Timers”. Perro guardián o “Watchdog”. Protección ante fallo de alimentación o “Brownout”. Estado de reposo o de bajo consumo. Conversor A/D. Conversor D/A. Comparador analógico. Modulador de anchura de impulsos o PWM. Puertos de E/S digitales. Puertos de comunicación.

Page 68: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

66

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 continuación dicho valor se va incrementando o decrementando al ritmo de los impulsos de reloj o algún múltiplo 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 Guardián O “Watchdog” Cuando el computador personal se bloquea por un fallo del software u otra

causa, se pulsa el botón 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 día. El Perro guardián consiste en un temporizador que, cuando se desborda y pasa por 0, provoca un reset automáticamente en el sistema.

Se debe diseñar el programa de trabajo que controla la tarea de forma que refresque o inicialice al Perro guardián antes de que provoque el reset. Si falla el programa o se bloquea, no se refrescará al Perro guardián y, al completar su temporización, “ladrará y ladrará” hasta provocar el reset.

3.2.2.3. Protección Ante Fallo De Alimentación O “Brownout” Se trata de un circuito que resetea al microcontrolador cuando el voltaje de

alimentación (VDD) es inferior a un voltaje mínimo (“brownout”). Mientras el voltaje de alimentación 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 algún acontecimiento externo que le ponga de nuevo en funcionamiento. Para ahorrar energía, (factor clave en los aparatos portátiles), los microcontroladores disponen de una instrucción especial (SLEEP en los PIC), que les pasa al estado de reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos. En dicho estado se detiene el reloj principal y se “congelan” sus circuitos asociados, quedando sumido en un profundo “sueño” el microcontrolador. Al activarse una interrupción ocasionada por el acontecimiento esperado, el microcontrolador se despierta y reanuda su trabajo.

Page 69: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

67

3.2.2.5. Conversor A/D (CAD) Los microcontroladores que incorporan un Conversor A/D (Analógico/Digital)

pueden procesar señales analógicas, tan abundantes en las aplicaciones. Suelen disponer de un multiplexor que permite aplicar a la entrada del CAD diversas señales analógicas 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 señal analógica que saca al exterior por una de las terminales de la cápsula. Existen muchos efectores que trabajan con señales analógicas.

3.2.2.7. Comparador Analógico Algunos modelos de microcontroladores disponen internamente de un

Amplificador Operacional que actúa como comparador entre una señal fija de referencia y otra variable que se aplica por una de las terminales de la cápsula. La salida del comparador proporciona un nivel lógico 1 ó 0 según una señal sea mayor o menor que la otra.

También hay modelos de microcontroladores con un módulo de tensión 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 través de las terminales del encapsulado.

3.2.2.9. Puertos De E/S Digitales Todos los microcontroladores destinan algunas de sus terminales a soportar

líneas de E/S digitales. Por lo general, estas líneas se agrupan de ocho en ocho formando Puertos.

Las líneas 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 configuración.

Page 70: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

68

3.2.2.10. Puertos De Comunicación 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 comunicación serie asíncrona. USART, adaptador de comunicación serie síncrona y asíncrona 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 adaptación con redes

de conexionado multiplexado desarrollado conjuntamente por Bosch e Intel para el cableado de dispositivos en automóviles. En EE.UU. se usa el J185O.

3.2.3. HERRAMIENTAS PARA EL DESARROLLO DE APLICACIONES Uno de los factores que más importancia tiene a la hora de seleccionar un

microcontrolador entre todos los demás es el soporte tanto software como hardware de que dispone. Un buen conjunto de herramientas de desarrollo puede ser decisivo en la elección, 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 programación 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 versión gratuita para los microcontroladores más populares.

Compilador. La programación 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 código resultante puede ser mucho más ineficiente que el programado en ensamblador. Las versiones más potentes suelen ser muy caras, aunque para los microcontroladores más populares pueden encontrarse versiones demo limitadas e incluso compiladores gratuitos.

Depuración. Debido a que los microcontroladores van a controlar dispositivos físicos, los desarrolladores necesitan herramientas que les permitan comprobar el buen funcionamiento del microcontrolador cuando es conectado al resto de circuitos.

Page 71: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

69

Simulador. Son capaces de ejecutar en un PC programas realizados para el microcontrolador. Los simuladores permiten tener un control absoluto sobre la ejecución de un programa, siendo ideales para la depuración de los mismos. Su gran inconveniente es que es difícil simular la entrada y salida de datos del microcontrolador. Tampoco cuentan con los posibles ruidos en las entradas, pero, al menos, permiten el paso físico de la implementación de un modo más seguro y menos costoso, puesto que ahorraremos en grabaciones de chips para la prueba in-situ.

Placas de evaluación. Se trata de pequeños 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, fácil 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 evaluación, aparte de permitir cargar programas y datos en la memoria del microcontrolador, puede permitir en cualquier momento realizar ejecución 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 anfitrión y el zócalo de la tarjeta de circuito impreso donde se alojará el microcontrolador definitivo. El programa es ejecutado desde el PC, pero para la tarjeta de aplicación es como si lo hiciese el mismo microcontrolador que luego irá en el zócalo. Presenta en pantalla toda la información tal y como luego sucederá cuando se coloque la cápsula.

3.3. LA FAMILIA DE LOS PIC COMO ELECCIÓN ¿Qué es lo que ocurre con los PIC?, ¿Por qué están en boca de todos? Hemos

buscado en multitud de bibliografía y realmente nadie da una respuesta concreta, pero una aproximación a la realidad puede ser esta:

Los PIC tienen “ángel”, tienen “algo” que fascina a los diseñadores, puede ser la velocidad, el precio, la facilidad de uso, la información, las herramientas de apoyo... Quizás un poco de todo eso es lo que produce esa imagen de sencillez y utilidad. Es probable que en un futuro próximo otra familia de microcontroladores le arrebate ese “algo”.

Queremos constatar que para las aplicaciones más habituales (casi un 90%) la elección de una versión adecuada de PIC es la mejor solución; sin embargo, dado su carácter general, otras familias de microcontroladores son más eficaces en aplicaciones específicas, especialmente si en ellas predomina una característica concreta, que puede estar muy desarrollada en otra familia.

Page 72: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

70

Los detalles más importantes que vuelven “locos” a los profesionales de la microelectrónica y microinformática 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 información, fácil de conseguir y económica. Precio: Su coste es comparativamente inferior al de sus competidores. Poseen una elevada velocidad de funcionamiento. Buen promedio de

parámetros: velocidad, consumo, tamaño, alimentación, código compacto, etc.

Herramientas de desarrollo fáciles y baratas. Muchas herramientas software se pueden recoger libremente a través 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.

Diseño rápido. La gran variedad de modelos de PIC permite elegir el que mejor

responde a los requerimientos de la aplicación.

Una de las razones del éxito de los PIC se basa en su utilización. Cuando se aprende a manejar uno de ellos, conociendo su arquitectura y su repertorio de instrucciones, es muy fácil emplear otro modelo.

3.3.1. CARACTERÍSTICAS RELEVANTES Descripción de las características más 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 simultáneamente a las dos memorias. Además, propicia numerosas ventajas al funcionamiento del sistema como se irán describiendo.

Page 73: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

71

3.3.1.2. Segmentación Se aplica la técnica de segmentación (“pipe-line”) en la ejecución de las

instrucciones.

La segmentación permite al procesador realizar al mismo tiempo la ejecución de una instrucción y la búsqueda del código de la siguiente. De esta forma se puede ejecutar cada instrucción en un ciclo (un ciclo de instrucción equivale a cuatro ciclos de reloj).

Las instrucciones de salto ocupan dos ciclos al no conocer la dirección de la siguiente instrucción hasta que no se haya completado la de bifurcación.

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 más las de la gama alta. Esta característica es muy ventajosa en la optimización de la memoria de instrucciones y facilita enormemente la construcción 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 instrucción 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.) están implementados físicamente como registros.

3.3.1.7. Diversidad De Modelos De Microcontroladores Con Prestaciones Y Recursos Diferentes

La gran variedad de modelos de microcontroladores PIC permite que el usuario pueda seleccionar el más conveniente para su proyecto.

3.3.1.8. Herramientas De Soporte Potentes Y Económicas La empresa Microchip y otras que utilizan los PIC ponen a disposición 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, Intérpretes y Compiladores BASIC, etc.

Page 74: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

72

La arquitectura Harvard y la técnica de segmentación son los principales recursos en los que se apoya el elevado rendimiento que caracteriza estos dispositivos programables, mejorando dos características esenciales:

Velocidad de ejecución.

Eficiencia en la compactación del código.

3.3.2. LAS GAMAS DE PIC Una de las labores más importantes del ingeniero de diseño es la elección del

microcontrolador que mejor satisfaga las necesidades del proyecto con el mínimo presupuesto.

Para resolver aplicaciones sencillas se precisan pocos recursos, en cambio, las aplicaciones grandes requieren numerosos y potentes. Siguiendo esta filosofía 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 más costosos para las de mucha envergadura.

Microchip dispone de cuatro familias de microcontroladores de 8 bits para adaptarse a las necesidades de la mayoría de los clientes potenciales.

En la mayor parte de la bibliografía encontrareis tan solo tres familias de microcontroladores, con lo que habrán 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 señales. Su pequeño tamaño los hace ideales en muchos proyectos donde esta cualidad es fundamental.

Page 75: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

73

3.3.2.1. La Gama Enana: PIC12C(F)XXX De Terminales Se trata de un grupo de PIC de reciente aparición que ha acaparado la atención

del mercado. Su principal característica es su reducido tamaño, 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 sólo tienen 8 terminales, pueden destinar hasta 6 como

líneas de E/S para los periféricos porque disponen de un oscilador interno R-C.

En la tabla se presentan las principales características de los modelos de esta subfamilia, que el fabricante tiene la intención de potenciar en un futuro próximo. Los modelos 12C5xx pertenecen a la gama baja, siendo el tamaño 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

ADC 8BITS

TEMPORIZADORES

TERMINALES

PIC12C508 512x12 25x8 4MHz 6 TMR0 + WDT 8

PIC12C509 1024x12 41x8 4MHz 6 TMR0 + WDT 8

PIC12C670 512x14 80x8 4MHz 6 TMR0 + WDT 8

PIC12C671 1024x14 128x8 4MHz 6 2 TMR0 + WDT 8

PIC12C672 2048x14 128x8 4MHz 6 4 TMR0 + WDT 8

PIC12C680 512X12 FLASH

80x8 16x8 EEPROM 4MHz 6 4 TMR0 + WDT 8

PIC12C681 1024x14 FLASH

80x8 16x8 EEPROM 4MHz 6 TMR0 + WDT 8

Page 76: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

74

3.3.2.2. Gama Baja O Básica: 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 están encapsuladas con 18 y 28 terminales y pueden alimentarse a partir de una tensión 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 ningún tipo de interrupción y la Pila sólo 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 características de los modelos de esta familia).

Sistema POR (“Power On Reset”) Todos los PIC tienen la facultad de generar una autoreinicialización o

autoreset al conectarles la alimentación. Perro guardián (Watchdog o WDT) Existe un temporizador que produce un reset automáticamente si no es

recargado antes que pase un tiempo prefijado. Así se evita que el sistema quede “colgado” dado en esa situación el programa no recarga dicho temporizador y se genera un reset.

Código de protección Cuando se procede a realizar la grabación del programa, puede

protegerse para evitar su lectura. También disponen los PIC de posiciones reservadas para registrar números de serie, códigos de identificación, prueba, etc.

Líneas de E/S de alta corriente Las líneas 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 periféricos.

Modo de reposo (Bajo consumo o “sleep”) Ejecutando una instrucción (SLEEP), la CPU y el oscilador principal se

detienen y se reduce notablemente el consumo.

Page 77: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

75

Para terminar el comentario introductorio sobre los componentes de la gama baja conviene nombrar dos restricciones importantes:

La pila o “stack” sólo dispone de dos niveles lo que supone no poder encadenar más de dos subrutinas.

Los microcontroladores de la gama baja no admiten interrupciones.

MEMORIA PROGRAMA

(x12bits) MODELO

EPROM ROM

MEMORIA DATOS (bytes)

FRECUENCIA MÁXIMA

LÍNEAS E/S TEMPORIZADORES TERMINALES

PIC16C52 384 25 4MHz 4 TMR0+WDT 18

PIC16C54 512 25 20MHz 12 TMR0+WDT 18

PIC16C54A 512 25 20MHz 12 TMR0+WDT 18

PIC16CR54A 512 25 20MHz 12 TMR0+WDT 18

PIC16C55 512 24 20MHz 20 TMR0+WDT 28

PIC16C56 1K 25 20MHz 12 TMR0+WDT 18

PIC16C57 2K 72 20MHz 20 TMR0+WDT 28

PIC16CR57B 2K 72 20MHz 20 TMR0+WDT 28

PIC16C58A 2K 73 20MHz 12 TMR0+WDT 18

PIC16CR58A 2K 73 20MHz 12 TMR0+WDT 18

Page 78: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

76

3.3.2.3. Gama Media. PIC16CXXX Con Instrucciones De 16bits Es la gama más variada y completa de los PIC. Abarca modelos con encapsulado

desde 18 terminales hasta 68, cubriendo varias opciones que integran abundantes periféricos. 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 añaden nuevas prestaciones a las que poseían los

de la gama baja, haciéndoles más adecuados en las aplicaciones complejas. Admiten interrupciones, poseen comparadores de magnitudes analógicas, 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. También dispone de interrupciones y una Pila de 8 niveles que permite el anidamiento de subrutinas. En la tabla se presentan las principales características de los modelos de esta familia.

MEMORIA DATOS MODELO MEMORIA

PROGRAMA RAM EEPROM

REGISTROS ESPECÍFICOS

TEMPORIZADORES

INTERRUPCIONES E/S RANGO

TENSIÓN TERMINALES

PIC16C84 1Kx14 EEPROM 36 64 11 TMR0+WDT 4 13 2-6 18

PIC16F84 1Kx14 FLASH 68 64 11 TMR0+WDT 4 13 2-6 18

PIC16F83 512X14 FLASH 36 64 11 TMR0+WDT 4 13 2-6 18

PIC16CR84 1Kx14 ROM 68 64 11 TMR0+WDT 4 13 2-6 18

PIC16CR83 512x14 ROM 36 64 11 TMR0+WDT 4 13 2-6 18

Page 79: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

77

Encuadrado en la gama media también se halla la versión PIC14C000, que soporta el diseño de controladores inteligentes para cargadores de baterías, pilas pequeñas, fuentes de alimentación ininterrumpibles y cualquier sistema de adquisición y procesamiento de señales que requiera gestión de la energía de alimentación. Los PIC14C000 admiten cualquier tecnología de las baterías como Li-Ion, NiMH, NiCd, Ph y Zinc.

El temporizador TMR1 que hay en esta gama tiene un circuito oscilador que puede trabajar asíncronamente y que puede incrementarse aunque el microcontrolador se halle en el modo de reposo (“sleep”), posibilitando la implementación de un reloj en tiempo real.

Las líneas 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 gestión de interrupciones vectorizadas muy potente. También incluyen variados controladores de periféricos, puertos de comunicación 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.

Quizás la característica más destacable de los componentes de esta gama es su arquitectura abierta, que consiste en la posibilidad de ampliación del microcontrolador con elementos externos. Para este fin, las terminales sacan al exterior las líneas de los buses de datos, direcciones y control, a las que se conectan memorias o controladores de periféricos. Esta facultad obliga a estos componentes a tener un elevado número de terminales comprendido entre 40 y 44. Esta filosofía de construcción del sistema es la que se empleaba en los microprocesadores y no suele ser una práctica habitual cuando se emplean microcontroladores.

Page 80: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

78

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 incluía los últimos avances y la mayoría de los periféricos para potenciar miles de aplicaciones centradas en las áreas de automoción, comunicaciones, ofimáticas, productos de gran consumo y control industrial.

El objetivo del fabricante era facilitar a sus usuarios la transición a dispositivos modernos, que con una relación precio/prestaciones muy competitiva, integraban la mayoría 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 periféricos; soportando Ensamblador y C.

Elevado rendimiento: máxima eficacia del compilador C; elevada productividad que alcanza un rendimiento de 10MIPS a 10MHz.

A principios del 2006 Microchip disponía de una gama de 80modelos y una previsión de 41 nuevos.

Aportaciones específicas de la gama mejorada:

Tecnología “nanoWatt”: reduce el consumo de energía. Espacio de direccionamiento lineal: desaparecen los bancos. Compatibilidad de software. Compatibilidad de hardware. Orientación al lenguaje C. Autoprogramabilidad: Pueden escribir su memoria de programa

internamente. Diversidad de periféricos integrados.

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

Page 81: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

79

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 información del fabricante.

3.4.1. DIAGRAMA DE PINES

Page 82: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

80

Page 83: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

81

3.4.2. PERSPECTIVA GENERAL DEL DISPOSITIVO

TABLA 2-1: Características Del Dispositivo

Page 84: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

82

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

Page 85: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

83

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

Page 86: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

84

TABLA 2-2: Descripción De Los Pines E/S Del PIC18F2455/2550

Page 87: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

85

Page 88: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

86

Page 89: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

87

FIGURA 2-3: Descripción De Los Pines Del PIC18F4455/4550

Page 90: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

88

Page 91: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

89

Page 92: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

90

3.4.3. CONFIGURACIÓN DEL OSCILADOR El microcontrolador necesita un reloj estable para proporcionar una fuente de

reloj separada.

FIGURA 3-1: Diagrama Del Reloj

Page 93: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

91

3.4.3.1. Control Del Oscilador El oscilador se controla mediante dos registros de configuración 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 configuración se seleccionan al programarlos y permanecerán 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 configuración FOSC3:FOSC0 para seleccionar un

modo de estos:

XT: XTAL/ circuito resonante. XTPLL: XTAL/ circuito resonante con PLL activo. HS: XTAL/ circuito resonante muy rápido. HSPLL: XTAL/ circuito resonante muy rápido 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 módulo USB y no se puede asociar a ninguna otra fuente de reloj.

El módulo 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.

Page 94: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

92

3.4.3.2.2. XTAL/Resonadores Cerámicos 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 división de la frecuencia se elige con el bit de configuración 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 Cerámico (Configuración 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 varía con el modo de oscilador seleccionado

TABLA 3-1: Condensador Para Osciladores Cerámicos

Valores de los condensadores típicos:

Modo Freq OSC1 OSC2 XT 4.0MHz 33pF 33pF

HS 8.0MHz 27pF 27pF

16.0MHz 22pF 22pF

El valor de los condensadores es sólo como guía en el diseño.

Estos condensadores se han probado con los osciladores de la lista de debajo en operaciones básicas de inicio. Estos valores no están optimizados.

Se puede necesitar otros condensadores de distinto valor para conseguir una oscilación aceptable en una determinada operación. 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 aplicación.

Page 95: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

93

Osciladores utilizados:

4.0MHz

8.0MHz

16.0MHz

TABLA 3-2: Condensadores Para Los XTAL

Valores de los condensadores típicos:

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 sólo como guía en el diseño.

Estos condensadores se han probado con los osciladores de la lista de debajo en operaciones básicas de inicio. Estos valores no están optimizados.

Se puede necesitar otros condensadores de distinto valor para conseguir una oscilación aceptable en una determinada operación. 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 aplicación.

Xtal utilizado:

4MHz

8MHz

20MHz

3.4.3.2.3. Señal De Reloj Externa Los modos EC, ECIO, ECPLL y ECPIO requieren una señal externa de reloj

conectada al pin OCS1. No se necesita un oscilador de “puesta en marcha” después de un reset o al salir del modo sleep.

En los modos EC y ECPLL, se obtiene una señal en el pin OSC2 de la señal de reloj dividida por 4. Esta señal 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 también en los modos EC y ECIO.

Page 96: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

94

FIGURA 3-3: Señal De Reloj Externa (Configuración HS)

FIGURA 3-4: Señal De Reloj Externa (Configuración EC Y ECPLL)

FIGURA 3-5: Señal De Reloj Externa (Configuración 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 oscilación y como fuente de reloj para el microcontrolador.

El PLL está activo en los modos HSPLL, XTPLL, ECPLL y ECPIO. Está diseñado para producir una señal de referencia de 96MHz de una señal de entrada de 4MHz. La salida se puede dividir y utilizar para el USB y el reloj del microcontrolador porque el PLL tiene una señal 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 señal de entrada por 12 para producir 4MHz para el PLL. El modo XTPLL sólo utiliza la frecuencia de entrada de 4MHz que dirige el PLL directamente.

Page 97: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

95

FIGURA 3-6: Diagrama Del Bloque PLL (Configuración HS)

3.4.3.2.5. Bloque Interno Del Oscilador En la familia PIC18F2455/PIC18F2550/PIC18F4455/PIC18F4550 tienen un

oscilador interno que genera dos señales 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 también 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 señal 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 automáticamente cuando alguno de los siguientes está activo:

Temporizador de encendido Monitor de reloj de seguridad Temporizador perro guardián Dos velocidades de inicio

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

Page 98: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

96

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 elección del USB se determina dependiendo del modo de funcionamiento interno.

Hay cuatro modos distintos:

INTHS: Da la señal el oscilador en modo HS. INTXT: Da la señal el oscilador en modo XT. INTCKO: La señal la da un oscilador externo conectado al OSC1; en el

OSC2 podemos obtener Fosc/4. INTIO: La señal la da un oscilador externo conectado al OSC1; en el

OSC2 tenemos un pin E/S (RA6).

Registro OSCTUNE La salida interna de oscilación está calibrada de fábrica pero se puede ajustar a la

aplicación 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 cambiarán 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 indicación de que el suceso haya concluido.

El registro OSCTUNE contiene el bit INTSRC que permite seleccionar que oscilador interno da la señal 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 operación de muchas formas.

La baja frecuencia del oscilador INTRC funciona independientemente de la fuente INTOSC. Cualquier cambio en INTOSC por tensión o temperatura no tiene porqué reflejarse en INTRC y viceversa.

Page 99: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

97

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 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 BIT 6-5 No implementados, se leen 0 BIT 4-0 TUN4:TUN0: Selectores de frecuencia: 01111: Máxima frecuencia …. …. 00001 00000: Frecuencia media. Funciona con la velocidad calibrada. 11111 …. …. 10000: Mínima frecuencia.

Compensación Por Los Cambios En INTOSC Es posible ajustar la frecuencia del INTOSC modificando el registro OSCTUNE.

Esto no producirá ningún cambio en la frecuencia de INTRC.

El ajuste de INTOSC debe hacerse dependiendo de la aplicación. Por ejemplo, si necesitamos la EUSART, debemos ajustar la frecuencia para evitar fallos de recepción 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 interrupción, 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 módulo 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.

Page 100: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

98

Si la medida es mucho mayor que el tiempo calculado quiere decir que el bloque del oscilador interno está funcionando demasiado rápido; 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. Configuración Del Oscilador Para El USB Cuando el PIC18F4550 se utiliza en una conexión 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 Configuración Del Oscilador Con El USB Frecuencia de Divisor PILL Modo del reloj División del reloj MCU Frecuencia del entrada del Osc. (PLLDIV2:PLLDIVO) (FOSC3:FOSCO) (CPUDIV1:CPUDIVO) reloj del micro 48MHz ÷N/A(1) EC, ECIO None(00) 48MHz ÷2(01) 24MHz ÷3(10) 16MHz ÷4(11) 12MHz 48MHz ÷12(111) EC, ECIO None(00) 48MHz ÷2(01) 24MHz .÷3(10) 16MHz ÷4(11) 12MHz ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 40MHz ÷10(110) EC, ECIO None(00) 40MHz ÷2(01) 20MHz ÷3(10) 13.33MHz ÷4(11) 10MHz ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 24MHz ÷6(101) HS, EC, ECIO None(00) 24MHz ÷2(01) 12MHz ÷3(10) 8MHz ÷4(11) 6MHz HSPLL, ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 20MHz ÷5(100) HS, EC, ECIO None(00) 20MHz ÷2(01) 10MHz ÷3(10) 6.67MHz ÷4(11) 5MHz HSPLL, ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 16MHz ÷4(011) HS, EC, ECIO None(00) 16MHz ÷2(01) 8MHz

Page 101: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

99

Frecuencia de Divisor PILL Modo del reloj División del reloj MCU Frecuencia del entrada del Osc. (PLLDIV2:PLLDIVO) (FOSC3:FOSCO) (CPUDIV1:CPUDIVO) reloj del micro ÷3(10) 5.33MHz ÷4(11) 4MHz HSPLL, ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 12MHz ÷3(010) HS, EC, ECIO None(00) 12MHz ÷2(01) 6MHz ÷3(10) 4MHz ÷4(11) 3MHz HSPLL, ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 8MHz ÷2(001) HS, EC, ECIO None(00) 8MHz ÷2(01) 4MHz ÷3(10) 2.67MHz ÷4(11) 2MHz HSPLL, ECPLL, ECPIO ÷2(00) 48MHz ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz 4MHz ÷1(000) XT, HS, EC, ECIO None(00) 4MHz ÷2(01) 2MHz ÷3(10) 1.33MHz -4(11) 1MHz HSPLL, ECPLL, XTPLL, ÷2(00) 48MHz ECPIO ÷3(01) 32MHz ÷4(10) 24MHz ÷6(11) 16MHz

Nota: (1) Sólo es válido 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 módulo 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.

Page 102: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

100

3.4.3.3.2. Funcionamiento Diferente El Reloj Del USB Y El Del Microcontrolador

El módulo USB puede funcionar de una forma asíncrona con respecto al reloj del microcontrolador y otros periféricos. 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 aplicación 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 opción 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 energía”.

Hay tres fuentes de reloj en estos dispositivos:

oscilador primario oscilador secundario bloque interno de oscilación

Los osciladores primarios incluyen los XTAL, los circuitos resonadores, los modos externos de reloj y el bloque interno de oscilación. El modo particular se elige con los bits de configuración 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 energía”.

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 energía”. Más comúnmente, 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 oscilación se puede usar como reloj en los modos “control de energía”. La fuente INTRC se utiliza en varias opciones especiales como el perro guardián o el monitor del reloj de seguridad.

Page 103: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

101

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 energía.

Los bits de selección 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 después de haber escrito el bit o los bits en un pequeño intervalo de reloj. Los bits SCS se borran en cualquier tipo de reset.

Los bits de selección de la frecuencia del oscilador interno son IRCF2:IRCF0, se elige la frecuencia de salida del bloque del oscilador interno. La elección 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 señal 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 opción permite a los usuarios seleccionar la fuente de reloj más precisa con INTOSC que mantiene el ahorro de energía con una baja velocidad de reloj.

INTRC siempre mantiene la señal de reloj en eventos como el perro guardián o el monitor de seguridad del reloj.

Los bits OSTS, IOFS y T1RUN indican cual es el reloj que proporciona la señal 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 señal secundaria de reloj. En los modos de “control de energía”, sólo 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 señal o el bloque interno el oscilador ha empezado y no está todavía listo.

El bit IDLEN determina si el dispositivo está en modo sleep o uno de los modos de ahorro, cuando se ha ejecutado la instrucción SLEEP.

Page 104: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

102

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 pequeña pausa cuando cambia la señal 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 IDLEN: Bit puntero del modo reposo 1= El dispositivo entra en modo reposo con la instrucción SLEEP 0= El dispositivo entra en modo sleep con la instrucción SLEEP BIT 6-4 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) BIT 3 OSTS: Bit de estado del desbordamiento de oscilador de inicio (depende del estado del bit de configuración 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. BIT 2 IOFS: Bit de frecuencia estable 1= La frecuencia de INTOSC es estable 0= La frecuencia de INTOSC no es estable BIT 1-0 SCS1:SCS0: Bits de selección del reloj del sistema 1x= Oscilador interno 01= Oscilador Timer1 00= Oscilador primario

Page 105: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

103

3.4.3.5. Efecto De Los Modos De Control De Energía En Varias Fuentes De Reloj

Cuando seleccionamos el modo PRI_IDLE el oscilador primario designado continúa sin interrupciones. En los demás modos de ahorro de energía, 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 oscilación.

En el modo de reloj secundario (SEC_RUN y SEC_IDLE), el oscilador Timer1 funciona y proporciona la señal de reloj. El oscilador Timer1 o Timer3 pueden funcionar en todos los modos de ahorro de energía si se requiere como reloj.

En los modos de oscilador interno (RC_RUN y RC_IDLE), el oscilador interno proporciona la fuente de la señal de reloj. La salida de 31kHz de INTRC se puede utilizar directamente para producir la señal de reloj y varios de los modos de ahorro de energía especiales. La salida de INTOSC de 8MHz se puede utilizar para producir la señal de reloj del dispositivo directamente o por medio de algún postscaler. La salida del INTOSC se desactiva directamente si la señal 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 oscilación continuará en el reloj del USB. Éste módulo y los demás puede cambiarse a una nueva fuente de reloj.

Si se selecciona el modo sleep, se interrumpen todas las señales de reloj. Con todas las corrientes de polarización de los transistores obtenemos el menor consumo en el dispositivo.

No se debe activar el modo sleep cuando el módulo USB está activado y existen comunicaciones. La única excepción es cuando al dispositivo se le ha suspendido por medio de un comando del USB. Una vez que el módulo 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 señal de reloj.

Page 106: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

104

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 mayoría de las aplicaciones, no se necesitan reset externos. Los retrasos mantienen el dispositivo apagado hasta que la tensión 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 configuración 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 después activa el micro.

Cuando elegimos el modo de oscilador HSPLL, el dispositivo permanece en reset 2ms más después del retraso del OST, para que el PLL pueda detectar la frecuencia de entrada.

Hay un intervalo de retraso TCSD después del POR, cuando el controlador empieza a ejecutar una instrucción. Este retraso se ejecuta cuando están 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 OSC1 Pin OSC2 Pin INTCKO Abierto, se conecta el reloj Salida (reloj/4) INTIO Abierto, se conecta el reloj Configurado como PORTA, bit 6 ECIO, ECHO Abierto, se conecta el reloj Configurado como PORTA, bit 6 EC Abierto, se conecta el reloj Salida (reloj/4) XT and HS Inactivo sin tensión Inactivo sin tensión

Page 107: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

105

3.4.4. MODOS DE CONTROL DE ENERGÍA Los dispositivos PIC18F2455/2550/4455/4550 ofrecen un total de siete modos

de funcionamiento para controlar la energía. Estos modos proporcionan una variedad de opciones para la conservación selectiva en las aplicaciones donde los recursos pueden ser limitados (es decir, los dispositivos con pilas).

Hay tres categorías de modos de control de energía:

Modo ejecución. Modo reposo Modo sleep.

Estas categorías definen qué porciones del dispositivo se utilizan y a veces, qué velocidad. Los modos ejecución 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 energía incluyen varias características de ahorro de energía que se ofrecieron en los microcontroladores antiguos. Una es la característica de la conmutación del reloj, ofrecida en otros dispositivos PIC18, permitiendo que el regulador utilice el oscilador Timer1 en lugar del oscilador primario. También 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 Energía MODO Bits OSCCON Modulo que controla Fuente de reloj y oscilador IDLEN(1) SCS1:SCS0 CPU Periféricos disponible

Sleep 0 N/A Off Off Nada – los relojes están desactivados PRI-RUN N/A 00 Clocked Clocked Primario-todos los modos del oscilador. Este es el modo de ejecución normal. SEC-RUN N/A 01 Clocked Clocked Secundario-Como oscilador los Timer RC RUN N/A 1x Clocked Clocked Bloque interno del oscilador(2) PRI IDLE 1 00 Off Clocked Primario- todos los modos de oscilador SEC_IDLE 1 01 Off Clocked Secundario-Como oscilador los Timer

RC IDLE 1 1x Off Clocked Bloque interno del oscilador(2)

Nota: 1: IDLEN devuelve este valor cuando se ha ejecutado la instrucción SLEEP.

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

Page 108: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

106

3.4.4.1. Seleccionar Los Modos De Control De Energía Seleccionar un modo de control de energía requiere dos decisiones: si la CPU

está controlada o no y la selección 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 selección de una de tres fuentes del reloj para

los modos de control de energía. Son:

El reloj primario, según lo definido en los bits de configuración 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 Energía El cambio de un modo de control de energía a otro comienza cargando el

registro OSCCON. Los bits SCS1:SCS0 seleccionan la fuente del reloj y se determinan cuáles funcionan en los modos ejecución 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 energía reposo o sleep se provoca por la ejecución de una instrucción 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 energía no tiene por que requerir seleccionar todos los bits. Muchas transiciones se pueden hacer cambiando los bits de selección del oscilador, o cambiando el bit IDLEN, antes de ejecutar una instrucción SLEEP. Si el bit IDLEN está configurado correctamente, puede ser necesario realizar una instrucción SLEEP para cambiar al modo deseado.

Page 109: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

107

3.4.4.1.3. Transiciones De Reloj Y Puntero De Estado La longitud de la transición 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 fórmula 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, sólo uno de estos bits se fijará en un modo de energía. 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 todavía.

Si el bloque del oscilador interno se configura como el reloj primario por los bits de configuración 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 señal estable de salida de 8MHz. Cambiar el modo de control de energía 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 más alta que la soportada por VDD. Se puede provocar un error si se violan las especificaciones de VDD/FOSC.

2: Ejecutar una instrucción SLEEP no pone necesariamente el dispositivo en el modo sleep. Actúa 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. Múltiples Comandos SLEEP El modo control de energía que se invoca con la instrucción SLEEP se determina

en el ajuste del bit IDLEN cuando se ejecuta la instrucción. Si se ejecuta otra instrucción del SLEEP, el dispositivo entrará en el modo de control de energía especificado por el bit IDLEN en ese momento. Si IDLEN ha cambiado, el dispositivo entrará en el nuevo modo de control de energía especificado por el nuevo ajuste.

Page 110: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

108

3.4.4.2. Modos De Ejecución En los modos de ejecución, están activos los relojes al núcleo y a los periféricos.

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 ejecución de la potencia normal del

microcontrolador. Éste también 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 periféricos se controlan con el oscilador Timer1. Esto da a los usuarios la opción de un consumo de energía más bajo mientras que todavía 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 situación, la operación inicial del oscilador será inestable e imprevisible.

En transiciones entre los modos SEC_RUN a PRI_RUN, los periféricos y la CPU continúan 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 señal. A los bits IDLEN y SCS no les afecta el arranque; el oscilador Timer1 continúa funcionando.

Page 111: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

109

FIGURA 4-1: Tiempos De Transición Para Entrar En El Modo SEC_RUN

FIGURA 4-2: Tiempos De Transición 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 periféricos se están controlando por el

bloque del oscilador interno usando el multiplexor INTOSC; se desactiva el reloj primario. Este modo proporciona la mejor conservación de energía de todos los modos cuando se ejecuta código. 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 ejecución 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 también 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.

Page 112: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

110

Si los bits IRCF e INTSRC están borrados, la salida de INTOSC está desactivada y el bit IOFS seguirá a 0; no habrá indicación 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á después de que la salida INTOSC sea estable. Las señales del dispositivo continúan mientras que la fuente de INTOSC se estabiliza después 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 continúa 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 Transición Al Modo RC_RUN

FIGURA 4-4: Tiempo De Transición En El Cambio Del Modo RC_RUN Al PRI_RUN

Page 113: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

111

3.4.4.3. Modo SLEEP El modo de control de energía SLEEP en los dispositivos

PIC18F2455/2550/4455/4550 es idéntico al modo SLEEP del resto de dispositivos de PICmicro. Se activa borrando el bit IDLEN (estado por defecto en el dispositivo) y ejecutándose la instrucción 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 señal 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, también continuará funcionando.

Cuando ocurre un acontecimiento (una interrupción, 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 están 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 Transición Para Entrar En El Modo SLEEP

FIGURA 4-6: Tiempo De Transición Del Reinicio De Un SLEEP (HSPLL)

Page 114: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

112

3.4.4.4. Modos De Reposo Los modos reposo permiten que la CPU del regulador esté apagada

selectivamente mientras que los periféricos continúen funcionando. Seleccionar un modo particular permite a usuarios manejar más el consumo de energía.

Si el bit IDLEN se fija a ‘1’ cuando se ejecuta una instrucción SLEEP, los periféricos tendrán 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 señal de reloj no les afecta. Activando el bit IDLEN y ejecutando una la instrucción SLEEP proporciona un método rápido 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, también continuará funcionando.

Puesto que la CPU no está ejecutando instrucciones, las únicas salidas de los modos de reposo son una interrupción, 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 código. Cuando la CPU comienza a ejecutar código, 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 periféricos (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 temporización sensible, esto permite una reanudación más rápida del dispositivo, con una fuente primaria más exacta del reloj, puesto que la fuente del reloj no tiene que “calentar” o esperar la transición de otro oscilador.

El modo de PRI_IDLE entra en modo PRI_RUN activando el bit IDLEN y ejecutando una instrucción SLEEP. Si el dispositivo está en otro modo de funcionamiento, primero activa el bit IDLEN, después borrar los bits SCS y por último ejecutar una instrucción SLEEP. Aunque la CPU está desactivada, los periféricos continúan gobernados por la fuente primaria de reloj especificada por los bits de configuración 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 ejecución de código. Esto se provoca para permitir que la CPU esté lista para ejecutar instrucciones. Después del reinicio, el resto de bits OSTS se activan. A los bits IDLEN y SCS no les afecta el reset.

Page 115: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

113

3.4.4.4.2. MODO SEC_IDLE En modo de SEC_IDLE, la CPU se desactiva pero los periféricos continúan

funcionando gracias al Timer1. Se cambia del modo SEC_RUN al SEC_IDLE activando el bit IDLEN y ejecutando una instrucción SLEEP. Si el dispositivo está en otro modo de funcionamiento, se activa primero el bit IDLEN, después 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 periférico continúan funcionando con el oscilador Timer1. Después de un intervalo TCSD que sigue a la interrupción, la CPU comienza a ejecutar código gracias al oscilador Timer1. A los bits IDLEN y SCS no les afecta el reset; el oscilador Timer1 continúa 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 instrucción SLEEP, se ignorará esta instrucción y no cambiara al modo SEC_IDLE. Si el oscilador Timer1 está activo pero no funciona todavía, se provocarán retrasos en los relojes de los periféricos hasta que el oscilador comience a contar. En tales situaciones, tenemos un oscilador imprevisible.

FIGURA 4-7: Tiempo De Transición Para Entrar En El Modo IDLE

FIGURA 4-8: Tiempo De Transición El Reinicio Del Modo IDLE Al RUN

Page 116: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

114

3.4.4.4.3. Modo RC_IDLE En modo de RC_IDLE, la CPU se desactiva pero los periféricos continúan

activos con el bloque del oscilador interno usando el multiplexor INTOSC. Este modo permite la conservación controlada de energía durante los períodos de reposo.

El paso del modo RC_RUN, a éste modo se realiza activando el bit IDLEN y ejecutando una instrucción SLEEP. Si el dispositivo está en otro modo de funcionamiento, primero se activa el bit IDLEN, después el bit SCS1 y por último, una instrucción 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 más alta modificando los bits IRCF antes de ejecutar la instrucción 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, después de un intervalo TIOBST. Los relojes de los periféricos continúan 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 instrucción SLEEP y la fuente INTOSC es estable, el bit IOFS seguirá activo. Si los bits IRCF e INTSRC están todos borrados, la salida INTOSC no se permitirá, el bit IOFS seguirá borrado y no habrá indicación de la fuente actual de reloj.

Cuando ocurre un acontecimiento de reinicio, los periféricos continúan funcionando por el multiplexor INTOSC. Después del retraso TCSD sigue la interrupción, la CPU comienza ejecutando el código 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 están 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

interrupción, un reset o un desbordamiento del WDT. Esta sección discute los disparadores que causan las salidas de modos de ahorro de energía. El subsistema que registra las acciones se discuten en cada uno de los modos de ahorro de energía.

Page 117: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

115

3.4.4.5.1. Salida Por Una Interrupción Cualquier interrupción puede provocar el cambio del modo de reposo o del

modo sleep al modo ejecución. Para permitir esta funcionalidad, se debe activar una fuente de interrupción 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 interrupción.

En todas las salidas de modos reposo o sleep por una interrupción, el programa salta al vector interrupción si el bit GIE/GIEH (INTCON<7>) está activo. Si no, la ejecución de código continúa o se reanuda sin saltos.

Se necesita un retraso TCSD después de la interrupción para que el sistema salga del modo reposo o sleep. Este retraso se provoca para que la CPU se prepare para la ejecución. La ejecución de la instrucción 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 energía que esté activo cuando se desborde.

Si el dispositivo no está ejecutando código (en cualquier modo reposo o en el modo sleep), el desbordamiento dará lugar a una salida del modo ahorro de energía. Si el dispositivo está ejecutando código (cualquiera de los modos de ejecución), el desbordamiento dará lugar a un reset del WDT.

El contador de tiempo y el postscaler del WDT se borran una instrucción SLEEP o CLRWDT, la pérdida de la fuente de reloj seleccionada (si se permite el monitor de reloj de seguridad) y la modificación 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 código. 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 ejecución de código depende de las fuentes de reloj de antes y después del reinicio y del tipo de oscilador si la nueva fuente de reloj es el oscilador primario.

La ejecución del código puede comenzar antes de que el reloj primario este listo. Si el inicio con dos velocidades o el monitor de reloj de seguridad están activos, el dispositivo puede comenzar la ejecución tan pronto como la fuente del reset haya desaparecido. La ejecución se controla con el multiplexor INTOSC conducido por bloque del oscilador interno. La ejecución la controla por el bloque del interno oscilador hasta que el reloj primario esté listo o entre en un modo de ahorro de energía antes de que el reloj primario esté listo; el reloj primario se desactiva.

Page 118: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

116

3.4.4.5.4. Salida Sin Un Retraso Del Inicio Del Oscilador Algunas salidas de los modos de ahorro de energía 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 después de reiniciar el sistema para dejar el modo sleep o reposo para permitir que la CPU se prepare para ejecutar una instrucción. La ejecución de la instrucción se reanuda en el primer ciclo de reloj después del retraso.

3.4.5. RESET Los dispositivos PIC18F2455/2550/4455/4550 distinguen entre las distintas

clases de reset:

a) Reset por fallo de energía (POR) b) Reset por MCLR* durante la operación normal c) Reset de MCLR* durante modos ahorro de energía d) Reset por el perro guardián (WDT) (durante ejecución) e) Reset por cese de energía (BOR) f) Instrucción RESET g) Reset por desbordamiento la Pila h) Reset por vaciado de la Pila

Esta sección discute los resets generados por MCLR*, POR y BOR y cubre la operación de los varios contadores de tiempo inicio.

Page 119: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

117

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 más bajos del registro indican que ha ocurrido un reset. En la mayoría de los casos, estos bits se borran con el reset y se deben activar por software después. El estado de estos flags se puede leer para indicar el tipo de reset que acaba de ocurrir.

El registro de RCON también tiene bits de control para elegir la prioridad de la interrupción (IPEN) y del software de control del BOR (SBOREN).

Page 120: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

118

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 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 6 SBOREN: 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 4 RI*: Bit de la instrucción RESET 1=no se ha ejecutado una instrucción RESET (se activa por firmware) 0=se ha ejecutado una instrucción RESET (se tiene que activar por software) BIT 3 TO*: Bit de desbordamiento del WDT: 1= Se activa por reinicio, CLRWDT, o una instrucción SLEEP 0= El WDT se ha desbordado BIT 2 PD*: Bit de detección de una caída de tensión: 1= Se activa por reinicio o CLRWDT 0=se borra por una instrucción SLEEP BIT1 POR*: Bit de estado de reset por subida de tensión (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) BIT0 BOR*: Bit de estado de reset por cese de energía 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 después de detectar el reset para poder detectar otros resets.

2: Normalmente, cuando ocurre un reset por cese de energía BOR* es ‘0’ y POR* ‘1’ (suponiendo que POR* se pone a ‘1’ después de un reset por subida de tensión).

Page 121: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

119

3.4.5.2. Master Clear Reset (MCLR*) El pin MCLR* proporciona un método 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 pequeños. El pin MCLR* no se pone a cero con ningún reset interno, incluyendo el WDT. En los dispositivos PIC18F2455/2550/4455/4550, la entrada MCLR* se puede inhabilitar con la configuración del bit MCLRE. Cuando MCLR* está desactivado, el pin se convierte en una entrada digital.

3.4.5.3. Reset Por Subida De Tensión (POR) Un reset por subida de tensión 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 través 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 tensión.

Cuando el dispositivo comienza la operación normal (es decir, salir de la condición de reset), los parámetros de funcionamiento del dispositivo (tensión, 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 ningún otro reset. POR no se ajusta a ‘1’ con ningún acontecimiento de hardware. Para capturar acontecimientos múltiples, el usuario pone manualmente el bit a ‘1’ por software después de cualquier POR.

FIGURA 5-2: Circuito De Reset Externo Por Subida De Tensión (Para Lenta Subida De VDD)

Nota: 1: Se necesita este circuito sólo si VDD sube lentamente.

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

2: R<40Ω Recomendada para que la tensión no dañe el chip.

3: R1≥1kΩ limitará la corriente en MCLR*.

Page 122: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

120

3.4.5.4. Reset Por Cese De Tensión (BOR) Los dispositivos PIC18F2455/2550/4455/4550 tienen un circuito BOR en

ejecución que provee al usuario un número de opciones de configuración y de ahorro de energía. 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 tensión 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 más que VBOR.

Si se permite el contador de tiempo de inicio, se invocará después 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 tensión 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 automáticamente 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 colocación del BOR bajo control por software da al usuario la flexibilidad adicional de adaptar la aplicación sin tener que reprogramar el dispositivo para cambiar la configuración del BOR. También permite al usuario adaptar el consumo de energía del dispositivo mediante software eliminando la corriente incremental que consume el BOR. Mientras que la corriente de BOR es muy pequeña, 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 todavía se fija con los bits BORV1:BORV0. No se puede cambiar por software.

Page 123: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

121

3.4.5.4.2. Detección Del BOR Cuando se permite el BOR, el bit BOR* se resetean en cualquier acontecimiento

de BOR o de POR. Esto hace que sea difícil determinar si ha ocurrido un reset BOR por la lectura el estado del bit BOR*. Un método de mayor confianza es comprobar simultáneamente el estado de los bits POR* y BOR*. Esto asume que el bit POR* se pone a ‘1’ por software inmediatamente después 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 están bajo el control del

hardware y funciona como se ha descrito previamente. Siempre que el dispositivo entre en modo sleep el BOR se inhabilita automáticamente. Cuando el dispositivo vuelve a cualquier otro modo de funcionamiento, se vuelve a permitir el BOR automáticamente.

Este modo permite aplicaciones en las que el dispositivo se recupere de situaciones de cese de energía, mientras que ejecutan código, cuando el dispositivo requiere la protección BOR. Al mismo tiempo, ahorra energía adicional en modo sleep eliminando la corriente incremental de BOR.

TABLA 5-1: Configuración Del BOR Configuración del BOR Estado de BOREN1 BOREN0 SBOREN Operaciones del BOR (RCON<6>)

0 0 No disponible BOR desactivado; para activarlo reprogramar el bit de configuración 0 1 Disponible BOR activo en software; se controlan las operaciones por SBOREN. 1 0 No disponible BOR activo en hardware en los modos RUN e IDLE, desactivado en el modo SLEEP 1 1 No disponible BOR activo en hardware; para desactivarlo reprogramar el bit de configuración.

3.4.5.5. 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 función principal es asegurarse de que el reloj del dispositivo es estable antes de que se ejecute el código. Estos contadores de tiempo son:

Temporizador de inicio (PWRT) Oscilador temporizador de arranque (OST) Temporizador de control del PLL

Page 124: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

122

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 2048x32µs=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 variación 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 después 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 energía.

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 típicamente 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. Después de que la condición 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 configuración 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 más de un PIC18FXXXX funcionando en paralelo.

Page 125: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

123

TABLA 5-2: Retraso En Distintas Situaciones Configuración del Aumento(2) y cese de tensión Salida del

Oscilador PWRTEN=0 PWRTEN=1 Modo de ahorro de energía

HS, XT 66ms(1) + 1024TOSC 1024TOSC 1024TOSC HSPLL, XTPLL 66ms(1)+1024TOSC+2ms(2) 1024TOSC+2ms(2) 1024TOSC+2ms(2) EC, ECIO 66ms(1) - - ECPLL, ECHO 66ms(1)+2ms(2) 2ms(2) 2ms(2) INTIO, INTCKO 66ms(1) - - INTHS, INTXT 66ms(1)+1024TOSC 1024TOSC 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 mayoría 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 mayoría de los registros no les afecta un reinicio por WDT, puesto que esto se ve como la reanudación a la operación 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. ORGANIZACIÓN 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 están separados; esto permite el acceso a la vez en las dos memorias. La EEPROM de datos, en la práctica, se puede utilizar como un dispositivo periférico, puesto que se maneja a través de un sistema de registros de control.

Page 126: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

124

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

3.4.6.1. Organización 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 localización en medio el límite superior de la memoria implementada físicamente y los 2Mb direccionables se leerá todo ‘0’ (una instrucción 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 interrupción. En un reset, la dirección del vector está en 0000h y los vectores de interrupción están en las direcciones 0008h y 0018h.

Page 127: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

125

3.4.6.1.1. Contador De Programa El contador de programa (PC) especifica la dirección de la instrucción 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 través 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 través del registro PCLATU.

El contenido de PCLATH y de PCLATU se transfiere al contador de programa por cualquier operación que escriba el PCL. Semejantemente, los dos bytes superiores del contador de programa se transfieren al PCLATH y al PCLATU por cualquier operación que lea el PCL.

El PC trata bytes en la memoria del programa. Para evitar que el PC no se alinee bien con la instrucción, 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 Dirección De La Pila La pila almacena la dirección de hasta 31 saltos. El PC se posiciona sobre la pila

cuando se ejecuta una instrucción CALL o RCALL o una llamada a una interrupción. El contenido de la pila se devuelve al CP con las instrucciones RETURN, RETLW o una instrucción 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 dirección 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 instrucción que guarda una dirección en la pila es CALL. El puntero de la pila se incrementa y la localización que señalaba por el puntero de la pila se escribe con el contenido del PC (que señala ya a la instrucción que sigue a CALL). Con la instrucción RETURN se utiliza el contenido de la pila. El contenido de la localización señalado por el STKPTR se transfieren al PC y entonces el stack pointer decrementa.

El stack pointer se inicializa con ‘00000’ después de cada reset. No hay RAM asociado a la localización que corresponde con un valor del stack pointer de ‘00000’; esto sólo es un valor de reset. Los bits de estado indican si la pila está llena, ha desbordado o tiene está vacía y tiene que devolver una dirección (underflow).

Page 128: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

126

FIGURA 6-2: Devolución De La Dirección 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 localización de la pila señalado por el registro STKPTR. Esto permite que los usuarios pongan una dirección en la pila mediante software en caso de necesidad. Después de que una CALL, un RCALL o una interrupción, 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 después 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 característica 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 acción que ocurre cuando se llene la pila depende por completo del estado del bit de configuración 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. Ningún dato adicional sobrescribirá el dato 31º y el STKPTR permanecerá en 31.

Page 129: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

127

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 ejecución de programa normal, es una característica deseable. El sistema de instrucción PIC18 incluye dos instrucciones, PUSH y POP, que permiten manipular la TOS por software. TOSU, TOSH y TOSL se pueden modificar poniendo datos o devolviéndolos a la pila.

La instrucción 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 instrucción 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

STKFUL STKUNF - SP4 SP3 SP2 SP1 SP0

BIT 7 STKFUL: Bit señalizador del llenado de la pila: (Borrado por software) 1= La pila está llena o sobresaturada 0= La pila no está llena ni sobresaturada BIT 6 STKUNF: Bit señalizador del underflow: (Borrado por software) 1= Ha ocurrido un underflow 0= No ha ocurrido un underflow BIT 4-0 SP4:SP0: Bits de localización 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 configuración 4L. Cuando se activa STVREN, un llenado o vaciado de la pila activará el bit apropiado STKFUL o STKUNF y después 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.

Page 130: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

128

3.4.6.1.3. Pila De Almacenamiento Rápido Un almacenamiento rápido en la pila se proporciona con los registros ESTADO,

WREG y BSR para lograr una “vuelta rápida” 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 interrupción. Todas las fuentes de la interrupción almacenarán valores en los registros de la pila. Los valores cargan nuevamente dentro de sus registros se utiliza la instrucción RETFIE o FAST para volver de la interrupción.

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 interrupción prioritaria mientras que se mantiene una interrupción de baja prioridad, los valores del registro de la pila almacenados por la interrupción de prioridad baja será eliminados y se almacenarán 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 rápido para volver de la interrupción. Si no se utilizan las interrupciones, la pila de almacenamiento rápido 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 rápido en una llamada de un subprograma, hay que usar una instrucción 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 rápido. Para restaurar estos registros hay que utilizar una instrucción RETURN, FAST.

EJEMPLO 6-1: Código De Ejemplo De Acceso A La Pila De Almacenamiento Rápido CALL SUB1, FAST ;Se guardan en el registro de la pila de acceso rápido los ;registros ESTADO, WREG y BSR ….. ….. SUB1 ….. ….. RETURN, FAST ;Devolvemos los valores guardados en la pila de acceso ;rápido

Page 131: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

129

3.4.6.1.4. Operaciones De Búsqueda En Las Tablas De Memoria De Programa

Puede haber programas que en determinadas situaciones requieran la creación de estructuras de datos, o tablas con búsqueda, dentro de la memoria del programa. En los dispositivos PIC18, las operaciones de búsqueda en tablas se puede implementar de dos maneras:

GOTO controlado Lectura de la tabla

GOTO Controlado Un GOTO controlado se logra agregando una compensación al contador de

programa.

Una opción de búsqueda en la tabla se puede conseguir con una instrucción ADDWF PCL y un grupo de instrucciones RETLW nn. El registro W se carga con una compensación en la tabla antes de ejecutar la llamada a esa tabla. La primera instrucción de la rutina llamada es la instrucción ADDWF PCL. La instrucción siguiente ejecutada será una RETLW nn que devuelve “el valor” nn a la función que llama.

El valor compensado (en WREG) especifica el número de bytes que el contador de programa debe avanzar y deben ser los múltiplos de 2 (LSb = 0).

Con este método, solamente se puede almacenar un byte de datos en cada localización y sitio de cada instrucción, en la vuelta se requiere la dirección de pila.

EJEMPLO 6-2: GOTO Controlado Usando Un Valor Compensado MOVF OFFSET, W CALL TABLE ORG nn00h TABLE ADDWF PCL RETLW nnh RETLW nnh RETLW nnh …. ….

Lectura Y Escritura En Las Tablas Un método mejor de almacenar datos en la memoria del programa permite que

dos bytes de datos sean almacenados en cada localización de la instrucción.

Las operaciones de búsqueda 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 dirección 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.

Page 132: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

130

3.4.6.2. Ciclos Instrucción 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 instrucción de la memoria del programa y almacenado en el registro de la instrucción (IR). Se descifra la instrucción y se ejecuta durante los siguientes Q1 hasta Q4.

FIGURA 6-3: Ciclo Reloj/Instrucción

3.4.6.2.2. Instrucción Flow/Pipelining Un “ciclo de instrucción” consiste en cuatro ciclos de Q: de Q1 hasta Q4. La

instrucción trae y se ejecuta es controlada de manera que traer tome un ciclo de la instrucción, mientras que el descifrar y ejecutar tome los otros ciclos de la instrucción. Sin embargo, debido al pipelining, cada instrucción se ejecuta con eficacia en un ciclo. Si una instrucción provoca que el contador de programa cambie (Ej., GOTO), entonces se requieren dos ciclos para terminar la instrucción. El ciclo de traer comienza con el contador de programa (el PC) incremento en Q1. En el ciclo de la ejecución, la instrucción traída se guarda en el registro de la instrucción (IR) en el ciclo Q1. Esta instrucción después se descifra y se ejecuta durante Ciclos Q2, Q3 y Q4. La memoria de los datos se lee durante Q2 (operando leído) y escrito durante Q4 (destinación escribir).

EJEMPLO 6-3: Instrucción Pipeline Flow

Page 133: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

131

Nota: Todas las instrucciones son de un solo ciclo, excepto las de salto. Estas tienen dos ciclos desde que se busca la instrucción se utiliza hasta que la instrucción 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 instrucción se almacena siempre en una posición de memoria del programa con una dirección (LSb = 0). Para mantener la alineación con límites de la instrucción, el PC se incrementa en múltiplos de 2 y el LSb siempre se leerá ‘0’.

Las instrucciones CALL y GOTO tienen la dirección de programa fija en la instrucción. Puesto que las instrucciones se almacenan siempre en direcciones de memoria, los datos contenidos en la instrucción son una dirección. La dirección de la instrucción se escribe en PC<20:1>, que tiene acceso a la dirección deseada del byte en la memoria del programa. Funciona de manera semejante las instrucciones de brinco del programa, que codifican la dirección. El valor almacenado en una instrucción de brinco representa el número 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 estándar 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 más significativos; los otros 12 bits son datos literales, generalmente una dirección de memoria de datos.

El uso del ‘1111’ en los 4 MSbs de una instrucción especifica una forma especial de NOP. Si la instrucción se ejecuta en la secuencia apropiada, inmediatamente después de la primera palabra, se conocen los datos de la segunda palabra y se utilizan como secuencia de la instrucción. Si se salta la primera palabra por alguna razón y la segunda palabra se ejecuta por sí sola, se lee un NOP. Esto es necesario para los casos cuando la instrucción de dos palabras es precedida por una instrucción condicional que cambie el PC.

Page 134: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

132

EJEMPLO 6-4: Instrucciones De Dos Palabras

CASO 1: Código máquina: Código fuente:

0110011000000000 TSTFSZ REG1 ;¿La RAM está en la localización 0? 1100000100100011 MOVFF REG1,REG2 ;No, salta esta instrucción 1111010001010110 ;ejecuta esta otra como NOP 0010010000000000 ADDWF REG3 ;Continua el código

CASO 2: 0110011000000000 TSTSZ REG1 ;¿La RAM está en la localización 0? 1100000100100011 MOVFF REG1,REG2 ;Si, ejecuta la instrucción 1111010001010110 ;2ª palabra de la instrucción 0010010000000000 ADDWF REG3 ;Continua el código

3.4.6.3. Organización De La Memoria De Datos Nota: La operación de algunos aspectos de la memoria de datos se cambia

cuando el PIC18 permite el sistema de instrucción extendida.

La memoria de datos en los dispositivos PIC18 se implementa como RAM estática. Cada registro en la memoria de datos tiene una dirección 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 ejecución, para un total de 2048 bytes.

La memoria de datos contiene los registros de función 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 periféricas, mientras que los GPRs se utilizan para el almacenaje de datos y las operaciones para salvar datos del usuario. Cuando se lee una localización no implementada aparecerán ‘0’s.

El sistema y la arquitectura de la instrucción permiten operaciones a través 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 ejecución. Éste es una memoria de 256 bytes que proporciona el acceso rápido a SFRs y la parte más baja del banco 0 de GPR sin usar BSR.

Page 135: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

133

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 propósito 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 instrucción.

Page 136: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

134

3.4.6.3.1. RAM Del USB Los bancos 4 a 7 de la memoria de datos están mapeados a un puerto dual

especial de RAM. Cuando el módulo USB está desactivado, los GPRs en estos bancos se utilizan como cualquier otro GPR en la memoria de datos.

Cuando se permite el módulo USB, la memoria en éstos bancos se asigna como RAM de almacenamiento intermedio para las operaciones del USB. Esta área se comparte entre el núcleo del microcontrolador y el motor de la interfaz en serie (SIE) del USB y se utiliza para transferir datos directamente entre los dos.

En teoría, se pueden utilizar las áreas de la RAM del USB que no se asignan como Buffers del USB para almacenar variables. En la práctica, la naturaleza dinámica de la asignación del almacenamiento intermedio hace que sea peligroso. Además, el banco 4 se utiliza para controlar el almacenamiento intermedio del USB cuando se permite el módulo y no se debe utilizar para otros propósitos 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

dirección para hacer el acceso rápido a cualquier dirección posible. Idealmente, esto significa que no se tiene que proporcionar una dirección entera para cada operación 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 instrucción, cada localización puede tratar directamente una dirección completa de 12 bits, o una dirección de orden inferior de 8 bits y un puntero del banco de 4 bits.

La mayoría 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 más significativos de la dirección de localización; la instrucción incluye los ocho bits menos significativos. Solamente los cuatro bits más bajos del BSR están implementados (BSR3:BSR0). No se utilizan los cuatro bits altos; leerán ‘0’ y no se pueden escribir. El BSR se puede cargar directamente usando la instrucción MOVLB.

El valor del BSR indica el banco en la memoria de datos. Los ocho bits de la instrucción muestran la localización en el banco y se pueden conocer como el límite bajo del banco.

Como hasta dieciséis registros pueden compartir la misma dirección 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 dirección de 8 bits son F9h, mientras que el BSR es 0Fh, reseteará el contador de programa.

Mientras que cualquier banco se puede seleccionar, sólo esos bancos que se ponen en ejecución se pueden leer o escribir. Cuando se escriba en los bancos no implementados no ocurrirá nada, mientras que cuando se lean se devolverán ‘0’s. Sin embargo, al registro ESTADO le afecta como si la operación fuera correcta.

Page 137: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

135

En el núcleo del sistema de instrucciones de los PIC18, solamente la instrucción MOVFF especifica completamente la dirección de 12 bits de los registros de la fuente y del blanco. Con esta instrucción se ignora el BSR cuando se ejecuta. El resto de las instrucciones incluyen solamente la dirección 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 instrucción se puede usar para invalidar

el banco seleccionado (BSR<3:0>) del registro de acceso al banco.

2: La instrucción MOVFF inserta los 12bit de dirección en la instrucción.

3.4.6.3.3. Acceso Al Banco Mientras que el uso del BSR, con una dirección de 8bits, permite que los

usuarios traten la gama entera de memoria de datos, también 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 localización incorrecta. Esto puede ser desastroso si un GPR se va a modificar por una operación 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

Page 138: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

136

dispositivo están mapeados. A estas dos áreas mapeadas en el banco de acceso se puede dirigir con una dirección de 8 bits.

El banco de acceso se utiliza por las instrucciones de núcleo de los PIC18 que incluyen el bit de acceso a RAM (el parámetro ‘a’ dentro de la instrucción). Cuando el ‘a’ es igual a ‘1’, la instrucción utiliza el BSR y la dirección de 8 bits incluidos en el código para la dirección 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 instrucción; se ignora el valor actual del BSR.

El usar estas direcciones “forzadas” permite a la instrucción funcionar en una dirección de datos en un solo ciclo sin actualizar primero el bit BSR. Para direcciones de 8bits de 60h y más, esto significa que los usuarios pueden evaluar y modificar los SFRs más eficientemente. Acceso la a RAM por debajo de 60h es bueno para almacenar los valores que el usuario pueda necesitar rápidamente, por ejemplo de cómputo inmediato resultados o variables comunes del programa. Tener acceso a la RAM también cuenta la rapidez y más ahorro del código y conmutación de variables.

El acceso al banco mapeado es levemente diferente cuando se permite el sistema de instrucciones extendidas (bit de configuración XINST=1).

3.4.6.3.4. Registro De Archivos De Propósito 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 (dirección 000h) y crece hasta la última área de SFR. GPRs no se inicializa por un reinicio y no cambia en ningún otro reset.

3.4.6.3.5. Registros De Función Específica Los registros de función específica (SFRs) son registros usados por la CPU y los

módulos periféricos para controlar las operaciones deseadas del dispositivo. Estos registros se ponen en ejecución como RAM estática en la memoria de datos. SFRs empieza la última dirección 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 “núcleo” del dispositivo (ALU, reajustes e interrupciones) y los relacionados con las funciones de los periféricos.

Los SFRs se distribuyen por las funciones los periféricos que controlan. Las localizaciones de SFR no utilizadas no están implementadas y se leen como ‘0’.

Page 139: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

137

TABLA 6-1: Mapa De Los Registros De Función Específica

Nota: 1: No es un registro físico.

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 aritmético de la ALU. Como con

cualquier otro SFR, se puede modificar con cualquier instrucción.

Si el registro ESTADO es el destino de una instrucción que afecte a los bits Z, C.C., C, OV o N, no escribirá el resultado de la instrucción, en vez de eso, el registro ESTADO se actualiza según la instrucción realizada. Por lo tanto, el resultado de una instrucción 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’).

Page 140: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

138

REGISTRO 6-2. STATUS: Registro Status BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

- - - N OV Z DC C

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 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 3 OV: Bit de desbordamiento. Este bit se utiliza en el complemento a 2. Indica que una operación de 7bits se ha desbordado. 1= Ha ocurrido un desbordamiento 0= No ha ocurrido un desbordamiento BIT 2 Z: Bits de cero 1= El resultado de una operación aritmética es 0 0= El resultado de una operación aritmética no es 0 BIT 1 DC: Dígito de acarreo/Bit BORROW* En BORROW*, se invierte la polaridad. Una se ejecuta una substracción 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 BIT0 C: Bit de acarreo/Bit BORROW* En BORROW*, se invierte la polaridad. Una se ejecuta una substracción 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

Page 141: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

139

3.4.6.4. Modos De Direccionamiento De Los Datos Nota: La ejecución de algunas instrucciones en el núcleo del PIC18 cambia

cuando se activan las instrucciones extendidas.

Mientras que la memoria de programa se puede tratar en una sola dirección (a través del contador de programa) la información en la memoria de datos se puede tratar de varias maneras. En la mayoría de las instrucciones, el modo de dirección es fijo. Otras instrucciones pueden utilizar hasta tres modos, dependiendo de cuales utilizan los operandos y si o no el sistema de instrucción extendida está permitido.

Los modos de direccionamiento son:

Inherente Literal Directo Indirecto

Hay otro modo de direccionamiento, indexación del literal compensado, está disponible cuando se permiten las instrucciones extendidas (configuración 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 operación global, que afecte al dispositivo o funcionar implícitamente en un registro. Se conoce este modo de dirección como Dirección inherente. Los ejemplos incluyen SLEEP, RESET y DAW.

Otras instrucciones trabajan de una manera similar pero requieren un argumento explícito adicional en el código máquina. 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 dirección 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 dirección de destino de la operación dentro del código de programa. Las opciones son especificadas por los argumentos que acompañan la instrucción.

En las instrucciones bit-orientadas y byte-orientadas del sistema de instrucción del núcleo de los PIC18, utilizan una cierta versión de direccionamiento directo por defecto. Todas estas instrucciones incluyen una cierta dirección literal de 8 bits como su byte menos significativo. Esta dirección especifica una dirección en uno de los bancos de la RAM o una localización en el banco de acceso como el código de la instrucción.

El bit de acceso a RAM la ‘a’ determina cómo es la dirección interpretada. Cuando la ‘a’ es el ‘1’, el contenido del BSR se utiliza con la dirección para determinar los 12bit completos de la dirección del registro. Cuando la ‘a’ es ‘0’, la dirección se

Page 142: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

140

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 dirección de 12 bits (fuente o destinación) entera en su código máquina. En estos casos, el BSR se ignora completamente.

El destino de los resultados de la operación 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 implícito en la instrucción; 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

localización en la memoria de datos sin dar una dirección fija en la instrucción. Esto se hace usando los registros selectores del archivo (FSRs) como punteros a las localizaciones que se leerán o se escribirán. Puesto que los FSRs están situados en la RAM como registros de función específica, sólo 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 están puestos con los operandos de archivo indirectos (INDFs) esa manipulación automática del permiso en ejecución del valor del puntero con auto-incremento, auto-decremento o compensando con otro valor. Esto permite un código eficiente, usando lazos.

EJEMPLO 6-5: Como Borrar RAM (Banco 1) Utilizando El Direccionamiento Indirecto LFSR FSR0,100h NEXT CLRF POSTINC0 ;Borrar el registro INDF e incrementar el puntero BTFSS FSR0H,1 ;¿Todo el banco 1 en blanco? BRA NEXT ;No, borrar el siguiente CONTINUE ;Si, continua

Page 143: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

141

Registros FSR Y El Operando INDF En el núcleo 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”; están mapeados en el espacio de SFR pero no se ponen en ejecución físicamente. 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 dirección indicada por FSR1H:FSR1L. Las instrucciones utilizan los registros INDF mientras que los operandos utilizan el contenido del FSR correspondiente como puntero de la instrucción. El operando de INDF es una manera conveniente de usar los punteros.

Como el direccionamiento indirecto utiliza una dirección 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 determinación de la dirección objetivo.

FIGURA 6-7: Direccionamiento Indirecto

Usando una instrucción de los registros de direccionamiento indirecto como

operando…

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

Page 144: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

142

…para determinar la localización de la memoria de datos que se usará en esta operación.

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

Registros FSR Y POSTINC, POSTDEC, PREINC Y PLUSW Además del operando INDF, cada par de registros FSR también 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 también realiza una acción específica que almacena valor. Son:

POSTDEC: tiene acceso al valor de FSR, entonces automáticamente lo decrementa en ‘1’ después

POSTINC: tiene acceso al valor de FSR, entonces automáticamente lo incrementa en ‘1’ después

PREINC: incrementa el valor de FSR en ‘1’, después lo utilizan en la operación

PLUSW: suma el valor del registro W (gama de -127 a 128) al del FSR y utiliza el nuevo valor en la operación.

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 operación. 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.

Page 145: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

143

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 señalar uno de los registros virtuales no dará lugar a operaciones acertadas. Como caso específico, asumir que FSR0H:FSR0L contiene FE7h, la dirección de INDF1. Las tentativas de leer el valor de INDF1, usando INDF0 como operando, devolverán 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 físicos 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 código 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 precaución de no cambia inadvertidamente los ajustes que puedan afectar la operación del dispositivo.

3.4.6.5. Memoria Del Programa Y El Sistema De Instrucciones Extendidas

A la operación 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 (configuración del bit XINST=1) cambia ciertos aspectos de la memoria de datos y de su dirección. Específicamente, el uso del banco de acceso para muchas de las instrucciones del núcleo de los PIC18 es diferente. Esto se debe a la introducción de un nuevo modo de dirección para la memoria de datos. Este modo también altera el comportamiento de FSR2 que usa direccionamiento indirecto y sus operandos asociados.

Lo que no cambia es lo importante. El tamaño de la memoria de datos no cambia, así como su direccionamiento lineal. El mapa de los SFRs sigue siendo igual. Las instrucciones del núcleo 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.

Page 146: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

144

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-orientadas- pueden invocar una forma de direccionamiento indexado usando una instrucción compensada específica. Este modo de direccionamiento especial se conoce como indexación 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 dirección es menor o igual a 5Fh.

Bajo estas condiciones, el direccionamiento de las instrucciones no se interpreta como el byte más bajo de una dirección (utilizando el BSR en direccionamiento directo), o como una dirección de 8 bits en el banco de acceso. En lugar, el valor es interpretado como un valor compensado a un puntero de la dirección especificada por FSR2. La compensación y el contenido de FSR2 se suman para obtener la dirección de objetivo de la operación.

3.4.6.6.2. Instrucciones Afectadas Por El Modo Indexado Por Literal Compensado

Algunas de las instrucciones del núcleo 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 instrucción estándar del PIC18. A las instrucciones que utilizan solamente los modos de direccionamiento inherente o literal no les afecta.

Además, 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 dirección del archivo de 60h para arriba. Las instrucciones que resuelven estos criterios continuarán ejecutándose 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.

Page 147: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

145

FIGURA 6-8: El Comparar Tratando Las Opciones Para Las Instrucciones Bit-Orientadas Y Byte-Orientadas (Sistema De Instrucciones Extendidas Permitido)

INSTRUCCIÓN DEL EJEMPLO:

ADDWF, f, d, a (Opcode: ffff del ffff 0010 01da) Cuando a=0 y f=60h: La

instrucción se ejecuta en el modo directo forzado. Se interpreta ‘f’ como un localización 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 están disponibles en este modo de direccionamiento.

Cuando a=0 y f=5Fh: La instrucción se ejecuta en el Modo indexado por literal compensado. ‘f’ se interpreta como compensación del valor de dirección en FSR2. Los dos se suman para obtener la dirección objetivo para la instrucción. La dirección 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 instrucción se ejecuta en el modo directo (también conocido como Modo largo directo). Se interpreta la ‘f’ como localización en uno de los 16 bancos de la memoria de datos. El banco se elige con el registro BSR. La dirección puede estar en cualquier banco implementado en la memoria de datos.

Page 148: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

146

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 límite de las direcciones mapeadas en la ventana, mientras que el límite superior se define por FSR2 más 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 operación indirecta o indexada que utilice operandos indirectos (FSR2 incluido) seguirá trabajando con el direccionamiento indirecto estándar. Cualquier instrucción que utilice el banco de acceso, pero incluya una dirección 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 situación: ADDWF f,d,a FSR2H:FSR2L=120h

Las posiciones de la región del puntero FSR2 (120h) a las del puntero mas (17Fh) están mapeadas con la parte de arriba de RAM (000h-05Fh).

Los registros de funciones especiales de F60h a FFFh están mapeadas de 60h a FFh como es normal.

Las direcciones del banco 0 por debajo de 5Fh no están disponibles en este modo. Se pueden direccionar usando el BSR

Page 149: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

147

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 según lo descrito previamente.

3.4.7. MEMORIA FLASH DE PROGRAMA La memoria flash de programa es legible, escribible y borrable, durante la

operación 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 código del usuario.

Escribir o borrar memoria de programa parará las búsquedas de instrucciones hasta que se complete la operación. No se puede acceder a la memoria de programa al escribir o borrar, por lo tanto, código 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 instrucción válida en la memoria de programa. Ejecutar una localización de la memoria de programa que no sea instrucción válida 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 través 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, más 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 dirección. Si en una tabla se escribe código ejecutable en la memoria de programa, las instrucciones de programa necesitarán ser palabra-alineadas.

Page 150: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

148

FIGURA 7-1: Operación De Lectura En Tabla

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

FIGURA 7-2: Operación De Escritura En Tabla

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

dirección de cada uno determina con TBLPTRL<4:0>.

Page 151: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

149

3.4.7.2. Registros De Control Los registros de control que se utilizan conjuntamente con las instrucciones

TBLRD y TBLWT. Son:

Registro EECON1 Registro EECON2 Registro TABLAT Registros TBLPTR

3.4.7.2.1. 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 físico; se utiliza exclusivamente en la memoria para escribir y borrar secuencias. Al leer EECON2 leerá todo ‘0’s.

El bit de control EEPGD determina si el acceso es un acceso de memoria de programa o de datos EEPROM. Al borrarlo, cualquier operación posterior funcionará en la memoria de datos EEPROM. Cuando se activa, las operaciones funcionarán sobre la memoria de programa.

El bit de control CFGS determina si el acceso es a los registros de la configuración o de calibración o a la memoria de programa o a la memoria de los datos EEPROM. Cuando está activo, las operaciones siguientes funcionarán seteando los registros de configuración sin importar EEPGD. Cuando está borrado, el acceso de selección de la memoria se determina por EEPGD.

El bit FREE, cuando se activa, permitirá borrar una instrucción de la memoria de programa. Cuando FREE está activo, la operación de borrado se ejecuta en el siguiente comando WR. Cuando FREE está borrado, sólo se permite escribir.

El bit WREN, cuando está activo, permitirá una operación 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 programación interno y se completa la operación de escritura.

Nota: En una operación normal el bit WRERR se lee ‘1’. Esto puede indicar que la operación de lectura ha terminado demasiado pronto por un reset o que no se ha escrito bien.

El bit de control WR inicializa la operación de escritura. El bit no se puede borrar, sólo activar, por software; se borra por hardware al terminar la operación de escritura.

Nota: Se fija el flag de la interrupción EEIF (PIR2<4>) cuando se completa la escritura. Debe borrarse por software.

Page 152: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

150

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 selector de la memoria flash o de la EEPROM: 1= Memoria de programa flash 0= Memoria de datos EEPROM BIT 6 CFGS: Bit selector de Flash/EEPROM o configuración: 1= Acceso a los registros de configuración 0= Acceso a la memoria flash o EEPROM BIT 4 FREE: Bit de borrado serie de la flash 1= Borra la memoria de programa con direccionamiento serie con TBLPTR en el próximo comando WR. (Se borra al completar la operación de borrado) 0= Sólo escritura BIT 3 WRERR: Flag de error de la memoria flash/EEPROM(1)

1= Una operación de escritura ha terminado bruscamente 0= La operación de escritura se ha completado BIT 2 WREN: 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 1 WR: 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 después del ciclo) 0= Ha completado el ciclo de escritura en la EEPROM BIT 0 RD: 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 operación de lectura de la EEPROM

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

Page 153: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

151

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 identificación del dispositivo, a la identificación del usuario y a los bits de la configuración.

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 operación 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

Ejemplo Operaciones en el puntero de tabla

TBLRD* TBLWT* No modifica TBLPTR

TBLRD*+ TBLWT*+ Se incrementa TBLPTR después de la lectura/escritura

TBLRD*- TBLWT*- Se decrementa TBLPTR después de la lectura escritura

TBLRD+* TBLWT+* Se incrementa TBLPTR antes de la lectura/escritura

3.4.7.2.4. Límites 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 cuáles 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 más significativos del TBLPTR (TBLPTR<21: 6>) determinan que bloque de la memoria de programa de 32 bytes se escribe.

Page 154: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

152

Cuando se ejecuta una instrucción borrar en la memoria de programa, los 16 bits más 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: Límites Del Puntero De Tabla Basado En Las Operaciones

3.4.7.3. Lectura De La Memoria De Programa Flash Se utiliza la instrucción TBLRD para recuperar datos de la memoria de

programa y los posiciona en la RAM de datos. Sólo se lee un bit cada vez en una operación de lectura de tabla.

TBLPTR señala un byte de dirección en el espacio del programa. Al ejecutar TBLRD se pone el byte señalado en TABLAT. Además, TBLPTR se puede modificar automáticamente en la siguiente operación de lectura de la tabla.

La memoria interna del programa se organiza en palabras. El bit menos significativo de la dirección selecciona entre los bytes altos y bajos de la palabra.

FIGURA 7-4: Lecturas De La Memoria De Programa

Page 155: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

153

EJEMPLO 7-1: Lectura De Una Palabra De La Memoria De Programa Flash MOVLW CODE_ADDR_UPPER ;Carga TBLPTR con la base MOVWF TBLPTRU ;dirección de la palabra MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL

READ_WORD TBLRD*+ ;lee en TABLAT e incrementa MOVF TABLAT, W ;consigue los datos MOVWF WORD_EVEN TBLRD*+ ;lee en TABLAT e incrementa MOVF TABLAT, W ;consigue los datos MOVF WORD_ODD

3.4.7.4. Borrado De Memoria Flash De Programa El mínimo bloque de borrado es de 32 palabras ó 64 bytes. Solamente con el uso

de un programador externo, o con control ICSP, se podrán borrar bloques más 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 más significativos del TBLPTR<21:6> hasta el bloque. Se ignoran los bits TBLPTR<5:0>.

El registro EECON1 ordena la operación de borrado. El bit EEPGD se debe activar para señalar 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 operación de borrado.

Por protección, se debe utilizar la secuencia de inicio de escritura en EECON2.

Se necesita una escritura larga para borrar la flash interna. Se para la ejecución de instrucciones mientras que dure el ciclo de escritura. La escritura la finalizará el contador de tiempo de programación interno.

Page 156: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

154

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 dirección de la fila que se va a borrar.

2. Activa el registro EECON1 para la operación de borrado:

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.

3. Inhabilita las interrupciones. 4. Escribe 55h en EECON2. 5. Escribe 0AAh en EECON2. 6. Activa el bit WR. Esto comenzará el ciclo de borrado de la fila. 7. 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 CODE_ADDR_UPPER ;carga TBLPTR con la base MOVWF TBLPTRU ;dirección del bloque de memoria MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL

ERASE_ROW BSF EECON1, EEPGD ;selección de la memoria FLASH BCF EECON1, CFGS ;acceso a la memoria flash BSF EECON1, WREN ;permite escribir en la memoria BSF EECON1, FREE ;permite la operación de borrado BCF INTCON, GIE ;inhabilitar las interrupciones MOVLW 55h MOVWF EECON2 ;escribir 55h MOVLW 0AAh MOVWF EECON2 ;escribir 0AAh BSF EECON1, WR ;comienza a borrar BSF INTCON, GIE ;volver a permitir las interrupciones

Page 157: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

155

3.4.7.5. Escribir En La Memoria Flash De Programa El bloque de programación mínimo 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 instrucción TBLWT se tiene que ejecutar 32 veces para cada operación de programación. Toda la tabla escribe operaciones cortas porque sólo se escriben los registros bloqueados. Al final de la actualización de los 32 registros, el registro EECON1 debe estar escrito para comenzar la operación de programación con una escritura larga.

Se necesita la escritura larga para programar la flash interna. Se para la ejecución de instrucciones mientras dure la escritura larga. La escritura larga finalizará con el contador interno de programación.

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 tensión del dispositivo.

Nota: El valor prefijado de los registros bloqueados en un reset y antes de una operación 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 operación de escritura.

FIGURA 7-5: La Escritura De Tabla En La Memoria Flash De Programa

Page 158: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

156

3.4.7.5.1. Secuencia De Escritura En La Memoria Flash De Programa La secuencia para programar una posición 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 dirección que se borre.

4. Ejecutar el procedimiento de borrar fila.

5. Cargar el registro del puntero de tabla con la dirección 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 operación 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 más 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 acción de las direcciones previstas de 32 bytes dentro el registro bloqueado.

Page 159: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

157

EJEMPLO 7-3: Escribir En La Memoria Flash Del Programa MOVLW D'64’ ;nº de bytes en el bloque a borrar MOVWF COUNTER MOVLW BUFFER_ADDR_HIGH ; puntero al buffer MOVWF FSR0H MOVLW BUFFER_ADDR_LOW MOVWF FSR0L MOVLW CODE_ADDR_UPPER ;Cargar TBLPTR con la dirección base MOVWF TBLPTRU ;del bloque de memoria MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL READ_BLOCK TBLRD*+ ; leer en TABLAT, e incrementar MOVF TABLAT, W ; coger datos MOVWF POSTINC0 ; guardar datos DECFSZ COUNTER ; ¿correcto? BRA READ_BLOCK ; 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 ;Cargar TBLPTR con la dirección base MOVWF TBLPTRU ;del bloque de memoria MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL BSF EECON1, EEPGD ;Puntero a la Flash BCF EECON1, CFGS ;acceso a la Flash BSF EECON1, WREN ;activar la escritura en memoria BSF EECON1, FREE ;Activar la operación de borrado de fila BCF INTCON, GIE ;desactiva interrupciones MOVLW 55h MOVWF EECON2 ;escribe 55h MOVLW 0AAh

Page 160: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

158

MOVWF EECON2 ;escribe 0AAh BSF EECON1, WR ;comienzo del borrado (CPU parada) BSF INTCON, GIE ;reactiva interrupciones TBLRD*- ;decremento después de leer MOVLW BUFFER_ADDR_HIGH ; puntero al buffer MOVWF FSR0H MOVLW BUFFER_ADDR_LOW MOVWF FSR0L MOVLW D’2’ MOVWF COUNTER1 WRITE_BUFFER_BACK MOVLW D’32’ ;nº de bytes en los registros bloqueados MOVWF COUNTER WRITE_BYTE_TO_HREGS MOVF POSTINC0, W ;coger el byte bajo del buffer MOVWF TABLAT ;llevar dato al lacht de tabla TBLWT+* ;escribir dato (escritura corta) DECFSZ COUNTER ;repetir hasta que el buffer se llene BRA WRITE_WORD_TO_HREGS PROGRAM_MEMORY BSF EECON1, EEPGD ;Puntero a la memoria flash BCF EECON1, CFGS ;Acceso a la memoria flash BSF EECON1, WREN ;Activar escritura en memoria BCF INTCON, GIE ;Desactivar interrupciones MOVLW 55h MOVWF EECON2 ;Escribir 55h MOVLW 0AAh MOVWF EECON2 ;Escribir 0AAh BSF EECON1, WR ;Comienzo del programa DECFSZ COUNTER1 BRA WRITE_BUFFER_BACK BSF INTCON, GIE ;Activa las interrupciones BCF EECON1, WREN ;Desactiva la escritura en memoria

3.4.7.5.2. Verificación De La Escritura Dependiendo del uso, en una buena programación 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 estén cerca del límite de la especificación.

Page 161: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

159

3.4.7.5.3. Finalización Inesperada De La Operación De Escritura Si una escritura termina por un acontecimiento imprevisto, tal y como la pérdida

de energía o un reset inesperado, las localizaciones de la memoria programadas se deben verificar y reprogramar si se necesita. Si se interrumpe la operación de escritura por un reset MCLR* o un desbordamiento del WDT durante la operación normal, el usuario puede comprobar el bit WRERR y reescribir las localizaciones según se necesite.

TABLA 7-2: Registros Asociados Con La Memoria Flash

Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

TBLPTRU - - bit 21(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 PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

EECON2 Registro de control 2 EEPROM (no es un registro físico)

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 configuración del dispositivo.

Page 162: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

160

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 duración 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 través de los registros especiales de la función (SFRs). La EEPROM es legible y escribible durante la operación 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 localización de la EEPROM.

La memoria de datos EEPROM se clasifica como muy resistente a los ciclos de escritura/borrado. Un byte escribe y automáticamente borra la localización 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 tensión 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 configuración o a la memoria del programa/EEPROM. Cuando está activado, las operaciones siguientes tienen acceso a los registros de configuración. Cuando CFGS está borrado, el bit EEPGD selecciona la flash o la memoria EEPROM. El bit WREN, cuando está activado, permitirá una operación 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 programación interno y se completa la operación de escritura.

Nota: Durante la operación normal, el WRERR se lee como ‘1’. Esto puede indicar que ha finalizado una operación de escritura prematuramente cerca de un reset o una operación de escritura finaliza incorrectamente.

Page 163: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

161

El bit de control WR inicia operaciones de escritura. El bit no se puede borrar, sólo está activo, en software; se borra en hardware al terminar la operación de escritura.

Nota: Se activa el flag de la interrupción 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 operación.

El bit RD no se puede activar al tener acceso a la memoria de programa (EEPGD=1).

El registro EECON2 no es un registro físico. Se utiliza exclusivamente en las secuencias de escribir y borrar en la memoria. La lectura EECON2 leerá todo ‘0’s.

3.4.8.2. Lectura De Los Datos De La Memoria EEPROM Para leer una posición de memoria de datos, el usuario debe escribir la dirección

en el registro EEADR, borrar el bit EEPGD (EECON1<7>) y después activar el bit RD (EECON1<0>). Los datos están disponibles en el siguiente ciclo de instrucción; por lo tanto, el registro EEDATA se puede leer con la instrucción siguiente. EEDATA mantendrá este valor hasta otra operación de lectura o hasta que lo escriba el usuario (durante una operación de escritura).

EJEMPLO 8-1: Lectura De La Memoria EEPROM MOVLW DATA_EE_ADDR MOVWF EEDRA ;Bits bajos de la dirección de memoria a leer BCF EECON1,EEPGD ;Puntero a la memoria de datos BCF EECON1,CFGS ;Acceso a la memoria EEPROM BSF EECON1,RD ;Lectura en EEPROM MOVWF EEDATA,W ;W=EEDATA

3.4.8.3. Escritura En La Memoria De Datos EEPROM Para escribir una localización de la EEPROM, se tiene que escribir la dirección

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, después activar el bit WR; para cada byte. Se recomienda que las interrupciones estén desactivadas durante esto segmento de código.

Page 164: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

162

EJEMPLO 8-2: Escritura De Datos En La EEPROM MOVLW DATA_EE_ADDR MOVWF EEDATA ;Bits bajos de la dirección de memoria a escribir MOVLW DATA_EE_DATA MOVWF EEDATA ;Valor de la memoria de datos a escribir BCF EECON1,EPGD ;Puntero a la memoria de datos BCF EECON1,CFGS ;Acceso a la EEPROM BSF EECON1,WREN ;Activa escritura BCF INTCON,GIE ;Desactivación de las interrupciones MOVLW 55h MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1,WR ;Activa WR para empezar a escribir BSF INTCON,GIE ;Activa las interrupciones BCF EECON1,WREN ;Desactiva la escritura cuando se complete

3.4.8.4. Verificación De La Escritura Dependiendo de la aplicación, se puede necesitar que se verifiquen los datos

después de escribirlos en la memoria comparándolos 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 límites de las especificaciones.

3.4.8.5. Operación Con Código De Protección La memoria de datos EEPROM tiene los bits de los códigos de protección en

palabras de configuración. Las operaciones de lectura y escritura externas se desactivan si se permite el código de protección.

El microcontrolador puede leer y escribir en la EEPROM sin importar el estado del bit de configuración del código de protección.

3.4.8.6. Protección 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 ejecución. En un ciclo de inicio, el bit WREN está borrado. Además, se bloquea la escritura en la EEPROM durante el período 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 tensión, fallo en la energía o malfuncionamiento del software.

Page 165: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

163

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 información que cambia con frecuencia (ej., variables de programa u otros datos que se actualizan a menudo). Los valores que cambian con frecuencia se actualizarán muy a menudo. Si éste no es el caso, se debe hacer un refresco de la matriz. Por esta razón, las variables que cambian infrecuentemente (por ejemplo constantes, las identificaciones, la calibración, 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 CLRF EEADR ;Comienzo en la dirección 0 BCF EECON1,CFGS ;Activa memoria BCF EECON1,EEPGD ;Activa memoria EEPROM BCF INTCON,GIE ;Desactiva interrupciones BSF EECON1,WREN ;Activa escritura

Loop BSF EECON1,RD ;Lee la dirección actual MOVLW 55h MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1,WR ;Activa WR para empezar a escribir BTFSC EECON1,WR ;Espera que se complete la escritura BRA $-2 INCFSZ EEEDR,F ;Incrementa la dirección BRA LOOP ;Si no es cero lo repite BCF EECON1,WREN ;Desactiva la escritura BSF INTCON,GIE ;Activa interrupciones

Page 166: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

164

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 físico)

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.

Page 167: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

165

3.4.9. MULTIPLICADOR DE 8X8 POR HARDWARE

3.4.9.1. Introducción Todos los dispositivos PIC18 incluyen un multiplicador de 8x8 por hardware

como parte de la ALU. El multiplicador realiza una operación sin signo y devuelve un resultado que se almacene en el par de registros del producto, PRODH:PRODL de 16bits. La operación del multiplicador no afecta ningún flag en el registro ESTADO.

La fabricación de la operación multiplicación por hardware permite que se termine en un solo ciclo de instrucción. Esto tiene ventajas, un rendimiento de cómputo más alto y un tamaño de código reducido para los algoritmos de multiplicación y permite que los dispositivos PIC18 sean utilizados en muchos usos reservados previamente para los procesadores de la señal numérica.

EJEMPLO 9-1: Rutina De Multiplicación Sin Signo De 8x8 MOVF ARG1,W MULWF ARG2 ;ARG1*ARG2=PRODH:PRODL

EJEMPLO 9-2: Rutina De Multiplicación Con Signo De 8x8 MOVF ARG1,W MULWF ARG2 ;ARG1*ARG2=PRODH:PRODL BTFSC ARG2,SB ;Bit test del signo SUBWF PRODH,F ;PRODH=PRODH-ARG1 MOVF ARG2,W BTFSC ARG1,SB ;Bit test del signo SUBWF PRODH,F ;PRODH=PRODH-ARG2

ECUACIÓN 9-1: Algoritmo De Multiplicación 16x16 Sin SIGNO RES3:RES0=ARG1H:ARG1L*ARG2H:ARG2l= =(ARG1H*ARG2H*216)+(ARG1H*ARG2L*28)+ +(ARG1L*ARG2H*28)+(ARG1L*ARG2L)

Page 168: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

166

EJEMPLO 9-3: Rutina De Multiplicación 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

ECUACIÓN 9-2: Algoritmo De Multiplicación 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)

Page 169: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

167

EJEMPLO 9-4: Rutina De Multiplicación 16x16 Con Signo MOVF ARG1L,W MULWF ARG2L MOVFF PRODH,RES1 MOVFF PRODL,RES0 MOVF ARG1H,W MULWF ARG2H MOVFF PRODH,RES3 MOVFF PRODH,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 BTFSS ARG2H,7 BRA SIGN_ARG1 MOVF ARG1L,W SUBWF RES2 MOVF ARG1H,W SUBWFB RES3

SIGN_ARG1 BTFSS ARG1H,7 BRA CONT_CODE MOVF ARG2L,W SUBWF RES2 MOVF ARG2H,W SUBWFB RES3

CONT_CODE

Page 170: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

168

3.4.10. INTERRUPCIONES Los dispositivos PIC18F2455/2550/4455/4550 tienen fuentes múltiples de

interrupción y una prioridad de interrupción que permite que cada fuente de interrupción se le asigne un nivel prioritario o un nivel bajo de prioridad. El puntero de alta prioridad está en 000008h y el puntero de interrupción de baja prioridad está en 000018h. Los acontecimientos prioritarios de interrupción pararán cualquier interrupción de prioridad baja que pueda estar en marcha.

Hay diez registros que se utilizan para controlar las operaciones de interrupción. Estos registros son:

RCON INTCON INTCON2 INTCON3 PIR1, PIR2 PIE1, PIE2 IPR1, IPR2

Cada fuente de interrupción tiene tres bits para controlar su operación. Las funciones de estos bits son:

Flag para indicar que ha ocurrido una interrupción El bit que permite la ejecución de programa en la dirección del puntero

de interrupción cuando se activa el flag El bit de prioridad para seleccionar alta o baja prioridad

Las características 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 interrupción, el bit de permiso y el bit de las interrupciones globales están activos, el programa saltará inmediatamente a la dirección 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 características de prioridad de las interrupciones están 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 ningún efecto. INTCON<6> es el bit PEIE el cuál permite/inhabilita todas las fuentes periféricas de interrupción. INTCON<7> es el bit GIE que permite/inhabilita todas las fuentes de interrupción. Todas las interrupciones saltan a la dirección 000008h en modo de compatibilidad.

Page 171: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

169

Cuando se responde una interrupción, 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 interrupción, éste será el bit GIEH o GIEL. Las fuentes de interrupción prioritarias pueden interrumpir una interrupción de baja prioridad. Las interrupciones de prioridad bajas no se procesan mientras que las interrupciones prioritarias estén en marcha.

La dirección de retorno se pone en la pila y el PC se carga con la dirección del puntero de interrupción (000008h ó 000018h). Una vez en la rutina de la interrupción, las fuentes de interrupción se pueden determinar interrogando los flags de interrupción. Los flags de interrupción se tienen que despejar por software antes de volver a permitir las interrupciones para evitar interrupciones recurrentes.

La “instrucción para volver de la interrupción”, RETFIE, devuelve de la rutina de interrupción 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 interrupción, tales como los pines INT o la interrupción por cambio de la entrada PORTB, el estado latente de la interrupción es de tres a cuatro ciclos de instrucción. El exacto el estado latente es igual para instrucciones de uno o dos ciclos. Los flags individuales de interrupción se activan sin importar el estado de su bit de permiso correspondiente o el bit GIE.

Nota: No utilizar la instrucción MOVFF para modificar registros de control de interrupción mientras que se permita cualquier interrupción. Al hacerlo puede provocar un comportamiento errático del microcontrolador.

3.4.10.1. Interrupciones Del USB Como otros periféricos, el módulo USB es capaz de generar una amplia gama de

interrupciones para muchos tipos de acontecimientos. Éstos incluyen varios tipos de acontecimientos normales de comunicación y de estado y varios niveles de errores de acontecimientos.

Para manejar estos acontecimientos, el módulo USB se equipa con su propia lógica de interrupción. La lógica funciona de una forma similar a las interrupciones del microcontrolador, con cada fuente de interrupción tenemos un flag separado y los bits de permiso. Todos los acontecimientos se concentran en una sola interrupción del dispositivo, USBIF (PIR2<5>). A los acontecimientos individuales de interrupción 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.

Page 172: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

170

FIGURA 10-1: Lógica De Interrupción

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 condición de interrupción 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 interrupción esté a cero antes de habilitar dicha interrupción.

Page 173: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

171

REGISTRO 10-1: INTCON: Registro De Control De Interrupción

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 activador del permiso global de interrupción: 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 6 PEIE/GIEL: Bit activador de las interrupciones de periféricos: 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 5 TMR0IE: Bit de permiso de interrupción por desbordamiento del TMR0: 1= Activa la interrupción 0= Desactiva la interrupción BIT 4 INT0IE: Bit de permiso de la interrupción externa INT0: 1= Activa la interrupción 0= Desactiva la interrupción BIT 3 RBIE: Bit de permiso de la interrupción por cambio del PORTB: 1= Activa la interrupción 0= Desactiva la interrupción BIT 2 TMR0IF: Flag de la interrupción por desbordamiento del TMR0: 1= Se ha activado la interrupción 0= No se ha activado la interrupción BIT 1 INT0IF: Flag de la interrupción externa INT0: 1= Se ha activado la interrupción 0= No se ha activado la interrupción BIT 0 RBIF: Flag de la interrupción del cambio de PORTB(1): 1= Uno de los pines RB7:RB4 ha cambiado (se tiene que borrar por software) 0= No ha cambiado ningún pin

Nota 1: Una condición de unión mal hecha continuará activando este bit. Al leer PORTB terminará la condición de unión mal hecha y permitirá que el bit se borre.

Page 174: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

172

REGISTRO 10-2: INTCON2: Registro De Control De Interrupción 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 activador de pull-up del PORTB: 1= Desactivado 0= Activado por valores individuales de latch BIT 6 INTEDG0: Bit selector del flaco de la interrupción 0: 1= Flanco de subida 0= Flanco de bajada BIT 5 INTEDG1: Bit selector del flanco de la INT1: 1= Flanco de subida 0= Flanco de bajada BIT 4 INTEDG2: Bit selector del flanco de la INT2: 1= Flanco de subida 0= Flanco de bajada BIT 2 TMR0IP: Bit de prioridad del desbordamiento del TMR0: 1= Alta prioridad 0= Baja prioridad BIT 0 RBIP: Bit de prioridad del cambio de PORTB: 1= Alta prioridad 0= Baja prioridad

Page 175: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

173

REGISTRO 10-3: INTCON3: Registro de control de interrupción 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 6 INT1IP: Bit de prioridad de la INT1: 1= Alta prioridad 0= Baja prioridad BIT 4 INT2IE: Bit de permiso de la interrupción externa INT2: 1= Activa la interrupción 0= Desactiva la interrupción BIT 3 INT1IE: Bit de permiso de la interrupción externa INT1: 1= Activa la interrupción 0= Desactiva la interrupción BIT 1 INT2IF: Flag de la interrupción externa INT2: 1= Se ha activado la interrupción 0= No se ha activado la interrupción BIT 0 INT1IF: Flag de la interrupción externa INT1: 1= Se ha activado la interrupción 0= No se ha activado la interrupción

3.4.10.3. Registros PIR Los registros PIR contienen los flags individuales de las interrupciones

periféricas. Debido al número de fuentes de interrupción periféricas hay dos registros de respuesta de las interrupciones periféricas (PIR1 y PIR2).

Page 176: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

174

REGISTRO 10-4: PIR1: Registro De Respuesta De Las Interrupciones Periféricas 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: Flag de acceso al puerto paralelo lectura/escritura(1): 1= Ocurre una lectura/escritura (borrado por software) 0= No ocurre lectura/escritura BIT 6 ADIF: Flag del conversor A/D: 1= Conversión A/D completa (borrado por software) 0= Conversión A/D no completa BIT 5 RCIF: Flag de recepción por la EUSART: 1= Buffer de recepción lleno (borrado por software) 0= Buffer de recepción vacío BIT 4 TXIF: Flag de transmisión por la EUSART: 1= Buffer de transmisión vacío (borrado por software) 0= Buffer de transmisión lleno BIT 3 SSPIF: Flag del puerto serie síncrono: 1= Transmisión/recepción completa (borrado por software) 0= Esperando transmisión/recepción BIT 2 CCP1IF: Flag del CCP1: Modo captura: 1= Ha ocurrido una captura en el TMR1 (borrado por software) 0= No ha ocurrido una captura Modo comparación: 1= Ha ocurrido una comparación en el TMR1 (borrado por software) 0= No ha ocurrido una captura Modo PWM: No se utilizan BIT 1 TMR2IF: Flag de interrupción al igualar TMR2 y PR2: 1= Se han igualado (borrado por software) 0= No se han igualado BIT 0 TMR1IF: 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.

Page 177: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

175

REGISTRO 10-5: PIR2: Registro De Respuesta De Las Interrupciones Periféricas 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: Flag de fallo del oscilador: 1= Ha ocurrido un fallo (borrado por software) 0= No ha ocurrido ningún fallo BIT 6 CMIF: Flag del comparador: 1= La entrada del comparador ha cambiado (borrado por software) 0= La entrada no ha cambiado BIT 5 USBIF: Flag del USB: 1= El USB pide una interrupción (borrado por software) 0= El USB no necesita interrupción BIT 4 EEIF: Flag de escritura en la EEPROM/Flash: 1= Se ha completado la escritura (borrado por software) 0= No se ha completado la escritura BIT 3 BCLIF: Flag del colisión en el bus: 1= Ha ocurrido una colisión (borrado por software) 0= No ha ocurrido colisión BIT 2 HLVIF: Flag de detección de alta tensión: 1= Ha ocurrido una condición de alta tensión (borrado por software) 0= No ha ocurrido una condición de AT BIT 1 TMR3IF: Flag de desbordamiento del TMR3: 1= Se ha desbordado el TMR3 (borrado por software) 0= No se ha desbordado BIT 0 CCP2IF: Flag del CCP2: Modo captura: 1= Ha ocurrido una captura en TMR1 o TMR3 (borrado por software) 0= No ha ocurrido ninguna captura Modo comparación: 1= Ha ocurrido una comparación en el TMR1 o TMR3 (borrado por software) 0= No ha ocurrido una comparación Modo PWM: No se utiliza

Page 178: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

176

3.4.10.4. Registros PIE Los registros PIE contienen los bits de permiso individual para las interrupciones

periféricas. Debido al número de fuentes de interrupción periféricas, 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 Periféricas

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 de permiso de interrupción de SPP(1): 1= Interrupción por una lectura/escritura permitida 0= No se permite la interrupción BIT 6 ADIE: Bit de permiso de interrupción por el conversor A/D: 1= Interrupción activada 0= Interrupción desactivada BIT 5 RCIE: Bit de permiso de interrupción por recepción por la EUSART: 1= Interrupción activada 0= Interrupción desactivada BIT 4 TXIE: Bit de permiso de la interrupción por transmisión por la EUSART: 1= Interrupción activada 0= Interrupción desactivada BIT 3 SSPIE: Bit de permiso de interrupción por el MSSP: 1= Interrupción activada 0= Interrupción desactivada BIT 2 CCP1IE: Bit de permiso de interrupción por el CCP1: 1= Interrupción activada 0= Interrupción desactivada BIT 1 TMR2IE: Bit de permiso de interrupción al igualar TMR2 y PR2: 1= Interrupción activada 0= Interrupción desactivada BIT 0 TMR1IE: Bit de permiso de la interrupción por desbordamiento del TMR1: 1= Interrupción activada 0= Interrupción desactivada

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

Page 179: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

177

REGISTRO 10-7: PIE2: Registro De Permiso De Las Interrupciones Periféricas 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 de permiso de interrupción por fallo del oscilador: 1= Interrupción activada 0= Interrupción desactivada BIT 6 CMIE: Bit de permiso de interrupción del comparador: 1= Interrupción activada 0= Interrupción desactivada BIT 5 USBIE: Bit de permiso de interrupción del USB: 1= Interrupción activada 0= Interrupción desactivada BIT 4 EEIE: Bit de permiso de interrupción por escribir en EEPROM/Flash: 1= Interrupción activada 0= Interrupción desactivada BIT 3 BCLIE: Bit de permiso de interrupción por colisión en el bus: 1= Interrupción activada 0= Interrupción desactivada BIT 2 HLVIE: Bit de permiso de interrupción por detección de alta tensión: 1= Interrupción activada 0= Interrupción desactivada BIT 1 TMR3IE: Bit de permiso de interrupción por desbordamiento del TMR3: 1= Interrupción activada 0= Interrupción desactivada BIT 0 CCP2IE: Bit de permiso de interrupción del CCP2: 1= Interrupción activada 0= Interrupción desactivada

Page 180: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

178

3.4.10.5. Registros IPR Los registros IPR contienen los bits de prioridad de las interrupciones

periféricas. Debido al número de fuentes de interrupción periféricas, hay dos registros (IPR1 e IPR2). Al usar los bits de la prioridad requieren que la prioridad de la interrupción esté permita (IPEN activado).

REGISTRO 10-8: IPR1: Registro De Prioridad De Las Interrupciones Periféricas

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 de prioridad de la interrupción de SPP(1): 1= Alta prioridad 0= Baja prioridad BIT 6 ADIP: Bit de prioridad de la interrupción por el conversor A/D: 1= Alta prioridad 0= Baja prioridad BIT 5 RCIP: Bit de prioridad de la interrupción por recepción por la EUSART: 1= Alta prioridad 0= Baja prioridad BIT 4 TXIP: Bit de prioridad de la interrupción por transmisión por la EUSART: 1= Alta prioridad 0= Baja prioridad BIT 3 SSPIP: Bit de prioridad de la interrupción por el MSSP: 1= Alta prioridad 0= Baja prioridad BIT 2 CCP1IP: Bit de prioridad de la interrupción por el CCP1: 1= Alta prioridad 0= Baja prioridad BIT 1 TMR2IP: Bit de prioridad de la interrupción al igualar TMR2 y PR2: 1= Alta prioridad 0= Baja prioridad BIT 0 TMR1IP: Bit de prioridad de la interrupción 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

Page 181: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

179

REGISTRO 10-9: IPR2: Registro De Prioridad De Las Interrupciones Periféricas 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 de prioridad de la interrupción por fallo del oscilador: 1= Alta prioridad 0= Baja prioridad BIT 6 CMIP: Bit de prioridad de la interrupción del comparador: 1= Alta prioridad 0= Baja prioridad BIT 5 USBIP: Bit de prioridad de la interrupción del USB: 1= Alta prioridad 0= Baja prioridad BIT 4 EEIP: Bit de prioridad de la interrupción por escribir en EEPROM/Flash: 1= Alta prioridad 0= Baja prioridad BIT 3 BCLIP: Bit de prioridad de la interrupción por colisión en el bus: 1= Alta prioridad 0= Baja prioridad BIT 2 HLVIP: Bit de prioridad de la interrupción por detección de alta tensión: 1= Alta prioridad 0= Baja prioridad BIT 1 TMR3IP: Bit de prioridad de la interrupción por desbordamiento del TMR3: 1= Alta prioridad 0= Baja prioridad BIT 0 CCP2IP: Bit de prioridad de la interrupción del CCP2: 1= Alta prioridad 0= Baja prioridad

Page 182: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

180

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 también contiene el bit IPEN el cuál 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 activador de las prioridades de las interrupciones: 1= Niveles de prioridad permitidos 0= Niveles de prioridad no permitidos BIT 6 SBOREN: Bit activador de BOR(1): Ver registro 5-1 BIT 4 RI*: Flag de reset por instrucción: Ver registro 5-1 BIT 3 TO*: Flag de desbordamiento del Watchdog: Ver registro 5-1 BIT 2 PD*: Flag de detección de la caída de tensión: Ver registro 5-1 BIT 1 POR*: Bit de estado de reset por aumento de tensión(2): Ver registro 5-1 BIT 0 CCP2IP: Bit de estado de reset por cese de tensión: 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 información 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 información.

Page 183: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

181

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 interrupción se acciona por un flanco de subida; si el bit está borrado, el disparo ocurre en el flanco de bajada. Cuando ocurre un flanco válido en el pin RBx/INTx, el flag el correspondiente se activa, INTxIF. Esta interrupción se puede inhabilitar borrando el bit INTxIE. El flag, INTxIF, debe borrarse por software antes de volver a permitir la interrupción.

Todas las interrupciones externas (INT0, INT1 e INT2) pueden despertar al procesador de los modos de ahorro de energía 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 interrupción después del reinicio.

La prioridad de la interrupción para INT1 e INT2 se determina con el valor contenido en los bits de prioridad de la interrupción, el INT1IP (INTCON3<6>) y el INT2IP (INTCON3<7>). No hay un bit de prioridad asociado a la interrupción INT0. Siempre es una fuente de interrupción prioritaria.

3.4.10.8. Interrupción 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 interrupción se puede permitir/inhabilitar activando/borrando el bit de permiso, TMR0IE (INTCON<5>). La prioridad de la interrupción para Timer0 se determina por el valor contenido en el bit de prioridad de la interrupción, TMR0IP (INTCON2<2>).

3.4.10.9. Interrupción Al Cambiar PORTB Un cambio en la entrada en PORTB<7:4> activa el flag, RBIF (INTCON<0>).

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

3.4.10.10. Almacenamiento De Datos Durante La Interrupción Durante las interrupciones, la dirección del PC de retorno se almacena en la pila.

Además, los registros WREG, ESTADO y BSR se guardan en la pila de acceso rápido. Si no se utiliza un retorno rápido de la interrupción, el usuario puede necesitar guardar los registros WREG, ESTADO y BSR en entrada a la rutina de la interrupción. Dependiendo de la aplicación, también se puede necesitar guardar otros registros.

Page 184: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

182

EJEMPLO 10-1: Almacenamiento De Los Registros ESTADO, WREG y BSR En RAM MOVWF W_TEMP ;W_TEMP está en el banco virtual MOVFF STATUS,STATUS_TEMP ;STATUS_TEMP direccionado en ;cualquier sitio MOVFF BSR, BSR_TEMP ;BSR_TMEP direccionado en ;cualquier sitio ; ;CÓDIGO DEL USUARIO ; MOVFF BSR_TEMP, BSR ;Restaura BSR MOVF W_TEMP, W ;Restaura WREG MOVFF STATUS_TEMP, STATUS ;Restaura ESTADO

3.4.11. PUERTOS DE ENTRADA-SALIDA Dependiendo del dispositivo seleccionado y de las características permitidas,

hay hasta cinco puertos disponibles. Algunos pines de los puertos de entrada-salida se multiplexan con una función alternativa de las características periféricas del dispositivo. Generalmente cuando se activa un periférico, 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 dirección 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.

Page 185: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

183

FIGURA 11-1: Puerto Genérico De Operaciones De Entrada-Salida

Nota 1: Los puertos de E/S tienen un diodo de protección 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

dirección 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) sólo es memoria mapeada. Las operaciones de lectura-modificación-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 módulo 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 configuración. Cuando no está utilizado como un puerto, RA6 y su TRIS asociado y los bits del LAT se leen como ‘0’.

El RA4 también se multiplexa con el módulo del USB; sirve como una entrada receptora de un transmisor-receptor externo del USB.

Varios pines de PORTA se multiplexan con las entradas analógicas, las entradas analógicas de VREF+ y de VREF- y la salida de referencia de la tensión del

Page 186: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

184

comparador. La operación 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 tensión, RA5 y RA3:RA0 se configuran como entradas analógicas y se leen como ‘0’. RA4 se configura como entrada digital.

El resto de los pines de PORTA tienen niveles de introducción de datos de TTL y drivers de salida de CMOS.

El registro TRISA controla la dirección de los pines RA, aun cuando se están utilizando como entradas analógicas. El usuario debe asegurarse de que los bits del registro TRISA son ‘1’ al usarlos como entradas analógicas.

EJEMPLO 11-1: Inicialización PORTA CLRF PORTA ;Inicializar PORTA borrando los latch de salida CLRF LATA ;Otro método para borrar los latch MOVLW 0Fh ;Configurar A/D MOVWF ADCON1 ;para entradas digitales MOVLW 07h ;Configurar los comparadores MOVWF CMCON ;para entrada digital MOVLW 0CFh ;Valor usado para inicializar las direcciones de los datos MOVWF TRISA ;Activar RA<3:0> como entradas y RA<5:4> como salidas

Page 187: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

185

TABLA 11-1: Resumen De Entradas-Salidas Del PORTA Pin Función Configuración

Del TRIS E/S Tipo de E/S Descripción

0 salida salida digital LATA<0> salida de datos; no le afectan las entradas analógicas

RA0 1 entrada Buffer de

entrada TTL PORTA<0> entradas de datos; desactivada cuando se

activen las entradas analógicas RA0/AN0

AN0 1 entrada analógica Canal 0 de entrada A/D y entrada del comparador C1-.

Configuración por defecto en POR; no le afectan salidas digitales.

0 salida salida digital LATA<1> salida de datos; no le afectan las entradas analógicas

RA1 1 entrada Buffer de

entrada TTL PORTA<1> entrada de datos; se lee ‘0’ en POR. RA1/AN1

AN1 1 entrada analógica Canal 1 de entrada A/D y entrada del comparador C2-.

Configuración por defecto en POR; no le afectan salidas digitales.

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

analógicas. Desactivado cuando la salida CVREF esté activa. RA2

1 entrada Buffer de entrada TTL

PORTA<2> entrada de datos. Desactivado cuando las funciones analógicas estén activas; desactivado cuando la

salida CVREF esté activa.

AN2 1 entrada analógica Canal 2 de entrada A/D y entrada del comparador C2+. Configuración por defecto en un POR; no le afectan las

salidas analógicas.

VREF- 1 entrada analógica Tensión baja de referencia de entrada para el A/D y el comparador.

RA2/AN2/ VREF-/CVREF

CVREF x salida analógica Tensión de referencia de salida. Activando esto se desactiva las E/S digitales.

0 salida salida digital LATA<3> salida de datos; no le afectan las entradas analógicas

RA3 1 entrada Buffer de

entrada TTL PORTA<3> entrada de datos; desactivado cuando las

entradas analógicas estén activas.

AN3 1 entrada analógica Canal 3 de entrada A/D y del comparador C1+. Configuración por defecto en un POR.

RA3/AN3/ VREF+

VREF+ 1 entrada analógica Tensión de referencia alta de entrada para el A/D y el comparador.

0 salida salida digital LATA<4> salida de datos; no le afectan las entradas analógicas

RA4 1 entrada

Buffer de entrada Schmitt

PORTA<4> entrada de datos; desactivado cuando las entradas analógicas estén activas.

T0CKI 1 entrada Buffer de entrada Schmitt

Entrada del reloj Timer0.

C1OUT 0 salida salida digital Salida del comparador 1; tiene prioridad sobre el puerto de datos.

RA4/T0CKI/ C1OUT/RCV

RCV x entrada Buffer de entrada TTL Entrada externa del transmisor RCV del USB.

RA5 0 salida salida digital LATA<5> salida de datos; no le afectan las entradas analógicas

1 entrada Buffer de entrada TTL

PORTA<5> entrada de datos; desactivado cuando las entradas analógicas estén activas.

AN4 1 entrada analógica Canal 4 de entrada A/D. Por defecto en un POR.

SS* 1 entrada Buffer de entrada TTL Entrada selectora de esclavo para SSP (Módulo MSSP).

HLVDIN 1 entrada analógica Detector de tensión Alta/Baja externa.

RA5/AN4/SS*/ HLVDIN/C2OUT

C2OUT 0 salida salida digital Salida del comparador 2; tiene prioridad sobre el puerto de datos.

OSC2/CLKO/RA6 OSC2 x salida analógica Conexión de regreso del oscilador (todos los modos XT y HS).

Page 188: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

186

CLKO x salida salida digital Salida del sistema del reloj (FOSC/4); disponible en los modos EC, ECPLL e INTCKO.

0 salida salida digital LATA<6> salida de datos. Disponible en los modos ECIO, ECPIO e INTIO; en otro caso, se lee ‘0’.

RA6 1 entrada Buffer de

entrada TTL 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 basándose en la configuración 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

dirección 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) sólo es memoria mapeada. Las operaciones de lectura-modificación-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 automáticamente cuando el pin se configura como salida. Se inhabilita el pull-up en un reinicio.

Page 189: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

187

Nota: En reinicio, RB4:RB0 se configuran como entradas analógicas por defecto y se leen como ‘0’; Se configuran los bits RB7:RB5 como entradas digitales.

Programando el bit de configuración, PBADEN (CONFIG3H<1>), RB4:RB0 se configuran alternativamente como entradas digitales en POR.

Cuatro de los pines de PORTB (RB7: RB4) tienen una interrupción “al cambiar”. Solamente los pines configurados como entradas pueden provocar esta interrupción. Cualquier pin RB7:RB4 configurado como salida se excluye de la interrupción “al cambiar”. Los pines se comparan con el último valor leído en el PORTB.

La interrupción se puede utilizar para despertar al dispositivo del sleep. El usuario, en la rutina del servicio de la interrupción, puede inhabilitar la interrupción de la manera siguiente:

a) Una lectura o escritura en el PORTB (excepto con la instrucción MOVFF x, PORTB). Esto terminará la condición de error de conexión.

b) Borrar el flag, RBIF.

Al leer el PORTB finalizará la condición de error de conexión y permitirá que el flag, RBIF, sea borrado.

La interrupción “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 interrupción. No es recomendable interrogar el PORTB cuando estamos usando la interrupción “por cambio”.

Los pines, RB2 y RB3, se multiplexan con el USB y sirven como las salidas para un transmisor-receptor externo USB (configuración TRIS).

RB4 se multiplexa con CSSPP, el chip selecciona funcionar con puerto paralelo (SPP) ajustando el TRIS.

EJEMPLO 11-2: Inicialización De PORTB CLRF PORTB ;Inicializar PORTB borrando los latch de salida de datos CLRF LATB ;Otra método para borrar los latch de salida MOVLW 0Eh ;Activar RB<4:0> como pines digitales de entrada-salida MOVWF ADCON1 ; (requerido si el bit PBADEN está activo) MOVLW 0CFh ;Valor usado para inicializar las direcciones de los datos MOVWF TRISB ;Activa RB<3:0> como entradas ;RB<5:4> como salidas ;RB<7:6> como entradas

Page 190: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

188

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

Pin Función Configuración Del TRIS E/S Tipo

De E/S Descripción

0 salida salida digital LATB<0> salida de datos; no le afectan las entradas analógicas

RB0 1 entrada Buffer de

entrada TTL

PORTB<0> entrada de datos; cuando el bit RBPU se borre, poca resistencia. Desactivada cuando se activen

las entradas analógicas(1) AN12 1 entrada señal analógica Canal de entrada A/D 12.(1)

INT0 1 entrada Buffer de entrada Schmitt Entrada de interrupción externa 0

FLT0 1 entrada Buffer de entrada Schmitt

Entrada de PWM mejorado contra fallos (Módulo ECCP1); activo por software

SDI 1 entrada Buffer de entrada Schmitt SPI entrada de datos (Módulo MSSP).

1 salida salida digital Salida de datos I2C (Módulo MSSP); tiene prioridad sobre el puerto de datos.

RB0/AN12/ INT0/FLT0/

SDI/SDA

SDA 1 entrada I2C/SMB

Entrada de datos I2C (Módulo MSSP); el tipo de entrada depende de las características seleccionadas en el

módulo.

0 salida salida digital LATB<1> salida de datos; no le afectan las entradas analógicas

RB1 1 entrada Buffer de

entrada TTL

PORTB<1> entrada de datos; cuando el bit RBPU se borre, poca resistencia. Desactivada cuando se activen

las entradas analógicas(1) AN10 1 entrada señal analógica Canal de entrada A/D 10.(1)

INT1 1 entrada Buffer de entrada Schmitt Entrada de interrupción externa 1

0 salida salida digital Salida de reloj SPI (Módulo MSSP); tiene prioridad sobre el puerto de datos. SCK

1 entrada Buffer de entrada Schmitt Entrada de reloj SPI (Módulo MSSP).

0 salida salida digital Salida de reloj I2C (Módulo MSSP); tiene prioridad sobre el puerto de datos.

RB1/AN10/ INT1/SCK/

SCL

SCL 1 entrada I2C/SMB Entrada de reloj I2C (Módulo MSSP); el tipo de entrada

depende de las características seleccionadas del módulo.

0 salida salida digital LATB<2> salida de datos; no le afectan las entradas analógicas

RB2 1 entrada Buffer de

entrada TTL

PORTB<2> entrada de datos; cuando el bit RBPU se borre, poca resistencia. Desactivada cuando se activen

las entradas analógicas(1) AN8 1 entrada señal analógica Canal de entrada A/D 8.(1)

INT2 1 entrada Buffer de entrada Schmitt Entrada de interrupción externa 2

RB2/AN8/ INT2/VMO

VMO 0 salida salida digital Salida de datos del transmisor externo USB VMO.

0 salida salida digital LATB<3> salida de datos; no le afectan las entradas analógicas

RB3 1 entrada Buffer de

entrada TTL

PORTB<3> entrada de datos; cuando el bit RBPU se borre, poca resistencia. Desactivada cuando se activen

las entradas analógicas(1) AN9 1 entrada señal analógica Canal de entrada A/D 9.(1)

0 salida salida digital Salida del comparador CCP2 y del PWM. CCP2(2)

1 entrada Buffer de entrada Schmitt Capturador de entrada CCP2.

RB3/AN9/ CCP2/VPO

VPO 0 salida salida digital Salida de datos del transmisor externo USB VPO.

0 salida salida digital LATB<4> salida de datos; no le afectan las entradas analógicas

RB4 1 entrada Buffer de

entrada TTL

PORTB<4> entrada de datos; cuando el bit RBPU se borre, poca resistencia. Desactivada cuando se activen

las entradas analógicas(1)

RB4/AN11/ KBI0/CSSPP

AN11 1 entrada señal analógica Canal de entrada A/D 11.(1)

Page 191: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

189

KBI0 1 entrada Buffer de entrada TTL Interrupción al cambiar.

CSSPP(4) 0 salida salida digital Salida de control del chip select de SPP.

0 salida salida digital LATB<5> salida de datos. RB5

1 entrada Buffer de entrada TTL

PORTB<5> entrada de datos; cuando el bit RBPU se borre, poca resistencia.

KBI1 1 entrada Buffer de entrada TTL Interrupción al cambiar.

RB5/KBI1/ PGM

PGM x entrada Buffer de entrada Schmitt

Modo de programación de suministro único (ICSP™). Activo por el bit LVP; todas las funciones de los demás

pines desactivadas.

0 salida salida digital LATB<6> salida de datos. RB6

1 entrada Buffer de entrada TTL

PORTB<6> entrada de datos; cuando el bit RBPU se borre, poca resistencia.

KBI2 1 entrada Buffer de entrada TTL Interrupción al cambiar.

RB6/KBI2/ PGC

PGC x entrada Buffer de entrada Schmitt Reloj de entrada serie para operaciones ICSP e ICD.(3)

0 salida salida digital LATB<7> salida de datos. RB7

1 entrada Buffer de entrada TTL

PORTB<7> entrada de datos; cuando el bit RBPU se borre, poca resistencia.

KBI3 1 entrada Buffer de entrada TTL Interrupción al cambiar.

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

RB7/KBI3/ PGD

PGD x entrada Buffer de

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

Nota 1: Configuración en el POR determinada por el bit PBADEN. Los pines se configuran como entradas analógicas cuando el bit PBADAN está activo y entradas digitales cuando está borrado.

2: Selección de pin alternativo de CCP2 cuando CCP2MX = 0. La selección natural es RC1.

3: Todas las funciones de los pines están desactivadas cuando ICSP o ICD se activan.

4: Sólo en los dispositivos de 40/44-pines.

Page 192: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

190

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.

Page 193: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

191

3.4.11.3. Registros PORTC, TRISC Y LATC El PORTC es un puerto bidireccional de 7bits de ancho. El registro de la

dirección 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) sólo es memoria mapeada. Las operaciones de lectura-modificación-escritura en el registro LATC lee y escribe el valor del latch de salida del PORTC.

PORTC se multiplexa sobre todo con los módulos de comunicación serie, incluyendo el EUSART, el módulo MSSP y el módulo USB. A excepción de RC4 y RC5, el PORTC utiliza buffer de disparo de entrada Schmitt.

Los pines RC4 y RC5 se multiplexan con el módulo USB. Dependiendo de la configuración del módulo, pueden servir como las líneas 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, sólo pueden funcionar como entradas digitales. Cuando se configura para operaciones con USB, la dirección de los datos se determina por la configuración y el estado del módulo USB en ese momento. Si se utiliza un transmisor-receptor externo, siempre funcionarán RC4 y RC5 como entradas del transmisor-receptor. Si se utiliza el transmisor-receptor del chip, la dirección de los datos se determina por la operación que se realiza por el módulo en el momento.

Cuando se permite el transmisor-receptor externo, RC2 sirve como la salida de control del transmisor-receptor.

Al permitir funciones periféricas en los pines de PORTC con excepción de RC4 y de RC5, hay que tener cuidado al definir los bits de TRIS. Algunos periféricos eliminan el bit TRIS para configurar un pin como salida, mientras que otros periféricos activan el bit TRIS para configurar un pin como entrada.

Nota: En un reset por subida de tensión, estos pines, excepto RC4 y RC5, se configuran como entradas digitales. Para utilizar los pines RC4 y RC5 como entradas digital, el módulo USB debe desactivarse (UCON<3>=0) y en el chip el transmisor-receptor del USB debe desactivarse también (UCFG<3>=1).

El contenido del registro de TRISC afectado por el periférico se elimina. La lectura de TRISC siempre devuelve el contenido actual, aun cuando un dispositivo periférico puede eliminar uno o más pines.

Page 194: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

192

EJEMPLO 11-3: Inicialización Del PORTC CLRF PORTC ;Inicializar PORTC borrando los latch de salida de datos CLRF LATC ;Otra método para borrar los latch de salida MOVLW 07h ;Valor usado para inicializar las direcciones de los datos MOVWF TRISC ;Activa RC<5:0> como salidas ;RC<7:6> como entradas

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

Pin Función Ajustes del TRIS E/S Tipo de E/S Descripción

RC0 0 S salida digital LATC<0> salida de datos.

1 E Buffer de entrada Schmitt PORTC<0> entrada de datos.

T1OSO x S señal analógica Salida del oscilador del Timer1; activo cuando se active el oscilador del Timer1. Inhabilita las E/S digitales.

RC0/T1OSO/

T13CKI

T13CKI 1 E Buffer de entrada Schmitt Entrada del contador Timer1/Timer3.

0 S salida digital LATC<1> salida de datos. RC1

1 E Buffer de entrada Schmitt PORTC<1> entrada de datos.

T1OSI x E señal analógica Entrada del oscilador Timer1; activo cuando se active el oscilador Timer1. Desactiva las E/S digitales.

0 S salida digital Salida del comparador CCP2 y del PWM output; tiene prioridad sobre el puerto de datos. CCP2(1)

1 E Buffer de entrada Schmitt Entrada de captura CCP2.

RC1/T1OSI/

CCP2/UOE*

UOE* 0 S salida digital Salida del transmisor OE externo del USB. 0 S salida digital LATC<2> salida de datos.

RC2 1 E Buffer de

entrada Schmitt PORTC<2> entrada de datos.

0 S salida digital Salida del comparador ECCP1 y del PWM output; tiene prioridad sobre el puerto de datos. CCP1

1 E Buffer de entrada Schmitt Entrada de captura ECCP1.

RC2/CCP1/ P1A

P1A(3) 0 S 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

caída del PWM mejorado.

RC4 —(2) E Buffer de entrada TTL

PORTC<4> entrada de datos; desactivado cuando el modulo transmisor del USB del chip esté activo.

—(2) S transmisor USB Línea de salida del bus USB diferencial negativo USB (transmisor interno). D-

—(2) E transmisor USB Línea de entrada del bus USB diferencial negativo USB (transmisor interno).

RC4/D-/VM

VM —(2) E Buffer de entrada TTL Entrada del USB VM externo.

RC5 —(2) E Buffer de entrada TTL

PORTC<5> entrada de datos; desactivado cuando el modulo transmisor del USB del chip esté activo.

—(2) S transmisor USB Línea de salida del bus USB diferencial positivo USB (transmisor interno). D+

—(2) E transmisor USB Línea de entrada del bus USB diferencial positivo USB (transmisor interno).

RC5/D+/VP

VP —(2) E Buffer de entrada TTL Entrada del USB VP externo.

0 S salida digital LATC<6> salida de datos. RC6/TX/CK RC6

1 E Buffer de entrada Schmitt PORTC<6> entrada de datos.

Page 195: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

193

TX 0 S salida digital Salida de transmisión serie asíncrona (módulo EUSART); tiene prioridad sobre el puerto de datos. El usuario tiene que configurarla como salid.

0 S salida digital Salida de transmisión serie síncrona (módulo EUSART); tiene prioridad sobre el puerto de datos.

CK 1 E Buffer de

entrada Schmitt Entrada del reloj serie síncrono (Módulo EUSART).

0 S salida digital PORTC<7> salida de datos RC7

1 E Buffer de entrada Schmitt PORT<7> entrada de datos

RX 1 E Buffer de entrada Schmitt Entrada de datos del receptor serie asíncrono (módulo EUSART).

1 S salida digital Salida serie de datos síncrona (modulo EUSART); tiene prioridad sobre SPI y el puerto de datos. DT

1 E Buffer de entrada Schmitt

Entrada de datos serie síncrona (módulo EUSART). El usuario tiene que configurarla como entr.

RC7/RX/DT/ SDO

SDO 0 S salida digital Salida de datos SPI (módulo MSSP); tiene prioridad sobre el puerto de datos.

Nota 1: Asignación del pin por defecto. La asignación 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 sólo entradas. La dirección de los datos del USB se determina por la configuración 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 están solamente disponibles como puertos cuando el módulo del USB está desactivado (UCON<3> = 0).

Page 196: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

194

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 dirección 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) sólo es memoria mapeada. Las operaciones de lectura-modificación-escritura en el registro LATD lee y escribe el valor del latch de salida del PORTD.

Todos los pines del PORTD están 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 automáticamente 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 módulo CCP.

Nota: En un reset por subida de tensión estos pines se configuran como entrada de datos digital.

El PORTD también 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 cuádruples, las funciones del MSSP en el PORTD se desactivan automáticamente.

EJEMPLO 11-4: Inicialización Del PORTD CLRF PORTD ; Inicializar PORTD borrando los latch de salida de datos CLRF LATD ;Otra método para borrar los latch de salida MOVLW 0C7h ;Valor usado para inicializar las direcciones de los datos MOVWF TRISD ;Activa RD<3:0> como entradas ;RD<5:4> como salidas ;RD<7:6> como entradas

Page 197: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

195

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

Pin Función Ajustes del TRIS E/S Tipo de E/S Descripción

0 salida Salida digital LATD<0> salida de datos. RD0

1 entrada Buffer de entrada Schmitt PORTD<0> entrada de datos.

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

RD0/SPP0

SPP0 1 entrada Buffer de

entrada TTL SPP<0> entrada de datos.

0 salida Salida digital LATD<1> salida de datos. RD1

1 entrada Buffer de entrada Schmitt PORTD<1> entrada de datos.

1 salida Salida digital SPP<1> salida de datos; tiene prioridad sobre el puerto de datos.

RD1/SPP1

SPP1 1 entrada Buffer de

entrada TTL SPP<1> entrada de datos.

0 salida Salida digital LATD<2> salida de datos. RD2

1 entrada Buffer de entrada Schmitt PORTD<2> entrada de datos.

1 salida Salida digital SPP<2> salida de datos; tiene prioridad sobre el puerto de datos.

RD2/SPP2

SPP2 1 entrada Buffer de

entrada TTL SPP<2> entrada de datos.

0 salida Salida digital LATD<3> salida de datos. RD3

1 entrada Buffer de entrada Schmitt PORTD<3> entrada de datos.

1 salida Salida digital SPP<3> salida de datos; tiene prioridad sobre el puerto de datos.

RD3/SPP3

SPP3 1 entrada Buffer de

entrada TTL SPP<3> entrada de datos.

0 salida Salida digital LATD<4> salida de datos. RD4

1 entrada Buffer de entrada Schmitt PORTD<4> entrada de datos.

1 salida Salida digital SPP<4> salida de datos; tiene prioridad sobre el puerto de datos.

RD4/SPP4

SPP4 1 entrada Buffer de

entrada TTL SPP<4> entrada de datos.

0 salida Salida digital LATD<5> salida de datos RD5

1 entrada Buffer de entrada Schmitt PORTD<5> entrada de datos

1 salida Salida digital SPP<5> salida de datos; tiene prioridad sobre el puerto de datos. SPP5

1 entrada Buffer de entrada TTL SPP<5> entrada de datos.

RD5/SPP5/P1B

P1B 0 salida Salida digital Salida ECCP1 y PWM mejorado, canal B; tiene prioridad sobre el puerto de datos. (1)

0 salida Salida digital LATD<6> salida de datos. RD6

1 entrada Buffer de entrada Schmitt PORTD<6> entrada de datos.

1 salida Salida digital SPP<6> salida de datos; tiene prioridad sobre el puerto de datos. SPP6

1 entrada Buffer de entrada TTL SPP<6> entrada de datos.

RD6/SPP6/P1C

P1C 0 salida Salida digital Salida ECCP1 y PWM mejorado, canal C; tiene prioridad sobre el puerto de datos. (1)

0 salida Salida digital LATD<7> salida de datos. RD7/SPP7/P1D RD7

1 entrada Buffer de entrada Schmitt PORTD<7> entrada de datos.

Page 198: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

196

1 salida Salida digital SPP<7> salida de datos; tiene prioridad sobre el puerto de datos. SPP7

1 entrada Buffer de entrada TTL SPP<7> entrada de datos.

P1D 0 salida Salida digital Salida ECCP1 y PWM mejorado, canal D; tiene prioridad sobre el puerto de datos. (1)

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 función Master Clean está desactivada (configuración 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 están implementados en los dispositivos de 28pines.

Page 199: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

197

3.4.11.5. Registros PORTE, TRISE Y LATE Dependiendo del PIC18F2455/2550/4455/4550 seleccionado, el PORTE se pone

en ejecución 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 analógica, éstos pines se leerán como ‘0’s.

El registro de dirección 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).

Además de los datos del puerto, el registro PORTE también contiene el bit de control RDPU (PORTE<7>); esto permite o inhabilita el pull-up del PORTD.

TRISE controla la dirección de los pines RE, incluso cuando se utilizan como entradas analógicas. El usuario debe cerciorarse de mantener los pines configurados como entradas cuando use las analógicas.

Nota: En un reset por subida de tensión, RE2:RE0 se configuran como entradas analógicas.

El registro del latch de datos (LATE) sólo es memoria mapeada. Las operaciones de lectura-modificación-escritura en el registro LATE lee y escribe el valor del latch de salida del PORTE.

El cuarto pin PORTE (MCLR*/VPP/RE3) sólo es un pin de entrada. Su operación se controlada con el bit de configuración 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 configuración, RE3 también funciona como entrada de tensión de programación.

Nota: En un reset de subida de tensión, se activa RE3 como una entrada digital solamente si la función de Master Clear está desactivada.

Page 200: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

198

EJEMPLO 11-5: Inicialización De PORTE CLRF PORTE ;Inicializar PORTE borrando los latch de salida de datos CLRF LATE ;Otra método para borrar los latch de salida MOVLW 0Ah ;Configura A/D como entradas digitales MOVWF ADCON1 MOVLW 03h ;Valor usado para inicializar las direcciones de los datos MOVLW 07h ;Desactiva los comparadores MOVWF CMCON MOVWF TRISE ;Activa RE<0> como entradas ;RE<1> como salidas ;RE<2> como entradas

3.4.11.5.1. PORTE En Los Dispositivos De 28-PIN En los dispositivos de 28pines, el PORTE sólo 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 según 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 activador del pull-up del PORD: 1= Pull-up activado 0= Pull-up desactivado BIT 3-0 RE3:RE0: Bits de entrada de datos del PORTE(1,2,3)

Nota 1: puesto en ejecución solamente cuando la funcionalidad clara principal es lisiada (configuración 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 sólo se implementan en los dispositivos de 40/44pines.

3: No implementado en los dispositivos de 28pines; se lee ‘0’.

Page 201: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

199

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

Pin Función Ajustes del TRIS E/S Tipo de E/S Descripción

0 salida Salida digital LATE<0> salida de datos; no le afectan las entradas analógicas.

RE0 1 entrada

Buffer de entrada Schmitt

PORTE<0> entrada de datos; desactivado cuando se activan las entradas analógicas.

AN5 1 entrada Señal analógica Entrada A/D canal 5; configuración por defecto en un POR.

RE0/AN5/ CK1SPP

CK1SPP 0 salida Salida digital Salida SPP reloj 1 (SPP activo).

0 salida Salida digital LATE<1> salida de datos; no le afectan las entradas analógicas.

RE1 1 entrada

Buffer de entrada Schmitt

PORTE<1> entrada de datos; desactivado cuando se activan las entradas analógicas.

AN6 1 entrada Señal analógica Entrada A/D Canal 6; configuración por defecto en un POR.

RE1/AN6/ CK2SPP

CK2SPP 0 salida Salida digital Salida SPP reloj 2 (SPP activo).

0 salida Salida digital LATE<2> salida de datos; no le afectan las entradas analógicas.

RE2 1 entrada

Buffer de entrada Schmitt

PORTE<2> entrada de datos; desactivado cuando se activan las entradas analógicas.

AN7 1 entrada Señal analógica Entrada A/D canal 7; configuración por defecto en un POR.

RE2/AN7/ OESPP

OESPP 0 salida Salida digital Salida active SPP (SPP activo).

MCLR* —(1) entrada Buffer de entrada Schmitt

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

VPP — (1) entrada Señal analógica

Detección de alta tensión, utilizado en el modo de detección de entrada ICSP. Siempre disponible sin importar el modo del pin.

MCLR*/VPP/ RE3

RE3 — (1) entrada Buffer de entrada Schmitt

PORTE<3> entrada de datos; activo cuando el bit de configuración MCLRE está borrado.

Nota 1: RE3 no tiene un bit correspondiente TRISE<3>. Este pin es siempre una entrada sin importar modo.

Page 202: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

200

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 sólo cuando la función Master Clear está desactivada (configuración 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 ejecución PORTE (es decir, los dispositivos 40/44-pin).

3: Estos registros o bits no están implementados en los dispositivos de 28 el pin.

Page 203: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

201

3.4.12. MÓDULO TIMER0 El módulo Timer0 incorpora las siguientes características:

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 Interrupción por desbordamiento

El registro de T0CON controla todos aspectos de operación del módulo, incluyendo selección 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 TMR0ON: Bit de control para activar el Timer0 1 = permite Timer0 0 = no permite Timer0 BIT 6 T08BIT: Bit de selección 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 BIT 5 T0CS: Bit selector de la fuente del reloj Timer0 1 = reloj en el pin T0CKI 0 = reloj interno del ciclo de la instrucción (CLKO) BIT 4 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 BIT 3 PSA: Bit de la asignación del prescaler del Timer0 1 = el prescaler Timer0 no se asigna. 0 = se asigna el prescaler Timer0 BIT 2-0 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

Page 204: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

202

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 módulo 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 instrucción. 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 sincronización 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 versión 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 través 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 máximo.

Page 205: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

203

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 máximo.

3.4.12.3. Prescaler Estos micros disponen de un contador de 8bit como prescaler para el módulo

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 cuáles determinan el divisor del prescaler y la asignación del prescaler.

Borrar el bit PSA asigna el prescaler al Módulo 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 módulo 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 asignación.

3.4.12.3.1. Conmutación En La Asignación Del Prescaler La asignación del prescaler se controla completamente bajo software y se puede

cambiar “en marcha” durante la ejecución del programa.

3.4.12.4. Interrupción Timer0 Se genera la interrupción 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 interrupción se puede enmascarar al borrar el bit TMR0IE (INTCON<5>). Antes de volver a permitir la interrupción, el bit TMR0IF debe borrarse por software en la rutina de la interrupción.

Como el Timer0 se desconecta en el modo sleep, su interrupción no puede despertar el dispositivo.

Page 206: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

204

TABLA 12-1: Registros Asociados Al Timer0

Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

TMR0L Timer0 Register Low Byte

TMR0H Timer0 Register High Byte

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 están 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’.

Page 207: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

205

3.4.13. MÓDULO TIMER1 El módulo temporizador/contador Timer1 incorpora las siguientes

características:

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 Interrupción por desbordamiento El módulo reset en un evento especial de disparo del CCP Flag de estado del reloj del dispositivo (T1RUN)

El módulo incorpora su propio oscilador de baja potencia para proporcionar una opción 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 energía.

El Timer1 se puede utilizar para proporcionar la funcionalidad del reloj en tiempo real (RTC) en las aplicaciones con un mínimo de componentes externos y de código.

El Timer1 se controla con el registro T1CON. También 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>).

Page 208: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

206

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 RD16: Bit de permiso de la lectura/escritura en el modo de 16-Bit 1 = permite la lectura/escritura del Timer1 en una operación de 16bits 0 = permite lectura/escritura del Timer1 en dos operaciones de 8bits BIT 6 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 BIT 5-4 T1CKPS1: T1CKPS0: Bits de selección del prescaler del Timer1 11 = valor de 1:8 10 = valor de 1:4 01 = valor de 1:2 00 = valor de 1:1 BIT 3 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 regeneración se apagan para eliminar la energía de drenaje. BIT 2 T1SYNC*: Bit de selección de la sincronización 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. BIT 1 TMR1CS: Bit de selección 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) BIT 0 TMR1ON: Bit de activación del Timer1 1 = permite Timer1 0 = para el Timer1

Page 209: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

207

3.4.13.1. Operaciones Del Timer1 Timer1 puede funcionar en uno de estos modos:

Temporizador Contador síncrono Contador asincrónico

El modo de funcionamiento se determina con el bit de selección TMR1CS (T1CON<1>). Cuando se borra TMR1CS (=0), incrementos del Timer1 en cada instrucción 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 regeneración se apagan para eliminar la energía 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 dirección 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á inválido debido a las lecturas redundantes.

Al escribir el byte alto del Timer1 debe pasar a través 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.

Page 210: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

208

No se puede leer o escribir el byte alto de Timer1 directamente en este modo. Toda lectura y escritura debe hacerse a través 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 regeneración se apagan para eliminar la energía 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 energía.

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

Page 211: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

209

TABLA 13-1: Selección Del Condensador Del Oscilador Del Temporizador

Osc Freq C1 C2

LP 32 kHz 27 pF 27 pF

3.4.13.3.1. Usar Timer1 como Fuente De Reloj El oscilador Timer1 está también disponible como fuente del reloj en los modos

de ahorro de energía. Poniendo los bits, SCS1:SCS0 (OSCCON<1:0>), a ‘01’, el dispositivo cambia al modo SEC_RUN. La CPU y los periférico se controlan con el oscilador Timer1. Si el bit IDLEN (OSCCON<7>) se borra y se ejecuta la instrucción 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 también 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 señal de reloj, preguntando al bit T1RUN sabremos si el reloj lo proporciona el oscilador Timer1 u otra fuente.

3.4.13.3.2. Opción De Baja Potencia Timer1 El oscilador Timer1 puede funcionar en dos niveles distintos de consumo de

energía basado en la configuración de dispositivo. Cuando se setea el bit de configuración LPT1OSC, el oscilador Timer1 funciona en un modo de baja potencia. Cuando LPT1OSC no se activa, el Timer1 funciona en un nivel de energía más alto. El consumo de energía para un modo particular es relativamente constante, sin importar el modo del dispositivo. La configuración por defecto del Timer1 es el modo de energía más alto.

Como el modo de baja potencia Timer1 tiende a ser más sensible a las interferencias, los ambientes con mucho de ruido pueden causar una cierta inestabilidad del oscilador. La opción de baja potencia es, por tanto, más adecuada en aplicaciones de poco ruido donde la conservación de energía es una consideración de diseño importante.

3.4.13.3.3. Consideraciones Del Layout Del Oscilador Timer1 El circuito del oscilador Timer1 crea una energía muy pequeña durante su

operación. Debido a la naturaleza de baja potencia del oscilador, puede provocarse interferencias rápidamente. El circuito del oscilador debe localizarse lo más cercano posible al microcontrolador. No puede haber circuitos que pasen por dentro de los límites del oscilador del circuito con excepción 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 además de un plano de tierra.

Page 212: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

210

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

Nota: No está dibujado a escala.

3.4.13.4. Interrupción Timer1 El par de registros TMR1 (TMR1H:TMR1L) incrementan de 0000h a FFFFh y

vuelve a 0000h. La interrupción Timer1, si está permitida, se genera en el desbordamiento que activa el flag de la interrupción, TMR1IF (PIR1<0>). Esta interrupción 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 módulos CCP se configuran como un modo de comparación para generar un disparo especial (CCP1M3:CCP1M0 o CCP2M3:CCP2M0 = 1011), esta señal reseteará el Timer1. El disparo de CCP2 también comenzar una conversión A/D, si es el módulo A/D está permitido.

El módulo se debe configurar como un temporizador o un contador síncrono para aprovechar esta característica. Cuando se está utilizando de esta manera, el par de registros CCPRH:CCPRL se convierten en un registro del período del Timer1.

Si Timer1 está funcionando en modo contador asíncrono, esta operación de reset puede que no funcione.

En caso que al escribir el Timer1 coincida con un evento de disparo especial, la operación de escritura tomará precedencia.

Nota: Los acontecimientos de disparo especiales del módulo CCP2 no activarán el flag de interrupción TMR1IF (PIR1<0>).

Page 213: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

211

3.4.13.6. Usar Timer1 como Reloj De Tiempo Real (RTC) Añadiendo un oscilador externo al Timer1 da a los usuarios la opción de incluir

aplicaciones en tiempo real. Esto se logra con un cristal de reloj para proporcionar una frecuencia exacta de base y varias líneas de código de la aplicación para calcular el tiempo. Al funcionar en modo sleep y con batería o súper condensador como fuente de energía, puede eliminar la necesidad de un RTC separado y una batería de reserva.

La rutina del código, RTCisr, demuestra un método simple para incrementar un contador en intervalos de un segundo usando una rutina de interrupción. Incrementando el par de registros TMR1 para desbordarlo y provocar la llamada de la interrupción, 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 tardaría 2s. Para forzar el desbordamiento en intervalos de un segundo, es necesario cargar el temporizador. El método más simple es fijar el MSb TMR1H con una instrucción 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 método sea exacto, el Timer1 debe funcionar en modo asíncrono y la interrupción del desbordamiento Timer1 debe estar permitida (PIE1<0>=1) según las indicaciones de rutina, RTCinit. El oscilador Timer1 tiene que estar permitido y funcionando siempre.

Page 214: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

212

EJEMPLO 13-1: Poner Un Reloj En Ejecución En Tiempo Real Usando La Interrupción Timer1 RTCinit MOVLW 80h ;Carga del par de registros TMR1 MOVWF TMR1H ;para desbordamiento en 1 segundo CLRF TMR1L MOVLW b'00001111' ;Configurar el reloj externo, MOVWF T1OSC ;Operación asíncrono, oscilador externo CLRF Secs ;Inicializar los registros para la puntualidad CLRF mins MOVLW d'12' MOVWF hours BSF PIE1,TMR1IE ;Permitir la interrupción Timer1 RETURN RTCisr BSF TMR1H,7 ;Carga para desbordamiento de 1s BCF PIR1,TMR1IF ;Flag de interrupción borrado INCF secs,F ;Incremento de segundos MOVLW d'59' ;¿Transcurrieron 60 segundos? CPFSGT secs RETURN ;No CLRF secs ;Si, Borrar segundos INCF mins,F ;Incremento minutos MOVLW d' 59' ;¿Transcurrieron 60 minutos? CPFSGT mins RETURN ;No CLRF mins ;Si, borrado de minutos INCF hours,F ;Incremento de horas MOVLW d' 23' ;¿Transcurrieron 24 horas? CPFSGT hours RETURN ;No MOVLW d' 01' ;Si, Reset de las horas a 1 MOVWF hours RETURN ;Hecho

Page 215: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

213

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

TMR1L Timer1 Register Low Byte

TMR1H Timer1 Register High Byte

T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC* TMR1CS TMR1ON

Leyenda: - = las localizaciones no están implementadas. Las celdas sombreadas no se utilizan con Timer0.

Nota 1: Estos bits no están implementados en los dispositivos de 28pines; mantenerlos siempre borrados.

3.4.14. MÓDULO TIMER2 El temporizador Timer2 incorpora las siguientes características:

Registros temporizador y período de 8bit (TMR2 y PR2, 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) Interrupción en TMR2 unida al PR2 Uso opcional como reloj del cambio para el módulo MSSP

El módulo se controla a través 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 mínimo el consumo de energía.

Page 216: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

214

FIGURA 14-1: Diagrama De Bloques Del Timer2

3.4.14.1. Operaciones Del Timer2 En una operación 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 período, PR2, en cada ciclo de reloj. Cuando los dos valores son iguales, el comparador genera una señal de sincronismo como temporizador de salida. Esta señal también 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.

Page 217: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

215

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 T2OUTPS3:T2OUTPS0: Bits selectores del Postscaler de la salida 0000 = 1:1 Postscaler 0001 = 1:2 Postscaler · · · 1111 = 1:16 Postscaler BIT 2 TMR2ON: Bit de activación del Timer2 1 = Timer2 está encendido 0 = Timer2 está apagado BIT 1-0 T2CKPS1:T2CKPS0: Bits selectores del Prescaler del reloj 00 = Prescaler de 1 01 = Prescaler de 4 1x = Prescaler de 16

3.4.14.2. Interrupción Timer2 Timer2 puede generar una interrupción opcional en el dispositivo. La señal 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 interrupción del TMR2 que está en TMR2IF (PIR1<1>). La interrupción se permite activando el bit de la interrupción, 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 módulos 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 módulo MSSP que funciona en modo SPI.

Page 218: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

216

TABLA 14-1: Los Registros Asociados Al Timer2 trabajando 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

TMR2 Timer2 Register

T2CON — T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0

PR2 Timer2 Period Register

Leyenda: - = no implementado, se lee como ‘0’. Las celdas sombreadas no las utiliza por módulo Timer2.

Nota 1: Estos bits no están implementados en los dispositivos de 28pines; mantenerlos siempre borrados.

3.4.15. MÓDULO TIMER3 El módulo Timer3 temporizador/contador incorpora las siguientes

características:

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 Interrupción del dispositivo al desbordarse El módulo de reset en un disparo especial del CCP

El módulo Timer3 es controlado con el registro T3CON. También selecciona la fuente del reloj opciones para los módulos de CCP.

Page 219: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

217

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 RD16: Bit de permiso del modo de lectura/escritura de 16Bits 1 = permite la lectura/escritura del Timer3 en una operación de 16 bits 0 = permite la lectura/escritura del Timer3 en dos operaciones de 8 bits BIT 6,3 T3CCP2:T3CCP1: Bits de permiso del Timer3 y Timer1 al CCPx 1x = Timer3 es la fuente del reloj para los módulos 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 BIT 5-4 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 BIT 2 T3SYNC*: Bit de control de la sincronización 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. BIT 1 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) BIT 0 TMR3ON: Bit de encendido del Timer3 1 = permite Timer3 0 = parado Timer3

Page 220: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

218

3.4.15.1. Operaciones Del Timer3 El Timer3 puede funcionar en uno de estos modos:

Temporizador Contador síncrono Contador asincrónico

El modo de funcionamiento se determina con el bit, TMR3CS (T3CON<1>). Cuando TMR3CS está borrado (=0), el Timer3 incrementa en cada instrucción 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 regeneración se apagan para eliminar la energía de drenaje.

3.4.15.2. Modo De Lectura/Grabación De 16bit Timer3 se puede configurar para que lea y escriba 16bits. Cuando el bit RD16

(T3CON<7>) se activa, la dirección 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 inválido.

Al escribir el byte alto del Timer3 debe pasar a través 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.

Page 221: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

219

No se puede leer o escribir el byte alto de Timer3 directamente en este modo. Toda lectura y escritura debe hacerse a través 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 regeneración se apagan para eliminar la energía 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. Interrupción Timer3 El par de registros TMR3 (TMR3H:TMR3L) incrementa de 0000h a FFFFh y se

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

Page 222: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

220

3.4.15.5. Reset Del Timer3 usando El Disparador Especial De Acontecimientos Del CCP

Si el módulo CCP2 se configura para generar el disparador especial de acontecimiento en el modo de comparación (CCP2M3:CCP2M0=1011), esta señal reseteará el Timer3. También comenzará una conversión A/D si el módulo A/D está activado.

El módulo se debe configurar como temporizador o contador síncrono para aprovecharse de esta característica. Cuando se está utilizando este modo, el par de registros CCPR2H:CCPR2L se convierten en un registro de período del Timer3.

Si Timer3 está funcionando en modo contador asíncrono, el reset puede que no funcione.

En caso que coincida una escritura en el Timer3 con el disparo especial de un módulo de CCP, la escritura tiene preferencia.

Nota: Los acontecimientos de disparo especiales del módulo CCP2 no activarán el flag TMR3IF (PIR2<1>).

TABLA 15-1: Los Registros Asociados Al Timer3 Trabajando 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

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 están implementadas. Las celdas sombreadas no se utilizan con Timer3.

Page 223: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

221

3.4.16. MÓDULOS CAPTURA/COMPARACIÓN/PWM (CCP) Los dispositivos PIC18F2455/2550/4455/4550 tienen dos módulos CCP

(Captura/Comparación/PWM). Cada módulo contiene un registro de 16 bits, que puede funcionar como registro de captura de 16bit, registro de comparación de 16bit o un registro PWM maestro/esclavo.

En dispositivos de 28pines, los dos módulos estándares CCP (CCP1 y CCP2) funcionan según lo descrito en este capítulo. En los dispositivos 40/44pines, CCP1 se implementa como módulo CCP mejorado, con los modos de captura y comparación estándar y PWM mejorado.

Las operaciones captura y comparación descritas en este capítulo se aplican a los módulos CCP estándares y al mejorado.

REGISTRO 16-1: CCPxCON: Registro De Control Estándar 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 DCxB1:DCxB0: Bit 1 y 0 del Duty Cicle PWM del módulo CCPx Modo de captura: No utilizado. Modo comparación: 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. BIT 3-0 CCPxM3:CCPxM0: Bits selectores del modo del módulo CCPx 0000= CCPX inhabilitado (CCPx en los resets) 0001= reservado 0010= modo comparación: 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 comparación: inicializa el pin bajo de CCPx; al igualar, se fuerza el pin alto de CCPx (Se activa el bit CCPxIF) 1001= modo comparación: inicializa el pin alto de CCPx; al igualar, se fuerza el pin bajo de CCPx (Se activa el bit CCPxIF) 1010= modo comparación: genera interrupción por

Page 224: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

222

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

3.4.16.1. Configuración Del Módulo CCP A cada módulo Captura/Comparación/PWM se le asocia un registro de control

(genéricamente, 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 Módulos CCP Y Del Temporizador Los módulos CCP utilizan los temporizadores 1, 2 ó 3, dependiendo del modo

seleccionado. Timer1 y Timer3 están disponibles en los módulos de los modos captura o comparación, mientras que Timer2 está disponible para los módulos en modo PWM.

La asignación de un temporizador particular a un módulo se determina con el bit de permiso del temporizador a CCP del registro T3CON. Ambos módulos pueden activarse en cualquier momento y pueden compartir el mismo recurso del temporizador si se configuran para funcionar en el mismo modo (la captura/comparación o PWM) al mismo tiempo. La captura no estará disponible con el Timer1 en modo asíncrono.

TABLA 16-1: Recursos De Los Modos CPP Y Temporizador

Modo CCP/ECCP Recurso temporizador

Captura Timer1 o Timer3

Comparación Timer1 o Timer3

PWM Timer2

Page 225: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

223

TABLA 16-2: Interacciones Entre CCP1 y CCP2 Para Los Recursos Del Temporizador

Modo CCP1 Modo CCP2 Interacción

Captura Captura Cada modulo puede usar TMR1 o TMR3 como base de tiempos. La base de tiempos puede ser distinta para cada CCP.

Captura Comparación

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

automáticas en el disparo. Puede afectar a las operaciones de CCP1 si tienen la misma base de tiempos.

Comparación 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.

Comparación Comparación 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 automáticas en el CCP2. Puede

haber conflictos si los dos módulos usan la misma base de tiempos.

Captura PWM(1) Ninguno

Comparación PWM(1) Ninguno

PWM(1) Captura Ninguno

PWM(1) Comparación Ninguno

PWM(1) PWM Ambos PWMs tendrán la misma frecuencia y ratio de actualización (interrupción TMR2).

Nota 1: Incluye las operaciones PWM estándar y mejorado.

3.4.16.1.2. CCP2 Asignación De Pin La asignación de pines para el CCP2 (la entrada de captura, salida de

comparación y PWM) puede cambiar, basado en la configuración del dispositivo. El bit de configuración CCP2Mx determina qué pin CCP2 se multiplexa. Por defecto, está asignado a RC1 (CCP2Mx=1). Si el bit de configuración se borra, CCP2 se multiplexa con RB3. Cambiar la asignación del CCP2 no cambia automáticamente los requisitos del puerto del pin. Los usuarios deben verificar siempre que el registro TRIS se configura correctamente con la operación CCP2, sin importar donde se localiza.

Page 226: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

224

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 selección del modo, CCPxM3:CCPxM0 (CCPxCON<3:0>). Cuando se hace una captura, el flag de petición de la interrupción, 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. Configuración 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 condición de captura.

3.4.16.2.2. Selección De Modo Timer1/Timer3 Los temporizadores que se deben utilizar con la característica de captura

(Timer1 y/o Timer3) deben funcionar en modo temporizador o modo contador síncrono. En el modo contador asíncrono, la captura no funcionará. El temporizador que se utilice con cada módulo CCP se selecciona en el registro T3CON.

3.4.16.2.3. Interrupción Por Software Cuando se cambia el modo captura, se puede generar una interrupción falsa de

captura. El usuario debe mantener el bit de permiso de interrupción CCPxIE borrado para evitar falsas interrupciones. El flag de interrupción, CCPxIF, tiene que borrarse después 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 módulo 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 interrupción. También, el contador del prescaler no se borra, por lo tanto, la primera captura puede ser de un prescaler diferente a cero.

Page 227: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

225

EJEMPLO 16-1: Cambio Entre Prescalers De Captura (Mostrado CCP2) CLRF CCP2CON ;Desconecta el CCP2 MOVLW NEW_CAPT_PS ;Carga el WREG con el valor del nuevo ;prescaler y CCP encendido MOVWF CCP2CON ;Carga CCP2CON con este valor

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

3.4.16.3. Modo Comparación En el modo comparación, 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 acción del pin se basa en el valor del modo seleccionado con los bits (CCPxM3:CCPxM0). Al mismo tiempo, se fija el flag de interrupción, CCPxIF.

3.4.16.3.1. Tipo De Conexión 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 comparación de salida de RB3 o RC1 (dependiendo de la configuración del dispositivo) a nivel bajo por defecto. Éste no es el PORTB o el latch de E/S de PORTC.

Page 228: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

226

3.4.16.3.2. Selección De Modo Timer1/Timer3 Timer1 y/o Timer3 deben funcionar en modo temporizador, o modo contador

síncrono, si el módulo CCP usa la característica de comparación. En modo contador asíncrono, no funciona la comparación.

3.4.16.3.3. Modo De Interrupción Por Software Cuando se elige el modo de interrupción por software

(CCPxM3:CCPxM0=1010), no varia el pin correspondiente al CCPx. Solamente se genera una interrupción CCP, si está permitida, y se activa el bit CCPxIE.

3.4.16.3.4. Disparador De Acontecimiento Especial Ambos módulos CCP se equipan con un disparador de acontecimiento especial.

Es una señal interna del hardware generada en el modo comparación para disparar acciones de otros módulos. El disparador de acontecimiento especial se activa seleccionando el modo del disparador de acontecimiento especial de comparación (CCPxM3:CCPxM0=1011).

Para cualquier módulo 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 período programable para cualquier temporizador.

El disparador de acontecimiento especial del CCP2 puede comenzar una conversión A/D. Para hacer esto, el convertidor A/D tiene que estar activado.

FIGURA 16-2: Diagrama De Bloques De Las Operaciones Del Módulo Comparación

Page 229: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

227

TABLA 16-3: Registros Asociados A La Captura Y A La Comparación, 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

TMR1L Timer1 Register Low Byte

TMR1H Timer1 Register High Byte

T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC* TMR1CS TMR1ON

TMR3H Timer3 Register High Byte

TMR3L Timer3 Register Low Byte

T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC* TMR3CS TMR3ON

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 CCP1M1 CCP1M0

CCPR2L Capture/Compare/PWM Register 2 Low Byte

CCPR2H Capture/Compare/PWM Register 2 High Byte

CCP2CON — — DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 CCP2M0

Leyenda: - = las localizaciones no están implementadas. Las celdas sombreadas no se utilizan con Captura/Comparación, Timer1 o Timer3.

Nota 1: El bit SBOREN sólo está disponible cuando BOREN<1:0>=01; en otro caso, se lee ‘0’.

Page 230: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

228

2: Este bit no se implementa en los dispositivos de 28pines; mantenerlo siempre a ‘0’.

3.4.16.4. Modo PWM En modo de modulación del ancho del pulso (PWM), el pin CCPx produce una

salida PWM de hasta 10bits de resolución. 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 comparación de salida de RB3 o RC1 (dependiendo de la configuración 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

Page 231: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

229

3.4.16.4.1. Periodo Del PWM El periodo se especifica escribiendo el registro PR2. El periodo se calcula con la

fórmula:

ECUACIÓN 16-1: )2____(4]1)2[(_ TMRdepresalerdelValorTPRPWMPeriodo OSC •••+=

La frecuencia de PWM se define como 1/[período 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 (excepción: 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 podía 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 resolución 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 ecuación siguiente se utiliza para calcular el ciclo de trabajo:

ECUACIÓN 16-2: )2___()4:5:(__ TMRprescalerdelValorTCCPXCONCCPRXLPWMCicleDuty OSC ••><=

CCPRxL y CCPxCON<5:4> se pueden escribir en cualquier momento, pero el valor del duty cicle no se grabará en CCPRxH hasta después de que se igualen PR2 y TMR2 (es decir, se complete el período). 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 técnicos 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 máxima resolución de PWM (bits) para una frecuencia PWM dada se calcula con la ecuación:

Page 232: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

230

ECUACIÓN 16-3:

bitsFF

PWM

OSC

)2log(

)log(M_máxima_PWResolución =

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 4 1 1 1 1

PR2 Valor FFh FFh FFh 3Fh 1Fh 17h

Resolución máxima (bits) 10 10 10 8 7 6,58

3.4.16.4.3. PWM Auto-Apagado (CCP1 Solamente) Las características del auto-apagado del PWM mejorado del módulo CCP están

también disponibles en el CCP1 de los dispositivos de 28pines.

Las características del auto-apagado no están disponibles en el CCP2.

3.4.16.4.4. Configuración Del PWM Hay que seguir los siguientes pasos para configurar el PWM:

a. Fijar el período 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, después permitir el Timer2

escribiendo el T2CON. e. Configurar el módulo CCPx para la operación PWM.

Page 233: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

231

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

TMR2 Timer2 Register

PR2 Timer2 Period Register

T2CON — T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0

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 CCP1M1 CCP1M0

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 están implementadas. Las celdas sombreadas no se utilizan con PWM o Timer2.

Nota 1: El bit SBOREN sólo 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’.

Page 234: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

232

3.4.17. MÓDULO MEJORADO DE CAPTURA/COMPARACIÓN/PWM (ECCP)

Nota: El módulo de ECCP se implementa en los dispositivos de 40/44pines.

En los dispositivos PIC18F4455/4550, CCP1 se implementa como módulo estándar CCP con capacidades mejoradas de PWM. Incluyen la disposición para 2 ó 4 canales de salida, la polaridad seleccionable por el usuario, el control de banda-muerta y la parada automática y el reinicio. La captura, comparación y las funciones de salida simple de PWM del módulo ECCP son iguales al módulo estándar CCP.

El registro de control para el módulo mejorado diferencia de los registros CCPxCON de los dispositivos PIC18F2255/2550 en que los dos bits más significativos están implementados para controlar el PWM.

Además de la gama mejorada de los modos disponibles a través del registro de CCP1CON, el módulo ECCP tiene dos registros adicionales asociados a las características de las operaciones mejoradas y de la auto-parada de PWM. Son:

ECCP1AS (configuración de la banda-muerta)

ECCP1DEL (Configuración de la auto-parada)

3.4.17.1. Salidas Y Configuración Del ECCP El módulo mejorado de CCP puede tener hasta cuatro salidas PWM,

dependiendo del modo de funcionamiento seleccionado. Estas salidas, señaladas 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 Módulo ECCP Como los módulos estándar CCP, el módulo ECCP puede utilizar los

temporizadores 1, 2 ó 3, dependiendo del modo seleccionado. Timer1 y Timer3 están disponibles para los modos captura o comparación, mientras que Timer2 está disponible para el modo PWM. Las interacciones entre el estándar y los módulos mejorados CCP son idénticas a las descritas para los módulos estándares CCP.

Page 235: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

233

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 P1M1:P1M0: Bits de configuración del PWM mejorado Si CCP1M3:CCP1M2=00, 01, 10: xx= P1A se asigna como E/S de Captura/Comparación; 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 BIT 5-4 DC1B1:DC1B0: Bit 1 y 0 del Duty Cicle PWM del módulo CCP1 Modo de captura: No utilizado. Modo comparación: 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. BIT 3-0 CCP1M3:CCP1M0: Bits selectores del modo del módulo CCP1 0000= CCPx inhabilitado (resetea ECCP) 0001= reservado 0010= modo comparación: 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 comparación: inicializa el pin bajo de CCP1; al igualar, se fuerza el pin alto de CCP1 (Se activa el bit CCP1IF) 1001= modo comparación: inicializa el pin alto de CCP1; al igualar, se fuerza el pin bajo de CCP1 (Se activa el bit CCP1IF) 1010= modo comparación: genera interrupción por software al igualar (se activa el bit CCP1IF, el pin CCP1 refleja el estado de la entrada-salida) 1011= modo comparación: accionar el acontecimiento especial, resetea el contador de tiempo, comenzar la conversión A/D al igualar CCP2 (Se activa el bit de CCP1IF)

Page 236: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

234

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 Comparación Los modos captura y comparación, a excepción de la operación del disparador

de acontecimiento especial, del módulo ECCP son idénticos 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 fácilmente para Timer1 o Timer3.

3.4.17.3. El Modo Estándar De PWM Cuando está configurado en un solo modo de salida, el módulo ECCP funciona

igual que el módulo estándar CCP en modo PWM. Esto también se llama modo “CCP compatible”.

TABLA 17-1: Asignación De Pines Para Varios ECCP1 Modo ECCP Configuración 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.

Page 237: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

235

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 módulo es una versión compatible del módulo estándar CCP y ofrece hasta cuatro salidas, señaladas de P1A a P1D. Los usuarios pueden seleccionar la polaridad de la señal (activo-alto o activo-bajo). El modo y la polaridad de la salida del módulo 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 límite del período cuando se resetea Timer2) para prevenir interferencias en las salidas. La excepción es el registro de retraso “banda-muerta” PWM, ECCP1DEL, que se carga en el límite del duty cicle o en el límite del período (el que llegue primero). Debido al buffer, el módulo 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 estándares PWM, pero se compensa con un ciclo completo de la instrucción (4TOSC).

Como antes, el usuario debe configurar manualmente los bits apropiados de TRIS como salida.

FIGURA 17-1: Diagrama De Bloques Simplificado Del Módulo 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.

Page 238: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

236

3.4.17.4.1. Periodo De PWM El periodo se especifica escribiendo el registro PR2. El periodo se calcula con la

fórmula:

ECUACIÓN 17-1: )2____(]1)2[(_ TMRdepresalerdelValorTPRPWMPeriodo OSC ••+=

La frecuencia de PWM se define como 1/[período 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 (excepción: 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 podía 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 resolución 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 ecuación siguiente se utiliza para calcular el ciclo de trabajo:

ECUACIÓN 17-2: )2___()4:51:1(__ TMRprescalerdelValorTCONCCPLCCPRPWMCicleDuty OSC ••><=

CCPR1L y CCP1CON<5:4> se pueden escribir en cualquier momento, pero el valor del duty cicle no se grabará en CCPR1H hasta después de que se igualen PR2 y TMR2 (es decir, se complete el período). 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 técnicos 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 máxima resolución de PWM (bits) para una frecuencia PWM dada se calcula con la ecuación:

Page 239: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

237

ECUACIÓN 17-3:

bitsFF

PWMmáximasolición PWM

OSC

)2log(

)log(__Re =

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 4 1 1 1 1

PR2 Valor FFh FFh FFh 3Fh 1Fh 17h

Resolución máxima (bits) 10 10 10 8 7 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)

Page 240: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

238

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 señal de salida PWM sale por el pin P1A, mientras que la señal 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 señales 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 número de ciclos de la instrucción 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.

Page 241: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

239

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 Aplicación 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.

Page 242: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

240

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

Page 243: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

241

FIGURA 17-7: Ejemplo De Aplicación Full-Bridge

Cambio De Dirección En El Modo Full-Bridge En el modo Full-Bridge, el bit P1M1 del registro CCP1CON permite que el

usuario controle la dirección directa/inversa. Cuando el firmware cambia este bit de control de dirección, el módulo asumirá la nueva dirección en el siguiente ciclo PWM.

Momentos antes del final del período 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 dirección opuesta. Esto ocurre en un intervalo del tiempo de (4TOSC*(valor de Timer2 Prescaler)) antes de que comience el próximo período 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 período, las salidas moduladas (P1B y P1D) siguen estando inactivas.

Observar que en el modo de salida Full-Bridge, el módulo ECCP no proporciona ningún retraso “banda-muerta”. Generalmente, porque sólo modula una salida, y no se necesita el retraso. Sin embargo, hay una situación donde si se necesita. Esta situación ocurre cuando las condiciones siguientes son verdaderas:

1. La dirección 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 energía, es mayor que el tiempo de encendido.

Page 244: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

242

Si hay que cambiar la dirección en una aplicación 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 más rápidas.

Pueden existir otras opciones para prevenir el pico de corriente.

FIGURA 17-8: Cambio De Dirección

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

escribe en cualquier momento del ciclo PWM.

2: Cuando se cambian las direcciones, las señales 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 señales de modulación de P1B y P1D están inactivas.

FIGURA 17-9: Cambio De Dirección Con Un Duty Cicle Cerca Del 100%

Page 245: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

243

Nota 1: Todas las señales 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 módulos CCP estándares.

En las aplicaciones Half-Bridge donde todos los conmutadores se modulan con la frecuencia de PWM, los conmutadores, normalmente, necesitan más tiempo para apagarse. Si los conmutadores cambian al mismo tiempo (uno se activa y el otro se apaga), ambos pueden estar activos en un período 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, después de un retraso, se activa el otro.

En el modo de salida Half-Bridge, existe un retraso digital programable “banda-muerta” para evitar los picos de los cambios. El retraso ocurre en la transición de la señal del estado inactivo al estado activo. Los bits PDC6:PDC0 del registro ECCP1DEL determinan el periodo del retraso en términos de ciclos de instrucción del microcontrolador (TCY o 4 TOSC). Estos bits no están disponibles en los dispositivos de 28pines, pues el módulo estándar CCP no soporta la operación 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 de permiso de reinicio de PWM 1 = sobre el auto-apagado, los bits ECCPASE se borran automáticamente cuando se ejecuta el evento de apagado; el PWM reinicia automáticamente 0 = sobre el auto-apagado, los ECCPASE se tienen que borrar por software para reiniciar el PWM BIT 6-0 PDC6:PDC0: Bits de cuenta del retraso(1) Tiempo de retraso, en ciclos FOSC/4 (4*TOSC), entre la programación y el tiempo actual de una señal de PWM de la transición a activo.

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

Page 246: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

244

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 módulos del comparador, con un nivel bajo en el pin RB0/AN12/INT0/FLT0/SDI/SDA, o de cualquier combinación de estas tres fuentes. Los comparadores se pueden utilizar para supervisar una entrada de tensión proporcional a una corriente supervisada por el circuito del puente. Si la tensión excede un umbral, el comparador cambia de estado y acciona un apagado. Alternativamente, una señal numérica en el pin INT0 puede provocar un apagado. La característica del auto-apagado se puede inhabilitar al no seleccionar ninguna fuente de auto-apagado. Las fuentes de auto-apagado que se utilizarán se seleccionan usando los bits ECCPAS2:ECCPAS0 (bits<6:4> del registro ECCP1AS).

Cuando ocurre un apagado, los pines de salida se colocan asíncronamente 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>) también 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 automático no está activo, el bit ECCPASE lo borra el firmware cuando cesa la causa de apagado. Si el reinicio automático está activo, el bit ECCPASE se borra automáticamente 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 volverán al funcionamiento normal al principio del periodo siguiente de PWM.

Nota: El escribir el bit ECCPASE se desactiva cuando una condición de apagado está activa.

Page 247: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

245

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 de estado del evento auto-apagado del ECCP 1= A ocurrido un acontecimiento de apagado; las salidas del ECCP están en estado de apagado 0= las salidas del ECCP están funcionando BIT 6-4 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 BIT 3-2 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’ BIT 1-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.

Page 248: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

246

El Auto-Apagado Y El Auto-Reinicio La característica del auto-apagado se puede configurar para permitir el reinicio

automático del módulo después 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 continúe la causa de apagado. Cuando la condición de apagado desaparece, el bit ECCP1ASE se borra. Si PRSEN=0, cuando ocurre la condición 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 condición de apagado esté activa.

Independientemente del ajuste del bit PRSEN, si la fuente del auto-apagado es uno de los comparadores, la condición 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)

Page 249: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

247

3.4.17.4.8. Consideraciones De Reinicio Cuando el módulo ECCP se utiliza en el modo PWM, el hardware de la

aplicación 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 están 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 señal o activar las salidas del PWM.

Los bits CCP1M1:CCP1M0 (CCP1CON<1:0>) permiten que el usuario elija si las señales 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 configuración de la polaridad mientras que los pines de PWM están como salidas no se recomiendan, puesto que puede dar lugar a daño a los circuitos de la aplicación.

Los latch de salida P1A, P1B, P1C y P1D pueden no estar en el estado apropiados al iniciarse el módulo PWM. Activar los pines del PWM como salida al mismo tiempo que el módulo ECCP puede causar daño al circuito de la aplicación. El módulo 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 módulo 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 período de PWM cargando el registro PR2. 3. Si se requiere el Auto-apagado:

Inhabilita el Auto-apagado (ECCPASE = 0) Configurar la fuente (FLT0, comparador 1 o comparador 2) Esperar una condición de no apagado

4. Configurar el módulo ECCP con el modo PWM deseado y configurar el registro CCP1CON cargando los valores apropiados:

Seleccionar una de las configuraciones y de las direcciones disponibles de salida con los bits P1M1:P1M0.

Seleccionar las polaridades de las señales 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: Seleccionar las fuentes del auto-apagado usando los bits

ECCPAS2:ECCPAS0.

Page 250: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

248

Selecciona los estados de parada de los pines de salida usando los bits PSSAC1:PSSAC0 y PSSBD1:PSSBD0.

Activar el bit ECCPASE (ECCP1AS<7>). Configurar los comparadores con el registro CMCON. Configurar las entradas del comparador como entradas

analógicas. 8. Si se necesita el auto-reinicio, activar el bit PRSEN (ECCP1DEL<7>). 9. Configurar y comenzar TMR2:

Borrar el flag de interrupción de TMR2 borrando el bit TMR2IF (PIR1<1>).

Determinar el valor del prescaler de TMR2 cargando los bits T2CKPS (T2CON<1:0>).

Permitir el Timer2 activando el bit TMR2ON (T2CON<2>). 10. Permitir las salidas del PWM después de que un nuevo ciclo de PWM

haya comenzado: Esperar hasta que se desborda TMRn (bit TMRnIF permitido). Activar los pines de salidas CCP1/P1A, P1B, P1C y/o P1D

borrando los bits respectivos de TRIS. Borrar el bit ECCPASE (ECCP1AS<7>).

3.4.17.4.10. Operando En Los Modos De Ahorro De Energía En el modo sleep, todas las fuentes del reloj están desactivadas. El Timer2 no se

incrementará y el estado del módulo 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 módulo ECCP sin cambios. En el resto de los modos de ahorro de energía, el reloj del ahorro de energía seleccionado gobernará el Timer2. Los relojes de otros modos de ahorro de energía tendrán una frecuencia diferente a la del reloj primario.

La Operación 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.

Page 251: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

249

3.4.17.4.11. Efectos De Un Reset Los resets por aumento de energía y por resets sucesivos forzarán a los puertos

al modo entrada y el CCP a su estado de reset.

Esto fuerza el módulo CCP mejorado a resetear a un estado compatible con el módulo CCP estándar.

TABLA 17-3: Registros Asociados A Los Módulos 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*

IPR1 SPPIP(2) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP

PIR1 SPPIF(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

TRISD(2) TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0

TMR1L Timer1 Register Low Byte

TMR1H Timer1 Register High Byte

T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC* TMR1CS TMR1ON

TMR2 Timer2 Module Register

T2CON — T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0

PR2 Timer2 Period Register

TMR3L Timer3 Register Low Byte

TMR3H Timer3 Register High Byte

T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC* TMR3CS TMR3ON

CCPR1L Capture/Compare/PWM Register 1 (LSB)

CCPR1H Capture/Compare/PWM Register 1 (MSB)

CCP1CON P1M1(2) P1M0(2) DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0

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 están implementadas. Las celdas sombreadas no se utilizan con ECCP.

Nota 1: El bit SBOREN sólo está disponible cuando BOREN<1:0>=01

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

Page 252: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

250

3.4.18. BUS SERIE UNIVERSAL (USB)

3.4.18.1. Descripción Del Periférico USB La familia de dispositivos PIC18FX455/X550 contiene una interfaz serie

compatible con el SIE (serial interface engine, máquina con comunicación serie) USB “full-speed” (2.0) y “de poca velocidad” (1.0) que permite la comunicación rápida entre cualquier dispositivo USB y el microcontrolador PIC®.

El SIE puede interconectarse directamente al USB, utilizando el transmisor-receptor interno, o puede conectarse a través 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 características 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 núcleo del microcontrolador y desde el SIE. También 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 volúmenes de datos grandes, por ejemplo datos síncronos, a los buffer de memoria externos.

FIGURA 18-1: Periférico Y Opciones Del USB

Page 253: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

251

Nota 1: Esta señal 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 módulo USB se configuran y controlan con tres registros.

En total hay 22 registros para manejar las transacciones del USB. Los registros son:

Registro de control del USB (UCON) Registro de configuración del USB (UCFG) Registro de estado de la transferencia del USB (USTAT) Registro de dirección de dispositivo USB (UADDR) Registros del número del frame (UFRMH: UFRML) Registros activadores de los Endpoints de 0 a 15 (UEPn)

3.4.18.2.1. Registro De Control Del USB (UCON) El registro de control del USB UCON contiene los bits necesarios para dirigir el

comportamiento del módulo durante las transferencias. El registro contiene los bits que gobiernan lo siguiente:

Permiso del periférico principal del USB Reset de los punteros tipo ping-pong Control del modo al suspender Desactivar la transferencia de paquetes

Además, el registro de control del USB contiene un bit de estado, SE0 (UCON<5>), que se utiliza para indicar el estado del bus, si sólo se manda un cero. Cuando se permite el módulo USB, este bit debe supervisarse para determinar si las líneas de datos han salido de una condición de single-ended cero (sólo se manda cero). Esto ayuda a distinguir el estado de ciclo inicial de la señal de reset del USB.

La operación total del módulo USB se controla con el bit USBEN (UCON<3>). Activar este bit setea el módulo y resetea todos los bits PPBI en el Buffer a ‘0’. Este bit también activa el regulador de tensión del chip y conecta las resistencias pull-up, si se permiten. Así, este bit puede utilizarse como una unión/separación al USB. Aunque se ignoran todos los estados y bits de control si este bit está borrado, el módulo 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 transmisión y la recepción de paquetes. Este lo bit activa el SIE cuando recibe un

Page 254: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

252

SETUP para permitir su procesamiento. Este bit no lo puede activar el microcontrolador, sólo borrar; al despejarlo el SIE continua la transmisión y/o recepción. Cualquier acontecimiento pendiente dentro de buffer intermedio todavía estará disponible, indicado dentro del registro USTAT en el buffer FIFO.

El bit RESUME (UCON<2>) permite al periférico realizar un reinicio ejecutando la señal resume. Para generar un reinicio válido, por firmware se debe activar el RESUME durante 10ms y entonces borrar el bit.

El bit SUSPND (UCON<1>) coloca el módulo y soporte del circuito (es decir, regulador de tensión) 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 interrupción IDLEIF. Debe borrarse por firmware después de observar una interrupción ACTVIF. Cuando este bit está activo, sigue estando el dispositivo unido al bus pero las salidas del transmisor-receptor permanecen en reposo. La tensión 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 suspensión, el bus del dispositivo USB se limita al 500µA 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 mínima cuando el dispositivo entre en el modo de suspensión.

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 de protección contra el ping-pong de datos: 1 = Reset todos los punteros del buffer ping-pong 0 = Buffer ping-pong no se resetean BIT 5 SE0: Flag de Single-Ended cero: 1 = Single-ended cero activo en el bus USB 0 = No se ha detectado single-ended BIT 4 PKTDIS: Bit de inhabilitación de transferencias de paquetes: 1 = SIE y procesamiento de paquetes desactivado, se activa automáticamente cuando recibe un SETUP 0 = SIE y procesamiento de paquetes permitido BIT 3 USBEN: Bit de permiso del módulo USB 1 = módulo USB y soporte del circuito activados (dispositivo unido) 0 = módulo USB y soporte del circuito desactivados (dispositivo separado) BIT 2: RESUME: Bit de permiso de la señal RESUME 1 = Señal RESUME activada

Page 255: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

253

0 = Señal RESUME desactivada BIT 1 SUSPND: Bit para suspender el USB 1 = módulo del USB y el soporte del circuito están en el modo de conservación de energía, reloj SIE inactivo 0 = módulo USB y el soporte del circuito están operando normalmente, reloj SIE controlado con el ratio asignado

3.4.18.2.2. Registro De Configuración Del USB (UCFG) Antes de comunicarse con el USB, se tiene que configurar el módulo del

hardware interno y/o externo. La mayor parte de la configuración se realiza con el registro UCFG. El regulador de tensión del USB se maneja con la configuración de los registros.

El registro UFCG contiene la mayor parte de los bits que dirigen el comportamiento del módulo 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 también contiene dos bits que ayudan a probar el módulo, eliminando errores y certificaciones del USB. La salida de control de estos bits permite el monitor de estado y generación de patrones “de ojo”.

Nota: La velocidad del USB, la transmisión y las pull-up deben configurase solamente durante la fase de activación del módulo. No se recomienda cambiar estos ajustes mientras que el módulo esté funcionando.

Page 256: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

254

REGISTRO 18-2: UCFG: Registro De Configuración 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 de permiso del test patrón “de ojo” del USB 1 = prueba del patrón “de ojo” permitido 0 = prueba del patrón “de ojo” inhabilitado BIT 6 UOEMON: Bit de permiso del monitor OE* del USB(1) 1 = señal del UOE* activa; indica los intervalos durante los cuales las líneas D+/D- están conduciendo 0 = señales del UOE* inactivas BIT 4 UPUEN: 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 3 UTRDIS: Bit inhabilitador del transmisor del chip(2) 1 = Transmisor del chip inhabilitado; la interfaz digital del transmisor permitida 0 = transmisor del chip activo BIT 2 FSEN: 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 BIT 1-0 PPB1:PPB0: Bits de configuración 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 End- Points 01 = buffer ping-pong permitido en los End-Points de salida 0 00 = buffers ping-pong inhabilitados

Nota 1: Si se activa UTRDIS, la señal UOE* estará activa independiente del ajuste del bit UOEMON.

2: Los bits UPUEN, UTRDIS y FSEN no deben cambiarse mientras el módulo USB esté permitido. Estos valores se deben preconfigurar antes de permitir el módulo.

3: Este bit solamente es válido cuando el transmisor del chip está activo (UTRDIS = 0); si no, se ignora.

Page 257: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

255

Transmisor Interno El periférico USB tiene, USB 2.0, full-speed y un transmisor de poca velocidad,

internamente conectado al SIE. Esta característica 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 tensión más alta. Así, la fuente de energía del transmisor es una fuente separada, VUSB.

Transmisor Externo Este módulo proporciona ayuda para el uso de un transmisor fuera del chip. El

transmisor externo se utiliza en aplicaciones donde las condiciones físicas dictan la localización del transmisor lejos del SIE. Por ejemplo, aplicaciones que requieren el aislamiento del USB podía 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 señales en el módulo para comunicar y controlar un transmisor externo:

VM: Entrada de la línea single-ended D- VP: Entrada de la línea single-ended D+ RCV: La entrada del receptor diferencial VMO: Salida a la línea diferencial del conductor VPO: Salida a la línea diferencial del conductor UOE: Salida permitida

Las señales VPO y VMO son salidas del SIE al transmisor externo. La señal del RCV es la salida del transmisor externo al SIE; representa las señales diferenciales del bus serie traducido en un tren de pulsos. Las señales VM y VP se utilizan para divulgar condiciones en el bus serie al SIE que no se puede capturar con la señal del RCV.

Page 258: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

256

La señal UOE* indica el estado del transmisor externo. A esta línea 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

0 0 Single-Ended Cero

0 1 Diferencial ‘0’

1 0 Diferencial ‘1’

1 1 Condición Ilegal

TABLA 18-2: Entradas Single-Ended Del Transmisor

VP VM Estado del Bus

0 0 Single-Ended Cero

0 1 Baja velocidad

1 0 Toda velocidad

1 1 Error

Resistencias Internas Pull-Up Los dispositivos PIC18FX455/X550 tienen unas resistencias pull-up internas

diseñadas 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Ω.

Page 259: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

257

FIGURA 18-3: Circuito Externo

El diseño muestra una aplicación 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 información de la operación 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 supervisión del USB OE* es útil para el eliminar errores del sistema inicial.

Permiso Del Test Patrón “De Ojo” Se genera una prueba automática al activar el bit UCFG<7> del patrón “de ojo”.

La salida del patrón “de ojo” dependerá de los ajustes del módulo, significando que el usuario es el primer responsable de configurar los ajustes del reloj SIE, las resistencias pull-up y el modo transmisor. Además, el módulo tiene que estar permitido.

Una vez que se active UTEYE, el módulo emula un cambio a una recepción 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 patrón “de ojo” esté permitido.

Observar que este bit no se debe activar mientras que el módulo está conectado con un sistema real USB. Este modo de prueba se utiliza para ayudar con las verificaciones internas de las pruebas de certificación USB. Se utiliza para depurar los fallos obtenidos por el ruido de las señales que pueden afectar los flancos del sistema, uniones de impedancias mal hechas y proximidad a otros componentes. No comprueba correctamente la transición de un estado de recepción a uno de transmisión. Aunque el patrón de ojo no significa que se sustituya la prueba más compleja de certificación 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 energía al transmisor interno y proporcionar una fuente para el pull-up

Page 260: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

258

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 través del bit de configuración VREGEN. Cuando está activo, la tensión 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 interrupción de transferencia completa por el USB, hay que leer USTAT para determinar el estado de la transferencia. USTAT contiene el número del Endpoint de la transferencia, dirección y valor del puntero del buffer ping-pong (si está utilizado).

Nota: Los datos en el registro de estado del USB son válidos solamente cuando el flag de interrupción 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 interrupción de transacción 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 válidos, el SIE inmediatamente reafirma la interrupción. Si no hay datos adicionales presentes, TRNIF seguirá borrado; los datos de USTAT puede que no sean correctos.

Nota: Si se recibe una petición de Endpoint mientras que el USTAT FIFO este lleno, el SIE publica automáticamente un NAK de nuevo al anfitrión.

Page 261: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

259

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 ENDP3:ENDP0: Bits de actividad del número codificado del último Endpoint (representa el número del BDT actualizado por la última transferencia del USB) 1111 = Endpoint 15 1110 = Endpoint 14 …. 0001 = Endpoint 1 0000 = Endpoint 0 BIT 2 DIR: Bit puntero de la última dirección BD 1 = la última transacción era de entrada 0 = la última transacción era de salida o de SETUP BIT 1 PPBI: Bit puntero del puntero ping-pong BD(1) 1 = la transacción pasada estaba al banco Odd de BD 0 = la transacción pasada estaba al banco Even de BD

Nota 1: Este bit es solamente válido para los Endpoints con registros Even y Odd BD disponibles.

Page 262: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

260

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 número 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. Típicamente, este bit se setea siempre excepto al usar Endpoints síncronos.

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 anfitrión. Activar este bit permite transacciones de salida. Semejantemente, el bit EPINEN (UEPn<1>) permite o inhabilita las transacciones de entrada al anfitrión.

El bit EPSTALL (UEPn<0>) se utiliza para indicar la condición 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.

Page 263: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

261

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 de permiso del protocolo de intercambio 1= se permite el protocolo de intercambio del Endpoint 0= se inhabilita (utilizado con los Endpoints síncronos) BIT 3 EPCONDIS: Bit bidireccional de control del Endpoint Si EPOUTEN=1 y EPINEN=1: 1= inhabilita las transferencias de control del Endpoint n; sólo permite las de entrada y las de salida 0= permite las transferencias de control (SETUP) y las de entrada y salida del Endpoint n BIT2 EPOUTEN: Bit de permiso de la salida del Endpoint 1= la salida del Endpoint n permitida 0= la salida del Endpoint n inhabilitada BIT 1 EPINEN: Bit de permiso de la entrada del Endpoint 1= la entrada del Endpoint n permitida 0= la entrada del Endpoint n inhabilitada BIT 0 EPSTALL: 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: Válido solamente si se permite el Endpoint n; si no, se ignora el bit.

3.4.18.2.5. Registro De Dirección Del USB (UADDR) El registro de dirección del USB contiene la única dirección del USB que el

periférico 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 dirección 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. Registros Del Número Del Frame Del USB (UFRMH: UFRML)

Los registros del número del frame contienen los 11bits del número 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 número de frame actual cuando recibe un SOF. Para el microcontrolador, estos registros son sólo de lectura. El registro del número del frame se utiliza sobre todo para transferencias síncronas.

Page 264: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

262

3.4.18.3. RAM Del USB Los datos del USB se mueven entre el núcleo del microcontrolador y el SIE a

través 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 específicamente en el control del buffer del Endpoint, mientras que los bancos de 5 a 7 están 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 semáforos para determinar el acceso a un buffer en un momento dado.

FIGURA 18-5: Implementación De La RAM Del USB En La Espacio De Memoria De Datos

Page 265: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

263

3.4.18.4. Buffer Descriptor Y Tabla Del Buffer Descriptor Los registros del banco 4 se utilizan específicamente para el control del buffer

del Endpoint en una estructura conocida como Tabla del Buffer descriptor (BDT). Esto proporciona un método 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 dirección de BD BDnADRH: Registro alto de la dirección de BD

BDs ocurre siempre como bloque de cuatro bytes en la secuencia, BDnSTAT:BDnCNT:BDnADRL:BDnADRH. La dirección de BDnSTAT es siempre una compensación de (4n-1) (en hexadecimal) de 400h, con n como el número del Buffer descriptor.

Dependiendo de la configuración 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 especificación del USB asigna que por mandato debe tener cada dispositivo el Endpoint0 configurado como entrada y salida en la disposición inicial. Dependiendo del Endpoint y de la configuración buffering, el BDT puede ser de 256 bytes de largo.

Aunque se puede creer que los buffers descriptores y los registros de dirección son registros de funciones especiales que no están mapeados en hardware, como lo están 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 dirección en la memoria de datos en un reset, también tienen un valor indeterminado.

Un sistema particular de los registros BD son solamente válidos si el Endpoint correspondiente está permitido usando el registro UEPn. Todos los registros BD están disponibles en la RAM del USB. El BD para cada Endpoint debe configurarse antes de permitirlo.

Page 266: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

264

FIGURA 18-6: Ejemplo De Un Buffer Descriptor

3.4.18.4.1. Estado Y Configuración De Los BD Los Buffer descriptores no sólo definen el tamaño de un Buffer Endpoint, sino

también determina su configuración y control. La mayor parte de la configuración 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 configuración de los bits del registro BDnSTAT depende del contexto. Hay dos configuraciones distintas, dependiendo de si el microcontrolador o el módulo 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 módulo del USB, se

utiliza un semáforo 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 núcleo del microcontrolador. Cuando se activa el bit UOWN, la entrada del BD y la memoria del Buffer los controla por el periférico USB. El núcleo no debe modificar el BD o su Buffer correspondiente en este momento. Observar que el núcleo 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 actualización del registro. Antes de poner en sus manos el periférico del USB, el usuario puede configurar las operaciones básicas del periférico con los bits BDnSTAT. Durante este tiempo, el byte de control de la cuenta y los registros de direccionamiento del Buffer también 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

Page 267: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

265

originales del BD. El registro BDnSTAT lo actualiza el SIE con el PID; la cuenta de la transferencia, BDnCNT, se actualiza también.

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 transacción. La única excepción es cuando KEN y/o BSTALL están permitidos.

No existe ningún 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 periférico USB devuelve la propiedad al microcontrolador.

Registro BDnSTAT (Modo CPU) Cuando UOWN=0, el núcleo 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 interrupción de transacción completa para el Endpoint. Esta característica se debe permitir solamente cuando el puerto paralelo se selecciona como canal de entrada-salida de datos en lugar de la RAM del USB.

El bit inhabilita el incremento de la dirección, INCDIS (BDnSTAT<4>), que controla el direccionamiento automático por incremento del SIE. Activar INCDIS inhabilita el auto incremento de la dirección del Buffer por el SIE para cada byte transmitido o recibido. Esta característica sólo se tiene que utilizar con el puerto paralelo, donde cada byte de datos se procesa a/desde la misma posición de memoria.

El bit de permiso de la sincronización de palabras, DTSEN (BDnSTAT<3>), se encarga de comprobar la paridad de los datos. Activar DTSEN permite la sincronización 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 sincronización incorrecta, los datos se ignoran. No se escriben en la RAM del USB y el flag de interrupción de transferencia completa del USB no se activará. Sin embargo, el SIE enviará un ACK al anfitrión 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. También proporciona ayuda con los comandos SET_FEATURE/CLEAR_FEATURE; típicamente, paradas continuas en cualquier Endpoint con excepción del Endpoint de control por defecto.

El bit BSTALL también permite las paradas del Buffer. Activar BSTALL hace que el SIE devuelva un STALL al anfitrión si el símbolo recibido utilizaría el BD en esa localización. Cuando se activa el bit EPSTALL en el registro de control correspondiente UEPn se genera una interrupción STALL cuando se manda la STALL al anfitrión. El bit UOWN activado y el BDs no se cambia a menos que se reciba un SETUP. En este caso,

Page 268: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

266

la condición de la STALL se borra y la propiedad del BD se devuelve al núcleo del microcontrolador.

Los bits BD9:BD8 (BDnSTAT<1:0>) guardan los dos dígitos más significativos del byte de la cuenta del SIE; los 8 dígitos más bajos se almacenan en el registro correspondiente BDnCNT.

TABLA 18-3: Efecto Del Bit DTSEN En La Recepción De Paquetes Pares/Impares (Data0/Data1)

Configuración BDnSTAT Respuesta del dispositivo después de recibir el paquete

Salida del paquete del Host

DTSEN DTS Protocolo UOWN TRNIF BDnSTAT y USTAT Estado

DATA0 1 0 ACK 0 1 Actualizado

DATA1 1 0 ACK 1 0 No Actualizado

DATA0 1 1 ACK 0 1 Actualizado

DATA1 1 1 ACK 1 0 No Actualizado

Otro 0 x ACK 0 1 Actualizado

Otro, con error x x NAK 1 0 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 de posesión del USB(1) 0 = el núcleo del microcontrolador posee el BD y su Buffer correspondiente BIT 6 DTS: Bit de sincronización de los datos(2) 1 = paquete de datos 1 0 = paquete de datos 0 BIT 5 KEN: Bit de permiso de la subsistencia de BD 1 = USB guardará el BD indefinidamente una vez que UOWN se active (requerido en la configuración de los Endpoint del SPP) 0 = USB guardará el último símbolo procesado BIT 4 INCDIS: Bit de inhabilitación del incremento de la dirección 1 = el incremento de la dirección inhabilitado (requerido en la configuración de los Endpoint del SPP)

Page 269: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

267

0 = incremento de la dirección permitido BIT 3 DTSEN: Bit de permiso de la sincronización 1 = sincronización 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 sincronización de los datos BIT 2 BSTALL: Bit de permiso de paradas en el Buffer 1 = parada del Buffer permitida; el protocolo de la STALL publica si se recibe un símbolo que utilizaría el BD en la localización dada (UOWN se activa, el resto sin cambios) 0 = parada del Buffer inhabilitado BIT 1-0 BC9:BC8: Bits del byte de cuenta 9 y 8 Los bits de cuenta del byte representan el número de bytes que se transmitirán con un símbolo IN o recibidos durante un símbolo OUT. Junto con BC<7:0>, las cuentas de byte válidas son 0-1023.

Nota 1: Este bit debe inicializarlo el usuario con el valor deseado antes de permitir el módulo 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 mayoría 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 dígitos más significativos de la cuenta, almacenados en BDnSTAT<1:0>.

Page 270: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

268

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 posesión del USB 1= el SIE gobierna el BD y el buffer correspondiente BIT 5-2 PID3:PID0: Bits identificadores del paquete El valor recibido del símbolo PID de la última transferencia (sólo IN, OUT o SETUP) BIT 1-0 BC9:BC8: Bits del byte de cuenta 9 y 8 Esto bits los actualiza el SIE para reflejar al número de bytes recibidos en una transferencia OUT y el número de bytes transmitidos en una IN.

3.4.18.4.2. Byte De Cuenta De BD El byte de cuenta representa el número total de bytes que se transmitirán durante

una IN. Después de la transferencia IN, el SIE devolverá el número de bytes enviados al anfitrión.

Para una transferencia OUT, el byte de cuenta representa número máximo de los bytes que se pueden recibir y almacenar en la RAM del USB. Después de una transferencia OUT, el SIE devolverá el número real de bytes recibidos. Si este número 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 más bajos de la cuenta residen en el registro BDnCNT. Los dos altos en BDnSTAT<1:0>. Esto representa una gama válida para el byte de 0 a 1023.

3.4.18.4.3. Validación De La Dirección De BD El par de registros de dirección de BD contiene la dirección de comienzo de la

RAM para el Buffer del Endpoint correspondiente. Para que una localización que comienza en el Endpoint sea válida, debe estar en la gama de la RAM del USB, 400h a 7FFh. No hay ningún mecanismo por hardware para comprobar la dirección del BD.

Si el valor de la dirección de BD no señala a una dirección de la RAM del USB, o si señala a una dirección dentro del Buffer de otro Endpoint, es probable que se pierdan los datos o que se sobrescriban. Semejantemente, solapando un Buffer de recepción (Endpoint de salida) con una localización de BD en uso se obtienen resultados inesperados. Cuando se desarrollan aplicaciones USB, el usuario puede incluir software para validar las direcciones en el código.

Page 271: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

269

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 máximo del/al USB.

El módulo USB apoya cuatro modos de operación:

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 módulo USB no pierde de vista el puntero ping-pong de cada Endpoint. Todos los punteros están reseteados inicialmente al BD par cuando se activa el módulo. Al terminar una transacción (SIE borra UOWN), el puntero se une al BD impar. Al terminar la transacción siguiente, el puntero se une de nuevo al BD par y así sucesivamente.

El estado par/impar de la transacción 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 relación fija con un Endpoint particular, dependiendo de la configuración del buffering. Esta relación significa también que pueden aparecer vacíos en las BDT si los Endpoints no se activan contiguamente. Esto significa en teoría, que los BDs de los Endpoints desactivados podían utilizarse como espacio de Buffer. En la práctica, los usuarios deben evitar usar tales espacios en el BDT a menos que el método de validar direcciones de BD esté en ejecución.

Page 272: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

270

FIGURA 18-7: Tablas Del Buffer Descriptor Mapeadas Para Los Modos De Los Buffer

Page 273: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

271

TABLA 18-4: Asignación De Los Buffers Descriptores A Los Diferentes Modos De Buffering

BDs asignados a Endpoint

Modo 0(No Ping-Pong)

Modo 1(Ping-Pong en EP0 OUT)

Modo 2(Ping-Pong en todos EPs)

Modo 3(Ping-Pong en todos EPs, excepto EP0) Endpoint

Out In Out In Out In Out In

0 0 1 0(E), 1(O) 2 0(E), 1(O) 2(E), 3(O) 0 1

1 2 3 3 4 4(E), 5(O) 6(E), 7(O) 2(E), 3(O) 4(E), 5(O)

2 4 5 5 6 8(E), 9(O) 10(E), 11(O) 6(E), 7(O) 8(E), 9(O)

3 6 7 7 8 12(E), 13(O) 14(E), 15(O)

10(E), 11(O)

12(E), 13(O)

4 8 9 9 10 16(E), 17(O) 18(E), 19(O)

14(E), 15(O)

16(E), 17(O)

5 10 11 11 12 20(E), 21(O) 22(E), 23(O)

18(E), 19(O)

20(E), 21(O)

6 12 13 13 14 24(E), 25(O) 26(E), 27(O)

22(E), 23(O)

24(E), 25(O)

7 14 15 15 16 28(E), 29(O) 30(E), 31(O)

26(E), 27(O)

28(E), 29(O)

8 16 17 17 18 32(E), 33(O) 34(E), 35(O)

30(E), 31(O)

32(E), 33(O)

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

Page 274: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

272

Leyenda: (E) =Buffer de transacción par, (O) = Buffer de transacción 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 dirección bajo

BDnADRH(1) Buffer dirección 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 estén 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 módulo USB puede generar condiciones de interrupción múltiples. Para

acomodar todas estas fuentes de interrupción, el módulo proporciona su propia lógica de estructura de interrupción, 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 petición de interrupción del USB, USBIF (PIR2<5>).

Hay dos capas de registros de interrupción en el módulo USB. El nivel superior consiste en todas las interrupciones de estado del USB; éstos se permiten y se señalan 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 señalan por medio de un flag en los registros UEIR y UEIE. Ninguna condición de interrupción en estos provoca la activación del flag de interrupción por error del USB (UERRIF) en el nivel superior.

Las interrupciones se pueden utilizar para detectar acontecimientos rutinarios en una transacción USB.

Page 275: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

273

FIGURA 18-8: Embudo De La Lógica De La Interrupción Del USB

FIGURA 18-9: Ejemplo De Los Eventos Transacción E Interrupción

Nota 1: La transferencia de control mostrada es sólo un ejemplo que muestra los

eventos que ocurren en cada transacción. El control típico de la transferencia se puede extender a varios frames.

Page 276: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

274

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 interrupción. 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 interrupción USBIF para el túnel de interrupción del micro.

Una vez que el SIE active un bit de interrupción, se tiene que borrar por software escribiendo un ‘0’. Los flags se pueden activar por software para ayudar en la búsqueda 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 de interrupción del símbolo START-OF-FRAME 1= START-OF-FRAME recibido por el SIE 0= ningún START-OF-FRAME recibido por el SIE BIT 5 STALLIF: Bit de interrupción del protocolo de STALL 1= protocolo de STALL enviado por el SIE 0= protocolo de intercambio STALL no se ha enviado BIT 4 IDLEIF: Bit de interrupción detector de reposo(1) 1= Reposo detectado (estado de reposo de 3ms o más) 0= ninguna condición de reposo detectada BIT 3 TRNIF: Bit de interrupción de transacción completa(2) 1= transacción pendiente completa; leer el registro USTAT para información del Endpoint 0= transacción pendiente no completada o no hay BIT 2 ACTVIF: Bit de interrupción de detección de la actividad del bus(3) 1= actividad detectada en las líneas D+/D- 0= ninguna actividad detectada en las líneas D+/D- BIT 1 UERRIF: Bit de interrupción de la condición de error del USB(4) 1= ha ocurrido una condición de error desenmascarada 0= no ha ocurrido ninguna condición de error. BIT 0 URSTIF: Bit de interrupción de reset del USB 1= Ha ocurrido un reset en el USB, 00h se carga en el registro UADDR 0= no ha ocurrido ningún reset del USB

Nota 1: Una vez que se detecte un estado de reposo, el usuario puede colocar al módulo USB en este modo.

Page 277: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

275

2: Borrar este bit hará avanzar la USTAT FIFO (válido solamente con los símbolos IN, OUT y SETUP).

3: Este bit es desenmascarado al detectar un acontecimiento de interrupción UIDLE.

4: Solamente las condiciones de error permitidas a través del registro UEIE activarán este bit. Este bit es bit de estado y no lo puede modificar el usuario.

Bit De Interrupción De Detección De La Actividad Del Bus (ACTVIF) El bit ACTVIF no se puede ser borrar inmediatamente después de despertar al

módulo 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. Además, si el módulo USB utiliza una fuente de reloj de 96MHz PLL, después se borra el bit SUSPND, el módulo del USB puede ser operacional inmediatamente mientras que espera los 96MHz PLL.

EJEMPLO 18-1: Borrado Del Bit ACTVIF (UIR<2>)

Ensamblador: BCF UCON, SUSPND LOOP: BTFSS UIR, ACTVIF BRA DONE BCF UIR, ACTVIF BRA LOOP DONE:

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 interrupción del USB contiene los bits de permiso

del estado de las fuentes de interrupción USB. No fijar ninguno de estos bits permitirá la interrupción elegida en el registro UIR.

Los valores en este registro afectan solamente la propagación de una condición de interrupción a la lógica de interrupción del microcontrolador. Los flags todavía están activados por su condición de interrupción, permite que sean interrogados y se mantienen sin realmente la interrupción.

Page 278: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

276

REGISTRO 18-8: UIE: Registro De La Interrupción 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 de permiso de la interrupción del START-OF-FRAME 1 = interrupción permitida 0 = interrupción inhabilitada BIT 5 STALLIE: Bit de permiso de la interrupción del protocolo STALL 1 = interrupción permitida 0 = interrupción inhabilitada BIT 4 IDLEIE: Bit de permiso de la interrupción de reposo 1 = interrupción permitida 0 = interrupción inhabilitada BIT 3 TRNIE: Bit de permiso de la interrupción de transacción completa 1 = interrupción permitida 0 = interrupción inhabilitada BIT 2 ACTVIE: Bit de permiso de la interrupción de detección de la actividad del bus 1 = interrupción permitida 0 = interrupción inhabilitada BIT 1 UERRIE: Bit de permiso de la interrupción de error del USB 1 = interrupción permitida 0 = interrupción inhabilitada BIT 0 URSTIE: Bit de permiso de la interrupción del reset del USB 1 = interrupción permitida 0 = interrupción inhabilitada

Page 279: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

277

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 periférico USB. Cada una de estas fuentes se controla con el bit de permiso de interrupción correspondiente del registro UEIE. Todas los flags de error de USB se suman para generar el flag de interrupción de error del USB (UERRIF) en el nivel superior de la lógica de interrupción.

Cada bit de error se activa cuando se detecta la condición de interrupción. Así, la interrupción normalmente no corresponde con el final de un símbolo que se acaba de procesar.

Una vez que un bit de interrupción 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: Flag de error del bit mercancía 1= Error detectado 0= No se ha detectado error BIT 4 BTOEF: Flag de error de espera en el procesamiento del bus 1= error detectado (han llegado más de 16bits de reposo antes de un EOP) 0= error no detectado BIT 3 DFN8EF: Flag de error del tamaño de los datos 1= error detectado (no era un número entero de bytes) 0= error no detectado BIT 2 CRC16EF: Flag de fallo CRC16 1= error detectado 0= error no detectado BIT 1 CRC5EF: Flag de error del anfitrión CRC5 1= error detectado (paquete simbólico rechazado) 0= error no detectado BIT 0 PIDEF: Flag de prueba de fallo de PID 1= error detectado 0= error no detectado

Page 280: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

278

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

activación para cada fuente de interrupción de error del USB. Activando cualquiera de estos bits se activa la fuente de la interrupción respectiva.

Como el registro UIE, los bits activos sólo afectan la propagación de la condición de la interrupción. Los flags se activan cuando se cumplen sus condiciones.

REGISTRO 18-10: UEIE: Registro De Permiso De La Interrupción 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 de permiso de interrupción del error del bit mercancía 1= Interrupción permitida 0= Interrupción no permitida BIT 4 BTOEF: Bit de permiso de interrupción del error de espera en el procesamiento del bus 1= Interrupción permitida 0= Interrupción no permitida BIT 3 DFN8EF: Bit de permiso de interrupción del error del tamaño de los datos 1= Interrupción permitida 0= Interrupción no permitida BIT 2 CRC16EF: Bit de permiso de interrupción del fallo CRC16 1= Interrupción permitida 0= Interrupción no permitida BIT 1 CRC5EF: Bit de permiso de interrupción del error del anfitrión CRC5 1= Interrupción permitida 0= Interrupción no permitida BIT 0 PIDEF: Bit de permiso de interrupción del prueba de fallo de PID 1= Interrupción permitida 0= Interrupción no permitida

Page 281: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

279

3.4.18.6. Modos De Energía Del USB Las aplicaciones USB tendrán diferentes requisitos y configuración de energía.

Los casos más comunes son los presentados aquí.

3.4.18.6.1. Sólo Energía En El Bus En modo de sólo energía en el bus. Es el método más simple de energía para el

dispositivo.

FIGURA 18-10: Sólo Energía En El Bus

3.4.18.6.2. Sólo Self-Power En modo sólo SELF-POWER, el uso del USB proporciona su propia energía,

con la energía muy pequeña cedida por el USB. Observar que indica cuando el USB ha estado conectado.

FIGURA 17-11: Sólo Self-Power

3.4.18.6.3. Energía Dual Con Dominancia Self-Power Algunas aplicaciones necesitan una opción con dos energías. La aplicación

utiliza la fuente de energía interna como primaria, pero cambia a la energía del USB cuando no se dispone de una fuente lineal.

Page 282: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

280

FIGURA 18-12: Energía Dual Con Dominancia Self-Power

Nota: Los usuarios deben tener presente los límites de energía del USB. Según la especificación 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 además de la RAM

del USB. Usando el SPP, un Endpoint se puede configurar para enviar o para recibir datos directamente del hardware externo.

Este método presenta posibilidades de diseño donde el microcontrolador actúa 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 aplicación puede incluir un sistema de adquisición de datos, donde los datos fluyen de una FIFO externa a través 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 través 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

dirección automático.

Nota 1: Si un Endpoint se configura para utilizar el SPP, el módulo SPP debe configurarse para utilizar el módulo USB. Si no, puede ocurrir una operación inesperada.

2: Además, si un Endpoint se configura para utilizar el SPP, el tipo de transferencia de datos de ese Endpoint debe ser síncrona.

3.4.18.8. Oscilador El módulo USB necesita una señal específica de reloj. En operaciones full-

speed, el reloj tiene que ser de 48MHz. El microcontrolador y los periféricos no tienen porque tener la misma frecuencia de reloj o la misma fuente.

Page 283: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

281

TABLA 18-6: Registros Asociados A Las Operaciones Del Módulo 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 están implementadas. Las celdas sombreadas no se utilizan con el módulo 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 están mapeados en el banco 4 y no son SFRs verdaderos, están en la tabla 18-5.

Page 284: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

282

3.4.18.9. Descripción Del USB Esta sección presenta algunos conceptos básicos del USB e información útil

necesaria para diseñar un dispositivo USB. Así, se anima al lector que refiera a las especificaciones del USB para más información (www.usb.org). Si estás muy al corriente de los detalles de USB, entonces ésta sección sirve como recuerdo básico, 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 más alta, con excepción del dispositivo, es la de configuración. Un dispositivo puede tener configuraciones múltiples. Por ejemplo, un dispositivo particular puede tener requisitos de energía múltiples basados en Self-Power o modos de energía sólo del bus.

Para cada configuración, puede haber múltiple interfaces. Cada interfaz podía apoyar un modo particular de esa configuración.

Debajo del interfaz están 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

Page 285: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

283

3.4.18.9.2. Frames La información 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.

Síncrona: Este tipo proporciona un método 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 pequeños y la pérdida no es crítica, por ejemplo audio.

Bulk: Este método de transferencia permite grande cantidades de datos que se transferirán asegurando la integridad de los datos; sin embargo, la puntualidad de la entrega no se asegura.

Interrupción: Este tipo de transferencia prevé la entrega puntual asegurada para bloques pequeños de datos, se asegura la integridad de los datos.

Control: Este tipo prevé la disposición 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 interrupción y control.

3.4.18.9.4. Energía La energía se puede obtener del USB. Las especificaciones del USB definen los

requisitos de energía del bus. Los dispositivos pueden ser self-powered o alimentados por bus. Los dispositivos Self-powered consiguen energía de una fuente externa, mientras que los dispositivos alimentados por bus utilizan la energía del bus.

La especificación del USB limita la energía tomada del bus. Cada dispositivo se asegura 90mA y 5V (una unidad de carga). La energía adicional puede solicitarse, hasta un máximo de 500mA. Observar que ceder más energía que la de una unidad de carga es una petición y el anfitrión o el hub no tiene que proporcionarla obligatoriamente. Así, un dispositivo capaz de consumir más de una unidad de carga debe ser capaz de mantener una configuración de baja potencia de una unidad carga o menos, en caso de necesidad.

La especificación del USB también define un modo de reposo. En esta situación, la corriente se debe limitar a 500µA, sobre 1 segundo. Un dispositivo se debe incorporar al estado de reposo después de 3ms de inactividad (es decir, ningún símbolo SOF en 3ms). El entrar el dispositivo en el modo reposo debe caer la consumición actual en los 10ms siguientes. Asimismo, al señalar un reinicio, el dispositivo debe señalarlo en los 10ms cediendo corriente.

Page 286: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

284

3.4.18.9.5. Enumeración Cuando el dispositivo se une al bus, el anfitrión crea un proceso de enumeración

en un intento por identificar el dispositivo. Esencialmente, el anfitrión interroga al dispositivo, recopila información tal como el consumo de energía, tarifas y tamaños de los datos, protocolo y otra información descriptiva, que contienen los descriptores. El proceso de enumeración sería:

1. Reset del USB: Resetear el dispositivo. Así, el dispositivo no se configura y no tiene una dirección (dirección 0).

2. Conseguir el descriptor del dispositivo: El anfitrión solicita una pequeña parte del descriptor del dispositivo.

3. Reset del USB: Resetear el dispositivo otra vez. 4. Fijar la dirección: El anfitrión asigna una dirección al dispositivo. 5. Conseguir el descriptor del dispositivo: El anfitrión recupera el descriptor

del dispositivo, recolectando la información, por ejemplo fabricante, tipo de dispositivo, control máximo del tamaño de los paquetes.

6. Conseguir los descriptores de configuración. 7. Conseguir cualquier otro descriptor. 8. Fijar una configuración.

El proceso exacto de enumeración depende del anfitrión.

3.4.18.9.6. Descriptores Hay ocho estándares del descriptor de cuál cinco son los más importantes para

este dispositivo.

Descriptor Del Dispositivo El descriptor del dispositivo proporciona la información de carácter general, por

ejemplo fabricante, número del producto, número de serie, la clase del dispositivo y el número de configuraciones. Hay solamente un descriptor del dispositivo.

Descriptor De La Configuración El descriptor de la configuración proporciona la información de los requisitos de

energía del dispositivo y cuántos interfaces diferentes soporta cuando está en esta configuración. Puede haber más de una configuración del dispositivo (es decir, configuraciones de baja potencia y de alta potencia).

Descriptor De La Interfaz El descriptor de la interfaz detalla el número de Endpoints utilizados en esta

interfaz, así como la clase de la interfaz. Puede haber más de una interfaz en la configuración.

Page 287: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

285

Descriptor Del Endpoint El descriptor del Endpoint identifica el tipo de transferencia y dirección, también

algunos otros específicos 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 más descriptores de la

secuencia. Los descriptores de la secuencia proporcionan información legible por un humano sobre la capa que pueden describir. Estas secuencias muestran en el anfitrión 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

anfitrión. 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 línea D+ o D- a 3,3V. En dispositivos de poca velocidad, la resistencia se conecta a la línea D-. En los dispositivos full-speed, la resistencia se conecta a la línea 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 mayoría de los casos, se requiere un driver en el lado del anfitrión para comunicarse con el dispositivo USB. En aplicaciones de encargo, se puede necesitar un driver convertido. Afortunadamente, los drivers están disponibles para la mayoría de los sistemas anfitriones comunes para las clases más comunes de los dispositivos. Así, estos drivers se pueden reutilizar.

Page 288: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

286

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 núcleo del microprocesador.

FIGURA 19-1: Trayectoria De Datos Del SPP

Además, el SPP puede proporcionar tiempo multiplexado tratando la

información junto con los datos usando segunda salida estroboscopia. Así, el número del Endpoint del USB se puede escribir conjuntamente con los datos en ese Endpoint.

3.4.19.1. Configuración Del SPP La operación del SPP se controla con dos registros: SPPCON y SPPCFG. El

registro SPPCON dirige la operación total del puerto paralelo y determina si funciona bajo el control del USB o del microcontrolador. El registro SPPCFG controla la configuración del tiempo y los pines de salida.

Page 289: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

287

3.4.19.1.1. Permitir El SPP Para permitir el SPP, activar el bit SPPEN (SPPCON<0>). Además, los bits del

TRIS del SPP correspondientes los pines se deben configurar correctamente. El mínimo:

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: Bit de permiso de la salida del Endpoint 1= la salida del Endpoint n permitida BIT1 SPPOWN: Bit de propiedad del SPP 1= El periférico USB controla el SPP 0= El microcontrolador controla directamente el SPP BIT0 SPPEN: Bit de permiso del SPP 1 = se permite 0 = se desactiva

Page 290: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

288

REGISTRO 19-2: SPPCFG: Registro De La Configuración 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 configuración del reloj del SPP 1x= CLK1 cambia a lectura o escritura una dirección impar de Endpoint; CLK2 cambia a lectura o escritura una dirección par de Endpoint. 01= CLK1 cambia a escritura; CLK2 cambia a lectura 00= CLK1 cambia sólo en la dirección del Endpoint de escritura; CLK2 cambia en la lectura o escritura de datos BIT 5 CSEN: Bit de permiso del pin selector del chip del SPP 1 = RB4 lo controla el módulo SPP y funciona como salida CS del SPP 0 = RB4 funciona como un puerto digital de E/S BIT 4 CLK1EN: Bit de permiso del pin del SPP CLK1 1 = RE0 lo controla el módulo SPP y funciona como la salida del SPP CLK1 0 = RE0 funciona como un puerto digital de E/S BIT 3-0 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

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)

Después, 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 información del Endpoint direccionado cuando CLK2 controla los datos.

CLK1 controla las operaciones de escritura mientras que CLK2 controla las de lectura.

Page 291: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

289

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 diseña 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 más 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 instrucción (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 múltiplos de dos. Los estados de espera se agregan simétricamente en todas las transacciones, con una mitad añadida a cada uno de los dos ciclos de reloj requeridos para la transacción.

3.4.19.1.4. SPP Pull-Ups Las líneas 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: Sincronización Para El Microcontrolador Escribe Dirección, Escribe Datos Y Lee Datos (Ningún Estado De Espera)

Page 292: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

290

FIGURA 19-3: Sincronización Para El USB Escribe Dirección Y Datos (Estados De Espera)

FIGURA 19-4: Sincronización Para El USB Escribe Dirección 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 periférico USB sin la intervención del microcontrolador; así, no requiere tiempo de procesado. Los datos se manejan a o hacia fuera del SPP con la información del Endpoint (dirección) primero, seguido por uno o más bytes de datos. Esto es ideal en aplicaciones que requieren transmisión síncrona, de gran capacidad. Los siguientes pasos se requieren para configurar el SPP para controlar el USB:

1. Configurar el SPP según 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 dirección

(BDnADRL:BDnADRH) a FFFFh. 4. Activar el bit KEN (BDnSTAT<5>) pero el buffer descriptor lo se

guarda indefinidamente el SIE.

Page 293: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

291

5. Activar el bit INCDIS (BDnSTAT<4>) para inhabilitar el incremento automático de la dirección del buffer.

6. Activar el bit SPPEN para permitir el módulo.

Nota: Si un Endpoint del USB se configura para utilizar el SPP, el tipo de la transferencia de datos de ese Endpoint debe ser síncrona.

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 dirección 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 instrucción (FOSC/4). Los pasos siguientes se requieren para configurar el SPP para operación del microcontrolador:

1. Configurar el SPP según lo deseado, incluyendo estados de espera y relojes.

2. Borrar el bit SPPOWN. 3. Activar SPPEN para permitir el módulo.

3.4.19.3.1. Interrupciones SPP Cuando lo controla el núcleo del microcontrolador, el control puede generar una

interrupción para notificar la aplicación cuando termina cada operación de lectura y escritura. El flag de interrupción 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>).

Page 294: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

292

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 dirección de los Endpoint OUT con los datos, escribiendo el registro SPPEPS inicia el ciclo de escritura en la dirección. Si no, la escritura comienza escribiendo los datos al registro SPPDATA. El bit SPPBUSY indica el estado de la dirección y los datos de los ciclos de escritura.

Lo que sigue es un ejemplo de secuencia de escritura:

1. Escribir la dirección de 4 bits al registro SPPEPS. El SPP comienza automáticamente escribiendo la dirección. Si la escritura de la dirección no se utiliza, vamos al paso 3.

2. Supervisar el bit SPPBUSY para determinar cuando se ha enviado la dirección. La duración depende en los estados de espera.

3. Escribir los datos al registro SPPDATA. El SPP comienza automáticamente a escribir los datos.

4. Supervisar el bit SPPBUSY para determinar cuando se han enviado los datos. La duración depende de los estados de espera.

5. Ir de nuevo a los pasos 1 ó 3 para escribir una nueva dirección 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 operación 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 dirección de 4bits al registro SPPEPS. El SPP comienza automáticamente escribiendo la dirección. Si la dirección escrita no se usa saltemos al paso 3.

2. Supervisar el bit SPPBUSY para determinar cuando se ha enviado la dirección. La duración depende de los estados de espera.

3. Leer los datos del registro SPPDATA; se devuelven los datos de la operación de lectura anterior. El SPP comienza automáticamente la lectura para el próximo ciclo de lectura.

4. Supervisar el bit SPPBUSY para determinar cuando se han leído los datos. La duración 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.

Page 295: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

293

REGISTRO 19-3: SPPEPS: Dirección 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 RDSPP: Bit del estado de lectura del SPP (válido cuando SPPCON<SPPOWN>=1, USB) 1 = la transacción anterior del SPP era de lectura 0 = la transacción anterior del SPP no era de lectura BIT 6 WRSPP: Bit de estado de escritura del SPP (válido cuando SPPCON<SPPOWN>=1, USB) 1 = la transacción anterior del SPP era de escritura 0 = la transacción anterior del SPP no era de escritura BIT 4 SPPBUSY: Bit de ocupación del bus del SPP 1 = El SPP está ocupado 0 = El SPP está listo para aceptar otras peticiones de lectura y escritura BIT 3-0 ADDR3:ADDR0: Bits de dirección 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.

Page 296: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

294

Nota 1: Implementado cuando el Master Clean está desactivado (configuración 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 están implementados en los dispositivos de 28 pines.

3.4.20. MÓDULO CONVERTIDOR DE 10-BIT ANALÓGICO A DIGITAL (A/D)

El módulo conversor de analógico a digital (A/D) tiene 10 entradas con los dispositivos de 28 pines y 13 en los de 40/44 pines. Este módulo permite la conversión de una señal de entrada analógica a un número digital de 10bits.

El módulo 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 módulo A/D. El registro ADCON1 configura las funciones de los puertos. El registro ADCON2 configura el reloj, programa el tiempo de adquisición y justificación.

Page 297: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

295

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: Bits selectores del canal analógico 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 1 GO/DONE*: Bit A/D del estado de la conversión Cuando ADON=1: 1 = conversión A/D en marcha 0 = A/D en reposo BIT 0 ADON: Bit de permiso del A/D 1 = módulo A/D permitido 0 = módulo A/D no permitido

Nota 1: Estos canales no se implementan en los dispositivos de 28pines.

2: La ejecución de una conversión en los canales no implementados devolverá una medida flotante de la entrada.

Page 298: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

296

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 configuración de la tensión de referencia (fuente de VREF-) 1 = VREF- (AN2) 0 = VSS BIT 4 VCFG0: Bit de configuración de la tensión de referencia (fuente de VREF+) 1 = VREF+ (AN3) 0 = VDD BIT 3-0 PCFG3:PCFG0: Bits de configuración de los puertos A/D:

PCFG3: PCFG0 AN12 AN11 AN10 AN9 AN8 AN7(2) AN6(2) AN5(2) AN4 AN3 AN2 AN1 AN0

0000(1) A A A A A A A A A A A A A

0001 A A A A A A A A A A A A A

0010 A A A A A A A A A A A A A

0011 D A A A A A A A A A A A A

0100 D D A A A A A A A A A A A

0101 D D D A A A A A A A A A A

0110 D D D D A A A A A A A A A

0111(1) D D D D D A A A A A A A A

1000 D D D D D D A A A A A A A

1001 D D D D D D D A A A A A A

1010 D D D D D D D D A A A A A

1011 D D D D D D D D D A A A A

1100 D D D D D D D D D D A A A

1101 D D D D D D D D D D D A A

1110 D D D D D D D D D D D D A

1111 D D D D D D D D D D D D D

A= Entrada analógica

D= E/S digital

Nota 1: El valor de POR de los bits PCFG depende del valor del bit de configuración PBADEN. Cuando PBADEN=1, PCFG<3: 0>=0000; cuando PBADEN=0, PCFG<3: 0>=0111.

2: AN5 con AN7 están disponibles solamente en los dispositivos 40/44pines.

Page 299: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

297

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 ADFM: Bit selecto del formato A/D del resultado 1 = derecho justificado 0 = izquierdo justificado BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición 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) BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión 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 añade un retraso de un TCY (ciclo de instrucción) antes de que el reloj A/D comience. Esto permite que la instrucción SLEEP se ejecute antes de comenzar una conversión.

La tensión analógica de referencia es seleccionable por software es cualquier fuente de tensión positiva y negativa del dispositivo (VDD y VSS) o el nivel de tensión en los pines RA3/AN3/VREF+ y RA2/AN2/VREF-/CVREF.

El convertidor A/D tiene la característica de poder funcionar mientras que el dispositivo está en modo sleep. Al funcionar en sleep, el reloj de conversión 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 vía aproximaciones sucesivas.

Un reset del dispositivo fuerza todos los registros a su estado de reset. Esto provoca que el módulo A/D se apague y la conversión en marcha se aborte.

Cada pin del puerto asociado al convertidor A/D puede configurarse como entrada analógica o como entrada-salida digital. Los registros ADRESH y ADRESL

Page 300: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

298

contienen el resultado de la conversión A/D. Cuando la conversión 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 interrupción A/D, ADIF.

FIGURA 20-1: Diagrama De Bloques Del A/D

Nota 1: Los canales de 5 a 7 no están disponibles en los dispositivos de

28pines.

2: Los pines de E/S tienen un diodo de protección a VDD y VSS.

El valor en los registros ADRESH:ADRESL no se modifica con un POR. Los registros ADRESH:ADRESL contendrán datos desconocidos después de un POR.

Después de que el módulo A/D se haya configurado según lo deseado, el canal seleccionado debe adquirir antes de que comience la conversión. Los canales de entrada analógica deben tener sus bits TRIS correspondientes seleccionados como entrada. Después de esta adquisición el tiempo ha transcurrido, la conversión A/D puede

Page 301: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

299

comenzar. Se puede programar un periodo de adquisición para que ocurra entre activar el bit GO/DONE* y el comienzo real de la conversión.

Hay que seguir los siguientes pasos para realizar la conversión A/D:

1. Configurar el módulo A/D: Configura los pines analógicos, referencia de tensión y entrada-salida

digital (ADCON1) Seleccionar el canal A/D de entrada (ADCON0) Seleccionar el tiempo de adquisición A/D (ADCON2) Seleccionar el reloj e la conversión A/D (ADCON2) Cambiar el módulo A/D (ADCON0)

2. Configuran la interrupción A/D (si se desea): Borrar el bit ADIF Activar el bit ADIE Activar el bit GIE

3. Esperar el tiempo requerido de adquisición (si procede). 4. Comienzo de la conversión:

Activar el bit GO/DONE* (registro ADCON0) 5. Esperar que termine la conversión A/D, por cualquiera:

La interrogación del bit GO/DONE* para ver si está borrado Esperar la interrupción A/D

6. Leer los registros del resultado A/D (ADRESH:ADRESL); borrar el bit ADIF, si procede.

7. Para la conversión siguiente, ir al paso 1 o al paso 2, al que se necesite. El tiempo de la conversión A/D por bit es definido como TAD. Se necesita esperar como mínimo 3TAD antes de comenzar la siguiente adquisición.

FIGURA 20-2: Función De Transferencia A/D

Page 302: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

300

FIGURA 20-3: Modelo De Entrada Analógica

3.4.20.1. Requisitos De La Adquisición 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 tensión 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) varía sobre la tensión del dispositivo (VDD). La impedancia de la fuente afecta a la tensión compensando la entrada analógica (debido al pin de salida de corriente). La impedancia recomendada máxima para las fuentes analógicas es de 2,5kΩ. Después de que el canal de entrada analógico esté seleccionado (cambiado), el canal se debe muestrear por lo menos el tiempo mínimo de adquisición antes de comenzar una conversión.

Nota: Cuando comienza la conversión, el condensador se desconecta del pin de entrada.

Para calcular el tiempo mínimo de adquisición, se puede usar la ecuación 20-1. Esta ecuación asume que existe el error de 1/2LSb (1024 pasos para el A/D). El error de 1/2LSb es el error máximo permitido del A/D para conseguir su resolución específica.

El ejemplo 20-3 muestra el cálculo del tiempo mínimo de adquisición requerido TACQ. Este cálculo se base con los siguientes datos de aplicación:

CHOLD=25pF

RS=2,5kΩ

Error de la conversión <= 1/2 LSb

VDD=5V

RSS=2kΩ

Page 303: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

301

Temperatura=85°C (máximo del sistema)

ECUACIÓN 20-1: Adquisición Tiempo

COFFCAMP

HOLDACQ

TTT

aTemperatureCoeficientCaCTiempoorAmplificadColocaciónTiempoT

++=

=++= __arg___

ECUACIÓN 20-2: Tiempo Mínimo De Carga A/D

)2048/1())((

)1())2048/(( ))(/(

LnRRRCTo

eVVV

SSSICHOLDC

RRRCTREFREFHOLD

SSSICHOLDC

++−=

−•−= ++−

ECUACIÓN 20-3: Cálculo Del Tiempo De Adquisición Mínimo

sCsCCCsCTempTsT

TTTT

COFF

AMP

COFFCAMPACQ

μμμμ

2,1)/º02,0)(º25º85()/º02,0)(º25(2

=−=−==

++=

El coeficiente de temperatura sólo se necesita para temperaturas >25ºC. Por

debajo de 25ºC, TCOFF=0ms.

ssssTssLnkkkpFsLnRRRCT

ACQ

SSSICHOLDC

μμμμμμμ

45,22,105,12,005,1)0004883,0()5,221)(25()2048/1())((

=++==Ω+Ω+Ω−=++−=

3.4.20.2. Seleccionar Y Configuración El Tiempo De Adquisición Tiempo

El registro ADCON2 permite que el usuario seleccione tiempo de adquisición que ocurre cada vez que se activa el bit GO/DONE*. También da a los usuarios la opción de utilizar un tiempo de adquisición automáticamente determinado. El tiempo de adquisición 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 módulo A/D continúa muestreando la entrada con el tiempo de adquisición seleccionado, entonces comienza automáticamente una conversión. Desde que se programa el tiempo de adquisición, puede que no ser necesite esperar un periodo de adquisición entre la selección de un canal y activar el bit GO/DONE*.

Se selecciona la adquisición manual cuando ACQT2:ACQT0 = 000. Cuando se activa el bit GO/DONE*, se para el muestreo y comienza una conversión. El usuario es el responsable de asegurar que ha pasado el tiempo de adquisición requerido entre la selección de la entrada deseada y fijar el bit GO/DONE*. Esta opción es el estado por defecto en un reset de los bits ACQT2:ACQT0 y es compatible con los dispositivos que no ofrecen tiempos de adquisición programables.

En cualquier caso, cuando se termina la conversión, el bit GO/DONE* se borra, se activa el flag ADIF y A/D comienza a muestrear el canal actualmente seleccionado

Page 304: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

302

otra vez. Si se programa un periodo de adquisición, no hay nada que indique si el tiempo de adquisición ha terminado o si la conversión ha comenzado.

3.4.20.3. Seleccionar El Reloj De Conversión A/D El tiempo A/D de conversión por bit se define como TAD. La conversión A/D

requiere 11 TAD para la conversión de 10 bits. La fuente de reloj A/D de la conversión 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 conversión A/D (TAD) debe ser tan corto como sea posible pero mayor que un mínimo TAD (para más información véase el parámetro 130 en la tabla 28-29).

TABLA 20-1: TAD Vs. Frecuencias De Operación De Los Dispositivos

Fuente del reloj AD (TAD) Máxima frecuencia del dispositivo

Opción 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 conversión o la exactitud del A/D está fuera de lo especificado.

4: Dispositivos de baja potencia

Page 305: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

303

3.4.20.4. Operación En Los Modos De Ahorro De Energía La selección del tiempo de adquisición automático y el reloj de conversión A/D

se determinado en parte con la fuente de reloj y la frecuencia mientras se trabaje en un modo de ahorro de energía.

Si se espera que el A/D funcione mientras que el dispositivo esté dentro de un modo de ahorro de energía, los bits ACQT2:ACQT0 y ADCS2:ADCS0 en ADCON2 se deben actualizar con la fuente de reloj que se utilizará en este modo. Después de entrar en el modo, una adquisición o la conversión A/D puede comenzar. Una vez que haya comenzado, el dispositivo debe continuar controlado con la misma fuente de reloj hasta que la conversión termine.

Si se desea, el dispositivo se puede poner en modo reposo durante la conversión. 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 conversión, la conversión tendrá un retraso de un ciclo de instrucción para permitir la ejecución de la instrucción SLEEP y entrada del modo sleep. El bit IDLEN (OSCCON<7>) tiene que estar borrado antes de comenzar la conversión.

3.4.20.5. Configuración De Los Pines De Los Puertos Analógicos Los registros ADCON1, TRISA, TRISB y TRISE configuran los pines de los

puertos A/D. Los pines tienen que estar como entradas analógicas, 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 operación 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 analógica se leerán como borrado (un nivel bajo). Los pines configurados como entrada digital convertirán como entradas analógicas. Los niveles analógicos de la entrada digital estarán bien convertidos.

2: Los niveles analógicos en cualquier pin definido como entrada digital puede causar al buffer de entrada digital que consuma una corriente fuera de los límites de la especificación de dispositivo.

3: El bit PBADEN en el registro de configuración 3H configura los pines de PORTB a resetar como pines analógicos o digitales dependiendo de como estén los bits PCFG0 de ADCON1 después el reset.

Page 306: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

304

3.4.20.6. Conversiones A/D La figura 20-4 muestra la operación del convertidor A/D después de que se haya

activado el bit GO/DONE* y los bits ACQT2:ACQT0 se hayan borrado. Comienza una conversión después de que la siguiente instrucción permita la entrada en el modo sleep antes de comenzar la conversión.

La figura 20-5 muestra la operación del convertidor A/D después de que se hayan fijado los bits GO/DONE*, y ACQT2:ACQT0 a ‘010’ y seleccionar el tiempo de adquisición a 4TAD antes del comienzo de la conversión.

Despejar el bit GO/DONE* durante una conversión aborta la conversión actual. El par de registros del resultado A/D no se actualiza cuando termina una parte de la conversión A/D. Esto significa que los registros ADRESH:ADRESL continuarán conteniendo el valor de la conversión anterior (o el último valor escrito en los registros ADRESH:ADRESL).

Después de que termine o se aborte la conversión A/D, se necesita esperar 2TAD antes de que la adquisición siguiente pueda comenzar. Después de esta espera, la adquisición en el canal seleccionado se activa automáticamente.

Nota: El bit de GO/DONE* no se debe activar dentro de la misma instrucción 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 característica ayuda a optimizar la ganancia unitaria del amplificador como el circuito siempre carga la matriz del condensador, más bien que cargar/descarga se basa en la medida de valores anteriores.

FIGURA 20-4: Ciclos TAD En La Conversión A/D (ACQT<2:0>=000, TAQT=0)

Page 307: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

305

FIGURA 20-5: Ciclos TAD En La Conversión A/D (ACQT<2:0>=010, TAQT=4TAD)

3.4.20.8. Uso Del Disparador Del CCP2 Una conversión A/D puede empezar con el disparo de un evento especial del

módulo CCP2. Esto requiere que los bits CCP2M3:CCP2M0 (CCP2CON<3:0>) se programen como ‘1011’ y que el módulo A/D esté activo (ADON esté activo). Cuando ocurre un disparo, el bit GO/DONE* se activará, empezando la adquisición y conversión A/D y el Timer1 (o Timer3) se resetea para repetir automáticamente el periodo de adquisición A/D con el uso de un mínimo de software (mover ADRESH:ADRESL a las localizaciones deseadas). Se tiene que seleccionar el canal de entrada analógico apropiado y un tiempo de adquisición mínimo elegido por el usuario o un TACQ apropiado antes de que el disparo del evento especial active el bit GO/DONE* (comience la conversión).

Si el módulo A/D no está permitido (ADON está borrado), el disparo del evento especial lo ignora el módulo A/D pero reseteará el contador Timer1 (o Timer3).

Page 308: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

306

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

PIR1 SPPIF(4) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

PIE1 SPPIE(4) 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

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

TRISA — TRISA6(2) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0

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 RDPU(4) — — — RE3(1,3) RE2(4) RE1(4) RE0(4)

TRISE(4) — — — — — TRISE2 TRISE1 TRISE0

LATE(4) — — — — — LATE2 LATE1 LATE0

Leyenda: -=no implementado, se leen ‘0’. Las casillas sombreadas no se utilizan con el módulo A/D.

Nota 1: Implementado cuando el Master Clean está desactivado (configuración del bit MCLRE=0).

2: RA6 y su latch asociado y los bits de dirección se activan como puertos de E/S dependiendo de la configuración del oscilador; en otro caso, se leen ‘0’.

3: El puerto RE3 está disponible sólo como entrada cuando el bit de configuración MCLRE es ‘0’.

4: Estos registros y/o bits no están disponibles en los dispositivos de 28pines.

Page 309: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

307

3.4.21. MÓDULO COMPARADOR El módulo comparador analógico contiene dos comparadores que se pueden

configurar de muchas maneras. Las entradas se pueden elegir de las entradas analógicas multiplexadas con los pines RA0 a RA5, como el módulo de tensión de referencia del chip. Las salidas digitales (normales o invertidas) están disponibles en los niveles de los pines o también se pueden leer a través del registro de control.

El registro CMCON selecciona la configuración de la entrada y de la salida del comparador.

REGISTRO 21-1: CMCON: Registro De Control Del Comparador BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0

R-0 R-0 R/W-0 R/W-0 R/W-0 R/W-1 R/W-1 R/W-1

BIT 7 C2OUT: Bit de salida del comparador 2 Cuando C2INV=0: 1 = C2 VIN+ > C2 VIN- 0 = C2 VIN+ < C2 VIN- Cuando C2INV=1: 1 = C2 VIN+ < C2 VIN- 0 = C2 VIN+ > C2 VIN- BIT 6 C1OUT: Bit de salida del comparador 1 Cuando C1INV=0: 1 = C1 VIN+ > C1 VIN- 0 = C1 VIN+ < C1 VIN- Cuando C1INV=1: 1 = C1 VIN+ < C1 VIN- 0 = C1 VIN+ > C1 VIN- BIT 5 C2INV: Bit inversor de la salida del comparador 2 1 = salida C2 invertida 0 = salida C2 no invertida BIT 4 C1INV: Bit inversor de la salida del comparador 1 1 = salida C1 invertida 0 = salida C1 no invertida BIT 3 CIS: 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 BIT 2-0 CM2:CM0: Bits del modo del comparador La figura 21-1 muestra los modos del comparador y los ajustes de los bits CM2:CM0.

Page 310: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

308

FIGURA 21-1: Modos De Operación De Las E/S Del Comparador

Page 311: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

309

3.4.21.1. Configuración Del Comparador Hay ocho modos de operación para los comparadores. Los bits CM2:CM0 del

registro CMCON se utilizan para seleccionar estos modos. El registro TRISA controla la dirección 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 válido 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 interrupción.

3.4.21.2. Operaciones Del Comparador En la figura 21-2 se muestra un comparador simple, junto con la relación entre

los niveles de entrada de datos analógicos y la salida digital. Cuando la entrada analógica en VIN+ es menor que la entrada analógica VIN-, la salida del comparador es un nivel digital bajo. Cuando la entrada analógica en VIN+ es mayor que la entrada analógica 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 reacción.

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 tensión. La señal analógica presente en VIN- se compara con la señal en VIN+ y la salida digital del comparador se ajusta consecuentemente.

Page 312: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

310

3.4.21.3.1. Señal De Referencia Externa Cuando son externas se utilizan las referencias de tensión, el módulo 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 señal de referencia debe estar entre VSS y VDD y se puede aplicar a cualquier pin del/los comparador/es.

3.4.21.3.2. Señal De Referencia Interna El módulo del comparador también permite la selección de referencia interna de

tensión interna generada por el módulo comparador de tensión 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 tensión interna de referencia se aplica al pin VIN+ de ambos comparadores.

3.4.21.4. Tiempo De Respuesta Del Comparador El tiempo de reacción es el tiempo mínimo, después de seleccionar una nueva

tensión de referencia o fuente entrada, antes de que la salida del comparador tenga un nivel válido. Si la referencia interna cambia, se tiene que considerar el máximo retraso de la tensión interna de referencia al usar las salidas del comparador. Si no, se tiene que utilizar el máximo 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 tensión compensada de la entrada y el tiempo de reacción dado en las especificaciones.

Los bits TRISA activarán/desactivarán 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 analógicas se leerán ‘0’. Los pines configurados como entradas digitales convertir una entrada analógica según las especificaciones de entrada del disparador Schmitt.

2: Los niveles analógicos de cualquier pin definidos como entrada digital pueden hacer que el buffer de entrada consuma más corriente que la que se especifica.

Page 313: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

311

FIGURA 21-3: Diagrama De Bloques Del Comparador De Salida

3.4.21.6. Interrupciones Del Comparador Se activa el flag de interrupción del comparador siempre que haya un cambio en

el valor de la salida de cualquier comparador. El software necesitará mantener la información 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 interrupción del comparador. El bit CMIF se tiene que resetear borrándolo. Puesto que está también posible escribir un ‘1’ en este registro, se puede iniciar una interrupción simulada.

El bit CMIE (PIE2<6>) y el bit PEIE (INTCON<6>) se tienen que activar para permitir la interrupción. Además, el bit GIE (INTCON<7>) tiene que estar activo. Si ninguno de estos bits están activos, no se permiten las interrupciones, aunque el bit CMIF todavía se active si ocurre una condición de interrupción.

Nota: Si un cambio en el registro de CMCON (C1OUT o C2OUT) ocurre cuando se está ejecutando la operación de lectura (comienzo del ciclo Q2), entonces el flag de interrupción CMIF (PIR2<6>) puede que no e active.

El usuario, en la rutina de interrupción, puede borrar la interrupción de la manera siguiente:

a) Cualquier lectura o escritura de CMCON terminará con condición de error de unión.

b) Borrar el flag CMIF.

Una condición de error de unión continuará activando el flag CMIF. La lectura de CMCON terminará con la condición de error de unión y permitirá que el flag CMIF se borre.

Page 314: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

312

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 interrupción es funcional si está permitida. Esta interrupción despertará al dispositivo del modo sleep, cuando está permitida. Cada comparador operacional consumirá corriente adicional, según las indicaciones de las especificaciones del comparador. Para reducir al mínimo el consumo de energía 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 módulos del comparador se apaguen (CM2:CM0=111). Sin embargo, los pines de entrada (RA0 a RA3) se configuran como entradas analógicas por defecto. La configuración 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 mínimo cuando las entradas analógicas están presentes en el tiempo de reset.

3.4.21.9. Consideraciones En La Conexión De Las Entradas Analógicas

Como los pines analógicos se conectan a una salida digital, hay diodos polarizados inversamente a VDD y VSS. La entrada analógica, tiene que estar entre la corriente de salida VSS y VDD. Si la tensión de entrada se desvía de este rango más de 0,6V en cualquier dirección, uno de los diodos se polariza directamente y ocurre una condición de lacth-up. Se recomienda una impedancia máxima de la fuente de 10kΩ para fuentes analógicas. Cualquier componente externo conectado a un pin de entrada analógica, como un condensador o un diodo zener, debe tener muy poca pérdida de corriente.

FIGURA 21-4: Modelo De Entrada Del Comparador Analógico

Page 315: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

313

TABLA 21-1: Registros Asociados Al Módulo 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 módulo comparador.

Nota 1: PORTA<6> y su dirección y bit de latch se configuran individualmente como pin de puerto en varios modos de oscilador. Cuando está desactivado estos bits se leen ‘0’.

Page 316: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

314

3.4.22. MÓDULO COMPARADOR DE TENSIÓN DE REFERENCIA La tensión del comparador de referencia es una red de 16 resistencias que

proporciona una referencia seleccionable de tensión. Aunque su propósito primario es proporcionar una referencia para los comparadores analógicos, se puede utilizar también independientemente de ellos.

La red de resistencias se divide en segmentos para proporcionar dos gamas de valores de CVREF y tiene una función de caída de energía para conservar la energía cuando la referencia no se está utilizando. La fuente de referencia del módulo se puede obtener de dispositivo VDD/VSS o una referencia externa de tensión.

3.4.22.1. Configuración Del Módulo Comparador De Tensión De Referencia

El módulo comparador de tensión de referencia se controla con el registro CVRCON. El comparador de tensión de referencia proporciona dos gamas de tensión 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 tamaño de los pasos seleccionados con los bits CVREF (CVR3:CVR0), con una gama de resolución más fina. Las ecuaciones utilizadas para calcular la salida de referencia de la tensión del comparador son:

Si CVRR=1:

CVREF=((CVR3:CVR0)/24)xCVRSRC

Si CVRR=0:

CVREF=(CVRSRC/4)+(((CVR3:CVR0)/32)xCVRSRC)

La tensión 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 tensión se selecciona con el bit CVRSS (CVRCON<4>).

Se tiene que considerar el periodo de configuración de comparador de tensión de referencia al cambiar la salida CVREF.

Page 317: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

315

REGISTRO 22-1: CVRCON: Registro De Control De La Tensión 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 de permiso de comparador de tensión de referencia 1= Circuito CVREF encendido 0= Circuito CVREF apagado BIT 6 CVROE: Bit de permiso de la salida del comparador VREF

(1) 1= El nivel de tensión CVREF también sale por el pin RA2/AN2/VREF-/CVREF 0= La tensión CVREF se desconecta del pin RA2/AN2/VREF-/CVREF BIT 5 CVRR: Bit de selección del rango del comparador VREF 1 = 0 a 0,667CVRSRC, con el tamaño de paso CVRSRC/24 (gama baja) 0 = 0,25CVRSRC a 0,75CVRSRC, con el tamaño de paso CVRSRC/32 (alta gama) BIT 4 CVRSS: Bit de selección de la fuente del comparador VREF 1 = fuente de referencia del comparador, CVRSRC=(VREF+)-(VREF-) 0 = fuente de referencia del comparador, CVRSRC=VDD–VSS BIT 3-0 CVR3:CVR0: Bits de selección 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>.

Page 318: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

316

FIGURA 22-1: Diagrama De Bloques Del Comparador De Tensión De Referencia

3.4.22.2. Exactitud/Error De La Tensión De Referencia La gama completa de la tensión de referencia no se puede observar debido a la

construcción del módulo. Los transistores en la tapa y el fondo de la red de la escala de resistencias guardan CVREF la referencia de la fuente. La tensión de referencia deriva de la fuente de referencia; por lo tanto, la salida CVREF cambia con fluctuaciones en esa fuente.

3.4.22.3. Operación En Modo SLEEP Cuando el dispositivo despierta del sleep con una interrupción o un

desbordamiento del perro guardián, no le afecta al contenido del registro CVRCON. Para reducir al mínimo la consumición actual en el modo sleep, la tensión de referencia debe desactivarse.

3.4.22.4. Efectos De Un Reset Un reset del dispositivo inhabilita la referencia de tensión borrando el bit,

CVREN (CVRCON<7>). Este reset también desconecta la referencia del pin RA2 borrando el bit, CVROE (CVRCON<6>) y selecciona el rango de alta tensión borrando el bit, CVRR (CVRCON<5>). El valor de los bits selectores CVR también se borra.

Page 319: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

317

3.4.22.5. Consideraciones De La Conexión El módulo de tensión de referencia funciona independientemente del módulo

comparador. La salida del generador de referencia se puede conectar al pin RA2 si el bit TRISA<2> y el bit CVROE están activos. Permitiendo a la tensión poner la salida en RA2 cuando se configura como una entrada digital aumentará la consumición de corriente. Conectando RA2 como salida digital con CVRSS permitido también 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 tensión de referencia para las conexiones externas a VREF.

FIGURA 22-2: Ejemplo De Buffer De Salida Del Comparador De Tensión De Referencia

Nota 1: R depende de los bits de configuración de la tensión de referencia,

CVRCON<5> y CVRCON<3:0>.

TABLA 22-1: Registros Asociados Al Comparador De Tensión 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 módulo comparador de la tensión de referencia.

Nota 1: PORTA<6> y su dirección y bit de latch se configuran individualmente como pin de puerto en varios modos de oscilador. Cuando está desactivado estos bits se leen ‘0’.

Page 320: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

318

3.4.23. DETECTOR DE ALTA/BAJA TENSIÓN (HLVD) Los dispositivos PIC18F2455/2550/4455/4550 tienen un módulo detector de

alta/baja tensión (HLVD). Éste es un circuito programable que permite al usuario especificarla tensión del cambio del dispositivo y la dirección del cambio en ese punto. Si el dispositivo experimenta un cambio mayor, se activa un flag de interrupción. Si se permite la interrupción, la ejecución del programa saltará a la dirección de vector de interrupción y el software responde a la interrupción.

El registro de control que detecta la alta/baja tensión controla totalmente la operación del Módulo HLVD. Esto permite que el circuito “lo apague” el usuario bajo control por software que reduce al mínimo la consumición actual del dispositivo.

REGISTRO 23-1: HLVDCON: Registro De Control Del Detector De Alta/Baja Tensión

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 VDIRMAG: Bit selector de la magnitud de la dirección de tensión 1 = el acontecimiento ocurre cuando la tensión iguala o excede el punto (HLVDL3:HLDVL0) 0 = el acontecimiento ocurre cuando la tensión iguala o cae por debajo del punto (HLVDL3: HLVDL0) BIT 5 IRVST: Flag de la tensión interna de referencia estable 1 = indica que la tensión detectada generará el flag de interrupción en la gama especificada 0 = indica que la tensión detectada no generará el flag de interrupción en la gama especificada y la interrupción HLVD no se debe permitir BIT 4 HLVDEN: Bit de permiso del detector de la alta/baja tensión 1 = HLVD permitido 0 = HLVD inhabilitado BIT 3-0 HLVDL3:HLVDL0: Bits del límite de detección de tensión 1111 = se utiliza la entrada analógica externa (la entrada es el pin HLVDIN) 1110 = ajuste máximo ... 0000 = ajuste mínimo

El módulo se permite activando el bit HLVDEN. Cada vez que se permite el módulo 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 módulo puede generar una sola interrupción después de que el circuito sea estable y se activa IRVST.

Page 321: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

319

El bit VDIRMAG determina la operación total del módulo. Cuando se borra VDIRMAG, el módulo supervisa las bajadas en VDD por debajo de un punto predeterminado. Cuando se activa el bit, la supervisón del módulo se realiza en las subidas de VDD sobre el punto de ajuste.

3.4.23.1. Operación Cuando se permite el módulo HLVD, un comparador usa una tensión 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 tensión del punto de cambio. “La tensión del punto de cambio” es el nivel de tensión en el cual el dispositivo detecta un acontecimiento de subida o bajada de tensión, dependiendo de la configuración del módulo. Cuando la fuente de tensión es igual al punto de cambio, la tensión que llega a la matriz de resistencias es igual a la tensión de referencia interna generada por el módulo de tensión de referencia. El comparador entonces genera una señal de interrupción activando el bit HLVDIF.

La tensión 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 módulo HLVD tiene una característica adicional que permite al usuario proveer la tensión de cambio al módulo 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 interrupción del detector de alta/baja tensión para que ocurra en la gama de tensión en funcionamiento.

Page 322: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

320

FIGURA 23-1: Diagrama De Bloques Del Módulo HLVD (Con Entrada Externa)

3.4.23.2. Configuración Del HLVD Se necesitan los siguientes pasos para instalar el módulo HLVD:

1. Inhabilitar el módulo 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 tensión

(VDIRMAG=1) o la bajada de tensión (VDIRMAG=0). 4. Permitir el módulo HLVD activando el bit HLVDEN. 5. Despejar el flag de interrupción HLVD, HLVDIF (PIR2<2>), que puede

estar activo. 6. Permitir la interrupción HLVD, si se quieren las interrupciones,

activando los bits HLVDIE y GIE/GIEH (PIE2<2> e INTCON<7>). Una interrupción se genera hasta que se activa el bit IRVST.

Page 323: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

321

3.4.23.3. Consumición De Corriente Cuando se permite el módulo, el comparador HLVD y el divisor de tensión

consumirán parásitos atmosféricos.

Dependiendo de la aplicación, el módulo HLVD no necesita funcionar constantemente. Para disminuir los requisitos actuales, el circuito HLVD puede permitirse en periodos cortos donde se compruebe la tensión. Después de hacer la comprobación, el módulo HLVD puede desactivarse.

3.4.23.4. Tiempo De Arranque De HLVD La tensión interna de referencia del módulo HLVD, la puede utilizar otro

circuito interno, por ejemplo el reset programable por cese de tensión. Si el HLVD u otros circuitos que usan la tensión de referencia se inhabilitan para bajar la consumición actual del dispositivo, la tensión de referencia del circuito requerirá un tiempo para ser estable antes de que una condición de bajada o subida de tensión pueda detectarse fiablemente. Este tiempo de arranque, TIRVST, es un intervalo que es independiente de la velocidad de reloj del dispositivo.

El flag de interrupción de HLVD permanece desactivado hasta que TIRVST expire y se alcance una tensión estable de referencia. Por esta razón, los excesos leves del punto de cambio puede que no se detecten.

FIGURA 23-2: Operación De Detección De Bajada De Tensión (VDIRMAG=0)

Page 324: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

322

FIGURA 23-3: Operación De Detección De Subida De Tensión (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 módulo HLVD podía estar configurado para detectar periódicamente la conexión o desconexión del Bus Serie Universal (USB). Esto asume que el dispositivo se acciona con una fuente de tensión más baja que cuando el USB está desconectado. Una activación indicaría que se ha detectado un nivel alto de tensión, por ejemplo, 3,3V a 5V (tensión en el USB) y viceversa al desconectar. Esta característica podía ahorrar el diseño de algún suplemento de componentes y una señal de activación (pin de entrada).

En aplicaciones generales con batería, el cuadro 24-4 muestra una curva posible de tensión. En un cierto tiempo, la tensión del dispositivo disminuye. Cuando la tensión del dispositivo alcanza la tensión VA, la lógica del HLVD genera una interrupción en el tiempo, TA. La interrupción podía causar la ejecución de un ISR, el cuál permitiría que la paliación realizara “tareas de economización” y realizan una parada controlada antes de que la tensión salga del rango de tensión válida para el dispositivo en TB. El HLVD, así, daría a la aplicación una ventana de tiempo, representada por la diferencia entre TA y TB, para salir con seguridad.

Page 325: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

323

FIGURA 23-4: Aplicación Típica Del Detector De Alta/Baja Tensión

3.4.23.6. Operaciones En El Modo Sleep Cuando se activa, el circuito HLVD continúa funcionando durante el modo

sleep. Si la tensión del dispositivo cruza el punto de cambio, el bit HLVDIF se activará y el dispositivo se despertará del sleep. La ejecución del dispositivo continuará en el vector interrupción si están 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 módulo HLVD se apague.

TABLA 23-1: Registros Asociados Al Módulo Detector De Alta/Baja Tensión

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 módulo HLVD.

Page 326: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

324

3.4.24. CARACTERÍSTICAS ESPECIALES DE LA CPU Los dispositivos PIC18F2455/2550/4455/4550 incluyen varias características

para maximizar la confiabilidad y reducir el coste al mínimo con la eliminación de componentes externos. Éstos son:

Selección del oscilador Resets:

Reset por subida de tensión (POR) Temporizador de inicio (PWRT) Temporizador de inicio del oscilador (OST) Reset por cese de tensión (BOR)

Interrupciones Temporizador perro guardián (WDT) Monitor de reloj a prueba de fallos Arranque a dos velocidades Código de protección Localizaciones de identificación Programación serie “en Circuito”

El oscilador se puede configurar para cada aplicación dependiendo de la frecuencia, la energía, la exactitud y el coste.

Además 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 guardián, que se permite permanentemente con los bits de configuración o el software de control (si está inhabilitado).

La inclusión de un oscilador interno RC también proporciona ventajas adicionales de un monitor de reloj a prueba de fallos (FSCM) y arranque de dos velocidades. FSCM proporciona una supervisión oculta del reloj del periférico y un cambio automático en caso de fallo. El arranque a dos velocidades permite al código ejecutarse casi inmediatamente en el inicio, mientras que la fuente de reloj primario termina su retraso de inicio.

Todas estas características se permiten y se configuran activando los bits apropiados del registro de configuración.

Page 327: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

325

3.4.24.1. Bits De Configuración Los bits de configuración pueden programarse (leerse como ‘0’) o no

programarse (leerse como ‘1’) para seleccionar varias configuraciones del dispositivo. Estos bits están mapeados en la posición de memoria del programa 300000h.

El usuario observará que la dirección 300000h está más allá de memoria del programa de usuario. De hecho, pertenece a memoria de la configuración (300000h-3FFFFFh), la cuál puede alcanzarse solamente usando la lectura y escritura de tablas.

La programación de los registros de configuración se hace de manera similar a la programación de la memoria flash. El bit WR del registro EECON1 comienza una escritura auto-temporizada en el registro de configuración. En modo de operación normal, una instrucción TBLWT, con el TBLPTR señalando al registro de configuración, selecciona la dirección y los datos para escribir el registro de configuración. Al activar el bit WR comienza una “escritura larga” en el registro de configuración. En los registros de configuración se escribe un byte a la vez. Al escribir o borrar una célula de configuración, una instrucción TBLWT puede escribir un ‘1’ o un ‘0’ en la célula.

TABLA 24-1: Bits De Configuración 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)

Page 328: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

326

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 sólo 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 Configuración Bajo (Dirección 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 USBDIV: Bit de selección del reloj del USB (usado sólo 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 BIT 4-3 CPUDIV1:CPUDIV0: Bits de selección 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 (ningún 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 BIT 2-0 PLLDIV2:PLLDIV0: Bits de selección del Prescaler del PLL

Page 329: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

327

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 = ningún prescaler (conducen 4MHz de entrada del oscilador PLL directamente)

REGISTRO 24-2: CONFIG1H: Registro De Configuración Alto (Dirección 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 IESO: Bit del intercambio interno y externo del oscilador 1 = modo del intercambio del oscilador permitido 0 = modo del intercambio del oscilador inhabilitado BIT 6 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 BIT 3-0 FOSC3:FOSC0: Bits de selección 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

Page 330: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

328

(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 módulo USB utilizan el oscilador seleccionado como su fuente del reloj en los modos XT, HS y EC. El módulo 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 Configuración Bajo (Dirección 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 VREGEN: Bit de permiso del regulador interno de tensión del USB 1 = regulador de tensión del USB permitido 0 = regulador de tensión del USB inhabilitado BIT 4-3 BORV1:BORV0: Bits de ajuste de la tensión de los resets por caída de tensión 11 = ajuste mínimo . . . 00 = ajuste máximo BIT 2-1 BOREN1:BOREN0: Bit de permiso del reset por caída de tensión 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 BIT 0 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 caída de tensión, permitiendo que estas características sean controladas independientemente.

Page 331: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

329

REGISTRO 24-4: CONFIG2H: Registro De Configuración Alto (Dirección 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 WDTPS3:WDTPS0: Bits selectores del Postscaler del temporizador del perro guardián 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 BIT 0 WDTEN: Bit de permiso del temporizador del perro guardián 1 = WDT permitido 0 = WDT inhabilitado (el bit de control es SWDTEN)

Page 332: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

330

REGISTRO 24-5: CONFIG3H: Registro De Configuración Alto (Dirección 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 de permiso del pin MCLR* 1= pin MCLR permitido, pin RE3 inhabilitado 0 = pin RE3 permitido, pin MCLR inhabilitado BIT 2 LPT1OSC: Bit de permiso de la potencia del oscilador Timer1 1 = Timer1 configurado como baja potencia 0 = Timer1 configurado como alta potencia BIT 1 PBADEN: Bit de permiso del PORTB A/D (Afecta al estado del reset de ADCON1. ADCON1 controla la configuración del pin PORTB<4:0>.) 1 = los pines PORTB<4:0> se configuran como canales de la entrada analógica en el reset 0 = los pines PORTB<4:0> se configuran como E/S digital en el reset BIT 0 CCP2MX: Bit CCP2 MUX 1 = la entrada-salida CCP2 se multiplexa con RC1 0 = la entrada-salida CCP2 se multiplexa con RB3

Page 333: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

331

REGISTRO 24-6: CONFIG4L: Registro De Configuración Bajo (Dirección 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 de permiso de la depuración oculta 1 = depuración oculta inhabilitada, RB6 y RB7 configurados como pines E/S generales 0 = depuración oculta permitida, RB6 y RB7 se dedica a eliminar errores “en Circuito” BIT 6 XINST: Bit de permiso del sistema de instrucciones extendidas 1 = extensión del sistema de instrucción y modo de dirección indexado permitidos 0 = extensión del sistema de instrucción y modo de dirección indexado inhabilitados (modo herencia) BIT 5 ICPRT: Bit de permiso del puerto de programación/depuración “en Circuito” (ICPORT)(1) 1 = ICPORT permitido 0 = ICPORT inhabilitado BIT 2 LVP: Bit de permiso de un Sólo-Proveedor ICSP™ 1 = Sólo-Proveedor ICSP permitido 0 = Sólo-Proveedor ICSP inhabilitado BIT 0 STVREN: 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.

Page 334: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

332

REGISTRO 24-7: CONFIG5L: Registro De Configuración Bajo (Dirección 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 de protección del código (1) 1 = el bloque 3 (006000-007FFFh) no es el código de protección 0 = el bloque 3 (006000-007FFFh) es el código de protección BIT 2 CP2: Bit de protección del código 1 = el bloque 2 (004000-005FFFh) no es el código de protección 0 = el bloque 2 (004000-005FFFh) es el código de protección BIT 1 CP1: Bit de protección del código 1 = el bloque 1 (002000-003FFFh) no es el código de protección 0 = el bloque 1 (002000-003FFFh) es el código de protección BIT 0 CP0: Bit de protección del código 1 = el bloque 0 (000800-001FFFh) no es el código de protección 0 = el bloque 0 (000800-001FFFh) es el código de protección

Nota 1: No implementado en los dispositivos PIC18FX455; mantener este bit activo.

Page 335: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

333

REGISTRO 24-8: CONFIG5H: Registro De Configuración Alto (Dirección 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 de protección del código de los datos EEPROM 1 = la EEPROM no se protege 0 = la EEPROM se protege BIT 6 CPB: Bit de protección del código 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 Configuración Bajo (Dirección 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 de protección de la escritura(1) 1 = el bloque 3 (006000-007FFFh) no es la protección contra la escritura 0 = el bloque 3 (006000-007FFFh) es la protección contra la escritura BIT 2 WRT2: Bit de protección de la escritura 1 = el bloque 2 (004000-005FFFh) no es la protección contra la escritura 0 = el bloque 2 (004000-005FFFh) es la protección contra la escritura BIT 1 WRT1: Bit de protección de la escritura 1 = el bloque 1 (002000-003FFFh) no es la protección contra la escritura 0 = el bloque 1 (002000-003FFFh) es la protección contra la escritura BIT 0 WRT0: Bit de protección de la escritura 1 = el bloque 0 (000800-001FFFh) o (001000-001FFFh) no es la protección contra la escritura 0 = el bloque 0 (000800-001FFFh) o (001000-001FFFh) es la protección contra la escritura

Page 336: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

334

Nota 1: No implementado en los dispositivos PIC18FX455; mantener este bit activo.

REGISTRO 24-10: CONFIG6H: Registro De Configuración Alto (Dirección 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 de protección de la escritura de datos EEPROM 1 = los datos EEPROM no tienen protección de escritura 0 = los datos EEPROM tienen protección de escritura BIT 6 WRTB: Bit de protección de la escritura en el bloque de arranque 1 = el bloque de arranque (000000-0007FFh) no tiene protección de escritura 0 = el bloque de arranque (000000-0007FFh) tiene protección de escritura BIT 5 WRTC: Bit de protección de la escritura en el registro de configuración(1) 1 = registros (300000-3000FFh) no están protegidos 0 = registros (300000-3000FFh) protegidos

Nota 1: Este bit es inalterable en modo normal de ejecución; se puede escribir solamente en modo programación.

Page 337: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

335

REGISTRO 24-11: CONFIG7L: Registro De Configuración Bajo (Dirección 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 de protección 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 2 EBTR2: Bit de protección 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 1 EBTR1: Bit de protección 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 0 EBTR0: Bit de protección 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.

Page 338: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

336

REGISTRO 24-12: CONFIG7H: Registro De Configuración Alto (Dirección 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 protección 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 Identificación 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

R R R R R R R R

BIT 7-5 DEV2:DEV0: Bits de identificación del dispositivo 011 = PIC18F2455 010 = PIC18F2550 001 = PIC18F4455 000 = PIC18F4550 BIT 4-0 REV3:REV0: Bits de identificación de la revisión Estos bits se utilizan para indicar la revisión del dispositivo.

Page 339: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

337

REGISTRO 24-14: DEVID2: Registro De Identificación 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)

R R R R R R R R

BIT 7-0 DEV10:DEV3: Bits de identificación del dispositivo(1) Estos bits se utilizan con los bits DEV2:DEV0 del DEVID1 para identificar el número de parte. 0001 0010 = dispositivos PIC18F2455/2550/4455/4550

Nota 1: Estos valores de DEV10:DEV3 se puede compartir con otros dispositivos. El dispositivo específico es identificado siempre usando la secuencia de bits DEV10:DEV0.

3.4.24.2. Temporizador Del Perro Guardián (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 también lo está. El período nominal del WDT es de 4ms y tiene la misma estabilidad que Oscilador INTRC.

El período 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 instrucción 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 instrucción de CLRWDT, borra la cuenta del postscaler.

Page 340: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

338

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 configuración 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 guardián está encendido 0 = temporizador del perro guardián está apagado

Nota 1: Este bit no tiene ningún efecto si se permite el bit de configuración, 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 sólo está disponible si BOREN<1:0>=01; en otro caso se lee ‘0’.

Page 341: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

339

3.4.24.3. Arranque A Dos Velocidades La característica de arranque de dos velocidades ayuda a reducir al mínimo

período del estado latente del inicio del oscilador para la ejecución de código, 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 sólo se puede permitir si el modo del oscilador primario es XT, HS, XTPLL o HSPLL (modos basados en XTAL). Las demás 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 después de activar un POR. Esto permite la ejecución de código casi de inmediato mientras que el oscilador primario comienza y OST está funcionando. Cuando se sobrepasan los tiempos OST, el dispositivo automáticamente 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 después de un reset; el reloj INTRC se utiliza directamente en su baja frecuencia. Para utilizar un reloj con velocidad más alta en el inicio, se utilizan las fuentes de reloj INTOSC o postscaler fijando los bits, IRCF2:IRCF0, inmediatamente después 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 energía, 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)

Page 342: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

340

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 energía, incluyendo la instrucción SLEEP. En la práctica, esto significa que el usuario cambia los bits SCS1:SCS0 con la instrucción SLEEP antes de terminar los tiempos OST. Esto permite un uso brevemente del reinicio, realizar rutinas de “economía doméstica” devuelve del modo sleep antes de que el dispositivo empiece a operar con el oscilador primario.

El código 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 operación en caso de fallo del oscilador externo automáticamente cambiando el reloj del dispositivo al bloque interno del oscilador. El la función FSCM se permite activando la configuración del bit FCMEN.

Cuando se permite el FSCM, el oscilador INTRC funciona todas las veces que supervise los relojes de los periféricos y proporcione un reloj de reserva en caso de un fallo del reloj. La supervisión del reloj se logra creando una muestra de la señal, 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 periférico. El reloj del dispositivo periférico 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 todavía esté activo, se ha detectado un fallo del reloj. Esto provoca lo siguiente:

el FSCM genera una interrupción 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 condición 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 configuración del reloj y entrar en un modo de ahorro de energía diferente. Esto se puede hacer para realizar una recuperación parcial o ejecutar una parada controlada.

Page 343: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

341

Para utilizar una velocidad de reloj más alta en el reinicio, se pueden seleccionar el INTOSC o las fuentes del reloj del postscaler los bits IRCF2:IRCF0 inmediatamente después 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 detectaría, y no se puede realizar ninguna acción.

FIGURA 24-3: Diagrama De Bloques Del FSCM

3.4.24.4.1. FSCM Y El Temporizador Perro Guardián 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 ningún efecto sobre el oscilador INTRC cuando se activa el FSCM.

Según 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 ejecución del código. Si se permite el WDT con un valor pequeño de prescaler, disminuye la velocidad del reloj y permite que ocurra un desbordamiento del WDT y su correspondiente reset del dispositivo. Por esta razón, los acontecimientos del monitor de reloj a prueba de fallos también resetean el WDT y el postscaler, permitiendo comenzar la sincronización del cambio de la velocidad de ejecución y disminuyendo la probabilidad de un desbordamiento erróneo.

3.4.24.4.2. Salir De La Operación A Prueba De Fallos La condición a prueba de fallos termina por cualquier reset o entrando en un

modo de ahorro de energía. En el reset, el regulador comienza con la fuente primaria de reloj especificada en el registro de configuración 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

Page 344: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

342

monitor de reloj a prueba de fallos entonces reanuda la supervisión del reloj del periférico.

La fuente primaria de reloj puede que no llegue a estar lista en el inicio. En este caso, la operación se controla con el multiplexor INTOSC. El registro OSCCON seguirá en reset hasta que entre en un modo de ahorro de energía.

FIGURA 24-4: Diagrama De Tiempos Del FSCM

3.4.24.4.3. Interrupciones De FSCM Dentro De Los Modos De Ahorro De Energía

Entrando en un modo de ahorro de energía, el reloj del multiplexor selecciona la fuente de reloj elegida en el registro OSCCON. La supervisión del reloj a prueba de fallos de los modos de ahorro de energía de la fuente de reloj se reanuda en un modo de ahorro de energía.

Si ocurre un fallo del oscilador durante el modo de ahorro de energía, los acontecimientos subsecuentes dependen de si la interrupción de fallo del oscilador está permitida o no. Si está permitida (OSCFIF=1), la ejecución del código la controlará el multiplexor INTOSC. No habrá un cambio automático al reloj que ha fallado.

Si la interrupción no está activa, las siguientes interrupciones mientras que esté en modo reposo harán 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 diseñado para detectar fallos en el oscilador en cualquier punto

después de salir el dispositivo de un reset por aumento de energía (POR) o del modo de baja potencia sleep. Cuando el reloj primario del dispositivo es EC o INTRC, la supervisión puede comenzar inmediatamente después de estos acontecimientos.

En los modos del oscilador que implican un cristal o un resonador (HS, HSPLL o XT), la situación es algo diferente. Puesto que el oscilador puede necesitar un retraso de inicio considerablemente más 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

Page 345: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

343

oscilador interno se configura automáticamente 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 lógica que previene el oscilador de falsas interrupciones por fallo en un POR o al despertar del sleep también prevendrá la detección 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 sincronización para determinar si el oscilador está tardando demasiado en comenzar. Sin embargo, la interrupción de no fallo del oscilador se señalará.

También es posible seleccionar otra configuración del reloj e incorporar un modo de ahorro de energía suplente mientras que el reloj primario sea estable. Cuando el nuevo modo de ahorro de energía se selecciona, el reloj primario se desactiva.

3.4.24.5. Verificación Del Programa Y Código De Protección La estructura total del código de protección 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 límites binarios.

Cada uno de estos cinco bloques tiene tres códigos de protección asociados a ellos. Son:

Bit de protección del código (CPn) Bit de protección de la escritura (WRTn) Bit de lectura del bloque de tabla externa (EBTRn)

Page 346: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

344

FIGURA 24-5: CÓDIGO De Protección De La Memoria De Programa Para Los PIC18F2455/2550/4455/4550

TABLA 24-3: Sumario De Los Registros Del Código De Protección

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 están implementadas.

Nota 1: No implementado en los dispositivos PIC18Fx455; mantener este bit activo.

Page 347: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

345

3.4.24.5.1. Memoria De Programa Código De Protección La memoria de programa se puede leer o escribir en cualquier localización

usando las instrucciones de lectura y escritura en tabla. La identificación del dispositivo se puede leer con la lectura de tabla. Los registros de configuración se pueden leer y escribir con la lectura y escritura de tabla.

En el modo normal de ejecución, los bits CPn no tienen ningún 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 configuración 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 instrucción de lectura de tabla ejecutada dentro de ese bloque. Una instrucción de lectura de tabla que se ejecuta en una localización exterior de ese bloque no se permite y da lugar a ‘0’s.

Nota: Los bits de protección del código 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 código de protección se activan solamente con un borrado completo del chip o al borrar el bloque función. El borrado completo del chip y el borrado del bloque función sólo 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.

Page 348: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

346

FIGURA 24-7: Lectura Externa De Tabla Rechazada (EBTRn)

Resultados: Todas las lecturas de los bloques externas al Blockn están

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 localización TBLPTR.

Page 349: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

347

3.4.24.5.2. Datos EEPROM Código De Protección 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 protección.

3.4.24.5.3. Configuración Del Registro De Protección Los registros de configuración pueden protegerse contra la escritura. El bit

WRTC controla la protección de los registros de configuración. En modo de ejecución normal, el bit WRTC es solamente legible. WRTC sólo se puede escribir vía ICSP o con un programador externo.

3.4.24.6. Localizaciones De Identificación En ocho posiciones de memoria (200000h-200007h) se guardan como

localizaciones de identificación, en donde el usuario puede almacenar versiones u otros números de identificación del código. Éstas localizaciones son legibles y escribibles durante la ejecución normal con las instrucciones TBLRD y TBLWT o durante programación/verificación. Las localizaciones de identificación se pueden leer cuando se protege el código del dispositivo.

3.4.24.7. Programación Serie In-Circuit Los microcontroladores PIC18F2455/2550/4455/4550 pueden programarse en

serie en el circuito de la aplicación. Esto se hace simplemente con dos líneas para el reloj y los datos y tres otras líneas para la energía, tierra y tensión de programación. 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 también permite los firmwares más recientes o firmwares de encargo.

3.4.24.8. Depuración In-Circuit Cuando el bit de configuración DEBUG* se programa con un ‘0’, la

funcionalidad de la depuración “en Circuito” se permite. Esto permite funciones simples para eliminar errores cuando se utiliza MPLAB® IDE. Cuando el microcontrolador tiene esta característica permitida, algunos recursos no están disponibles en el uso general.

Para utilizar la función In-Circuit de la depuración del microcontrolador, el diseño debe implementar las conexiones de la programación In-Circuit: MCLR*/VPP/RE3, VDD, VSS, RB7 y RB6. Esto interconectará al módulo depuración In-Circuit disponible de microchip o de una de las compañías de herramientas de desarrollo.

Page 350: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

348

TABLA 24-4: Recursos De Depuración

Pines E/S: RB6, RB7

Pila: 2 niveles

Memoria de programa: 512 bytes

Memoria de datos: 10 bytes

3.4.24.9. Características Especiales De Icport (Señalando Paquetes Solamente)

Bajo circunstancias específicas, los pines que no se conectan (NC) de los dispositivos PIC18F4455/4550 de 44pines en encapsulado TQFP pueden proporcionar funcionalidad adicional. Éstas características se controlan con los bits de configuración del dispositivo y están disponibles solamente en este tipo de encapsulado y número 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 depuración In-Circuit (ICD) y la programación serie In-Circuit (ICSP). Estos pines se conocen como el puerto dedicado ICSP/ICD, puesto que no comparten ninguna otra función 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 estándares de E/S, poniendo los pines de E/S a disposición de la aplicación del usuario.

El puerto dedicado ICSP/ICD se permite activando el bit de configuración 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 configuración ICPRT puede estar programado con puerto ICSP por defecto.

2: El bit de configuración ICPRT debe mantenerse borrado en los dispositivos de 28pines y 40pines; si no, pueden ocurrir operaciones inesperadas.

Page 351: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

349

TABLA 24-5: Equivalencia De Pines Entre Los Puertos Dedicados Y Herencia ICD/ICSP

Nombre del pin

Puerto herencia

Puerto dedicado

Tipo de pin

Función del pin

MCLR*/VPP/ RE3

NC/ICRST*/ ICVPP Energía

Reset del dispositivo y permiso de

programación

RB6/KBI2/ PGC

NC/ICCK/ ICPGC Entrada Reloj serie

RB7/KBI3/ PGD

NC/ICDT/ ICPGD E/S Datos serie

3.4.24.9.2. Emulación De 28 Pines Los dispositivos PIC18F4455/4550 de 44 pines con encapsulado TQFP tienen la

capacidad de cambiar su configuración bajo control externo para depurar errores. Esto permite que el dispositivo se comporte como si fuera un PIC18F2455/2550 de 28pines.

Este modo de configuración de 28pines se controla a través de un solo pin, NC/ICPORTS. Conectar este pin a VSS fuerza al dispositivo para que funcione como un dispositivo de 28pines. Las características 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 configuración por defecto.

La opción de configuración sólo está disponible cuando se permite la depuración 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 Programación ICSP El bit de configuración LVP permite el suministro único de la programación

ICSP (conocida antes como Programación ICSP de baja tensión o LVP). Cuando el suministro único de programación se permite, el microcontrolador puede programarse sin requerir la tensión 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 programación, VDD se aplica al pin MCLR*/VPP/RE3 como en el modo de ejecución normal. Para entrar en modo de programación, VDD se aplica al pin PGM.

Page 352: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

350

Nota 1: La programación de alta tensión siempre está disponible, sin importar el estado del bit LVP, aplicando VIHH al pin MCLR*.

2: Mientras que en la programación de baja tensión del modo ICSP, el pin RB5 no puede utilizarse más como pin de entrada-salida y deber llevarse a un punto de tensión bajo durante la operación normal.

3: Al usar la programación de baja tensión 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 programación de baja tensión (CONFIG4L<2>=0); b) RB5/KBI1/PGM está en nivel bajo durante la entrada de ICSP.

Si el modo de programación 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 programación estándar de alta tensión (VIHH aplicado al pin MCLR*/VPP/RE3). Una vez que se haya inhabilitado LVP, solamente la programación de alta tensión estándar está disponible y debe utilizarse para programar el dispositivo.

La memoria sin código de protección 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 programación de baja tensión, el dispositivo necesita una VDD de 4,5V a 5,5V.

Page 353: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

351

3.5. FUSES DE PROGRAMACIÓN DE LA FAMILIA PIC18FXX5X Los fuses son los variables que hay que configurar dependiendo de la aplicación.

Existe el fuse del oscilador, de los prescaler…

3.5.1. PIC18F2455

3.5.1.1. 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)

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

Page 354: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

352

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. Bit De Permiso Del Monitor De Reloj De Seguridad:

3.5.1.6. Bit De Cambio Del Oscilador Interno/Externo: IESO = OFF Modo de cambio del oscilador desactivado

IESO = ON Modo de cambio del oscilador activo

3.5.1.7. Bit De Permiso Del Retraso En El Inicio: PWRT = ON PWRT activo

PWRT = OFF PWRT desactivado

FCMEM = OFF Monitor de reloj de seguridad desactivado

FCMEM = ON Monitor de reloj de seguridad activo

Page 355: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

353

3.5.1.8. Bit De Permiso Del Reset Por Cese De Tensión (BOR):

BOR = OFF BOR desactivado en hardware y software

BOR = SOFT BOR activo y controlado por software

(SBOREN activo)

BOR = ON_ACTIVE BOR activo sólo en hardware y desactivado en modo Sleep(SBOREN está desactivado)

BOR = ON BOR activo sólo en hardware

(SBOREN desactivado)

3.5.1.9. Bits De Tensión BOR: BORV = 0 Configuración máxima

BORV = 1

BORV = 2

BORV = 3 Configuración mínima

3.5.1.10. Bit De Permiso Del Regulador De Tensión USB:

3.5.1.11. Bit De Permiso Del Temporizador Watchdog: WDT = OFF HW Desactivado - SW Controlado

WDT = ON HW Activo - SW Desactivado

VREGEN = OFF Regulador de tensión USB desactivado

VREGEN = ON Regulador de tensión USB activo

Page 356: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

354

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

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

3.5.1.14. Bit De Permiso De La Potencia Del Oscilador Timer 1: LPT1OSC = OFF Timer 1 configurado para la operación de alta potencia

LPT1OSC = ON Timer 1 configurado para baja potencia

Page 357: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

355

3.5.1.15. 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 analógicas en el Reset

3.5.1.16. CCP2 MUX Bit: CCP2MX = OFF E/S CCP2 se multiplexa con RB3

CCP2MX = ON E/S CCP2 se multiplexa con RC1

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

3.5.1.18. Bit De Permiso Del ICSP:

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

3.5.1.20. 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 depropósito general

LVP = OFF ICSP desactivado

LVP = ON ICSP activo

Page 358: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

356

3.5.1.21. Bit Del Código De Protección En El Bloque 0: CP0 = ON Bloque 0 (000800-001FFFh) con código de protección

CP0 = OFF Bloque 0 (000800-001FFFh)

3.5.1.22. Bit Del Código De Protección En El Bloque 1: CP1 = ON Bloque 1 (002000-003FFFh) con código de protección

CP1 = OFF Bloque 1 (002000-003FFFh) sin código de protección

3.5.1.23. Bit Del Código De Protección En El Bloque 2: CP2 = ON Bloque 2 (004000-005FFFh) con código de protección

CP2 = OFF Bloque 2 (004000-005FFFh) sin código de protección

3.5.1.24. Bit Del Código De Protección En El Bloque De Inicio: CPB = ON Bloque de inicio (000000-0007FFh) con código de protección

CPB = OFF Bloque de inicio (000000-0007FFh) sin código de protección

3.5.1.25. Bit Del Código De Protección En La EEPROM De Datos: CPD = ON EEPROM de datos con código de protección

CPD = OFF EEPROM de datos sin código de protección

3.5.1.26. Bit De Protección Contra Escritura 0: WRT0 = ON Bloque 0 (000800-001FFFh) con protección contra escritura

WRT0 = OFF Bloque 0 (000800-001FFFh) sin protección contra escritura

3.5.1.27. Bit De Protección Contra Escritura 1: WRT1 = ON Bloque 1 (002000-003FFFh) con protección contra escritura

WRT1 = OFF Bloque 1 (002000-003FFFh) sin protección contra escritura

Page 359: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

357

3.5.1.28. Bit De Protección Contra Escritura 2: WRT2 = ON Bloque 2 (004000-005FFFh) con protección contra escritura

WRT2 = OFF Bloque 2 (004000-005FFFh) sin protección contra escritura

3.5.1.29. Bit De Protección Contra Escritura En El Bloque De Inicio:

3.5.1.30. Bits De Protección Contra Escritura En Los Registros De Configuración:

3.5.1.31. Bits De Protección Contra Escritura En La EEPROM De Datos:

3.5.1.32. Bit De Protección De La Lectura De Tabla Del Bloque 0:

EBTR0 = ON Bloque 0 (000800-001FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR0 = OFF Bloque 0 (000800-001FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.1.33. Bit De Protección De La Lectura De Tabla Del Bloque 1:

EBTR1 = ON Bloque 1 (002000-003FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR1 = OFF Bloque 1 (002000-003FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

WRTC = ON Bloque de inicio (000000-0007FFh) con protección contra escritura

WRTC = OFF Bloque de inicio (000000-0007FFh) sin protección contra escritura

WRTB = ON Registros de configuración (300000-3000FFh) con protección contra escritura

WRTB = OFF Registros de configuración (300000-3000FFh) sin protección contra escritura

WRTD = ON EEPROM de datos con protección contra escritura

WRTD = OFF EEPROM de datos sin protección contra escritura

Page 360: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

358

3.5.1.34. Bit De Protección De La Lectura De Tabla Del Bloque 2:

EBTR2 = ON Bloque 2 (004000-005FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR2 = OFF Bloque 2 (004000-005FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.1.35. Protección Contra La Lectura De Tabla Del Bloque De Inicio:

EBTRB = ON Bloque de inicio (000000-0007FFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTRB = OFF Bloque de inicio (000000-0007FFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.2. PIC18F2550

3.5.2.1. 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)

3.5.2.2. 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]

Page 361: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

359

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

3.5.2.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 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 HS oscilador, HS usado por USB

FOSC = HSPLL_HS HS oscilador, PLL activo, HS usado por USB

3.5.2.5. Bit De Permiso Del Monitor De Reloj De Seguridad:

3.5.2.6. Bit De Cambio Del Oscilador Interno/Externo: IESO = OFF Modo de cambio del oscilador desactivado

IESO = ON Modo de cambio del oscilador activo

FCMEM = OFF Monitor de reloj de seguridad desactivado

FCMEM = ON Monitor de reloj de seguridad activo

Page 362: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

360

3.5.2.7. Bit De Permiso Del Retraso En El Inicio: PWRT = ON PWRT activo

PWRT = OFF PWRT desactivado

3.5.2.8. Bit De Permiso Del Reset Por Cese De Tensión (BOR):

BOR = OFF BOR desactivado en hardware y software

BOR = SOFT BOR activo y controlado por software (SBOREN está activo)

BOR = ON_ACTIVE BOR activo sólo en hardware y desactivado en modo Sleep (SBOREN desactivado)

BOR = ON BOR activo sólo en hardware (SBOREN está desactivado)

3.5.2.9. Bits De Tensión BOR: BORV = 0 Configuración máxima

BORV = 1

BORV = 2

BORV = 3 Configuración mínima

3.5.2.10. Bit De Permiso Del Regulador De Tensión USB: VREGEN = OFF Regulador de tensión USB desactivado

VREGEN = ON Regulador de tensión USB activo

3.5.2.11. Bit De Permiso Del Temporizador Watchdog: WDT = OFF HW Desactivado - SW Controlado

WDT = ON HW Activo - SW Desactivado

Page 363: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

361

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

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

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

Page 364: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

362

3.5.2.15. 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 analógicas en el Reset

3.5.2.16. CCP2 MUX Bit: CCP2MX = OFF E/S CCP2 se multiplexa con RB3

CCP2MX = ON E/S CCP2 se multiplexa con RC1

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

3.5.2.18. Bit De Permiso Del ICSP: LVP = OFF ICSP desactivado

LVP = ON ICSP activo

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

3.5.2.20. 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 propósito general

3.5.2.21. Bit Del Código De Protección En El Bloque 0: CP0 = ON Bloque 0 (000800-001FFFh) con código de protección

CP0 = OFF Bloque 0 (000800-001FFFh) sin código de protección

Page 365: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

363

3.5.2.22. Bit Del Código De Protección En El Bloque 1: CP1 = ON Bloque 1 (002000-003FFFh) con código de protección

CP1 = OFF Bloque 1 (002000-003FFFh) sin código de protección

3.5.2.23. Bit Del Código De Protección En El Bloque 2: CP2 = ON Bloque 2 (004000-005FFFh) con código de protección

CP2 = OFF Bloque 2 (004000-005FFFh) sin código de protección

3.5.2.24. Bit Del Código De Protección En El Bloque 3: CP3 = ON Bloque 3 (006000-007FFFh) con código de protección

CP3 = OFF Bloque 3 (006000-007FFFh) sin código de protección

3.5.2.25. Bit Del Código De Protección En El Bloque De Inicio: CPB = ON Bloque de inicio (000000-0007FFh) con código de protección

CPB = OFF Bloque de inicio (000000-0007FFh) sin código de protección

3.5.2.26. Bit Del Código De Protección En La EEPROM De Datos: CPD = ON EEPROM de datos con código de protección

CPD = OFF EEPROM de datos sin código de protección

3.5.2.27. Bit De Protección Contra Escritura 0: WRT0 = ON Bloque 0 (000800-001FFFh) con protección contra escritura

WRT0 = OFF Bloque 0 (000800-001FFFh) sin protección contra escritura

3.5.2.28. Bit De Protección Contra Escritura 1: WRT1 = ON Bloque 1 (002000-003FFFh) con protección contra escritura

WRT1 = OFF Bloque 1 (002000-003FFFh) sin protección contra escritura

Page 366: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

364

3.5.2.29. Bit De Protección Contra Escritura 2: WRT2 = ON Bloque 2 (004000-005FFFh) con protección contra escritura

WRT2 = OFF Bloque 2 (004000-005FFFh) sin protección contra escritura

3.5.2.30. Bit De Protección Contra Escritura 3: WRT3 = ON Bloque 3 (006000-007FFFh) con protección contra escritura

WRT3 = OFF Bloque 3 (006000-007FFFh) sin protección contra escritura

3.5.2.31. Bit De Protección Contra Escritura En El Bloque De Inicio:

WRTB = ON Registros de configuración (300000-3000FFh) con protección contra escritura

WRTB = OFF Registros de configuración (300000-3000FFh) sin protección contra escritura

3.5.2.32. Bits De Protección Contra Escritura En Los Registros De Configuración:

WRTC = ON Bloque de inicio (000000-0007FFh) con protección contra escritura

WRTC = OFF Bloque de inicio (000000-0007FFh) sin protección contra escritura

3.5.2.33. Bits De Protección Contra Escritura En La EEPROM De Datos:

WRTD = ON EEPROM de datos con protección contra escritura

WRTD = OFF EEPROM de datos sin protección contra escritura

3.5.2.34. Bit De Protección De La Lectura De Tabla Del Bloque 0:

EBTR0 = ON Bloque 0 (000800-001FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR0 = OFF Bloque 0 (000800-001FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

Page 367: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

365

3.5.2.35. Bit De Protección De La Lectura De Tabla Del Bloque 1:

EBTR1 = ON Bloque 1 (002000-003FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR1 = OFF Bloque 1 (002000-003FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.2.36. Bit De Protección De La Lectura De Tabla Del Bloque 2:

EBTR2 = ON Bloque 2 (004000-005FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR2 = OFF Bloque 2 (004000-005FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.2.37. Bit De Protección De La Lectura De Tabla Del Bloque 3:

EBTR3 = ON Bloque 3 (006000-007FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR3 = OFF Bloque 3 (006000-007FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.2.38. Protección Contra La Lectura De Tabla Del Bloque De Inicio:

EBTRB = ON Bloque de inicio (000000-0007FFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTRB = OFF Bloque de inicio (000000-0007FFh) sin protección de la lectura de tabla ejecutado en otros bloques

Page 368: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

366

3.5.3. PIC18F4455

3.5.3.1. 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)

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

Page 369: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

367

3.5.3.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 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 HS oscilador, HS usado por USB

FOSC = HSPLL_HS HS oscilador, PLL activo, HS usado por USB

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

3.5.3.6. Bit De Cambio Del Oscilador Interno/Externo: IESO = OFF Modo de cambio del oscilador desactivado

IESO = ON Modo de cambio del oscilador activo

3.5.3.7. Bit De Permiso Del Retraso En El Inicio:

PWRT = ON PWRT activo

PWRT = OFF PWRT desactivado

Page 370: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

368

3.5.3.8. Bit De Permiso Del Reset Por Cese De Tensión (BOR):

BOR = OFF BOR desactivado en hardware y software

BOR = SOFT BOR activo y controlado por software (SBOREN está activo)

BOR = ON_ACTIVE BOR activo sólo en hardware y desactivado en modo Sleep (SBOREN desactivado)

BOR = ON BOR activo sólo en hardware (SBOREN está desactivado)

3.5.3.9. Bits De Tensión BOR: BORV = 0 Configuración máxima

BORV = 1

BORV = 2

BORV = 3 Configuración mínima

3.5.3.10. Bit De Permiso Del Regulador De Tensión USB: VREGEN = OFF Regulador de tensión USB desactivado

VREGEN = ON Regulador de tensión USB activo

3.5.3.11. Bit De Permiso Del Temporizador Watchdog: WDT = OFF HW Desactivado - SW Controlado

WDT = ON HW Activo - SW Desactivado

Page 371: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

369

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

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

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

Page 372: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

370

3.5.3.15. 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 analógicas en el Reset

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

3.5.3.18. Bit De Permiso Del ICSP: LVP = OFF ICSP desactivado

LVP = ON ICSP activo

3.5.3.19. Bit De Permiso Del Debug En-Circuito/Puerto De Programación (ICPORT):

ICPRT = OFF ICPORT desactivado

ICPRT = ON ICPORT activo

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

3.5.3.21. 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 propósito general

Page 373: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

371

3.5.3.22. Bit Del Código De Protección En El Bloque 0: CP0 = ON Bloque 0 (000800-001FFFh) con código de protección

CP0 = OFF Bloque 0 (000800-001FFFh) sin código de protección

3.5.3.23. Bit Del Código De Protección En El Bloque 1: CP1 = ON Bloque 1 (002000-003FFFh) con código de protección

CP1 = OFF Bloque 1 (002000-003FFFh) sin código de protección

3.5.3.24. Bit Del Código De Protección En El Bloque 2: CP2 = ON Bloque 2 (004000-005FFFh) con código de protección

CP2 = OFF Bloque 2 (004000-005FFFh) sin código de protección

3.5.3.25. Bit Del Código De Protección En El Bloque De Inicio:

3.5.3.26. Bit Del Código De Protección En La EEPROM De Datos: CPD = ON EEPROM de datos con código de protección

CPD = OFF EEPROM de datos sin código de protección

3.5.3.27. Bit De Protección Contra Escritura 0:

3.5.3.28. Bit De Protección Contra Escritura 1: WRT1 = ON Bloque 1 (002000-003FFFh) con protección contra escritura

WRT1 = OFF Bloque 1 (002000-003FFFh) sin protección contra escritura

CPB = ON Bloque de inicio (000000-0007FFh) con código de protección

CPB = OFF Bloque de inicio (000000-0007FFh) sin código de protección

WRT0 = ON Bloque 0 (000800-001FFFh) con protección contra escritura

WRT0 = OFF Bloque 0 (000800-001FFFh) sin protección contra escritura

Page 374: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

372

3.5.3.29. Bit De Protección Contra Escritura 2: WRT2 = ON Bloque 2 (004000-005FFFh) con protección contra escritura

WRT2 = OFF Bloque 2 (004000-005FFFh) sin protección contra escritura

3.5.3.30. Bit De Protección Contra Escritura En El Bloque De Inicio:

WRTB = ON Registros de configuración (300000-3000FFh) con protección contra escritura

WRTB = OFF Registros de configuración (300000-3000FFh) sin protección contra escritura

3.5.3.31. Bits De Protección Contra Escritura En Los Registros De Configuración:

WRTC = ON Bloque de inicio (000000-0007FFh) con protección contra escritura

WRTC = OFF Bloque de inicio (000000-0007FFh) sin protección contra escritura

3.5.3.32. Bits De Protección Contra Escritura En La EEPROM De Datos:

WRTD = ON EEPROM de datos con protección contra escritura

WRTD = OFF EEPROM de datos sin protección contra escritura

3.5.3.33. Bit De Protección De La Lectura De Tabla Del Bloque 0:

EBTR0 = ON Bloque 0 (000800-001FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR0 = OFF Bloque 0 (000800-001FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.3.34. Bit De Protección De La Lectura De Tabla Del Bloque 1:

EBTR1 = ON Bloque 1 (002000-003FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR1 = OFF Bloque 1 (002000-003FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

Page 375: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

373

3.5.3.35. Bit De Protección De La Lectura De Tabla Del Bloque 2:

EBTR2 = ON Bloque 2 (004000-005FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR2 = OFF Bloque 2 (004000-005FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.3.36. Protección Contra La Lectura De Tabla Del Bloque De Inicio:

EBTRB = ON Bloque de inicio (000000-0007FFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTRB = OFF Bloque de inicio (000000-0007FFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.4. PIC18F4550

3.5.4.1. 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)

3.5.4.2. 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]

Page 376: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

374

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

3.5.4.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 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 HS oscilador, HS usado por USB

FOSC = HSPLL_HS HS oscilador, PLL activo, HS usado por USB

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

3.5.4.6. Bit De Cambio Del Oscilador Interno/Externo: IESO = OFF Modo de cambio del oscilador desactivado

IESO = ON Modo de cambio del oscilador activo

Page 377: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

375

3.5.4.7. Bit De Permiso Del Retraso En El Inicio: PWRT = ON PWRT activo

PWRT = OFF PWRT desactivado

3.5.4.8. Bit De Permiso Del Reset Por Cese De Tensión (BOR):

BOR = OFF BOR desactivado en hardware y software

BOR = SOFT BOR activo y controlado por software (SBOREN está activo)

BOR = ON_ACTIVE BOR activo sólo en hardware y desactivado en modo Sleep (SBOREN desactivado)

BOR = ON BOR activo sólo en hardware (SBOREN está desactivado)

3.5.4.9. Bits De Tensión BOR: BORV = 0 Configuración máxima

BORV = 1

BORV = 2

BORV = 3 Configuración mínima

3.5.4.10. Bit De Permiso Del Regulador De Tensión USB: VREGEN = OFF Regulador de tensión USB desactivado

VREGEN = ON Regulador de tensión USB activo

3.5.4.11. Bit De Permiso Del Temporizador Watchdog: WDT = OFF HW Desactivado - SW Controlado

WDT = ON HW Activo - SW Desactivado

Page 378: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

376

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

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

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

Page 379: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

377

3.5.4.15. 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 analógicas en el Reset

3.5.4.16. CCP2 MUX Bit: CCP2MX = OFF E/S CCP2 se multiplexa con RB3

CCP2MX = ON E/S CCP2 se multiplexa con RC1

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

3.5.4.18. Bit De Permiso Del ICSP: LVP = OFF ICSP desactivado

LVP = ON ICSP activo

3.5.4.19. Bit De Permiso Del Debug En-Circuito/Puerto De Programación (ICPORT):

ICPRT = OFF ICPORT desactivado

ICPRT = ON ICPORT activo

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

3.5.4.21. 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 propósito general

Page 380: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

378

3.5.4.22. Bit Del Código De Protección En El Bloque 0: CP0 = ON Bloque 0 (000800-001FFFh) con código de protección

CP0 = OFF Bloque 0 (000800-001FFFh) sin código de protección

3.5.4.23. Bit Del Código De Protección En El Bloque 1: CP1 = ON Bloque 1 (002000-003FFFh) con código de protección

CP1 = OFF Bloque 1 (002000-003FFFh) sin código de protección

3.5.4.24. Bit Del Código De Protección En El Bloque 2: CP2 = ON Bloque 2 (004000-005FFFh) con código de protección

CP2 = OFF Bloque 2 (004000-005FFFh) sin código de protección

3.5.4.25. Bit Del Código De Protección En El Bloque 3:

3.5.4.26. Bit Del Código De Protección En El Bloque De Inicio: CPB = ON Bloque de inicio (000000-0007FFh) con código de protección

CPB = OFF Bloque de inicio (000000-0007FFh) sin código de protección

3.5.4.27. Bit Del Código De Protección En La EEPROM De Datos: CPD = ON EEPROM de datos con código de protección

CPD = OFF EEPROM de datos sin código de protección

3.5.4.28. Bit De Protección Contra Escritura 0: WRT0 = ON Bloque 0 (000800-001FFFh) con protección contra escritura

WRT0 = OFF Bloque 0 (000800-001FFFh) sin protección contra escritura

CP3 = ON Bloque 3 (006000-007FFFh) con código de protección

CP3 = OFF Bloque 3 (006000-007FFFh) sin código de protección

Page 381: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

379

3.5.4.29. Bit De Protección Contra Escritura 1: WRT1 = ON Bloque 1 (002000-003FFFh) con protección contra escritura

WRT1 = OFF Bloque 1 (002000-003FFFh) sin protección contra escritura

3.5.4.30. Bit De Protección Contra Escritura 2: WRT2 = ON Bloque 2 (004000-005FFFh) con protección contra escritura

WRT2 = OFF Bloque 2 (004000-005FFFh) sin protección contra escritura

3.5.4.31. Bit De Protección Contra Escritura 3: WRT3 = ON Bloque 3 (006000-007FFFh) con protección contra escritura

WRT3 = OFF Bloque 3 (006000-007FFFh) sin protección contra escritura

3.5.4.32. Bit De Protección Contra Escritura En El Bloque De Inicio:

WRTC = ON Bloque de inicio (000000-0007FFh) con protección contra escritura

WRTC = OFF Bloque de inicio (000000-0007FFh) sin protección contra escritura

3.5.4.33. Bits De Protección Contra Escritura En Los Registros De Configuración:

3.5.4.34. Bits De Protección Contra Escritura En La EEPROM De Datos:

WRTD = ON EEPROM de datos con protección contra escritura

WRTD = OFF EEPROM de datos sin protección contra escritura

WRTB = ON Registros de configuración (300000-3000FFh) con protección contra escritura

WRTB = OFF Registros de configuración (300000-3000FFh) sin protección contra escritura

Page 382: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

380

3.5.4.35. Bit De Protección De La Lectura De Tabla Del Bloque 0:

EBTR0 = ON Bloque 0 (000800-001FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR0 = OFF Bloque 0 (000800-001FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.4.36. Bit De Protección De La Lectura De Tabla Del Bloque 1:

EBTR1 = ON Bloque 1 (002000-003FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR1 = OFF Bloque 1 (002000-003FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.4.37. Bit De Protección De La Lectura De Tabla Del Bloque 2:

EBTR2 = ON Bloque 2 (004000-005FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR2 = OFF Bloque 2 (004000-005FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.4.38. Bit De Protección De La Lectura De Tabla Del Bloque 3:

EBTR3 = ON Bloque 3 (006000-007FFFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTR3 = OFF Bloque 3 (006000-007FFFh) sin protección de la lectura de tabla ejecutado en otros bloques

3.5.4.39. Protección Contra La Lectura De Tabla Del Bloque De Inicio:

EBTRB = ON Bloque de inicio (000000-0007FFh) con protección de la lectura de tabla ejecutado en otros bloques

EBTRB = OFF Bloque de inicio (000000-0007FFh) sin protección de la lectura de tabla ejecutado en otros bloques

Page 383: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

4. LENGUAJE DE PROGRAMACIÓN

C18

Page 384: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 385: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

383

4. LENGUAJE DE PROGRAMACIÓN C18

4.1. INTRODUCCIÓN El lenguaje C fue creado en los años 70 para escribir el código del sistema

operativo UNIX. Tanto por su origen como por sus características, es un lenguaje muy adecuado para la programación de sistemas, ya que combina la abstracción de los lenguajes de alto nivel con la eficiencia del lenguaje máquina.

La amplia utilización 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 versión estándar de C. En 1983, se creó el comité técnico X3J11 bajo la supervisión de American National Standards Comitte on Computer and Information Processing (X3), para “proporcionar una definición del lenguaje clara e independiente de la computadora”. En 1989, el estándar fue aprobado. ANSI cooperó con la International Organization for Standardization (ISO) para estandarizar C a nivel mundial; el documento conjunto del estándar se publicó en 1990 y se conoce como ANSI/ISO9899:1990 o ANSI C.

Entre las características de este lenguaje cabe citar que es altamente portable, es muy flexible, genera código muy eficiente y permite escribir código muy compacto (se pueden realizar muchas funciones escribiendo pocas líneas de código).

El C18 es una versión del C creada específicamente para los microcontroladores PIC18, que por sus características resulta demasiado complicado la programación en su lenguaje de bajo nivel, el Assambler.

4.2. COMPILADOR MPLAB C18

4.2.1. INTRODUCCIÓN El compilador MPLAB C18 es un compilador que optimiza el estándar ANSI C

en los microcontroladores PIC18. El compilador modifica el estándar ANSI X3.159-1989 sólo en los puntos en los que se puedan crear conflictos con el soporte del microcontrolador.

El MPLAB C18 tiene las siguientes características:

Compatibilidad ANSI ’89.

Integración con el MLAB IDE para una mayor facilidad de realización y debugg de proyectos.

Admite ensamblador empotrado.

Gran variedad de librerías.

Page 386: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

384

Optimización multinivel.

Acceso transparente en la lectura/escritura de la memoria.

Versión estudiante gratuita.

En este manual, aparecen en verde y con tipo de letra Comic Sans MS el código fuente y en verde con tipo de letra Times New Roman las notas del código.

4.2.2. TIPOS DE DATOS Los datos de más 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. Enteros

Tipo Tamaño Mínimo Máximo

Char 8 bits -128 127

Signedchar 8 bits -128 127

Unsigned char 8 bits 0 255

Int 16 bits -32768 32767

Unsigned Int 16 bits 0 65535

Short 16 bits -32768 32767

Unsigned Short 16 bits 0 65535

Short long 24 bits -8.388.608 8.388.607

Unsigned short long 24 bits 0 16.777.215

Long 32 bits -2.147.483.648 2.147.483.647

Unsigned long 32 bits 0 4.294.967.295

4.2.2.2. Reales Tipo Tamaño Exponente Mínimo Exponente Máximo

Float 32 bits -126 128

Double 32 bits -126 128

Page 387: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

385

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: Las variables se declaran globales si se ha hecho fuera de las

funciones y locales si se realiza en las funciones.

Tienen prioridad las locales. Todas las variables no inicializadas tienen un valor indefinido.

Externa: La variable declarada pertenece a otro módulo, por lo que no

reserva memoria para ella.

Sirve para acceder a una variable aunque no se haya declarado todavía.

Se inicializan a cero.

Register: La variable se guarda en uno de los registros del procesador.

Si no se puede almacenar en un registro, se comporta como Auto.

Útil para optimizar el tiempo de ejecución de algunas funciones.

Page 388: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

386

Static: Variables locales que retiene su valor al salir de la función en la

que se ha declarado.

Se inicializan a cero.

Ahorra número de instrucciones para acceder a las variables.

Typedef: Asigna un nuevo nombre a un tipo de datos.

Overlay: Declara las variables locales Static pero se inicializan cada vez

que se llama la función.

Ahorra espacio de memoria.

4.2.2.5. Calificadores Const: Definición 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 código, podemos acceder a objetos por encima de 64KB.

Near: La variable se declara en el banco de acceso. Si se declara código, accedemos a una zona inferior de 64KB.

RAM: La variable se sitúa en la memoria de datos.

ROM: La variable se sitúa 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 expresión,

que se comprueba al comenzar el bucle, sea falso, es decir cero.

while (expresión) Instrucción 1 Instrucción 2 ... Instrucción n

Page 389: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

387

4.2.3.1.2. Sentencia Do Las instrucciones se ejecutan repetidamente hasta que el valor de la expresión,

que se comprueba al final del bucle, sea falso, es decir cero.

do Instrucción 1 Instrucción 2 ... Instrucción n while ( expresión );

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 evalúa al final del mismo.

for( exp1; exp 2; exp 3) Instrucción 1 Instrucción 2 ... Instrucción n

4.2.3.1.4. Sentencia If La expresión se evalúa y si es verdadera (distinta de cero) se ejecutan las

instrucciones.

If( expresión ) Instrucción 1 Instrucción 2 ... Instrucción n

4.2.3.1.5. Sentencia If-Else La expresión se evalúa, si es verdadera se ejecutan las instrucciones A, en caso

contrario las Instrucciones B.

If( expresión ) Instrucciones A else Instrucciones B

Page 390: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

388

4.2.3.1.6. Sentencia Switch Permite realizar selecciones múltiples. switch ( expresión ) case const1: Instrucción 1; break; case const2: Instrucción 2; break; ... default: Instrucción n break;

4.2.3.1.7. Sentencia Break Interrumpe la ejecución de un bucle while, do-while o for.

Ejemplo: ¿ cómo 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 repetición.

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 utilización ya que varía la estructura del programa.

Page 391: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

389

4.2.4. PUNTEROS Un puntero es una variable que contiene la dirección a una zona de memoria en

la que se almacena una variable.

Los punteros ocupan 16Bits.

char car; //variable de tipo char char *pcar; //puntero a una variable char car=0xAA //almacena el dato hexadecimal AA pcar=&car //almacena la dirección de la variable car, & devuelve la dirección

Otra forma de acceso:

char *pcar; //puntero a una variable char pcar=(char*)0x501 //almaceno en el puntero la dirección de memoria 501 *pcar=0xAA //almaceno en la dirección de memoria que tiene el puntero, el dato 0xAA

Optimizando este código:

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

Page 392: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

390

4.3. LIBRERÍAS DEL C18 Una librería es una colección de funciones agrupadas por referencia y facilidad

de llamada.

En este apartado aparecen las librerías utilizadas en el proyecto.

Las librerías relacionadas con el USB no se instalan con el compilador, teniendo que descargarse de la página del fabricante; el resto se encuentran en la carpeta lib dentro de la carpeta de instalación del MPLAB C18.

4.3.1. ABREVIATURAS EN LAS LIBRERÍAS DE MICROCHIP

A

ACM Modelo abstracto de control

ACT Actividad, activa

ADR Dirección

ALLOC Asignación

ALT Alterno

AUX Auxiliar

B

BD Buffer Descriptor

BDT Tabla del buffer descriptor

BUFF Buffer

C

CDC Clase del dispositivo

CFG Configuración

CLR borrar

CLS Clase

CTRL Control

D

DC Clase del dispositivo

DEF Definición

DEFS ver DEF

DEV Dispositivo

DIR Dirección

Page 393: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

391

DSC Descriptor

E

ENDP Endpoint

EP Endpoint

EXT Externo

F

FN funcional

FS Full-Speed

H

HID Dispositivo interfaz humana

I

INIT inicializar

INT Interrupción/interno

INTF Interfaz

IO Entrada-salida

ISOCH Síncrono

ISR Rutina del servicio de interrupción

L

LANG Lenguaje

LEN Longitud

LS Low-speed

M

MAX Máximo

MCHP Tecnología de microchip

MEM Memoria

MFR Fabricante, fabricación, fabricación

MGT Gerencia

MIN Mínimo

MSD Dispositivo de almacenamiento masivo

Page 394: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

392

N

NUM Número

O

OP Operacional

P PKT Paquete PID Paquete de identificación PP Ping-pong PREP Preparación PTR Puntero

R RDY listo REG registro REQ Petición RCPT Receptor RPT Informe RWU Reinicio remoto RX recibir

S

SIE Motor de la interfaz serie

STAT Estado

STD Estándar

SYNCH síncrono, sincronización

SYS Sistema

T TEL Teléfono

TR Emisor

TRF Transferencia

TX transmisión

Page 395: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

393

U

USB Bus serie universal

UTIL Utilidad

V

VAR Variable

VAL Valor

VEND Vendedor

Z

ZLP Paquete cero de longitud

4.3.2. ADC.H: LIBRERÍA DE LOS CONVERSORES A/D Con esta libraría se tratan los conversores analógico-digitales, desde su

configuración hasta su lectura.

Para poder llamar a las funciones, como se indica en el código, hay que incluir la librería de la siguiente forma:

#include <adc.h>

4.3.2.1. Descripción De Las Funciones

char BusyADC(void) Comprueba si el conversor está realizando una conversión o no. Devuelve un 1

si el conversor A/D realiza la conversión y un 0 si no lo hace.

BusyADC();

void CloseADC(void) Desactiva el conversor A/D y el mecanismo de interrupción.

CloseADC();

void ConvertADC(void) Esta función comienza la conversión A/D. Se puede utilizar BusyADC() para

detectar el final de la conversión.

ConvertADC();

Page 396: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

394

void OpenADC(unsigned char config, unsigned char config2, unsigned char portconfig)

Esta función resetea los registros asociados al conversor A/D al estado POR y configura el reloj, el formato del resultado, tensión de referencia, puerto y canal.

Hay variaciones dependiendo del microcontrolador. Lo que se expone aquí es para la mayoría 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

Justificación del resultado A/D: ADC_RIGHT_JUST Resultado en los bits menos significativos

ADC_LEFT_JUST Resultado en los bits más significativos

Selectores del tiempo de adquisición 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

Page 397: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

395

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

Configuración 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 configuración de los puertos.

OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD, DC_CH0 & ADC_INT_OFF, 15;

Page 398: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

396

int ReadADC(void) Esta función devuelve los 16 bits con signo resultado de la conversión A/D.

Basándose en la configuración del conversor A/D, el resultado puede almacenarse en los bits menos o más significativos.

int resultado; resultado=ReadADC();

void SetChanADC(unsigned char channel) Selecciona al canal que se va a utlizar en el código.

Si se han activado los canales AN0 y AN1, antes de leer el AN1 hay que llamar esta función 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);

Page 399: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

397

4.3.3. PWM.H: FUNCIONES DEL PWM Y EPWM Esta librería trata la modulación de ancho de pulso tanto de los CCP como de los

mejorados.

Todas las funciones aparecen con una x, esta corresponde al número del CCP que se está utilizando.

La forma de invocar las funciones está escrita en verde (código). Antes de llamar las funciones hay que incluir la librería:

#include <pwm.h>

Para que la modulación funcione correctamente hay que activar el Timer 2, se explica en este capítulo.

4.3.3.1. Descripción De Las Funciones

void ClosePWMx(void) y void CloseEPWM1(void) Esta función desactiva el canal PWM específico. La x corresponde al canal.

ClosePWM2();

void OpenPWMx(char period) y void OpenEPWM1(char period) Esta función configura el canal PWM específico por periodo y por base de

tiempos. El PWM sólo utiliza el Timer2.

Para que funcione el PWM, antes hay que abrir el Timer2 con la función OpenTimer2(…).

period:

Puede ser un valor de 0x00 a 0xFF. Este dato determina la frecuencia del PWM mediante la fórmula:

)2____(4]1)[(_ TMRdeprescalerdelValorTperiodPWMPeriodo OSC •••+= OpenPWM2(0xFF);

void SetDCPWMx(unsigned int dutycicle) y void SetDCPEPWM1(unsigned int dutycicle)

Esta función 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 sólo se almacenarán los 10 bits de menos peso.

SetDCPWM2(0x0F0);

Page 400: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

398

void SetOutputEPWM1(unsigned char outputconfig, unsigned char outputmode)

Esta función configura la salida del módulo 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);

Page 401: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

399

4.3.4. TIMERS.H: FUNCIONES DE LOS TEMPORIZADORES Esta librería es la encargada de los temporizadores.

En esta traducción de la librería de Microchip sólo aparecen las palabras de configuración válidas para la familia PIC18Fxx5x, ya que varía dependiendo del microprocesador.

Para incluirla hay que escribir al principio del archivo:

#include <timers.h>

4.3.4.1. Descripción de las funciones

void CloseTimerx(void) Esta función desactiva el temporizador x y su interrupción.

CloseTimer2();

void OpenTimer0(unsigned char config); Esta función configura el Timer0 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer0: TIMER_INT_ON Activa

TIMER_INT_OFF Desactiva

Tamaño 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

Page 402: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

400

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 función configura el Timer1 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer1: TIMER_INT_ON Activa

TIMER_INT_OFF Desactiva

Tamaño 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

Page 403: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

401

Oscilador: T1_OSC1EN_ON Activo

T1_OSC1EN_OFF Desactivo

Sincronización del reloj de entrada: T1_SYNC_EXT_ON Sincronización 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 función configura el Timer2 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción 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

Page 404: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

402

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 OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_8)

void OpenTimer3(unsigned char config); Esta función configura el Timer3 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer3: TIMER_INT_ON Activa

TIMER_INT_OFF Desactiva

Tamaño 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

Sincronización del reloj de entrada: T3_SYNC_EXT_ON Sincronización 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

Page 405: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

403

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 función 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 función escribe un valor en el/los registros específicos 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);

Page 406: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

404

4.3.5. DELAYS.H: RETRASOS POR SOFTWARE Las funciones delay ejecutan un código de un número específico 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. Descripción De Las Funciones

void Delay1TCY(void) Esta función es una definición de la instrucción NOP. Cuando se encuentra en el

código, el compilador inserta un NOP.

Delay1TCY();

void Delay10TCYx(unsigned char unit) Esta función crea un retraso en múltiplos de 10 ciclos de instrucción.

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 función crea un retraso en múltiplos de 100 ciclos de instrucción.

Esta función utiliza la variable global DelayCounter1. Si se utliza la función en las interrupciones y en el código, la variable anterior se tiene que almacenar y recuperar en el código de la interrupción. 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();

Page 407: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

405

void Delay1KTCYx(unsigned char unit) Esta función crea un retraso en múltiplos de 1 000 ciclos de instrucción.

Esta función utiliza la variable global DelayCounter1 y DelayCounter2. Si se utliza la función en las interrupciones y en el código, las variables anteriores se tienen que almacenar y recuperar en el código de la interrupción. 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 función crea un retraso en múltiplos de 10 000 ciclos de instrucción.

Esta función utiliza la variable global DelayCounter1 y DelayCounter2. Si se utliza la función en las interrupciones y en el código, las variables anteriores se tienen que almacenar y recuperar en el código de la interrupción. 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();

Page 408: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

406

4.3.6. LIBRERÍAS DEL USB Las librerías 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 líneas que dependen de la clase. Y en verde la parte de la librería que es código, aunque el texto en rojo y en azul también es código.

Para realizar una conexión sin características específicas, lo recomendable es utilizar la clase genérica (GEN) ya que permite una velocidad más alta que la clase CDC, aunque esta última se utiliza por resultar más fácil la programación del host. Para ello se copian todas las librerías de esta clase que suministra Microchip y se modifican las líneas que aquí aparecen en rojo. Lo más importante es definir bien las interfaces y los Endpoints.

Para realizar una aplicación en una clase determinada, lo más sencillo es copiar todas las librerías de esa clase, corregirlas y modificar las librerías user.h y las aquí comentadas. Haciendo esto, nos evitamos tener que modificar el código al cambiar la clase del dispositivo.

Para más información visitar la página web de microchip, en la que hay ejemplos de cada clase.

4.3.6.1. Usb.h Esta librería proporciona la forma de incluir todos los archivos necesarios del

firmware del USB de Microchip.

En realidad, es la única librería que hay que incluir en el programa de inicio, ya que se encarga de añadir las demás.

El orden de inclusión 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"

Page 409: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

407

Si USB_USE_HID está definida se incluye la librería hid.h

#if defined(USB_USE_HID) Ver autofiles\usbcfg.h #include "system\usb\class\hid\hid.h" #endif

Si USB_USE_MSD está definida se incluye la librería msd.h

#if defined(USB_USE_MSD) Ver autofiles\usbcfg.h #include "system\usb\class\msd\msd.h" #endif

Si USB_USE_CDC está definida se incluye la librería cdc.h

#if defined(USB_USE_CDC) Ver autofiles\usbcfg.h #include "system\usb\class\cdc\cdc.h" #endif

Page 410: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

408

4.3.6.2. Usbcfg.h: Configuración Esta librería es la encargada de la configuración del buffer por defecto, del

Endpoint 0, de los Endpoints utilizados en la comunicación… Hay que modificarla en cada aplicación.

4.3.6.2.1. Definiciones Tamaño del buffer del Endpoint 0 (8, 16 32 ó 64):

#define EP0_BUFF_SIZE 8

Número máximo de interrupciones:

#define MAX_NUM_INT 1

Definición de parámetros descritos en usbdrv.h:

Modo Ping-Pong:

#define MODE_PP _PPBM0

Valor de configuración:

#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 realizarán cuando sea necesario, siendo totalmente independiente una de la otra.

4.3.6.2.2. Uso de la clase del dispositivo Dependiendo de la aplicación 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 Uso de la clase Almacenamiento masivo: #define USB_USE_MSD

MUID = Microchip USB Clase ID

Se utiliza para identificar la clase del USB de la sesión actual de control de la transferencia del EP0:

#define MUID_NULL 0 Ninguna #define MUID_USB9 1 USB9 #define MUID_HID 2 Interfaz humana #define MUID_CDC 3 Clase de comunicación del dispositivo

Page 411: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

409

4.3.6.2.3. Distribución de los Endpoint #define HID_INTF_ID 0x00 Identificación de la interfaz #define HID_UEP UEP1 Endpoints que se utlizan #define HID_BD_OUT ep1Bo Buffer descriptor de salida #define HID_INT_OUT_EP_SIZE 3 Tamaño de la interrupción del Endpoint de salida #define HID_BD_IN ep1Bi Buffer descriptor de entrada #define HID_INT_IN_EP_SIZE 3 Tamaño de la interrupción del Endpoint de entrada #define HID_NUM_OF_DSC 1 Número de descriptores #define HID_RPT01_SIZE 50 Tamaño del informe

Macros HID Ver la dirección del descriptor HID:

#define mUSBGetHIDDscAdr(ptr) if(usb_active_cfg == 1) ptr = (rom byte*)&cfg01.hid_i00a00;

Ver la dirección del informe del descriptor HID:

#define mUSBGetHIDRptDscAdr(ptr) if(usb_active_cfg == 1) ptr = (rom byte*)&hid_rpt01;

Ver el tamaño del informe del descriptor HID:

#define mUSBGetHIDRptDscSize(count) if(usb_active_cfg == 1) count = sizeof(hid_rpt01);

Número máximo de Endpoints:

#define MAX_EP_NUMBER 1 //UEP1

Page 412: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

410

4.3.6.3. Usbdefs_std_dsc.h: Definiciones estándar de los descriptores: Mediante esta libraría se crean las estructuras de los descriptores estándar, se

definen constantes para realizar el código más rápidamente, etc.

En general, no hay que modificar nada de la librería. En nuestra aplicación copiaremos la que cede Microchip que corresponda con nuestra clase.

4.3.6.3.1. Incluye: #include "system\typedefs.h" Librería en la que se definen tipos de datos

4.3.6.3.2. Definiciones Tipos de descriptores:

#define DSC_DEV 0x01 Descriptor del dispositivo #define DSC_CFG 0x02 Descriptor de configuración #define DSC_STR 0x03 Descriptor de la secuencia #define DSC_INTF 0x04 Descriptor de la interfaz #define DSC_EP 0x05 Descriptor del Endpoint

Definición de los Endpoint (sólo usarse con los descriptores, para cualquier otro uso utilizar los definidos en usbdrv.h):

#define _EP01_OUT 0x01 #define _EP01_IN 0x81 #define _EP02_OUT 0x02 #define _EP02_IN 0x82 #define _EP03_OUT 0x03 #define _EP03_IN 0x83 #define _EP04_OUT 0x04 #define _EP04_IN 0x84 #define _EP05_OUT 0x05 #define _EP05_IN 0x85 #define _EP06_OUT 0x06 #define _EP06_IN 0x86 #define _EP07_OUT 0x07 #define _EP07_IN 0x87 #define _EP08_OUT 0x08 #define _EP08_IN 0x88 #define _EP09_OUT 0x09 #define _EP09_IN 0x89 #define _EP10_OUT 0x0A #define _EP10_IN 0x8A #define _EP11_OUT 0x0B #define _EP11_IN 0x8B

Page 413: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

411

#define _EP12_OUT 0x0C #define _EP12_IN 0x8C #define _EP13_OUT 0x0D #define _EP13_IN 0x8D #define _EP14_OUT 0x0E #define _EP14_IN 0x8E #define _EP15_OUT 0x0F #define _EP15_IN 0x8F

Atributos de configuración:

#define _DEFAULT 0x01<<7 Valor por defecto (El Bit 7 se activa) #define _SELF 0x01<<6 Auto-alimentado (Mantener si está activo) #define _RWU 0x01<<5 Reinicio remoto (Mantener si está activo)

Tipo de transferencia del Endpoint:

#define _CTRL 0x00 Transferencia de control #define _ISO 0x01 Transferencia síncrona #define _BULK 0x02 Transferencia Bulk #define _INT 0x03 Transferencia interrupción

Tipo de sincronización del Endpoint de transferencia síncrona:

#define _NS 0x00<<2 Sin sincronización #define _AS 0x01<<2 Asíncrona #define _AD 0x02<<2 Adaptivo #define _SY 0x03<<2 Síncrona

Utilización del Endpoint tipo síncrono:

#define _DE 0x00<<4 Endpoint de datos #define _FE 0x01<<4 Endpoint retroalimentado #define _IE 0x02<<4 Endpoint de datos y retroalimentado

4.3.6.3.3. Estructuras Estructura de los descriptores del dispositivo USB (ver usbdsc.c):

typedef struct _USB_DEV_DSC Longitud; Tipo de descriptor; Bcd del USB; byte bLength; byte bDscType; word bcdUSB; Clase del dispositivo; Subclase del dispositivo; Protocolo del dispositivo; byte bDevCls; byte bDevSubCls; byte bDevProtocol; Tamaño máximo del paquete; Identificador del fabricante; Identificación del producto; byte bMaxPktSize0; word idVendor; word idProduct; Bcd del dsipositivo; Información de la manufactura; Información del producto; word bcdDevice; byte iMFR; byte iProduct; Número de serie; Número de configuración;

Page 414: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

412

byte iSerialNum; byte bNumCfg; USB_DEV_DSC;

Estructura del descriptor de configuración del USB: typedef struct _USB_CFG_DSC Longitud; Tipo de descriptor; Longitud total; byte bLength; byte bDscType; word wTotalLength; Número de interfaz; Valor de configuración; Información de configuración; byte bNumIntf; byte bCfgValue; byte iCfg; Atributos; Máxima energía; byte bmAttributes; byte bMaxPower; USB_CFG_DSC;

Estructura de la interfaz del dispositivo USB:

typedef struct _USB_INTF_DSC Longitud; Tipo de descriptor; Número de interfaz; byte bLength; byte bDscType; byte bIntfNum; Configuración alterna; Número de Endpoints; Clase de interfaz; byte bAltSetting; byte bNumEPs; byte bIntfCls; Subclase de interfaz; Protocolo de la interfaz; Información de la interfaz; byte bIntfSubCls; byte bIntfProtocol; byte iIntf; USB_INTF_DSC;

Estructura del Descriptor del Endpoint del USB:

typedef struct _USB_EP_DSC Longitud; Tipo de descriptor; Dirección del Endpoint; byte bLength; byte bDscType; byte bEPAdr; Atributos; Tamaño máximo del paquete; Intervalo; byte bmAttributes; word wMaxPktSize; byte bInterval; USB_EP_DSC;

Page 415: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

413

4.3.6.4. Usbdsc.h: Descriptores Esta es una de las librerías más importantes, ya que en ella se definen los

descriptores.

Como hemos visto anteriormente, los descriptores definen la interfaz, la clase, el fabricante, etc.

Esta librería suele ser totalmente distinta en cada aplicación.

4.3.6.4.1. Librerías 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 Configuración 01 USB_CFG_DSC cd01; Descriptor de configuración USB_INTF_DSC i00a00; Descriptor de la interfaz USB_EP_DSC ep01o_i00a00; Endpoint descriptor de salida USB_EP_DSC ep01i_i00a00; Endpoint descriptor de entrada cfg01

4.3.6.4.3. Externas extern rom USB_DEV_DSC device_dsc; extern CFG01; extern rom structbyte bLength;byte bDscType;word string[1];sd000;

Page 416: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

414

4.3.6.5. Usbdefs_ep0_buff.h: Descripciones Del Buffer Del Endpoint 0 La librería actual recopila las características del Endpoint 0 y de su buffer, no

hay que modificarla ya que las variables se han declarado en otras librerías.

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 tamaño del buffer del Endpoint

0 es el especificado en la librería usbcfg.h.

El tamaño del buffer puede ser de 8, 16, 32 ó 64.

Los primeros 8bytes se definen para direccionarse directamente para mejorar la velocidad y reducir el tamaño del código. El resto de bytes se direccionan indirectamente.

typedef union _CTRL_TRF_SETUP Matriz para el direccionamiento indirecto struct byte _byte[EP0_BUFF_SIZE]; ; Respuestas estándar del dispositivo struct byte bmRequestType; Tipo de respuesta byte bRequest; Respuesta word wValue; Valor word wIndex; Índice word wLength; Longitud ; struct unsigned :8; unsigned :8; WORD W_Value; Valor WORD W_Index; Índice WORD W_Length; Longitud ; struct

Page 417: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

415

unsigned Recipient:5; Dispositivo, Interfaz, Endpoint, Otro unsigned RequestType:2; Estándar, Clase, Fabricante, Reservado unsigned DataDir:1; Host-al-dispositivo, Dispositivo-al-host unsigned :8; byte bFeature; Reinicio remoto, Paro del Endpoint unsigned :8; unsigned :8; unsigned :8; unsigned :8; unsigned :8; ; struct unsigned :8; unsigned :8; byte bDscIndex; Sólo para configuración y String del descriptor byte bDscType; Dispositivo, Configuración, String word wLangID; Identificación de idioma unsigned :8; unsigned :8; ; struct unsigned :8; unsigned :8; BYTE bDevADR; Dirección del dispositivo 0-127 byte bDevADRH; Tiene que ser cero unsigned :8; unsigned :8; unsigned :8; unsigned :8; ; struct unsigned :8; unsigned :8; byte bCfgValue; Valor de configuración 0-255 byte bCfgRSD; Tiene que ser cero (Reservado) unsigned :8; unsigned :8; unsigned :8; unsigned :8; ; struct

Page 418: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

416

unsigned :8; unsigned :8; byte bAltID; Valor alterno de configuración 0-255 byte bAltID_H; Tiene que ser cero byte bIntfID; Valor del número de interfaz 0-255 byte bIntfID_H; Tiene que ser cero unsigned :8; unsigned :8; ; struct unsigned :8; unsigned :8; unsigned :8; unsigned :8; byte bEPID; Identificación del Endpoint ID (Número y Dirección) byte bEPID_H; Tiene que ser cero unsigned :8; unsigned :8; ; struct unsigned :8; unsigned :8; unsigned :8; unsigned :8; unsigned EPNum:4; Número del Endpoint 0-15 unsigned :3; unsigned EPDir:1; Dirección del Endpoint: 0-OUT, 1-IN unsigned :8; unsigned :8; unsigned :8; ; CTRL_TRF_SETUP;

Page 419: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

417

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;

Page 420: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

418

4.3.6.6. Usbmmap.h Esta librería define constantes y estructuras utilizadas por otras.

El programador, salvo excepción, no tiene que modificarla utilizándola tal y como aparece.

4.3.6.6.1. Incluye #include "system\typedefs.h"

4.3.6.6.2. Definiciones Parámetros de inicialización del descriptor del registro estado:

#define _BSTALL 0x04 Parada del buffer activa #define _DTSEN 0x08 Dato de sincronización activo #define _INCDIS 0x10 Incremento de dirección desactivado #define _KEN 0x20 Guardado del buffer descriptor por el SIE activo #define _DAT0 0x00 Paquete DATA0 esperando el siguiente #define _DAT1 0x40 Paquete DATA1 esperando el siguiente #define _DTSMASK 0x40 Máscara DTS #define _USIE 0x80 El SIE controla el buffer #define _UCPU 0x00 La CPU controla el buffer

Estados del dispositivo USB. Para utilizarlos con [byte usb_device_state]:

#define DETACHED_STATE 0 Sin conexión #define ATTACHED_STATE 1 Conectado #define POWERED_STATE 2 Alimentado #define DEFAULT_STATE 3 Por defecto #define ADR_PENDING_STATE 4 Pendiente de dirección #define ADDRESS_STATE 5 Direccionado #define CONFIGURED_STATE 6 Configurado

Tipos de memoria para el control de transferencias, utilizado en USB_DEVICE_STATUS:

#define _RAM 0 #define _ROM 1

Page 421: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

419

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 Estado del buffer descriptor byte _byte; struct unsigned BC8:1; unsigned BC9:1; unsigned BSTALL:1; Parada del buffer activa unsigned DTSEN:1; Dato de sincronización activo unsigned INCDIS:1; Incremento de dirección desactivado unsigned KEN:1; Guardado del buffer descriptor por el SIE activo unsigned DTS:1; Valor del dato de sincronización unsigned UOWN:1; Propiedad del USB ; 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; Paquete de identificación unsigned :2; ; BD_STAT; typedef union _BDT Tabla del buffer descriptor

Page 422: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

420

struct BD_STAT Stat; byte Cnt; byte ADRL; Dirección del buffer baja byte ADRH; Dirección del buffer alta ; struct unsigned :8; unsigned :8; byte* ADR; Dirección del Buffer ; BDT;

4.3.6.6.4. 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; Buffer descriptor del Endpoint #0 Out extern volatile far BDT ep0Bi; Buffer descriptor del Endpoint #0 In extern volatile far BDT ep1Bo; Buffer descriptor del Endpoint #1 Out extern volatile far BDT ep1Bi; Buffer descriptor del Endpoint #1 In extern volatile far BDT ep2Bo; Buffer descriptor del Endpoint #2 Out extern volatile far BDT ep2Bi; Buffer descriptor del Endpoint #2 In extern volatile far BDT ep3Bo; Buffer descriptor del Endpoint #3 Out extern volatile far BDT ep3Bi; Buffer descriptor del Endpoint #3 In extern volatile far BDT ep4Bo; Buffer descriptor del Endpoint #4 Out extern volatile far BDT ep4Bi; Buffer descriptor del Endpoint #4 In extern volatile far BDT ep5Bo; Buffer descriptor del Endpoint #5 Out extern volatile far BDT ep5Bi; Buffer descriptor del Endpoint #5 In extern volatile far BDT ep6Bo; Buffer descriptor del Endpoint #6 Out extern volatile far BDT ep6Bi; Buffer descriptor del Endpoint #6 In extern volatile far BDT ep7Bo; Buffer descriptor del Endpoint #7 Out extern volatile far BDT ep7Bi; Buffer descriptor del Endpoint #7 In extern volatile far BDT ep8Bo; Buffer descriptor del Endpoint #8 Out extern volatile far BDT ep8Bi; Buffer descriptor del Endpoint #8 In extern volatile far BDT ep9Bo; Buffer descriptor del Endpoint #9 Out extern volatile far BDT ep9Bi; Buffer descriptor del Endpoint #9 In extern volatile far BDT ep10Bo; Buffer descriptor del Endpoint #10 Out extern volatile far BDT ep10Bi; Buffer descriptor del Endpoint #10 In extern volatile far BDT ep11Bo; Buffer descriptor del Endpoint #11 Out

Page 423: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

421

extern volatile far BDT ep11Bi; Buffer descriptor del Endpoint #11 In extern volatile far BDT ep12Bo; Buffer descriptor del Endpoint #12 Out extern volatile far BDT ep12Bi; Buffer descriptor del Endpoint #12 In extern volatile far BDT ep13Bo; Buffer descriptor del Endpoint #13 Out extern volatile far BDT ep13Bi; Buffer descriptor del Endpoint #13 In extern volatile far BDT ep14Bo; Buffer descriptor del Endpoint #14 Out extern volatile far BDT ep14Bi; Buffer descriptor del Endpoint #14 In extern volatile far BDT ep15Bo; Buffer descriptor del Endpoint #15 Out extern volatile far BDT ep15Bi; 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

Page 424: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

422

4.3.6.7. Usbdrv.h: Driver Del USB Esta librería es la encargada de definir la configuración inicial.

Lo único que hay que modificar es la corrección de la errata en la original de Microchip, como se comenta más adelante.

4.3.6.7.1. Incluye #include "system\typedefs.h" #include "system\usb\usb.h"

4.3.6.7.2. Definiciones Parámetros de configuración iniciales:

#define _PPBM0 0x00 Buffer Ping-pong Modo 0 #define _PPBM1 0x01 Buffer Ping-pong Modo 1 #define _PPBM2 0x02 Buffer Ping-pong Modo 2 #define _LS 0x00 Modo USB Low-Speed #define _FS 0x04 Modo USB Full-Speed #define _TRINT 0x00 Transmisor-receptor interno #define _TREXT 0x08 Transmisor-receptor externo #define _PUEN 0x10 Usar resistencias pull-up internas #define _OEMON 0x40 Usar el indicador de salida SIE #define _UTEYE 0x80 Usar el test “Patrón de ojo”

Parámetros de los Endpoint iniciales:

#define EP_CTRL 0x06 Pipe de control #define EP_OUT 0x0C Pipe de salida #define EP_IN 0x0A Pipe de entrada #define EP_OUT_IN 0x0E Pipe de entrada y salida #define HSHK_EN 0x10 Activar paquetes de protocolo Los paquetes de protocolo se tienen que desactivar en la síncronas

Definiciones de los Endpoints PICmicro El formato de la dirección de los EP PICmicro:

X:EP3:EP2:EP1:EP0:DIR:PPBI:X

Esto se utiliza cuando se comprueba el valor leído 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"

Page 425: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

423

#define OUT 0 #define IN 1 #define PIC_EP_NUM_MASK 0b01111000 Número de máscara del Endpoint #define PIC_EP_DIR_MASK 0b00000100 Dirección de la máscara del Endpoint

NOTA: la librería tiene una errata en la definición de los Endpoints, lo correcto es:

#define EP00_OUT ((0x00<<3)|(OUT<<2)) #define EP00_IN ((0x00<<3)|(IN<<2)) #define EP01_OUT ((0x01<<3)|(OUT<<2)) #define EP01_IN ((0x01<<3)|(IN<<2)) #define EP02_OUT ((0x02<<3)|(OUT<<2)) #define EP02_IN ((0x02<<3)|(IN<<2)) #define EP03_OUT ((0x03<<3)|(OUT<<2)) #define EP03_IN ((0x03<<3)|(IN<<2)) #define EP04_OUT ((0x04<<3)|(OUT<<2)) #define EP04_IN ((0x04<<3)|(IN<<2)) #define EP05_OUT ((0x05<<3)|(OUT<<2)) #define EP05_IN ((0x05<<3)|(IN<<2)) #define EP06_OUT ((0x06<<3)|(OUT<<2)) #define EP06_IN ((0x06<<3)|(IN<<2)) #define EP07_OUT ((0x07<<3)|(OUT<<2)) #define EP07_IN ((0x07<<3)|(IN<<2)) #define EP08_OUT ((0x08<<3)|(OUT<<2)) #define EP08_IN ((0x08<<3)|(IN<<2)) #define EP09_OUT ((0x09<<3)|(OUT<<2)) #define EP09_IN ((0x09<<3)|(IN<<2)) #define EP10_OUT ((0x0A<<3)|(OUT<<2)) #define EP10_IN ((0x0A<<3)|(IN<<2)) #define EP11_OUT ((0x0B<<3)|(OUT<<2)) #define EP11_IN ((0x0B<<3)|(IN<<2)) #define EP12_OUT ((0x0C<<3)|(OUT<<2)) #define EP12_IN ((0x0C<<3)|(IN<<2)) #define EP13_OUT ((0x0D<<3)|(OUT<<2)) #define EP13_IN ((0x0D<<3)|(IN<<2)) #define EP14_OUT ((0x0E<<3)|(OUT<<2)) #define EP14_IN ((0x0E<<3)|(IN<<2)) #define EP15_OUT ((0x0F<<3)|(OUT<<2)) #define EP15_IN ((0x0F<<3)|(IN<<2))

Page 426: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

424

mInitializeUSBDriver() Configura el modulo USB.

La definición de UCFG_VAL está en autofiles\usbcfg.h

Este registro determina: velocidad del USB Speed, selección de las resistencias pull-up del chip, selección del transmisor-receptor del chip, modo de chequeo “patrón 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 envíe una señal 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) Precondición: 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; además, cambia el bit DTS para sincronización.

Page 427: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

425

#define mUSBBufferReady(buffer_dsc) buffer_dsc.Stat._byte &= _DTSMASK; Guarda sólo el bit DTS buffer_dsc.Stat.DTS = !buffer_dsc.Stat.DTS; Cambia el bit DTS buffer_dsc.Stat._byte |= _USIE|_DTSEN; Cambia la propiedad al SIE

4.3.6.7.3. Prototipos públicos void USBCheckBusStatus(void); void USBDriverService(void); void USBRemoteWakeup(void); void USBSoftDetach(void); void ClearArray(byte* startAdr,byte count);

Page 428: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

426

4.3.6.8. Usbctrltrf.h: Control de transferencias del USB Esta librería es la encargada de definir los tipos de transferencia. Se utiliza desde

otras librerías 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 0 Espera Setup #define CTRL_TRF_TX 1 Transf. de control de transmisión #define CTRL_TRF_RX 2 Transf. de control de recepción

Tipos de Tokens:

#define SETUP_TOKEN 0b00001101 Token setup #define OUT_TOKEN 0b00000001 Token de salida #define IN_TOKEN 0b00001001 Token de entrada

Definición de los tipos de respuesta:

#define HOST_TO_DEV 0 Host-al-Dispositivo #define DEV_TO_HOST 1 Dispositivo-al-Host #define STANDARD 0x00 #define CLASS 0x01 Clase #define VENDOR 0x02 Fabricante #define RCPT_DEV 0 Dispositivo destinatario #define RCPT_INTF 1 Destinatario de la interfaz #define RCPT_EP 2 Destinatario del Endpoint #define RCPT_OTH 3

4.3.6.8.3. Externas extern byte ctrl_trf_session_owner; extern POINTER pSrc; extern POINTER pDst; extern WORD wCount;

4.3.6.8.4. Prototipos públicos void USBCtrlEPService(void); void USBCtrlTrfTxService(void); void USBCtrlTrfRxService(void); void USBCtrlEPServiceComplete(void); void USBPrepareForNextSetupTrf(void);

Page 429: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

427

4.3.6.9. Usb9.h Gracias a esta librería obtenemos la dirección del dispositivo, entre otras

características.

No se tiene que modificar.

4.3.6.9.1. Incluye #include "system\typedefs.h"

4.3.6.9.2. Definiciones Códigos de respuesta estándar:

#define GET_STATUS 0 Obtiene estado #define CLR_FEATURE 1 Borra característica #define SET_FEATURE 3 Fija característica #define SET_ADR 5 Fija dirección #define GET_DSC 6 Obtiene descriptor #define SET_DSC 7 Fija descriptor #define GET_CFG 8 Obtiene configuración #define SET_CFG 9 Fija configuración #define GET_INTF 10 Obtiene interfaz #define SET_INTF 11 Fija interfaz #define SYNCH_FRAME 12 Marco de sincronismo

Características de los selectores estándar:

#define DEVICE_REMOTE_WAKEUP 0x01 Reinicio remoto del dispositivo #define ENDPOINT_HALT 0x00 Paro del Endpoint

mUSBCheckAdrPendingState() Rutina de chequeo especializado, comprueba si el dispositivo está en el estado

“Pendiente de dirección” 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 públicos void USBCheckStdRequest(void);

Page 430: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

428

4.3.6.10. Usbgen.h: USB Genérico Esta es la librería de la clase genérica. 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 típico: 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 típico: 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 número de bytes copiados al buffer del usuario en la última llamada a la función USBGenRead.

#define mUSBGenGetRxLength() usbgen_rx_len

4.3.6.10.3. Externas extern byte usbgen_rx_len;

4.3.6.10.4. Prototipos Públicos void USBGenInitEP(void); void USBGenWrite(byte *buffer, byte len); byte USBGenRead(byte *buffer, byte len);

Page 431: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

429

4.3.6.11. Msd.h: Almacenamiento Masivo Esta es la librería 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" Mapa de pines E/S

4.3.6.11.2. Definiciones Código de la clase de interfaz MSD:

#define MSD_INTF 0x08

Código de la subclase de la interfas de clase MSD:

#define MSD_INTF_SUBCLASS 0x06

Código de protocolo de la clase de la interfaz MSD:

#define MSD_PROTOCOL 0x50

Comandos de la clase:

#define MSD_RESET 0xff #define GET_MAX_LUN 0xfe #define BLOCKLEN_512 0x0200 #define STMSDTRIS TRISD0 #define STRUNTRIS TRISD1 #define STMSDLED LATDbits.LATD0 #define STRUNLED LATDbits.LATD1 #define ToggleRUNLED() STRUNLED = !STRUNLED;

Set de commandos de código de la subclase transparente SCSI:

#define INQUIRY 0x12 #define READ_FORMAT_CAPACITY 0x23 #define READ_CAPACITY 0x25 #define READ_10 0x28 #define WRITE_10 0x2A #define REQUEST_SENSE 0x03 #define MODE_SENSE 0x1A #define PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E #define TEST_UNIT_READY 0x00 #define VERIFY 0x2F

Page 432: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

430

#define STOP_START 0x1B

Varios estados del Firmware de almacenamiento masivo:

#define MSD_WAIT 0 Esperando para un CBW válido #define MSD_DATA_IN 2 Estado de datos IN (Dispositivo-> Host) #define MSD_DATA_OUT 3 Estado de datos OUT (Host -> Device) #define MSD_CSW_SIZE 0x0d Datos CSW de 10 bytes CSW #define MSD_CBW_SIZE 0x1f Datos CSW de 31 bytes CBW #define INVALID_CBW 1 #define VALID_CBW !INVALID_CBW #define MAX_LUN 0

Clave de los códigos de error Sense

#define S_NO_SENSE 0x0 #define S_RECOVERED_ERROR 0x1 #define S_NOT_READY 0x2 #define S_MEDIUM_ERROR 0x3 #define S_HARDWARE_ERROR 0X4 #define S_ILLEGAL_REQUEST 0x5 #define S_UNIT_ATTENTION 0x6 #define S_DATA_PROTECT 0x7 #define S_BLANK_CHECK 0x8 #define S_VENDOR_SPECIFIC 0x9 #define S_COPY_ABORTED 0xA #define S_ABORTED_COMMAND 0xB #define S_OBSOLETE 0xC #define S_VOLUME_OVERFLOW 0xD #define S_MISCOMPARE 0xE #define S_CURRENT 0x70 #define S_DEFERRED 0x71

Códigos ASC ASCQ para datos (sólo 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

Page 433: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

431

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 típico: 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 típico: if(mMSDTxIsBusy())

#define mMSDTxIsBusy() MSD_BD_IN.Stat.UOWN

Page 434: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

432

(bit) mMin(void) Esta macro se utiliza para encontrar el menor de dos argumentos.

Uso típico: mMin(A, B)

#define mMin(A,B) (A<B)?A:B

4.3.6.11.3. Estructuras typedef struct _USB_MSD_CBW 31 bytes totales CBW dword dCBWSignature; 55 53 42 43h dword dCBWTag; Enviado por el host, el dispositivo se hace eco con el valor en CSW (asociado a CSW con CBW) dword dCBWDataTransferLength; Número de bytes de datos que el host espera transferir byte bCBWFlags; Flags CBW, bit 7 = 0 salida de datos del host- dispositivo; bit 7=1 dispositivo-host, el resto de bits 0 byte bCBWLUN; MS1bits son siempre cero, 0 en nuestro caso es una sola unidad lógica byte bCBWCBLength; MS3bits son cero byte CBWCB[16]; Bloque de comando que ejecuta el dispositivo USB_MSD_CBW; typedef struct /Bloque de comando para leer 10 (0x28) y escribir 10 (0x2a) comandos byte Opcode; byte Flags; b7-b5 lectura protegida, b4 DPO, b3 FUA, b2 Reservado, b1 FUA_NV, b0 Obsoleto DWORD LBA; byte GroupNumber; b4-b0 es el número de grupo el resto reservados WORD TransferLength; byte Control; ReadWriteCB; typedef struct Formato del comando Inquiry byte Opcode; byte EVPD; sólo b0 enable vital product data byte PageCode; word AllocationLength; byte Control; InquiryCB;

Page 435: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

433

typedef struct capacidad de lectura 10 byte Opcode; byte Reserved1; dword LBA; Bloque de dirección lógico word Reserved2; byte PMI; Partial medium Indicator sólo b0 byte Control; ReadCapacityCB; typedef struct Respuesta Sense 0x03 byte Opcode; byte Desc; word Reserved; byte AllocationLength; byte Control; RequestSenseCB; typedef struct Modo Sense 0x1A byte Opcode; byte DBD; Actualmente sólo se utiliza b3 como bloque descriptor desactivado byte PageCode; b7,b6 PC=página de control, b5-b0 página de código Página 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 Prevenir el permiso de retirada del medio 0x1E byte Opcode; byte Reserved[3]; byte Prevent; Sólo se previenen b1-b0, el resto reservados byte Control; PreventAllowMediumRemovalCB; typedef struct Unidad de prueba disponible 0x00 byte Opcode; dword Reserved; byte Control; TestUnitReadyCB; typedef struct Verificar 10 Comando 0x2F byte Opcode;

Page 436: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

434

byte VRProtect; b7-b5 VRProtect, b4 DPO, b3-b2,Reservado, b1 BYTCHK, b0 Obsoleto dword LBA; byte GroupNumber; Número del grupo b4-b0, el resto reservado word VerificationLength; byte Control; VerifyCB; typedef struct STOP_START 0x1B byte Opcode; byte Immed; word Reserved; byte Start; b7-b4 Condición de energía, b3-b2 reservedo, b1 LOEJ, b0 Start byte Control; StopStartCB; typedef struct _USB_MSD_CSW CSW dword dCSWSignature; 55 53 42 53h firma del paquete de CSW dword dCSWTag; eco dCBWTag del paquete CBW dword dCSWDataResidue; diferencia en los datos esperados (dCBWDataTransferLength) y la cantidad actual procesada/enviada byte bCSWStatus; 00h Comando aprobado, 01h Comando Fallido, 02h Error de fase, el resto obsoleto/reservado USB_MSD_CSW; typedef struct byte Peripheral; Clasificador del periférico:3; Periférico_DevType:5; byte Removble; medio removible bit7 = 0 medio no removible, resto reservado byte Version; versión byte Response_Data_Format; b7,b6 Obsoleto, b5 Acceso de control coordinado, b4 direccionamiento jerárquico soportado b3:0 respuesta al formato de datos 2 indica que la respuesta esta en el formato definido por spec byte AdditionalLength; longitud en bytes de los datos que quedan de la indagación estándar byte Sccstp; b7 SCCS, b6 ACC, b5-b4 TGPS, b3 3PC, b2-b1 Reservado, b0 Protegido byte bqueetc; b7 bque, b6- EncServ, b5-VS, b4-MultiP, b3-MChngr, b2-b1 Obsoleto, b0-Addr16 byte CmdQue; b7-b6 Obsoleto, b5-WBUS, b4-Sync, b3-Linked,

Page 437: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

435

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; 0 indica que no soporta los bits DPO y FUA unsigned notused:2; unsigned WP:1; 0 indica que no protege la escritura byte BlockDscLen; Longitud del Bloque Descriptor tModeParamHdr;

Modo corto del bloque descriptor LBA (ver Página 1009, SBC-2)

typedef struct byte NumBlocks[4]; byte Resv; reservado byte BlockLen[3]; tBlockDescriptor; /* Page_0 mode page format */ typedef struct unsigned PageCode:6; SPC-3 7.4.5 unsigned SPF:1; SubPageFormat=0 medio Page_0 formato unsigned PS:1; Parámetros salvables byte PageLength; si 2..n bytes del modo parámetro PageLength=n-1 byte ModeParam[]; modo parámetros tModePage; typedef struct tModeParamHdr Header; tBlockDescriptor BlockDsc; tModePage modePage; ModeSenseResponse;

Page 438: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

436

Formato fijado si el bit Desc de la respuesta sense CBW es 0

typedef union struct byte _byte[18]; ; struct unsigned ResponseCode:7; b6-b0 es el código de respuesta fijado o el formato del descriptor unsigned VALID:1; Poner a 1 indica que el campo de información tiene un valor válido byte Obsolete; unsigned SenseKey:4; Referencia SPC-3 Sección 4.5.6 unsigned Resv:1; unsigned ILI:1; Indicador de la longitud incorrecta unsigned EOM:1; Fin del medio unsigned FILEMARK:1; para los comandos READ y SPACE DWORD Information; Tipo de dispositivo o comando específico (SPC-33.1.18) byte AddSenseLen; Número de bytes sense adicionales que siguen <=244 DWORD CmdSpecificInfo; depende del comando de la excepción ocurrida byte ASC; código sense adicional byte ASCQ; código sense adicional sección clasificada 4.5.2.1 SPC-3 byte FRUC; byte SenseKeySpecific[3]; SKSV son los msb de la clave sense específica de campo válido fijado=>SKS válido. Los 18-n bytes sense adicionales se pueden definir más tarde 18bytes de respuesta sense de formato fijado ; RequestSenseResponse;

4.3.6.11.4. Externas extern CSD gblCSDReg; declarado en sdcard.c

4.3.6.11.5. Prototipos públicos void USBCheckMSDRequest(void); void ProcessIO(void); void SDCardInit(void); void MSDInitEP(void);

Page 439: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

437

4.3.6.12. Cdc.h: Dispositivos De Comunicación Esta es la librería 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 específica:

#define SEND_ENCAPSULATED_COMMAND 0x00 #define GET_ENCAPSULATED_RESPONSE 0x01 #define SET_COMM_FEATURE 0x02 #define GET_COMM_FEATURE 0x03 #define CLEAR_COMM_FEATURE 0x04 #define SET_LINE_CODING 0x20 #define GET_LINE_CODING 0x21 #define SET_CONTROL_LINE_STATE 0x22 #define SEND_BREAK 0x23

Notificaciones

Nota: las notificaciones se obtienen de la interface de comunicación (Endpoint Interrupción)

#define NETWORK_CONNECTION 0x00 #define RESPONSE_AVAILABLE 0x01 #define SERIAL_STATE 0x20

Código de la clase del dispositivo:

#define CDC_DEVICE 0x02

Código de la clase de la interfaz de comunicación

#define COMM_INTF 0x02

Código de la subclase de la interfaz de comunicación

#define ABSTRACT_CONTROL_MODEL 0x02

Código del protocolo de control de la clase de la interfaz de comunicación

#define V25TER 0x01 Comandos comunes AT ("Hayes(TM)")

Código de la clase de la interfaz de datos

#define DATA_INTF 0x0A

Page 440: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

438

Código del protocolo de la clase de la interfaz de datos

#define NO_PROTOCOL 0x00 No necesita un protrocolo de clase específico

Código selector de las características de la comunicación

#define ABSTRACT_STATE 0x01 #define COUNTRY_SETTING 0x02

Descriptores funcionales

Tipos de valor del campo bDscType

#define CS_INTERFACE 0x24 #define CS_ENDPOINT 0x25

bDscSubType en descriptores funcionales

#define DSC_FN_HEADER 0x00 #define DSC_FN_CALL_MGT 0x01 #define DSC_FN_ACM 0x02 ACM – Administración de control abstracta #define DSC_FN_DLM 0x03 DLM – Dirección de línea directa #define DSC_FN_TELEPHONE_RINGER 0x04 #define DSC_FN_RPT_CAPABILITIES 0x05 #define DSC_FN_UNION 0x06 #define DSC_FN_COUNTRY_SELECTION 0x07 #define DSC_FN_TEL_OP_MODES 0x08 #define DSC_FN_USB_TERMINAL 0x09

Estados de tranferencia CDC Bulk IN

#define CDC_TX_READY 0 #define CDC_TX_BUSY 1 #define CDC_TX_BUSY_ZLP 2 ZLP: Paquete de longitud cero #define CDC_TX_COMPLETING 3

BOOL mUSBUSARTIsTxTrfReady(void) Esta macro se utiliza para comprobar si la clase CDC está disponible para enviar

mas datos.

Uso típico: if(mUSBUSARTIsTxTrfReady())

#define mUSBUSARTIsTxTrfReady() (cdc_trf_state == CDC_TX_READY)

Page 441: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

439

(bit) mCDCUsartRxIsBusy(void) Esta macro se utiliza para comprobar si el Endpoint CDC Bulk OUT está

ocupado (controlado por el SIE) o no.

Uso típico: 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 típico: if(mCDCUsartTxIsBusy())

#define mCDCUsartTxIsBusy() CDC_BULK_BD_IN.Stat.UOWN

byte mCDCGetRxLength(void) Salida: devuelve cdc_rx_len

mCDCGetRxLength se utiliza para recuperar el número de bytes que se han copiado al buffer del usuario en la última llamada a la función getsUSBUSART.

#define mCDCGetRxLength() cdc_rx_len

void mUSBUSARTTxRam(byte *pData, byte len) Precondición: 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 localización de los bytes de datos.

len: número 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 sólo 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;

Page 442: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

440

void mUSBUSARTTxRom(rom byte *pData, byte len) Precondición: 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 localización de los bytes de datos.

len: número 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 sólo 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 línea de codificación

#define LINE_CODING_LENGTH 0x07 typedef union _LINE_CODING struct byte _byte[LINE_CODING_LENGTH]; ; struct DWORD dwDTERate; Estructura de datos compleja byte bCharFormat; byte bParityType; byte bDataBits; ; LINE_CODING;

Page 443: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

441

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 dirección 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 unión

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;

Page 444: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

442

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

Page 445: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

443

4.3.6.13. Hid.h: Dispositivo interfaz con humanos Esta es la librería 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 específicas:

#define GET_REPORT 0x01 Obtener informe #define GET_IDLE 0x02 Obtener reposo #define GET_PROTOCOL 0x03 Obtener protocolo #define SET_REPORT 0x09 Fijar informe #define SET_IDLE 0x0A Fijar reposo #define SET_PROTOCOL 0x0B Fijar protocolo

Tipos de clase de descriptor:

#define DSC_HID 0x21 Descriptor HID #define DSC_RPT 0x22 Descriptor informe #define DSC_PHY 0x23

Selección de protocolo:

#define BOOT_PROTOCOL 0x00 Protocolo de inicio #define RPT_PROTOCOL 0x01 Informe de protocolo

Código de clase de interfaz HID:

#define HID_INTF 0x03 Interfaz HID

Código de subclase de interfaz HID:

#define BOOT_INTF_SUBCLASS 0x01

Código de protocolo de clase de interfaz:

#define HID_PROTOCOL_NONE 0x00 Ninguno #define HID_PROTOCOL_KEYBOAD 0x01 Teclado #define HID_PROTOCOL_MOUSE 0x02 Ratón

Page 446: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

444

(bit) mHIDRxIsBusy() Esta macro comprueba si el Endpoint de salida del HID está ocupado

(controlado por el SIE) o no.

Aplicación típica: 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.

Aplicación típica: 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 número de bytes copiándolos al buffer de usuario en orden de la última llamada a la función HIDRxReport.

#define mHIDGetRptRxLength() hid_rpt_rx_len

4.3.6.13.3. 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; Código de territorio Número 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;

Page 447: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

445

4.3.6.13.5. Prototipos públicos 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 librería se definen los puertos utilizados en la aplicación USB.

Si no se desea incluir hay que definir el apartado del USB ya que si no, la compilación daría 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 1 #define OUTPUT_PIN 0

4.3.6.14.3. 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 TRISBbits.TRISB3 Salida #define tris_usb_vmo TRISBbits.TRISB2 Salida #define tris_usb_rcv TRISAbits.TRISA4 Entrada #define tris_usb_vp TRISCbits.TRISC5 Entrada #define tris_usb_vm TRISCbits.TRISC4 Entrada #define tris_usb_oe TRISCbits.TRISC1 Salida

Page 448: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

446

#define tris_usb_suspnd TRISAbits.TRISA3 Salida

4.3.6.14.4. LED #define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0; #define mLED_1 LATDbits.LATD0 #define mLED_2 LATDbits.LATD1 #define mLED_3 LATDbits.LATD2 #define mLED_4 LATDbits.LATD3 #define mLED_1_On() mLED_1 = 1; #define mLED_2_On() mLED_2 = 1; #define mLED_3_On() mLED_3 = 1; #define mLED_4_On() mLED_4 = 1; #define mLED_1_Off() mLED_1 = 0; #define mLED_2_Off() mLED_2 = 0; #define mLED_3_Off() mLED_3 = 0; #define mLED_4_Off() mLED_4 = 0; #define mLED_1_Toggle() mLED_1 = !mLED_1; #define mLED_2_Toggle() mLED_2 = !mLED_2; #define mLED_3_Toggle() mLED_3 = !mLED_3; #define mLED_4_Toggle() mLED_4 = !mLED_4;

4.3.6.14.5. Interruptores #define mInitAllSwitches() TRISBbits.TRISB4=1;TRISBbits.TRISB5=1; #define mInitSwitch2() TRISBbits.TRISB4=1; #define mInitSwitch3() TRISBbits.TRISB5=1; //#define sw2 PORTBbits.RB4 #define sw3 PORTBbits.RB5

4.3.6.14.6. Potenciómetro #define mInitPOT() TRISAbits.TRISA0=1;ADCON0=0x01;ADCON2=0x3C;

4.3.6.14.7. SPI: Líneas de Chip Select #define tris_cs_temp_sensor TRISBbits.TRISB2 Salida #define cs_temp_sensor LATBbits.LATB2 #define tris_cs_sdmmc TRISBbits.TRISB3 Salida #define cs_sdmmc LATBbits.LATB3

4.3.6.14.8. SDMMC #define TRIS_CARD_DETECT TRISBbits.TRISB4 Entrada #define CARD_DETECT PORTBbits.RB4 #define TRIS_WRITE_DETECT TRISAbits.TRISA4 Entrada #define WRITE_DETECT PORTAbits.RA4

Page 449: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

447

4.3.6.15. interrupt.h En esta librería se incluye todo lo referente a las interrupciones. El usuario la

modificará dependiendo de la aplicación.

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

Page 450: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

448

4.3.6.16. Usb_compile_time_validation.h: Validación Del Tiempo De Compilado

Esta librería se utiliza para comprobar errores en la compilación. Es totalmente opcional.

4.3.6.16.1. Incluye #include "system\typedefs.h" #include "system\usb\usb.h"

4.3.6.16.2. Validación del USB #if (EP0_BUFF_SIZE != 8) && (EP0_BUFF_SIZE != 16) && (EP0_BUFF_SIZE != 32) && (EP0_BUFF_SIZE != 64) #error(Tamaño 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 tamaño 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 tamaño del Endpoint de entrada de HID no puede ser mayor de 64, comprueba "autofiles\usbcfg.h") #endif #endif

4.3.7. LIBRERÍAS DEL MICROPROCESADOR Al instalar el compilador MPLAB C18 se crea una carpeta llamada lkr, en la

cual hay unos archivos que se pueden añadir al proyecto.

Estos archivos definen todos los puertos, registros, bits… del microprocesador que utilicemos en el proyecto.

Es recomendable añadir este archivo ya que todas las librerías trabajan con las definiciones hechas en él.

Page 451: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

449

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 librerías. En éstas hay un apartado llamado prototipos públicos en los que se declara la macro como función.

Las macros que no aparecen en el apartado de prototipos públicos, 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 librerías, aparecen en rojo los datos que hay que modificar en cada aplicación, en azul los referentes a la clase y en verde todo el código fuente.

4.4.1. USBDRV.C: DRIVERS USB En este archive el fabricante ha creado el código relativo a la comunicación

inicial. En el cual se declaran los estados del USB, los comprueba y determina en cual está la aplicación.

4.4.1.1. Incluye #include <p18cxxx.h> #include "system\typedefs.h" #include "system\usb\usb.h" #include "io_cfg.h" Se necesita para USBCheckBusStatus()

4.4.1.2. Variables #pragma udata

4.4.1.3. Prototipos privados void USBModuleEnable(void); void USBModuleDisable(void); void USBSuspend(void); void USBWakeFromSuspend(void); void USBProtocolResetHandler(void); void USB_SOF_Handler(void); void USBStallHandler(void); void USBErrorHandler(void);

4.4.1.4. Declaraciones #pragma code

Page 452: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

450

4.4.1.4.1. void USBCheckBusStatus(void) Esta rutina activa/desactiva el módulo USB comprobado la señal de energía.

void USBCheckBusStatus(void)

Detección de la conexión/desconexión del bus

usb_bus_sense es un puerto de E/S definido en io_cfg.h

#define USB_BUS_ATTACHED 1 #define USB_BUS_DETACHED 0 if(usb_bus_sense == USB_BUS_ATTACHED) ¿Está el USB conectado? if(UCONbits.USBEN == 0) ¿Está el módulo apagado? USBModuleEnable(); Está apagado, actívalo else if(UCONbits.USBEN == 1) ¿Está el módulo encendido? USBModuleDisable(); Está encendido, desactívalo end if(usb_bus_sense...)

Después de activar el modulo USB, hay un retardo para que la tensión de las líneas D+ o D- se pongan en alto lo suficiente para que salga de la condición SE0.

La interrupción de Reset del USB tiene que estar enmascarada hasta que la condición 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; Borra todas las interrupciones del USB UIE = 0; Enmascara todas las interrupciones del USB UIEbits.URSTIE = 1; Desenmascara la interrupción RESET UIEbits.IDLEIE = 1; Desenmascara la interrupción IDLE usb_device_state = POWERED_STATE; end if Lo demás espera hasta que SE0 esté borrado end if(usb_device_state == ATTACHED_STATE) end USBCheckBusStatus

Page 453: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

451

4.4.1.4.2. void USBModuleEnable(void) Esta rutina activa el módulo USB.

Sólo se puede llamar esta rutina desde USBCheckBusStatus().

void USBModuleEnable(void) UCON = 0; UIE = 0; Enmascara todas las interrupciones USB UCONbits.USBEN = 1; Activa el modulo y une el bus usb_device_state = ATTACHED_STATE; Definido en usbmmap.c y .h end USBModuleEnable

4.4.1.4.3. void USBModuleDisable(void) Esta rutina desactiva el modulo USB.

Sólo se puede llamar esta rutina desde USBCheckBusStatus().

void USBModuleDisable(void) UCON = 0; Desactiva el modulo y desconecta del bus UIE = 0; Enmascara todas las interrupciones USB usb_device_state = DETACHED_STATE; Definido en usbmmap.c y .h end USBModuleDisable

4.4.1.4.4. void USBSoftDetach(void) Efectos secundarios: El dispositivo se tiene que reenumerar.

USBSoftDetach desconecta eléctricamente el dispositivo del bus. Se utiliza para dejar de suministrar tensión VUSB a las resistencias pull-up. Las resistencias pull-down en el lado del host pondrán las señales diferenciales en bajo y el host registrará el evento como una desconexión.

Como el cable USB no se desconecta físicamente, la energía suministrada a través de él la puede detectar el dispositivo. Cuando se llame la función USBCheckBusStatus(), se reconectará el dispositivo al bus.

void USBSoftDetach(void) USBModuleDisable(); end USBSoftDetach

Page 454: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

452

4.4.1.4.5. void USBDriverService(void) Esta rutina es el corazón del firmware. Controla las interrupciones USB.

Nota: Las transiciones de estado del dispositivo son las siguientes:

Desconectado->Conectado->Alimentado->Por defecto->Pendiente de dirección-> ->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 interrupción 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 Interrupción 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 después 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 interrupción de transacción completa

if(UIRbits.TRNIF && UIEbits.TRNIE) USBCtrlEPService sólo maneja las transacciones del EP0, ignora todas las transacciones de los otros EP. USBCtrlEPService(); Los demás Endpoint se pueden determinar después respondiendo a la clase del firmware. Cada driver del dispositivo sabe cuando una transacción 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.

Page 455: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

453

Por esta lógica, no es necesario guardar el valor de USTAT de una transacción 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í Razón: ACTVIF sólo se genera si IDLEIF se ha generado. Es un ratio de generación de interrupción de 1:1. Por cada IDLEIF, habrá sólo un ACTVIF sea cual sea el número 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 interrogación) ^ 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 energía, el reloj SIE inactivo. En este punto el PIC puede ponerse en sleep, reposo, cambiar a un reloj más lento, etc. /* Sección modificable */ /* Final de la sección 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

Page 456: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

454

4.4.1.4.8. void USBRemoteWakeup(void) Esta función la tiene que llamar el usuario cuando el dispositivo se despierte por

un estímulo externo que no sea ACTIVIF.

Nota: La sección modificable en esta rutina se puede cambiar dependiendo de las especificaciones de la aplicación. La implementación actual bloquea temporalmente otras funciones de ejecución en un periodo de 1-13ms dependiendo de la frecuencia del núcleo.

De acuerdo con las especificaciones del USB 2.0 en la sección 7.1.7.7, “El reinicio remoto del dispositivo tiene que bloquear la señal al menos por 1ms y no más de 15ms.” La idea aquí es utilizar un retraso por contador, usando un valor común que pueda trabajar con un gran rango de frecuencias del núcleo. Este valor es 1800. Ver la tabla de debajo:

Frec del núcleo (MHz) MIP Periodo señal RESUME (ms) 48 12 1,05 4 1 12,6

Estos tiempos pueden ser distintos si se utiliza la optimización o el código de instrucciones entendido o cuando se tiene otra interrupción activa. Asegurarse usando del Stopwatch del MPLAB SIM.

void USBRemoteWakeup(void) static word delay_count; if(usb_stat.RemoteWakeup == 1) Comprueba si el host a activado la función reinicio remoto USBWakeFromSuspend(); Reinicio del modo suspendido UCONbits.RESUME = 1; Comienzo de la señal RESUME /* Sección modificable */ /* Final de la sección modificable */ UCONbits.RESUME = 0; endif end USBRemoteWakeup

Page 457: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

455

4.4.1.4.9. void USB_SOF_Handler(void) El host envía un paquete SOF a los dispositivos cada milisegundo. Esta

interrupción puede ser útil en las pipes síncronas. Los diseñadores pueden implementar una rutina de realimentación como necesite.

void USB_SOF_Handler(void) /* Rutina de realimentación aquí */ UIRbits.SOFIF = 0; end USB_SOF_Handler

4.4.1.4.10. void USBStallHandler(void) Precondición: El SIE tiene que haber mandado un paquete STALL al host.

El STALLIF se active cada vez que el SIE envía un paquete STALL siempre que un Endpoint lo provoque. Una transacción Setup invalida la función 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 función STALL a un pipe Endpoint particular se desactivará automáticamente (dirección específica).

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 específico.

Ejemplo: Clase de dispositivo de almacenamiento masivo

Si el CBW no es válido, 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 transacción Setup, la CPU gobierna el EP0_OUT forzándolo por firmware. if(UEP0bits.EPSTALL == 1) USBPrepareForNextSetupTrf(); UEP0bits.EPSTALL = 0; UIRbits.STALLIF = 0; end USBStallHandler

Page 458: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

456

4.4.1.4.11. void USBErrorHandler(void) El propósito de esta interrupción es sólo por depuración durante el desarrollo.

Chequea UEIR para ver error ha causado la interrupción.

void USBErrorHandler(void) UIRbits.UERRIF = 0; end USBErrorHandler

4.4.1.4.12. void USBProtocolResetHandler(void) Precondición: Se tiene que haber recibido un reset del bus USB desde el host.

Efectos secundarios: Esta rutina purga cualquier transacción pendiente. Borra la FIFO USTAT.

Hay que llamar esta rutina cuando el reset del bus USB se ha recibido. Resetea la dirección 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 interrupción, desenmascara las interrupciones USB aplicables y reinicializa las variables internas de estado-máquina.

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 interrupción USB UIE = 0b01111011; Activa todas las interrupciones menos ACTVIE UADDR = 0x00; Resetea a la dirección 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 transacción 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 configuración activa usb_device_state = DEFAULT_STATE; end USBProtocolResetHandler

Page 459: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

457

4.4.1.5. Función 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 conexión.

4.4.2.1. Incluye #include <p18cxxx.h> #include "system\typedefs.h" #include "system\usb\usb.h" #include "io_cfg.h" Requerido para el estado auto-alimentado

4.4.2.2. Variables #pragma udata

4.4.2.3. Prototipos privados void USBStdGetDscHandler(void); void USBStdSetCfgHandler(void); void USBStdGetStatusHandler(void); void USBStdFeatureReqHandler(void);

4.4.2.4. Declaraciones #pragma code

4.4.2.4.1. void USBCheckStdRequest(void) Esta rutina chequea el paquete de datos setup para ver si sabe cuando conectarse.

void USBCheckStdRequest(void) if(SetupPkt.RequestType != STANDARD) return; switch(SetupPkt.bRequest) case SET_ADR: ctrl_trf_session_owner = MUID_USB9;

Page 460: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

458

usb_device_state = ADR_PENDING_STATE; Actualización de estado Ver USBCtrlTrfInHandler() en usbctrltrf.c para el próximo 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:

Page 461: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

459

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 estándar GET_DESCRIPTOR. Utiliza tablas

dinámicamente buscando el tamaño del descriptor. Esta rutina no se debe modificar si las tablas usbdsc.c en están 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; Fija el tipo de memoria end if end USBStdGetDscHandler

Page 462: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

460

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 sección 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; /* Sección modificable */ BootInitEP(); /* Final de la sección modificable */ end if(SetupPkt.bcfgValue == 0) end USBStdSetCfgHandler

4.4.2.4.4. void USBStdGetStatusHandler(void) Esta rutina une la respuesta estándar GET_STATUS.

void USBStdGetStatusHandler(void) CtrlTrfData._byte0 = 0; Inicializa el contenido CtrlTrfData._byte1 = 0; 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) usb_stat definido en usbmmap.c CtrlTrfData._byte0|=0b00000010; 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);

Page 463: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

461

if(*pDst.bRam & _BSTALL) Usar _BSTALL como máscara de bit CtrlTrfData._byte0=0x01; Activa bit0 break; end switch if(ctrl_trf_session_owner == MUID_USB9) pSrc.bRam = (byte*)&CtrlTrfData; Fija fuente usb_stat.ctrl_trf_mem = _RAM; Fija el tipo de memoria LSB(wCount) = 2; Activa la cuenta de datos end if(...) end USBStdGetStatusHandler

4.4.2.4.5. void USBStdFeatureReqHandler(void) Esta rutina une las repuestas estándar SET y CLEAR FEATURES.

void USBStdFeatureReqHandler(void) if((SetupPkt.bFeature==DEVICE_REMOTE_WAKEUP)&&(SetupPkt.Recipient==RCPT_DEV)) 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 dirección 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

Page 464: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

462

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; Estado de la transferencia de control byte ctrl_trf_session_owner; Controlador de la sesión de transferencia actual POINTER pSrc; Puntero a la fuente de datos POINTER pDst; Puntero al destino de los datos WORD wCount; Contador de datos

4.4.3.3. Prototipos privados void USBCtrlTrfSetupHandler(void); void USBCtrlTrfOutHandler(void); void USBCtrlTrfInHandler(void);

4.4.3.4. Declaraciones #pragma code

4.4.3.4.1. void USBCtrlEPService(void) Precondición: USTAT está cargada con una dirección de Endpoint válida.

USBCtrlEPService chequea tres tipos de transacciones que conoce como tratarlas y lo hace:

1. EP0 SETUP 2. EP0 OUT 3. EP0 IN

Ignora los demás tipos.

void USBCtrlEPService(void) if(USTAT == EP00_OUT) if(ep0Bo.Stat.PID == SETUP_TOKEN) EP0 SETUP USBCtrlTrfSetupHandler(); else EP0 OUT USBCtrlTrfOutHandler();

Page 465: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

463

else if(USTAT == EP00_IN) EP0 IN USBCtrlTrfInHandler(); end USBCtrlEPService

4.4.3.4.2. void USBCtrlTrfSetupHandler(void) Precondición: El buffer SetupPkt está cargado con un dato válido de Setup.

Esta rutina es una tarea para despachar y tiene tres estados.

1. Inicializa la transferencia de control de estados máquina. 2. Llama cada vez al módulo que sabe como servir la respuesta Setup del

host. Ejemplo de módulo: USB9, HID, CDC, MSD,… Se añade una nueva clase, la tabla ClassReqHandler en usbdsc.c se tiene que actualizar para llamar todas las clases de unión disponibles.

3. Una vez que el módulo se arriesga a chequear si el responsable de servir la respuesta, en el estado 3 chequea la dirección 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 máquina:

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 parámetros 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; Fijar el dueño a NULL wCount._word = 0; Estado 2 USBCheckStdRequest(); Ver system\usb9\usb9.c /* Sección Modificable */ Insertar otra respuesta de unión de clase de dispositivo USB aquí /* Fin de la sección modificable */

Page 466: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

464

Estado 3 USBCtrlEPServiceComplete(); end USBCtrlTrfSetupHandler

4.4.3.4.4. void USBCtrlTrfOutHandler(void) Esta rutina une una transacción 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 dueño de la sesión cada transacción 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 transacción IN de acuerdo con el estado de la transferencia

de control que está actualmente activa.

Nota: Si se fija la dirección 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 dirección es una transacción IN. Por lo tanto se necesita para servir esta situación cuando la condición es correcta. La macro mUSBCheckAdrPendingState se define en usb9.h y está diseñada 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)

Page 467: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

465

ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; else ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; else CTRL_TRF_RX USBPrepareForNextSetupTrf(); end USBCtrlTrfInHandler

4.4.3.4.6. void USBCtrlTrfTxService(void) Precondición: pSrc, wCount, y usb_stat.ctrl_trf_mem están 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 múltiples transacciones USB.

Nota: Esta rutina trabaja con Endpoints síncronos mayores que 256bytes y aquí se muestra un ejemplo de cómo 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 envían. 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 número 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--;

Page 468: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

466

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 versión del firmware.

void USBCtrlTrfRxService(void) byte byte_to_read; byte_to_read = ep0Bo.Cnt; Acumula el número total de bytes leídos 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 situación dada.

Hay tres:

a. No hay unión 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)

Page 469: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

467

Si ninguno sabe cómo 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 transacción 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 sesión 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 terminación temprana NOTA: Si algo va mal durante la transferencia de control, puede que el host no envíe la última fase de estado. Cuando pasa esto, pueden ocurrir dos cosas dependiendo del host:

a) El host envía un RESET b) El host puede mandar una nueva transacción SETUP sin enviar primero un

RESET. Para que el caso b) comunique correctamente, el EP OUT tiene que configurarse para recibir una transacción OUT de longitud cero o una nueva transacción SETUP. Como la transacción SETUP necesita que el bit DTS sea DAT0, el estado de longitud cero necesita que el bit DTS sea DAT1, la comprobación del bit DTS por hardware tiene que desactivarse. En este caso el SIE puede aceptar cualquiera de las dos transacciones. Además, el byte Cnt se tiene que fijar para prepararse para el dato SETUP (8bytes o mas), y el buffer de dirección 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 dueño. 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 finalización 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.

Page 470: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

468

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 transacción 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 transacción Setup, y

fuerza a que la CPU controle el EP0 IN.

void USBPrepareForNextSetupTrf(void) ctrl_trf_state = WAIT_SETUP; Ver usbctrltrf.h ep0Bo.Cnt = EP0_BUFF_SIZE; Definido en usbcfg.h ep0Bo.ADR = (byte*)&SetupPkt; ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; Inicialización EP0 buff dsc, ver usbmmap.h ep0Bi.Stat._byte = _UCPU; EP0 IN buffer inicialización end USBPrepareForNextSetupTrf

Page 471: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

469

4.4.4. USBDSC.C: DESCRIPTORES USB Este archivo contiene la información de los descriptores USB. Se utiliza junto al

archivo usbdsc.h. Cuando se añade o remueve un descriptor del menú de configuración 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 tamaño del descriptor, ej. sizeof(CFG01).

Una configuración típica de los descriptores consiste en:

La mínima configuración del descriptor (USB_CFG_DSC)

Uno o más descriptores de interfaz (USB_INTF_DSC)

Uno o más descriptores de Endpoint (USB_EP_DSC)

Nombres convenidos:

Tipo USB_CFG_DSC se nombra cdxx, donde xx es el número de configuración. Este número debería ser el mismo que el valor del índice actual de esta configuración.

Tipo USB_INTF_DSC se nombra i<yy>a<zz>, donde yy es el número de la interfaz y zz es el número de la interfaz alterna.

Tipo USB_EP_DSC se nombra ep<##><d>_i<yy>a<zz>, donde ## es el número del Endpoint y d es la dirección 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 configuración, 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 jerarquía de los descriptores sigue a las especificaciones de necesidad del USB. Todos los Endpoint que pertenecen a una interfaz se tienen que listar inmediatamente después que la interfaz.

Page 472: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

470

Rellenar los valores del descriptor en el archivo usbdsc.c:

[Descriptor de Configuration (USB_CFG_DSC)]

El atributo de configuración tiene que tener la definición _DEFAULT como mínimo. Se pueden añadir 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 parámetros son auto-explicativos. Especifican la longitud del descriptor del Endpoint (7) y el tipo de descriptor. El siguiente parámetro identifica el Endpoint, las definiciones se encuentran en usbdefs_std_dsc.h y tienen la siguiente convención:

_EP<##>_<dir>

donde ## es el número del endpoint y dir es la dirección de la transferencia. dir tiene el valor de ‘OUT’ o ‘IN’.

El siguiente parámetro 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 opción _ISO, se pueden añadir opciones adicionales. Ejemplo:

_ISO|_AD|_FE

Esto describe el Endpoint como una pipe síncrona con los atributos adoptivo y realimentación. Ver usbdefs_std_dsc.h y las especificaciones del USB por más detalles. El siguiente parámetro define el tamaño del Endpoint. El último parámetro es el intervalo de muestreo.

Añadir un String al USB

Una matriz de string descriptor debe tener el siguiente formato:

rom structbyte 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 número 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 carácter como un tipo de letra. Todo el texto string se declara como una matriz de letras con el número

Page 473: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

471

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 structbyte 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 múltiples strings como una búsqueda en tabla.

La búsqueda en tabla se define:

rom const unsigned char *rom USB_SD_Ptr[]=&sd000,&sd001,&sd002;

La declaración de arriba tiene 3 strings, sd000, sd001 y sd002. Los strings se pueden añadir o borrar. sd000 es un string descriptor especial, define el idioma, normalmente es inglés americano (US English (0x0409)). El índice del string debe ser igual que el índice de posición de la matriz USB_SD_Ptr, &sd000 tiene que estar en la posición USB_SD_Ptr[0], &sd001 tiene que estar en la posición USB_SD_Ptr[1] y así sucesivamente.

La búsqueda en tabla USB_SD_Ptr la utiliza la función de unión string en usb9.c.

El esquema de búsqueda en tabla también se aplica a la descriptor de configuración. Un dispositivo USB puede tener varios descriptores de configuraciones, ej. CFG01, CFG02, etc. Para añadir un descriptor de configuración, el usuario tiene que implementar una estructura similar a CFG01.

El siguiente paso es añadir el nombre del descriptor de configuración, ej. cfg01, cfg02…; a la búsqueda en tabla USB_CD_Ptr. USB_CD_Ptr[0] es muy fácil poner el titular ya que la configuración 0 es el estado no configurado de acuerdo con las especificaciones del USB.

Los tipos de descriptor específicos se definen en:

system\usb\usbdefs\usbdefs_std_dsc.h

La información de configuración se define en:

autofiles\usbcfg.h

4.4.4.1. Incluye #include "system\typedefs.h" #include "system\usb\usb.h"

Page 474: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

472

4.4.4.2. Constantes #pragma romdata Descriptor del dispositivo rom USB_DEV_DSC device_dsc= sizeof(USB_DEV_DSC), Tamaño del descriptor en bytes DSC_DEV, Descriptor tipo DEVICE 0x0200, Número de versión del USB en formato BCD 0x00, Código de Clase 0x00, Código Subclase 0x00, Código Protocolo EP0_BUFF_SIZE, Tamaño de paquete máximo para el EP0, ver usbcfg.h 0x04D8, ID Fabricante 0x0000, ID Producto 0x0001, Número de versión del dispositivo en formato BCD 0x01, String índice de fabricante 0x02, String índice del producto 0x00, String índice del número de serie del dispositivo 0x01 Número de configuraciones posible ; Descriptor de configuración 1 CFG01= Descriptor de configuración sizeof(USB_CFG_DSC), Tamaño del descriptor en bytes DSC_CFG, Tipo del descriptor CONFIGURACIÓN sizeof(cfg01), Longitud total de datos de esta configuración 1, Número de interfaces en esta configuración 1, Valor del índice de esta configuración 0, String índice de configuración _DEFAULT|_RWU, Atributos, ver usbdefs_std_dsc.h 50, Consumo máximo de corriente (2X mA) Descriptor de la interfaz sizeof(USB_INTF_DSC), Tamaño del descriptor en bytes DSC_INTF, Tipo de descriptor INTERFACE 0, Número de Interface 0, Número alterno de configuración 1, Número de Endpoints en esta interfaz HID_INTF, Código de la Clase BOOT_INTF_SUBCLASS, Código de la Subclase HID_PROTOCOL_MOUSE, Código del Protocolo 0, String índice de interfaz

Page 475: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

473

Descriptor de Clase Específica HID sizeof(USB_HID_DSC), Tamaño del descriptor en bytes DSC_HID, Tipo del descriptor HID 0x0101, Número de versión específica HID en formato BCD 0x00, Código del país (0x00 en los no soportados) HID_NUM_OF_DSC, Número de la clase del descriptor, ver usbcfg.h DSC_RPT, Tipo del informe del descriptor sizeof(hid_rpt01), Tamaño del informe del descriptor Descriptor del Endpoint sizeof(USB_EP_DSC),DSC_EP,_EP01_IN,_INT,HID_INT_IN_EP_SIZE,0x0A ; rom structbyte bLength;byte bDscType;word string[1];sd000= sizeof(sd000),DSC_STR,0x0409; rom structbyte 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 structbyte 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 structbyte report[HID_RPT01_SIZE];hid_rpt01= 0x05, 0x01, Página de uso (Escritorio genérico) 0x09, 0x02, Uso (Ratón) 0xA1, 0x01, Colección (Aplicación) 0x09, 0x01, Uso (Puntero) 0xA1, 0x00, Colección (Física) 0x05, 0x09, Página de uso (Botones) 0x19, 0x01, Uso mínimo (01) 0x29, 0x03, Uso máximo (03) 0x15, 0x00, Mínimo lógico (0) 0x25, 0x01, Máximo lógico (0) 0x95, 0x03, Cuenta del informe (3) 0x75, 0x01, Tamaño del informe (1) 0x81, 0x02, Entrada (Dato, Variable, Absoluto) 0x95, 0x01, Cuenta del informe (1) 0x75, 0x05, Tamaño del informe (5) 0x81, 0x01, Entrada (Constante); 5 bit de relleno 0x05, 0x01, Uso de página (Escritorio genérico) 0x09, 0x30, Uso (X) 0x09, 0x31, Uso (Y) 0x15, 0x81, Mínimo lógico (-127) 0x25, 0x7F, Máximo lógico (127) 0x75, 0x08, Tamaño del informe (8)

Page 476: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

474

0x95, 0x02, Cuenta del informe (2) 0x81, 0x06, Entrada (Dato, Variable, Relativo) 0xC0, 0xC0; Fin de la colección 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 compilación de usbcfg.h instantáneamente 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 específica 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 están conectadas en el chip. Al hacerlas instantáneas, 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 ejecución y se reduce el tamaño de programa.

Los Endpoints se definen con el número de Endpoint y la dirección de transferencia. Para simplificar, usbmmap.c sólo utiliza el número del Endpoint del esquema de direccionamiento de los registros BDT. Con este método si MAX_EP_NUMBER es 1, tenemos cuatro BDTs instantáneamente: uno para EP0IN, otro para EP0OUT, que se tiene que inicializar instantáneamente para las transferencias de control por defecto, y otros dos para EP1IN y EP1OUT. El nombre convenido es ep<#>B<d> donde # es el número del Endpoint y d es la dirección 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 instantáneamente. Representa el número máximo de Endpoints que se direccionan, no cuantos Endpoints se utilizan. Como los BDTs para los Endpoints tienen la dirección 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 aplicación 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

Page 477: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

475

utilizan, y los 24bytes de memoria asociados se pierden. No tiene mucho sentido saltar Endpoints, pero la decisión final la tiene el usuario.

El paso siguiente es asignar los BDTs instantáneos a las distintas funciones del USB. El firmware asume que cada función 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 número.

La asignación de los Endpoints de las funciones del USB se gobiernan en usbcfg.h. Esto ayuda a prevenir errores de tener más de una función USB con el mismo Endpoint. La sección “Distribución de los Endpoints” en usbcfg.h proporciona un ejemplo de cómo distribuir los Endpoints del USB con funciones USB.

Se puede cambiar la configuración en esta sección. No hay una forma correcta de configuración y los usuarios tienen que elegir el método más adecuado para la aplicación.

Normalmente, un usuario mapeará lo siguiente para una función de interfaz:

1. El ID de la interfaz USB 2. Los registros de control de los Endpoint (UEPn) 3. El registro BDT (ep<#>B<d>) 4. El tamaño 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 código 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 tamaño del Endpoint definido en el archivo usbcfg.h se utiliza de nuevo en el archivo usbmmap.c. Esto muestra que los dos archivos están muy relacionados.

El buffer del Endpoint para cada función USB se localiza en el área del puerto-dual RAM y como después se tiene que hacer instantáneos los BDTs. Un ejemplo de declaración es: volatile far unsigned char[FOO_EP_SIZE] data;

La palabra ‘volatile’ dice al compilador que no funcione ningún código de optimización 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 (0x000-0x05F).

Page 478: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

476

Para que la variable sea accesible globalmente con otros ficheros, se tiene que declarar en el archivo de cabecera usbmmap.h como una definición externa, como extern volatile far unsigned char[FOO_EP_SIZE] data;

Conclusión:

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 código de programa más rápido y pequeño.

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; Estados del dispositivo: Desconectado, Conectado, ... USB_DEVICE_STATUS usb_stat; Flags globales del USB byte usb_active_cfg; Valor de la configuración actual byte usb_alt_intf[MAX_NUM_INT]; Matriz para guardar los datos de la configuración actual alterna para cada ID interfaz

4.4.5.3. Localizaciones de variables fijas del USB #pragma udata usbram4=0x400 Ver, usb4: 0x400-0x4FF(256-byte) Sección 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; Endpoint #1 BD Out volatile far BDT ep1Bi; Endpoint #1 BD In #endif

Page 479: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

477

#if(2 <= MAX_EP_NUMBER) volatile far BDT ep2Bo; Endpoint #2 BD Out volatile far BDT ep2Bi; Endpoint #2 BD In #endif #if(3 <= MAX_EP_NUMBER) volatile far BDT ep3Bo; Endpoint #3 BD Out volatile far BDT ep3Bi; Endpoint #3 BD In #endif #if(4 <= MAX_EP_NUMBER) volatile far BDT ep4Bo; Endpoint #4 BD Out volatile far BDT ep4Bi; Endpoint #4 BD In #endif #if(5 <= MAX_EP_NUMBER) volatile far BDT ep5Bo; Endpoint #5 BD Out volatile far BDT ep5Bi; Endpoint #5 BD In #endif #if(6 <= MAX_EP_NUMBER) volatile far BDT ep6Bo; Endpoint #6 BD Out volatile far BDT ep6Bi; Endpoint #6 BD In #endif #if(7 <= MAX_EP_NUMBER) volatile far BDT ep7Bo; Endpoint #7 BD Out volatile far BDT ep7Bi; Endpoint #7 BD In #endif #if(8 <= MAX_EP_NUMBER) volatile far BDT ep8Bo; Endpoint #8 BD Out volatile far BDT ep8Bi; Endpoint #8 BD In #endif #if(9 <= MAX_EP_NUMBER) volatile far BDT ep9Bo; Endpoint #9 BD Out volatile far BDT ep9Bi; Endpoint #9 BD In #endif #if(10 <= MAX_EP_NUMBER) volatile far BDT ep10Bo; Endpoint #10 BD Out volatile far BDT ep10Bi; Endpoint #10 BD In #endif

Page 480: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

478

#if(11 <= MAX_EP_NUMBER) volatile far BDT ep11Bo; Endpoint #11 BD Out volatile far BDT ep11Bi; Endpoint #11 BD In #endif #if(12 <= MAX_EP_NUMBER) volatile far BDT ep12Bo; Endpoint #12 BD Out volatile far BDT ep12Bi; Endpoint #12 BD In #endif #if(13 <= MAX_EP_NUMBER) volatile far BDT ep13Bo; Endpoint #13 BD Out volatile far BDT ep13Bi Endpoint #13 BD In #endif #if(14 <= MAX_EP_NUMBER) volatile far BDT ep14Bo; Endpoint #14 BD Out volatile far BDT ep14Bi; Endpoint #14 BD In #endif #if(15 <= MAX_EP_NUMBER) volatile far BDT ep15Bo; Endpoint #15 BD Out volatile far BDT ep15Bi; Endpoint #15 BD In #endif Sección B: Espacio del Buffer del EP0 - Dos areas definidas para el buffer: A. CTRL_TRF_SETUP - Tamaño = 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 - Tamaño = 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; Sección 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

Page 481: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

479

4.4.6. USBGEN.C: USB GENÉRICO En este archivo se han creado todas las funciones de transferencia de los datos

que desee el usuario en la clase genérica.

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 genéricos, buffer de los descriptores,

estados máquina internos y variables. Hay que llamarla después 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. Razón: El número de bytes enviados al host varía de una transacción a otra. Cnt tiene que ser igual al número exacto de bytes a transmitir en una transacción IN dada. Este número de bytes sólo se conoce una vez que los datos hayan sido enviados. USBGEN_BD_OUT.Cnt = sizeof(usbgen_out); Fija el tamaño del buffer USBGEN_BD_OUT.ADR = (byte*)&usbgen_out; Fija la dirección del buffer USBGEN_BD_OUT.Stat._byte = _USIE|_DAT0|_DTSEN; Fija el estado USBGEN_BD_IN.ADR = (byte*)&usbgen_in; Fija la dirección del buffer USBGEN_BD_IN.Stat._byte = _UCPU|_DAT1; Fija el estado del buffer end USBGenInitEP

Page 482: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

480

4.4.6.4.2. void USBGenWrite(byte *buffer, byte len) Precondición: mUSBGenTxIsBusy() tiene que devolver “falso”.

El valor de ‘len’ tiene que ser igual o menor que USBGEN_EP_SIZE.

Para un Endpoint interrupción/bulk, el tamaño máximo del buffer es de 64bytes.

Entrada: buffer: Puntero a la localización de inicio de los bytes de datos.

len: Número de bytes a transmitir.

Esta macro se utiliza para transferir datos de la memoria de datos.

Aplicación típica:

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 comprobación fuerza que se cumpla la precondición. 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

Page 483: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

481

4.4.6.4.3. byte USBGenRead(byte *buffer, byte len) Precondición: El valor del argumento de entrada ‘len’ tiene que ser menor que

el tamaño máximo del Endpoint responsable de la recepción 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 número de bytes copiados al buffer.

Efectos secundarios: el acceso a la variable pública usbgen_rx_len se actualiza con el número de bytes copiados al buffer. Una vez llamado USBGenRead, la recuperación de usbgen_rx_len se puede hacer llamando la macro mUSBGenGetRxLength().

USBGenRead copia un string de los bytes recibidos a través de un Endpoint OUT a una localización especificada por el usuario. Es una función que espera a recibir los datos si no están disponibles. Devuelve ‘0’ para notificar que no hay datos disponibles.

Nota: Si el número actual de bytes recibidos es mayor que el número de bytes esperados (len), sólo se copian el número de bytes esperados al buffer.

Si el número de bytes recibidos es menor que el número 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 número de bytes que se esperan al número 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 próximo transacción 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

Page 484: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

482

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 número 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 estándar para saber que commando está en la ROM.

const rom InquiryResponse inq_resp = 0x00, Dispositivo periférico conectado, acceso directo al bloque del 0x80, dispositivo removible. 0x04, versión = 00=> no cumple ningún estándar, 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 básicas de cola "Microchp", este es el T10 asignado ID del fabricante "Mass Storage ", "0001" ;

Page 485: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

483

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 específicas de la clase

4.4.7.5.1. void USBCheckMSDRequest(void) Esta rutina une el RESET estándar y el comando de repuesta recibido en el EP0

de control GET_MAX_LUN.

Page 486: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

484

4.4.7.5.2. void ProcessIO(void) Precondición: 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 módulo de almacenamiento masivo.

En el estado MSD_WAIT: Espera al bloque de comando de cubierta (CBW) del Endpoint1. Si se recibe un CBW válido y significativo, dependiendo del comando recibido MSD_State cambia a MSD_DATA_IN si el dato se envía al host (para todos comandos además del WRITE_10).

MSD_DATA_OUT si el host está esperando a mandar datos (sólo en el caso de WRITE_10). Al finalizar el comando de estado de transferencia de datos de cubierta (CSW) se envía 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 Tamaño = 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 Inicialización.

MSD_State se fija a MAD_WAIT.

Esta rutina se llama desde InitializeSystem() en main.c. Inicializa la tarjeta SD y si tiene algún problema en la inicialización todos los LEDs se encienced. También 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

función 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 función envía el CSW y fija el estado a MSD_WAIT. También 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.

Page 487: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

485

4.4.7.5.7. void SendData(byte* dataAddr, byte dataSize) Esta función envía “dataSize” bytes de datos empezando en la dirección

“dataAddr”.

4.4.7.5.8. void MSDDataIn(void) Esta función envía 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 envían son menores que MSD_EP:SIZE y cuando se comprueba la condición de error bCSWStatus=0x01. En caso de error 0 se llenan y se envían los datos del tamaño esperado por el host dCBWDataTransferLength is sent.

4.4.7.5.9. void IsValidCBW() Comprueba si el CBW es válido de acuerdo con las especificaciones de la clase

almacenamiento masivo. Se considera un CSW válido 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 válido soportado por el dispositivo 3. bCBWCBLength y CBWCB tienen concordancia con

bInterfaceSubClass

4.4.7.5.11. void PrepareCSWData() Esto prepara el dato de estado del CSW copiando el dCSWTag del CBWTage y

fijando la firma de válido CSW=53425355h

4.4.7.5.12. void MSDInquiryHandler(void) Esta función 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 Sense, inicializando la estructura

RequestSenseResponse gblSenseData.

Page 488: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

486

4.4.7.5.14. void MSDReadCapacityHandler() Esta función procesa el dato del registro CSD (leido durante la inicialización de

la tarjeta SD) para encontrar el número 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 (número 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 envían al host en trozos de 64B (MSD_IN_EP_SIZE) (ver MSDDataIN()). Esto se repite para el número 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 código apropiado ASC, ASCQ.

4.4.7.5.16. void MSDDataOut(void) Efectos secundarios: MSD_BD_OUT.ADR se incrementa con

MSD_OUT_EP_SIZE (para leer los 64B siguientes en msd_buffer).

Esta función 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 (número 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 función 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 código apropiado ASC, ASCQ.

4.4.7.5.18. void MSDRequestSenseHandler(void) Esta función 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 función prepara para responder al comando Modo Sense. Se implementa

una respuesta básica en esta versión del código 00h y 0x03 es el tamaño del dato (en bytes) que sigue.

Page 489: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

487

4.4.7.5.20. void MSDMediumRemovalHandler() Esta función prepara la respuesta al comando Prevent Allow Medium Removal.

No se espera una respuesta de datos sólo se espera un CSW con comando de ejecución de estado. Como no se puede controlar la retirada del medio, repondemos con un Success CSW.

4.4.7.5.21. void MSDTestUnitReadyHandler() Esta función prepara la respuesta al comando Test Unit Ready. No se espera

respuesta de datos, sólo se envía 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 función prepara la respuesta al comando Verify. No se espera respuesta de

datos, respondemos con un CSW satisfactorio. El comando no se procesa en esta versión del código.

4.4.7.5.23. void MSDStopStartHandler() Esta función 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 versión del código.

Page 490: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

488

4.4.8. CDC.C: USB DISPOSITIVO DE COMUNICACIÓN 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; Estados definidos en cdc.h POINTER pCDCSrc; Puntero dedicado a la fuente POINTER pCDCDst; Puntero dedicado al destino byte cdc_tx_len; Longitud total tx byte cdc_mem_type; _ROM, _RAM LINE_CODING line_coding; Buffer para almacenar líneas de información 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 específicas 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.

Page 491: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

489

4.4.8.5. Api del Usuario

4.4.8.5.1. void CDCInitEP(void) CDCInitEP inicializa los Endpoints CDC, buffer descriptores, estados internos

máquina y variables. Se tiene que llamar después 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) Precondición: El valor del argumento de entrada ‘len’ tiene que ser menor que

el tamaño máximo del Endpoint responsable de la recepción 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 tamaño especificado por ‘len’.

Entrada: Buffer: Puntero a donde se guardan los datos recibidos.

len: El número de bytes esperados.

Salida: El número de bytes copiados al buffer.

Efectos secundarios: Se actualiza la variable de acceso público cdc_rx_len con el número de bytes copiados al buffer. Para recuperar esta variable llamamos a la macro mCDCGetRxLength().

getsUSBUSART copia un string de bytes recibidos a través del Endpoint OUT CDC Bulk a una localización especificada por el usuario. Es una función de no bloqueo. No espera a los datos si no están disponibles. Devuelve un ‘0’ para notificar que no hay datos disponibles.

Nota: Si el número actual de bytes recibidos es mayor que el número de bytes esperados (len), sólo se copian el número de bytes esperados. En cambio, si es menor el número de los recibidos, se copian todos.

4.4.8.5.3. void putsUSBUSART(char *data) Precondición: 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 envían 255bytes al host.

putsUSBUSART escribe un string de datos al USB incluyendo caracteres nulos. Utilizar esta versión, ‘puts’, para transferir datos localizados en la memoria de datos.

Nota: El mecanismo de transferencia para dispositivo-a-host (put) es más flexible que el de host-a-dispositivo (get). Puede manipular un string de datos mayor que el tamaño máximo del Endpoint In bulk. Se utiliza un estado máquina para

Page 492: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

490

transferir un long string de datos a través de múltiples transacciones USB. Ver CDCTxService() para más detalles.

4.4.8.5.4. void putrsUSBUSART(const rom char *data) Precondición: 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 envían 255bytes al host.

putrsUSBUSART escribe un string de datos al USB incluidos los caracteres nulos. Utilizar esta versión, ‘puts’, para transferir datos localizados en la memoria de programa.

Nota: El mecanismo de transferencia para dispositivo-a-host (put) es más flexible que el de host-a-dispositivo (get). Puede manipular un string de datos mayor que el tamaño máximo del Endpoint In bulk. Se utiliza un estado máquina para transferir un long string de datos a través de múltiples transacciones USB. Ver CDCTxService() para más detalles.

4.4.8.5.5. void CDCTxService(void) CDCTxService une las transacciones dispositivo-a-host. Hay que llamar a esta

función una vez por cada loop del programa Main.

Page 493: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

491

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; [0] Protocolo de inicio [1] Protocolo de informe byte hid_rpt_rx_len;

4.4.9.3. Prototipos privados void HIDGetReportHandler(void); void HIDSetReportHandler(void);

4.4.9.4. Declaraciones #pragma code

4.4.9.5. Respuestas específicas de la clase

4.4.9.5.1. void USBCheckHIDRequest(void) Esta rutina chequea el paquete de datos específico 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

máquina y variables. Se tiene que llamar después de que el host haya enviado una repuesta SET_CONFIGURATION. Ver USBStdSetCfgHandler() en usb9.c para ejemplos.

Page 494: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

492

4.4.9.6.2. void HIDTxReport(char *buffer, byte len) Precondición: mHIDTxIsBusy() tiene que devolver falso. El valor de ‘len’ tiene

que ser menor o igual que HID_INT_IN_EP_SIZE. Para un Endpoint interrupción, el tamaño del buffer máximo es de 64bytes.

Entrada: buffer: Puntero al comienzo de la localización de bytes de datos.

len: Número de bytes que se van a transferir.

Utilizar esta macro para tranferir datos localizados en la memoria de datos.

Aplicación típica: if(!mHIDTxIsBusy()) HIDTxReport(buffer, 3);

4.4.9.6.3. byte HIDRxReport(char *buffer, byte len) Precondición: El valor del arguemento de entrada ‘len’ tiene que ser menor que

el tamaño máximo del Endpoint responsable de la recepción de datos del host USB para la clase HID. El argumento de entrada ‘buffer’ tiene que apuntar a un área mayor o igual al tamaño especificado por ‘len’.

Entrada: buffer: Puntero al lugar donde se guardan los datos recibidos.

len: Número de bytes que se esperan.

Salida: Número de bytes copiados al buffer.

Efectos secundarios: Se actualiza la variable de acceso público hid_rpt_rx_len con el número de bytes copiados al buffer. Para recuperar esta variable llamamos a la macro mHIDGetRptRxLength().

HIDRxReport copia un string de bytes recibidos a través del Endpoint OUT HID a una localización especificada por el usuario. Es una función de no bloqueo. No espera a los datos si no están disponibles. Devuelve un ‘0’ para notificar que no hay datos disponibles.

Nota: Si el número actual de bytes recibidos es mayor que el número de bytes esperados (len), sólo se copian el número de bytes esperados. En cambio, si es menor el número de los recibidos, se copian todos.

Page 495: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

493

4.4.10. MAIN.C Este es el archivo de inicio. En él se incluyen las funciones necesariar para

establecer la comunicación USB y las relativas a la aplicación 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() USB Tasks ProcessIO(); Aqui se llama al programa del usuario end while end main

Page 496: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

494

static void InitializeSystem(void) InitializeSystem es una rutina centralizada de inicialización. Todas las rutinas de

inicialización 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(); inicialización del usuario end InitializeSystem

void USBTasks(void) Precondición: Se tiene que haber llamado InitializeSystem

Da vueltas dando servicio a las tareas USB.

void USBTasks(void)

Da servicio al Hardware

USBCheckBusStatus(); se tiene que utilizar el método obtener if(UCFGbits.UTEYE!=1) USBDriverService(); Método interrupción u obtener end USBTasks

Page 497: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

495

4.4.11. INTERRUPT.C En este archivo se declaran la parte del programa que se ejecuta durante una

interrupción.

4.4.11.1. Incluye #include <p18cxxx.h> #include "system/typedefs.h" #include "system/interrupt/interrupt.h"

4.4.11.2. Vectores de interrupción #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

Page 498: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 499: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

5. LENGUAJE DE PROGRAMACIÓN

VISUAL BASIC

Page 500: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 501: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

499

5. LENGUAJE DE PROGRAMACIÓN VISUAL BASIC

5.1. INTRODUCCIÓN El lenguaje de programación BASIC (Beginner's All purpose Symbolic

Instruction Code ) nació en el año 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 inglés), y con instrucciones muy sencillas y escasas. Teniendo en cuenta el año de su nacimiento, este lenguaje cubría casi todas las necesidades para la ejecución de programas. Téngase en cuenta que las máquinas existentes en aquella época estaban estrenando los transistores como elementos de conmutación, 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 científicos John G. Kemeny (Budapest, 1926 – USA 1992) y Thomas E. Kurtz (Illinois 1928) Su trabajo original se llamó True BASIC.

La evolución del BASIC por los años 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 creándose la normativa BASIC STANDARD

Con la aparición de los primeros ordenadores personales, dedicados comercialmente al usuario particular, allá por la primera mitad de los ochenta, el BASIC resurgió como lenguaje de programación pensado para principiantes, y muchos de estos pequeños ordenadores domésticos lo usaban como único sistema operativo (Sinclair, Spectrum, Amstrad)

Con la popularización 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 crédito entre los profesionales de la informática.

Las razones para ello eran obvias:

No era un lenguaje estructurado.

No existían herramientas de compilación fiables.

No disponía de herramientas de intercambio de información.

No tenía librerías.

No se podía acceder al interior de la máquina.

Un largo etcétera de desventajas respecto a otros lenguajes de programación.

Page 502: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

500

Tal fue ese abandono por parte de los usuarios, que la aparición del Quick-BASIC de Microsoft, una versión ya potente del BASIC, que corregía casi todos los defectos de las versiones pasó prácticamente inadvertida, a no ser porque las últimas versiones del sistema operativo MS-DOS incluían una versión de Quick-BASIC algo recortada (Q-Basic) como un producto mas dentro de la amplia gama de ficheros ejecutables que acompañan 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 versión del popular BASIC ya es un lenguaje estructurado, lo que permite crear programas modularmente, mediante subrutinas y módulos, 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 gráfico Windows.

Sin embargo algo había en el BASIC que tentaba a superarse: su gran sencillez de manejo. Si a esto se le añade el entorno gráfico Windows, el aprovechamiento al máximo de las posibilidades de Windows en cuanto a intercambio de información, de sus librerías, de sus drivers y controladores, manejo de bases de datos, etc. el producto resultante puede ser algo que satisfaga todas las necesidades de programación en el entorno Windows. La suma de todas estas cosas es VISUAL - BASIC. Esta herramienta conserva del BASIC de los años 80 únicamente su nombre y su sencillez, y tras su lanzamiento al mercado, la aceptación a nivel profesional hizo borrar por fin el "mal nombre" asociado a la palabra BASIC.

Actualmente (2001) se está comercializando la versión 6.0 de este producto. Desde su salida al mercado, cada versión supera y mejora la anterior. Dados los buenos resultados a nivel profesional de este producto, y el apoyo prestado por el fabricante para la formación 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 máquina 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 programación. (Visual-C). o realizar librerías (DLLs) que lo hagan. En la mayor parte de las aplicaciones, las herramientas aportadas por VB son mas que suficiente para lograr un programa fácil de realizar y de altas prestaciones.

Page 503: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

501

5.2. CARACTERÍSTICAS GENERALES DE VISUAL BASIC Visual Basic es una herramienta de diseño de aplicaciones para Windows, en la

que estas se desarrollan en una gran parte a partir del diseño de una interface gráfica. En una aplicación Visual Basic, el programa está formado por una parte de código puro, y otras partes asociadas a los objetos que forman la interface gráfica.

Es por tanto un término medio entre la programación tradicional, formada por una sucesión lineal de código estructurado, y la programación orientada a objetos. Combina ambas tendencias. Ya que no podemos decir que VB pertenezca por completo a uno de esos dos tipos de programación, debemos inventar una palabra que la defina: PROGRAMACION VISUAL.

La creación de un programa bajo Visual Basic lleva los siguientes pasos:

Análisis. Es el estudio de las necesidades que han dado origen a la creación de ese programa. Es lo que se se llama Análisis de la aplicación. Es la primera fase que debe tener siempre un programa y es también la más olvidada entre los programadores noveles. Una aplicación no se inicia con el teclado, sino sobre un papel.

Creación de un interface de usuario. Este interface será la principal vía de comunicación hombre máquina, tanto para salida de datos como para entrada. Será necesario partir de una o varias ventanas (Formularios) a las que le iremos añadiendo los controles necesarios.

Definición de las propiedades de los controles. Se dará la forma, posición, y todas las características necesarias a los controles que hayamos colocado en ese formulario. Estas propiedades determinarán la forma estática de los controles, es decir, como son los controles y para qué sirven.

Generación del código 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.

Generación del código del programa. Un programa puede hacerse solamente con la programación de los distintos procedimientos que acompañan a cada objeto. Sin embargo, VB ofrece la posibilidad de establecer un código de programa separado de estos eventos. Este código puede introducirse en unos bloques llamados Módulos, 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 ejecución del programa.

No es necesario entender de momento lo anterior. Visual Basic introduce un concepto nuevo de programación, y es necesario cambiar hasta el argot del

Page 504: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

502

programador. Posiblemente se le habrán acumulado demasiados términos 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 ejecución de un programa.

Se admiten valores decimales (base 10), hexadecimales (base 16) y octales (base 8). Un número hexadecimal va precedido por “&H” y un número octal por “&O” (letra “O”, no número “0”).

Una constante de caracteres o constante alfanumérica 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

ejecución de una aplicación.

Cada variable tiene atributos propios como:

Nombre: es el nombre que se utiliza para referirnos a su contenido en la aplicación.

Tipo: el tipo determina qué clase de valores se pueden almacenar en cada variable.

Ámbito: especifica en qué parte de la aplicación 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, dígitos, el carácter subrayado (´_´) y los caracteres de declaración de tipo de la variable (%, &, !, #, @ y $). Los caracteres de declaración de tipo, cuando se utilicen, tienen que ocupar la última posición.

No se pueden utilizar el punto (´.´) ni otros que tienen un significado especial en VB (por ejemplo, los paréntesis). El nombre de una variable no puede ser una palabra reservada de VB (como For, Caption, Long, And...)

Page 505: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

503

5.3.2.2. Tipo Todas las variables tienen un tipo de dato que determina la clase de datos que

pueden almacenar:

TIPO DESCRIPCION CAR-

TIPO RANGO

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 Número c/ punto decimal fijo @ ±9223372036854775807

String Cadena de caracteres fija (no) Hasta 64Kbytes aprox.

String Cadena de c. Variable $ Hasta 231 caracteres aprox.

Byte Carácter (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 omisión (no) Numérico = Double

Cadena = String

Page 506: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

504

5.3.2.3. Ámbito Se entiende por ámbito o alcance de una variable el espacio de la aplicación

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:

Aplicación: Variables utilizables por todos los módulos (declaración Public en cualquier módulo).

Formulario: Variables utilizadas dentro del módulo (declaración Dim o Private en el módulo).

Funciones y Procedimientos: Variables locales (Dim o Static).

5.3.3. OPERADORES La tabla que se muestra a continuación presenta el conjunto de operadores

soportados, ordenados de mayor a menor prioridad cuando varios intervienen en una misma expresión:

TIPO OPERACIÓN OPERADOR

Aritméticos

Exponenciación Cambio de signo

Multiplicación, división División entera

Resto de div. entera Suma, resta

^ -

* , / \

Mod + , -

Concatenación Enlazar cadenas &

Relacional Igual, distinto, menor, mayor, ... =, <>, <, >, ...

Otros Comparar dos cadenas de texto

Comparar dos referencias a objetos Like

Is

Lógico

Negación And

Or inclusiva (Or) Or Exclusiva (Xor)

Equivalencia (opuesto a Xor) Implicación

Not And Or Xor Eqv Imp

Page 507: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

505

5.3.4. SENTENCIAS DE CONTROL Las sentencias de control, denominadas también 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 expresión entre corchetes - []- es opcional.

De las expresiones entre llaves -- se puede elegir una, la necesaria según el caso.

5.3.4.1. Sentencia If Permite tomar una decisión referente al camino a seguir o acción a ejecutar en

un proceso, basándose en el resultado booleano (verdadero o falso) de una condición. Su sintaxis es:

If condición Then acción1 [Else acción2]

Donde condición debe ser una expresión numérica, relacional o lógica (el resultado que se obtiene al evaluar la condición es Trae o False, y acción 1 | acción2 son una o más sentencias separadas por “:”.

Si la condición es verdadera, se ejecuta la acción 1 y si es falsa se ejecuta la acción2, lógicamente en el caso de que sea especificada.

En cualquier caso, la ejecución continúa con la siguiente sentencia ejecutable.

Page 508: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

506

5.3.4.2. Sentencia Select La sentencia Select permite ejecutar una de varias acciones en función del valor

de una expresión. Es una alternativa a la sentencia If cuando lo que se necesita es comparar la misma expresión 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 expresión numérica o alfanumérica y las expresiones lista-1, lista-2 pueden tener cualquiera de las formas siguientes:

expresión [, expresión] ... expresión To expresión Is operador-de-relacion expresión

O una combinación de las anteriores separadas por comas.

5.3.4.3. Sentencia For…Next La sentencia For da lugar a un bucle, y permite ejecutar un conjunto de

sentencias cierto número 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 más reciente (aunque se recomienda incluir las variables, evitando confusiones).

Page 509: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

507

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 continuación se comprueba si la variable es mayor que la expr-2, en cuyo caso se salta el cuerpo del bucle y se continúa en la sentencia que esté a continuación de Next.

En otro caso, se ejecutan las líneas 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), volviéndose a efectuar la comparación entre la variable y expr-2, y así sucesivamente.

5.3.4.4. Sentencia While…Wend Una sentencia o bucle While repite la ejecución de un conjunto de sentencias

especificado mientras una determinada condición sea cierta. La condición se verifica antes de ejecutar el conjunto de sentencias. Su sintaxis es: While condición [sentencias] Wend

Donde condición es cualquier expresión de tipo numérico, relacional o lógico. Al finalizar el bucle, se continúa la ejecución en la sentencia posterior a la

cláusula Wend.

5.3.4.4.1. Funcionamiento de la Sentencia While...Wend La ejecución de las sentencias de este tipo sucede así:

1. Se evalúa la condición.

2. Si el resultado de la evaluación es Falso, las sentencias que forman el cuerpo de While no se ejecutan y se pasa el control a la siguiente sentencia en el código a Wend.

3. Si el resultado de la evaluación es Verdadero, se ejecutan las sentencias que forman el cuerpo de While y el proceso descrito se repite posteriormente desde el punto 1.

Page 510: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

508

5.3.4.5. Sentencia Do…Loop La sentencia Do ... Loop proporciona una manera más flexible y estructurada de

realizar los bucles. Repite la ejecución de un conjunto de instrucciones mientras una condición dada sea cierta o hasta que una condición dada sea cierta. La condición puede ser verificada antes o después de ejecutarse el conjunto de sentencias:

Formato 1:

Do [While|Until condición] [sentencias] [Exit Do] [sentencias] Loop

Formato 2:

Do [sentencias] [Exit Do] [sentencias] Loop [While|Until condición]

5.3.4.6. Sentencia Goto Transfiere el control a una línea específica del código, identificada por una

etiqueta o nº de línea. Su sintaxis es:

Goto etiqueta|nº de línea

Un uso abusivo de esta sentencia puede dar lugar a aplicaciones difíciles de interpretar o mantener. Por ello, en programación se utiliza solamente en ocasiones excepcionales, pues la función que vaya a desempeñar Goto puede suplirse utilizando cualquiera de las sentencias de control estructuradas que se han visto anteriormente.

Page 511: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

509

5.4. LIBRERÍAS EN VISUAL BASIC Como en cualquier lenguaje de alto nivel, en VB también existen las librerías,

además de los componentes.

Los componentes archivos ocx, son librerías que se programan desde un entorno visual. Pueden ser desde tipos de botones para agregar al programa hasta la creación, en el programa, de un puerto serie.

Las librerías 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. LIBRERÍA DEL USB: MPUSBAPI.DLL

5.4.1.1. Inroducción 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 revisión del MPUSAPI.dll. Es un nivel de revisión de 32bits.

Esta función no devuelve la versión del código, no realiza nada con el USB.

Devuelve la versión de la dll en formato hexadecimal de 32bits.

MPUSBGetDLLVersion()

5.4.1.2.2. MPUSBGetDeviceCount(pVID_PID) Devuelve el número de dispositivo con VID_PID asignado.

pVID_PID: Input: cadena de caracteres del número de identificación asignado.

MPUSBGetDeviceCount(vid_pid)

Page 512: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

510

5.4.1.2.3. MPUSBOpen(instance, pVID_PID, pEP, dwDir, dwReserved)

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 time-out.

Nota: el valor del time-out no tiene sentido en una pipe síncrona.

instance: Input: Un número 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 número devuelto por el MPUSBGetDeviceCount tiene que ser igual o menor que el número de todos los dispositivos actualmente conectados y usando el driver genérico.

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 función tiene que haber un mecanismo que intente llamar MPUSOpen() desde 0 hasta MAX_NUM_MPUSB_DEV. Se tiene que contar el número de llamadas exitosas. Cuando este número sea igual al número devuelto por MPUSBGetDeviceCount, hay que dejar de hacer las llamadas porque no puede haber más 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 número del Endpoint que se va a abrir. El formato es “\\MCHP_EPz” o “\MCHP_EPz” dependiendo del lenguaje de programación. Donde z es el número del Endpoint en decimal.

Ejemplo:

“\\MCHP_EP1” o “\MCHP_EP1”

Page 513: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

511

Este argumento puede ser NULL (nulo) para crear lazos con Endpoints de funciones no específicas.

Las funciones específicas son: MPUSBRead, MPUSBWrite, MPUSBReadInt.

Nota: Para utilizar MPUSBReadInt(), el formato de pEP tiene que ser “\\MCHP_EPz_ASYNC”. Esta opción sólo está disponible para un Endpoint interrupción IN. La pipe de datos abierta con “_ASYNC” debe almacenar datos con el intervalo especificado en el Endpoint descriptor con un máximo de 100 recepciones. Cualquier otro dato recibido después de llenar el buffer del driver se ignora.

La aplicación del usuario tiene que llamar MPUSBReadInt() a menudo sin superar el máximo de 100.

dwDir: Especifica la dirección 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, pData, dwLen, pLength, dwMilliseconds)

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 leído de la pipe.

dwLen: Input: Especifica el número de bytes que hay que leer de la pipe.

pLenght: Output: Puntero al número de bytes leídos. 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 función vuelve si transcurre el intervalo aunque no se complete la operación. Si dwMilliseconds=0, la función 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)

Page 514: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

512

5.4.1.2.5. MPUSBWrite(handle, pData, dwLen, pLength, dwMilliseconds)

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 número de bytes que se van a escribir en la pipe.

pLenght: Output: Puntero al número de bytes que se escriben al llamar esta función. 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 función vuelve si transcurre el intervalo aunque no se complete la operación. Si dwMilliseconds=0, la función 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, pData, dwLen, pLength, dwMilliseconds)

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 leído de la pipe.

dwLen: Input: Especifica el número de bytes que hay que leer de la pipe.

pLenght: Output: Puntero al número de bytes leídos. 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 función vuelve si transcurre el intervalo aunque no se complete la operación. Si dwMilliseconds=0, la función 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 unión.

handle: Input: Identifica la pipe del Endpoint que se va a cerrar.

MPUSBClose (myOutPipe)

Page 515: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

513

5.4.1.3. TIPOS DE TRANSFERENCIAS En este apartado se recomienda que función utilizar dependiendo del tipo de

transferencia.

Tipo Función ¿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 interrupción

Isochronous: tipo síncrono

Nota: “Input” y “output” se refiere a los parámetros designados en las llamadas a estas funciones, que son lo opuesto a los sentidos comunes desde la perspectiva de una aplicación haciendo llamadas.

5.4.1.4. Declaración De Constantes Y Variables Aquí aparecen las constantes y variables que el fabricante recomienda usar.

Todas son optativas, dejando la elección al programador.

También, se comentan las pequeñas 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 números del Endpoint por los que se van a realizar las transmisiones.

Page 516: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

514

5.4.1.5. Declaración de las funciones En el último punto de la librería, se comenta como incluir las funiones en varios

lenguajes de programación.

5.4.1.5.1. C 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

Page 517: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

515

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: DWORD, dwReserved: DWORD): HANDLE; cdecl; Function MPUSBClose(handle: HANDLE): BOOLEAN; cdecl; Function MPUSBRead(handle: HANDLE, pData: PVOID, dwLen: DWORD, pLength: PDWORD, dwMilliseconds: DWORD): DWORD; cdecl; Function MPUSBWrite(handle: HANDLE, pData: PVOID, dwLen: DWORD, pLength: PDWORD, dwMilliseconds: DWORD): DWORD; cdecl; Function MPUSBReadInt(handle: HANDLE, pData: PVOID, dwLen: DWORD, pLength: 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;

Page 518: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 519: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

6. INTERCONEXIÓN

USB-PC

Page 520: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 521: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

519

6. INTERCONEXIÓN USB-PC

6.1. INTRODUCCIÓN El USB se encuentra en todos los tipos de plataformas de ordenador conocidos.

En este capítulo, nos centraremos en Windows por ser el más difundido y en los periféricos USB.

Para que cualquier sistema operativo reconozca un periférico, 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 documentación (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 aplicación 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 común 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 aplicación.

6.3. CARGA EN WINDOWS DE UN MÓDULO USB Veamos las operaciones realizadas por Windows cuando se conecta un

periférico USB.

En cuanto se detecta la presencia de un periférico, Windows realiza la enumeración, de forma que obtiene la información VID y PID. El sistema utiliza estos datos para encontrar el driver que gestiona el periférico. Si este ya se conoce, su información se encuentra en el “registro”, de otro modo, esta se encontrará en un fichero de tipo inf. Por esta razón, Windows pide para cada nuevo periférico el disco que contiene la información. Si encuentra varios ficheros .inf, el sistema busca en cada uno de ellos el que contiene la información de instalación del periférico (VID/PID).

Las instrucciones para la carga del software necesario para este dispositivo se encuentra en ese fichero que, como mínimo, debe indicar el nombre del fichero que contiene el driver (con extensión .SYS), el GUID…

Page 522: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

520

El software se almacena en la carpeta de Windows, con lo que finaliza el proceso de instalación. Sólo queda hacerse cargo del periférico, para lo que Windows ejecuta el driver xx.sys.

En las últimas versiones de Windows, el sistema posee archivos .sys “genéricos”. Al conectar un periférico, el sistema busca en una base de datos interna el VID y el PID y, si encuentra el periférico, instala el driver genérico que posee. Así, al conectar un periférico nuevo, normalmente no pide el disco con el driver.

6.4. EL DRIVER .SYS Para dialogar con la aplicación, es necesario que ésta solicite al sistema la

apertura de un enlace.

La solución más aconsejable es proporcionar el GUID…, que debe ser un número único para que la aplicación pueda conectarse con su driver.

En cuanto el periférico se conecta, el programa driver.sys se carga y se ejecuta, y será descargado en cuanto el periférico se desconecte. Al llamarle, el sistema le proporciona la dirección 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 (inicialización o carga del código, por ejemplo). Los programas se quedan en reposo hasta que la aplicación efectúa una petición o se produce un evento (desconexión, por ejemplo).

6.4.1. DIÁLOGO CON LA APLICACIÓN La aplicación utiliza el GUID para abrir un enlace virtual con el periférico.

Pueden utilizarse varios grupos de funciones para dialogar. El primero utiliza las funciones básicas de creación, apertura, lectura y escritura en un fichero. El periférico se ve como un fichero, y este grupo no permite el envío de mensajes de control sobre el Endpoint 0.

El interés de estas funciones es que utilizan los puntos de entrada clásicos de Windows. A priori, pueden utilizarse todos los compiladores de 32bits. La familia de funciones Device IOControl permite un acceso más completo al USB. Como decíamos al principio de este capítulo, se puede obtener información más completa en Microsoft.

Page 523: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

521

6.4.2. GESTIÓN 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 aplicación que se encuentran en ejecución o que, en un momento u otro, han modificado el sistema.

Todos esto elementos interactúan 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 configuración del sistema y efectuar pruebas cruzadas para encontrar los programas activos. La simple constatación de un fallo no aporta gran cosa para hallar la causa. Las “líneas calientes” de los fabricantes de tarjetas ofrecen cuestionarios muy completos a los que hay que responder antes de iniciar cualquier investigación del problema por parte del servicio técnico.

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 garantía”. A los fabricantes de periféricos que pagan una gran cantidad económica Microsoft les otorga su certificado, para que al instalar el driver no parezca un mensaje en la pantalla diciendo que el periférico 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 versión de Windows.

6.4.3. CARACTERÍSTICAS DE UN DRIVER No hay que creer que un driver no es más que eso: un driver; del mismo modo

que para un mecánico profesional no hay sólo un coche. Las particulares características hacen que un driver sea diferente del resto. Todo lo que ocurra dependerá del driver, por tanto, de la elección del software por parte del desarrollador de ese programa. Por esto, vamos a comentar las principales características de un driver.

En este punto se irán comentando las características del driver mchpusb.sys de Microchip.

Page 524: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

522

6.4.3.1. Principios De Acceso La aplicación puede acceder al driver tanto por los puntos de entrada clásicos

Read y Write, como por la función IoControl. En el primer caso, se pasa solamente un buffer, en el otro, se pasan dos buffers y un código de función. El desarrollador puede elegir una u otra solución, incluso las dos. La primera permite ofrecer una compatibilidad descendente con los anteriores sistemas orientados a ficheros, pero es más frecuente la segunda solución, ya que permite hacer otras peticiones, tales como las de estado.

El código de función IoControl depende del desarrollador. Sin embargo, las opciones elegidas por este modifican el código en función de los campos de bits “normalizados”.

La librería de Microchip hace la transferencia IoControl.

6.4.3.2. Modo De Acceso Más concretamente, el retorno puede hacerse tanto si ha terminado la petición

como si no. En el primer caso, la petición es síncrona y, en consecuencia, las acciones se hacen detrás de otras, mientras que en el segundo caso, la petición es asíncrona.

El modo asíncrono resulta más complicado de implementar, ya que es necesario gestionar el overlapped. Para ello, durante la petición, ésta pasa a un puntero para indicar adónde debe retornar esta información el driver. Todo esto debe ser cuidadosamente gestionado.

El driver de Microchip soporta ambos modos de acceso, la variación reside en las funciones de acceso utilizadas, como se explicó en el capítulo anterior.

6.4.3.3. Modo De Acceso Múltiple Esto no tiene lugar en el modo síncrono, puesto que se retorna a la aplicación

cuando la petición termina. Por el contrario, en el caso del modo asíncrono, puede haber varias peticiones en curso. El driver debe ser capaz de mantener la información overlapped y de reenviar la información de fin (o error) al llamador. Todo esto es muy coherente, pero complica la programación en consecuencia. Para esta opción, la solución más adecuada viene a ser la lista encadenada.

6.4.3.4. Paso De Datos Para paquetes pequeños, únicamente se pasa el puntero, que suele ser la solución

más 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 aplicación, sin embargo, el driver debe ser capaz de manejar ambos casos.

Page 525: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

523

6.4.3.5. Limitación de 4Kbytes En las capas más “profundas” del sistema operativo, hay que moverse rápido y

no se puede andar dividiendo los paquetes en bloques. Esto viene a cuento porque existe una restricción física 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. Múltiples Periféricos En este caso nos pasamos al otro lado, o sea, al diálogo hacia el periférico USB.

La aplicación tiene puntos de entrada hacia el driver (pasando por el sistema), pero el sistema dialoga también con el driver.

Cuando el sistema detecta un nuevo periférico 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 aplicación para abrir el fichero (create).

Desafortunadamente, si este nombre ya existe, por ejemplo, por que el driver haya sido utilizado anteriormente para cargar un periférico idéntico al que se trata de instalar, el sistema lo rechazará y devolverá un mensaje negativo al driver. Un driver con múltiples periféricos propondrá otro nombre.

La gestión de múltiples periféricos obliga sin embargo a mantener información para cada periférico. Utilizando en cada vez un VID/PID diferente, se puede rodear el problema con el mismo driver. El nombre que permite asociar la aplicación con su driver tiene una importancia decisiva. Este nombre debe ser conocido por la aplicación y único, de otro modo, será rechazado por el sistema. Por ello Microchip permite registrar el PID.

6.4.3.7. Gestión De Las Peticiones De La Aplicación La aplicación envía sus peticiones al driver y este responde; el método es simple;

además, el fabricante que vende el producto proporciona tanto la aplicación como el driver. Por esta razón es difícil imaginar que la aplicación pueda hacer peticiones que estén fuera de las aceptadas por el driver, más aún cuando es el propio driver el que proporciona los números de código de las funciones.

6.4.3.8. Gestión De Las Peticiones Del Sistema El sistema operativo (OS) también 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 periféricos se hubiera estancado, la evolución del sistema operativo es constante, por lo que hay que actualizar el driver.

Page 526: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

524

6.5. EL DRIVER DE MICROCHIP A lo largo del capítulo, se han comentado carácterísticas del driver que cede

Microchip para desarrollar aplicaciones para sus microcontroladores.

Al disponer de un driver estable con las características apropiadas y con un ámbito de aplicación muy grande, por sencillez y comodidad, se utilizará este. El problema es que dependiendo de la aplicación 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, descripción y los demás datos que aparecen en las últimas líneas. Con estas pequeñas y sencillas modificaciones se adapta el driver de Microchip a nuestra aplicación.

Page 527: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

7. APLICACIÓN

Page 528: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 529: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

527

7. APLICACIÓN

7.1. INTRODUCCIÓN Como aplicación practica de la comunicación 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, dirección 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 modificación de anchura del pulso (PWM).

La dirección se controla con un motor paso a paso, éste necesita unos pulsos de control para poder moverse un determinado ángulo, que depende del motor.

Además, se encenderán dos luces delanteras y dos traseras y un zumbador para simular el claxon.

En éste capítulo, se pretende explicar desde el porqué del diseño de la placa a la aplicación de control realizada en el ordenador.

7.2. CIRCUITO ELÉCTRICO En este punto, se analizarán todos los componentes que se han utilizado,

comentando sus características y el motivo de su uso.

La alimentación del puerto USB sólo se utiliza para alimentar el microcontrolador y el L293D, debido a la demanda excesiva del circuito y para que el micro tenga una tensión estable que no se vea afectada por el ruido generado por los motores de corriente continua.

Se han utilizado dos fuentes de alimentación debido a la gran demanda de corriente del cicuito, y que el autor no dispone de una fuente de alimentación 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 conexión de un condensador de 100nF entre los puntos de la fuente de alimentación, es para filtrar el posible error producido por el ruido generado por las altas frecuencias del puerto USB y por los motores.

Page 530: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

528

7.2.1. ESQUEMA ELÉCTRICO DEL CIRCUITO

Page 531: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

529

7.2.2. COMPONENTES

7.2.2.1. Microcontrolador El componente más importante es el microcontrolador PIC18F2455, dentro de la

familia PIC18Fxx5x se ha elegido este, por ser el que más se adecua a nuestra aplicación por ser el de menor memoria y por ser el de menor salidas. Estas dos características 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, según el fabricante, en los terminales OSC1 y OSC2.

El condensador electrolítico de 47μF conectado al terminal VUSB es una exigencia del fabricante para estabilizar la tensión 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 tensión que alimenta al LED.

El resto de características se han comentado a lo largo de esta memoria.

7.2.2.2. ULN2803 Este dispositivo es un buffer de alta tensión y alta corriente, formado por una

matriz de ocho transistores interconectados en Darlington.

Sus ocho transistores NPN están diseñados especialmente para interconectar circuitos lógicos de baja potencia (TTL, CMOS o PMOS/NMOS) con componentes que requieren alta tensión/corriente como bombillas, motores, relees.

También pertenece a la familia de este integrado el ULN2804, la diferencia entre ambos, reside en que este último está diseñado para amplificar dispositivos CMOS o PMOS y el ULN2803 los TTL.

Como el microcontrolador tiene lógica 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 conexión 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 alimentación del circuito de

salida, en este caso, se conecta a la fuente de alimentación. Las salidas, cuando se activan proporcionan 0V, por lo que se utilizan

como la masa del componente que se quiere amplificar.

Page 532: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

530

7.2.2.3. L293D El L293D es un cuádruple puente de alta corriente, diseñado para proporcionar

la doble dirección en corrientes mayores de 600mA y tensiones de 4,5V a 36V. Se ha diseñado para controlar inducciones como las de un relee, un motor…

Las entradas son compatibles con la lógica TTL.

Las entradas se activan en parejas, 1A y 2A se activan con la entrada de habilitación 1,2EN; y 3A y 4A con 3,4EN. Cuando una entrada y la de habilitación están en un nivel alto, el driver (la salida) también, activándose en fase con la entrada. Cuando la entrada está en un nivel bajo y la de habilitación en alto, el driver estará en bajo. El último caso, cuando la entrada está en cualquier nivel y la de habilitación 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 aplicación son los diodos rectificadores 1N4007, que soportan una tensión y una corriente mucho más alta que la del circuito.

El integrado posee dos terminales de alimentación, uno para la alimentación TTL, Vcc (terminal 18), conectado a la alimentación 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 tensión. Esta conexión se ha realizado para que el L293D tenga la tensión 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 tensión analógica dentro de un rango de 20 a 80cm. La tensión de alimentación es de 5V y la tensión de salida varía unos 2V de diferencia entre el margen mínimo y el máximo de la distancia medida, actualizándose 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 tensión 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 número del componente), se utilizan, en este caso, para detectar cuando se choca el coche con algún 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.

Page 533: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

531

7.2.2.6. Zumbador El zumbador es un componente, que al alimentarlo emite sonido. El que se

utiliza en la aplicación es de 6V, pudiéndose alimentar a 5V como el resto del circuito.

En la aplicación 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 súper LEDs rojos. La diferencia entre un LED normal y estos, es que estos lucen con más intensidad que los tradicionales.

7.2.2.8. Conector USB El conector USB utilizado es del tipo B hembra, para impedir la recirculación al

estar prohibida, como se explica en el capítulo referente a la conexión USB.

La alimentación del USB es la encargada de suministrar la energía al microcontrolador, por eso el terminal 1 del conector se une a la alimentación del micro, a los finales de carrera y al L293D.

Como en cualquier circuito que utilice varias fuentes o con algún tipo de transmisión, 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.

Page 534: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

532

7.2.2.9. Motores De Corriente Continua Son de los más comunes y económicos, y se pueden encontrar en la mayoría 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 interacción entre el campo magnético del imán permanente y el generado por las bobinas, ya sea una atracción o una repulsión hacen que el eje del motor comience su movimiento.

Cuando una bobina es recorrida por la corriente eléctrica, esta genera un campo magnético y como es obvio este campo magnético tiene una orientación es decir dos polos un polo NORTE y un polo SUR, de esta forma:

N SNS

- + Estos polos pueden ser invertidos fácilmente con sólo cambiar la polaridad de la

bobina, por otro lado al núcleo de las bobinas las convierte en un electroimán, 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.

NS NS

Torque

Torque El torque (par motor) es simplemente la fuerza de giro, podríamos 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 tensión etc. Esto es algo que viene determinado por el fabricante, y que nosotros poco podemos hacer, más que jugar con uno que otro parámetro que ahora se describen.

La imagen anterior es sólo a modo descriptivo, ya que por lo general suelen actuar las dos fuerzas, tanto atracción como repulsión, y más si se trata de un motor con bobinas impares. Estos motores disponen de dos bornes que se conecten a la fuente de alimentación y según la forma de conexión el motor girará en un sentido u otro.

Page 535: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

533

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 simétrica o dos fuentes de alimentación con un interruptor simple de dos contactos y otra es utilizar una fuente común con un interruptor doble es decir uno de 4 contactos, en todos los casos es bueno conectar también un condensador en paralelo entre los bornes del motor, éste para amortiguar la inducción que generan las bobinas internas del motor (aunque no aparece representado para facilitar un poco la comprensión del circuito), las conexiones serían:

Con fuente simétrica:

+12V

-12V GND

+12V

-12V GND Con fuente simple:

12V 12V

Otra solución, es sustituir los interruptores por los relees correspondientes e idear un par de circuitos para lograr el mismo efecto... Aunque esta última opción es una de las más prácticas, tiene sus inconvenientes ya que los relees suelen presentar problemas mecánicos y de desgaste, lo ideal sería disponer de un circuito un poco más sólido, quitando los relees y haciendo uso de transistores, estos últimos conectados en modo corte y saturación, así actúan como interruptores.

Al usar una fuente simétrica, será necesario el uso de dos transistores complementarios es decir uno PNP y otro NPN, de este modo sólo es necesario un terminal de control, el cual puede tomar valores lógicos "0" y "1":

GND

-Vcc

Control

+Vcc

Page 536: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

534

Al utilizar una fuente de alimentación simple la cosa se complica un poco más. Estos circuitos son conocidos como puente en H o H-Bridge.

GND

Control1"0"

+Vcc

Control2"1"

GND

Control1"1"

+Vcc

Control2"0"

Estos Driver's son circuitos integrados que facilitan el diseño de los circuitos,

tales como el UCN5804, el BA6286, el L293B, L297, L298 o también 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 sólo

sentido de giro, es decir, hacer que gire o detenerlo, en este caso tienes posibilidad de controlar hasta 4 motores.

Aquí sólo se representa la mitad del integrado, la otra mitad es lo mismo, sólo cambia el número de los pines.

1/2 L2934, 5, 12, 13

M1 M2

GND+Vs

+Vcc

Ven

BA

8

10 11 14 1516

9

Page 537: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

535

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 sería como se ve en la siguiente tabla:

Ven A M1 B M2

H H Parado H Encendido

H L Encendido L Parado

L X Alta Impedancia X Alta

Impedancia

+Vcc es el terminal de alimentación compatible con la señal de control A y B, o sea +5V, Vs tiene los niveles de tensión requeridos por el motor (12, 15, 20, hasta 36v). D1 y D2, son para proteger al integrado de las tensiones generadas por la inducción 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 método de control, requiere dos de los 4 driver del integrado, la forma de conexión sería:

1/2 L2934, 5, 12, 13

M+Vs

+Vcc

Ven

BA

8

7 6 3 216

1

Page 538: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

536

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 señal en los terminales de control A, B, C y D no tendrán efecto alguno sobre el motor, es decir que ha quedado liberado totalmente.

Ven C D Función del motor

H H L Sentido 1

H L H Sentido 2

H C=D Parado

L X X Motor Libre

El método de conexión utilizado en la aplicación es el segundo, ya que se necesitan dos motores en la aplicación y se puede invertir el sentido.

7.2.2.9.3. Control De La Velocidad

Modulación De Ancho De Pulso (PWM) La modulación de ancho de pulso básicamente consiste en enviar a los

terminales de control un tren de pulsos los cuales varían en mayor o menor medida el tiempo en que se mantiene el nivel alto de esos pulsos, manteniendo la frecuencia constante, logrando que la tensión media que detecta el motor sea mayor o menor dependiendo del tiempo en el que la señal permanezca en nivel alto.

Con esta forma de control la cantidad de corriente sigue siendo la misma, la

tensión no varía y en consecuencia el torque del motor se mantiene.

Un circuito de ejemplo puede ser:

SalidaT1

T2

10

T1>T2T1=0,7(R1+R2)CT2=0,7R2C

R1

R2C

D

En el cual puedes reemplazar R1 por un potenciómetro y así controlar los

tiempos de los niveles de salida.

Page 539: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

537

En la aplicación, se utiliza este método para variar la velocidad. No se necesita ningún circuito adicional ya que el microcontrolador genera una onda modulada en los terminales CCP1 y CCP2 como se ha visto en capítulos anteriores.

Modulación Por Frecuencia De Pulsos (PFM) Otro método de variar la frecuencia de pulso en los terminales de control, lo cual

puedes lograr fácilmente con un circuito astable que bien podría ser un 555, y utilizar un potenciómetro para variar la frecuencia de los pulsos:

Claro que para mayor velocidad la frecuencia de los pulsos iría mucho más

rápido de lo que se muestra en esta imagen.

El esquema para el 555 podría ser:

555

DISCHR

OUT

THERSTRIG

GND

Vcc

Vcc

84R1

7R2

R32

6

C1 1

3 Clock

7.2.2.9.4. 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 transmisión 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 aplicación, les acompaña una reductora seleccionable mediante una sencilla configuración. En la aplicación, se ha seleccionado una reductora de 243:1 ya que la siguiente inferior genera un par muy pequeño y la siguiente superior una velocidad muy reducida.

Page 540: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

538

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 alimentación, los Motores-PaP solamente giran un ángulo determinado, los primeros sólo disponen de dos terminales de conexión, mientras los otros pueden tener 4, 5 ó 6, según el tipo de motor que se trate, por otro lado los motores de corriente continua no pueden quedar enclavados en una sola posición, mientras los motores paso a paso sí.

Los motores paso a paso son comúnmente utilizados en situaciones en que se requiere un cierto grado de precisión, por ejemplo en las disqueteras se puede encontrar unido al cabezal haciéndolo avanzar, retroceder o posicionarse en una determinada región 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, (también llamado paso) se efectúa 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, según su diseño y fabricación pueden ser Bipolares o Unipolares:

Motor paso a paso bipolar:

1a

2a 2b

1b

Motor paso a paso unipolar:

1a

2a 2b

1bCom1

Mientras los Unipolares disponen de dos bobinas independientes los Bipolares

parecieran tener 4 debido al terminal central que es el común 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 común y 4 terminales de control (es decir 5 cables).

Page 541: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

539

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 mayoría de los casos se hace a través 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 sería:

1a1b2a2b

EnableGND

+VsGND

+VssGND

41

32

+Vss

+Vs

D1 D2

L1

D3 D4

D5 D6

L2

D7 D8

C1

Page 542: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

540

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 líneas marcadas en azul corresponden a la tensión de alimentación 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 habilitación, 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

más de 4 cables son más fáciles de controlar, esto se debe a que tienen un terminal común a ambas bobinas. Una forma de identificar cada uno de los cables es analizar la forma de conexión interna de estos motores.

A

C D

BCom1

En la imagen los dos bobinados del motor se encuentran separados, pero ambos

tienen un terminal central el cual lo llamaremos común (Com1, Com2). Este es el modelo utilizado en la aplicación.

La cuestión es que este motor tiene 6 cables, y ahora nombrarlos correctamente. Con el multímetro en modo ohmetro comenzamos a medir resistencias por todos los cables obteniéndose 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 común 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.

Page 543: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

541

Si se unen los terminales Com1 y Com2, entonces quedas con un motor de 5 cables.

A

C D

B

Com

Aquí la resistencia entre cualquier terminal y el común 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 serán A, B, C y D, y para saber cual es cual:

1. se conecta el terminal común al positivo de la fuente de alimentación 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 posición, 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 económica es mediante el ULN2803:

ULN2803IN1IN2IN3IN4

OUT1OUT2OUT3OUT4

GND CC

A

C D

B

+12V

ABCD

D0D1D2D3

PuertoParalelo

18...25GND

GND

D1...D41N4148

D5zener 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 señal negativa para ser activados, como el ULN tiene sus salidas invertidas, cada vez que envíes un "1" por el pin INn se transformará en "0" a la salida, es decir en el pin OUTn correspondiente.

En la aplicación, los pulsos los envía el microcontrolador, por lo que no se necesita ningún diodo.

Page 544: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

542

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, sólo 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 1 0 0 0

Paso 2 0 1 0 0

Paso 3 0 0 1 0

Paso 4 0 0 0 1

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 magnético se duplica, y en consecuencia el motor tiene mayor fuerza de giro y retención. Esta es la secuencia recomendada por el fabricante y se conoce como secuencia normal:

Nº de Pasos A B C D

Paso 1 1 1 0 0

Paso 2 0 1 1 0

Paso 3 0 0 1 1

Paso 4 1 0 0 1

Con este tipo de secuencia se consigue que los movimientos resulten demasiado bruscos, y las baterías no te aguantan mucho tiempo.

Page 545: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

543

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 también puedes hacerlo con 8 pasos, para lo cual se utiliza la secuencia de medio paso:

Nº de Pasos A B C D

Paso 1 1 0 0 0

Paso 2 1 1 0 0

Paso 3 0 1 0 0

Paso 4 0 1 1 0

Paso 5 0 0 1 0

Paso 6 0 0 1 1

Paso 7 0 0 0 1

Paso 8 1 0 0 1

Esta es una combinación de las dos anteriores.

En cuanto a la fuerza de giro, sólo 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. Características 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 posición.

Para obtener un arranque suave y preciso, es recomendable comenzar con una frecuencia de pulso baja y gradualmente ir aumentándola hasta la velocidad deseada sin superar la máxima tolerada.

El giro en reversa debería realizarse bajando la velocidad de giro y luego cambiando el sentido de rotación.

Page 546: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

544

7.2.3. ESQUEMA ELÉCTRICO DE LA PLACA IMPRESA El esquema de montaje después de realizar la placa impresa, sería:

Los componentes externos se unen a la placa por medio de conectores.

Las líneas azules existentes en el interior del integrado L293, son puentes.

Como se ha mencionado anteriormente, la alimentación es del tipo corriente continua de 5V.

Page 547: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

545

7.3. FIRMWARE DEL MICROCONTROLADOR Con firmware se refiere al programa realizado en C18 para el microcontrolador.

Este programa, es una modificación del software cedido por Microchip para la comunicación por medio del USB. Se parte del programa de la clase genérica y se realizan modificaciones, según lo indicado anteriormente. En este apartado sólo aparecen las librerías o macros modificadas.

Como en el resto de la memoria, el código 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 código 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 añade las librerías necesarias para la ejecución

del código de main.c.

La librería p18f2455.h contiene las descripciones de los puertos, terminales, registros, etcétera; útiles para configurar y ejecutar aplicaciones.

#include <p18f2455.h> #include "system\typedefs.h" // Requerida #include "system\usb\usb.h" // Requerida #include "io_cfg.h" // Requerida #include "system\usb\usb_compile_time_validation.h" // Opcional #include "user\user.h" // Modificable

Después de los #include, aparecen los fuses de configuración descritos anteriormente.

En la aplicación 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 señal del reloj y postscaler de 1:2 para la señal 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

Page 548: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

546

El camino que sigue la señal 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.

Después del disparador Smicht del Primary Oscillator (oscilador primario), salen tres líneas en paralelo que van a distintos módulos.

La línea 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 demás 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 señal 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 obtendrán 4MHz. En la aplicación se configura con un 1 para que no exista división.

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 señal también 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 oscilación del microcontrolador.

Page 549: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

547

Como, en la aplicación, FOSC=XT_XT, indica que FOSC3:FOSC0 valen 0, siendo la señal definitiva de la CPU los 4MHz del cristal de entrada.

Por último, llega al multiplexor FSEN la señal del reloj primario (Primary Clock) dividida por 4 junto con la de la salida del USBDIV. Con este multiplexor se selecciona la señal de reloj primario o las del PLL o del Cristal dependiendo de la configuración. En la aplicación la señal proviene del PLL.

Continuando con los fuses, como no se utilizan, la mayoría 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 tensión.

#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 librarías.

#pragma udata //Coloca las variables en la memoria de datos

7.3.1.3. Prototipos privados Los prototipos privados son las funciones que se utilizan dentro de un mismo

archivo.

static void InitializeSystem(void); void USBTasks(void);

Page 550: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

548

7.3.1.4. Remapeo Del vector En esta parte del código, el compilador modifica el vector de inicio y el de

interrupción, mediante una rutina en ensamblador.

extern void _startup (void); //Vector de inicio #pragma code _RESET_INTERRUPT_VECTOR = 0x000800 //Vector de interrupción void _reset (void) //Vector de reset _asm goto _startup _endasm #pragma code

7.3.1.5. Declaraciones #pragma code //Coloca lo siguiente en la memoria de programa

7.3.1.5.1. void main(void) Cada vez que se inicia el sistema, el micro ejecuta este código lo primero.

void main(void) InitializeSystem(); //Salta a la rutina InitializeSystem(), existente en este mismo archivo while(1) USBTasks(); // USB Tasks dentro de este mismo archivo Aplicacion(); // Salta a la rutina Aplicación() de user\user.c

7.3.1.5.2. void InitializeSystem(void) static void InitializeSystem(void) #if defined(USE_USB_BUS_SENSE_IO) tris_usb_bus_sense = INPUT_PIN; // Se define el puerto, se declara el terminal #endif //como puerto de entrada en io_cfg.h #if defined(USE_SELF_POWER_SENSE_IO) tris_self_power = INPUT_PIN; #endif mInitializeUSBDriver(); //Salta a la rutina de usbdrv.h Inicializacion(); // Salta a la rutina de user\user.c

Page 551: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

549

7.3.1.5.3. void USBTasks(void) void USBTasks(void) USBCheckBusStatus(); //Se tiene que usar el método de muestreo if(UCFGbits.UTEYE!=1) USBDriverService(); //Se puede usar el método de muestreo o el de interrupción #if defined(USB_USE_CDC) //Si se define la clase CDC salta a la rutina indicada CDCTxService(); #endif

7.3.2. USBCFG.H Las únicas modificaciones realizadas en esta librería corresponden con el

descriptor de la interfaz. El resto del código se ha comentado y analizado anteriormente.

#ifndef USBCFG_H #define USBCFG_H

7.3.2.1. Definiciones #define EP0_BUFF_SIZE 8 // 8, 16, 32, ó 64 #define MAX_NUM_INT 1 // 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. Definición De La Clase #define USB_USE_GEN /* * MUID = Microchip USB Class ID * Se utiliza para indicar la clase de la sesión actual del control del EP0 */ #define MUID_NULL 0 #define MUID_USB9 1

Page 552: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

550

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 aplicación sólo hay una interfaz, por lo que se nombra con el primer número, el cero.

#define USBGEN_INTF_ID 0x00

7.3.2.3.2. Endpoints Son los Endpoints que se utilizan en esta interfaz y su descripción.

Como sólo se utiliza uno en toda la aplicación, 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 tamaño de los buffers tiene que ser mayor que el número de bytes que se esperan transmitir.

#define USBGEN_BD_OUT ep1Bo #define USBGEN_OUT_EP_SIZE 8 #define USBGEN_BD_IN ep1Bi #define USBGEN_IN_EP_SIZE 8

Se define el número total de Endpoints utilizados en todas las interfaces.

#define MAX_EP_NUMBER 1 // UEP1

7.3.3. USBDSC.H En esta librería, como en la anterior, sólo se modifica las características relativas

a los descriptores de la conexión.

#ifndef USBDSC_H #define USBDSC_H

7.3.3.1. Incluye #include "system\typedefs.h" #include "autofiles\usbcfg.h" #include "system\usb\usb.h"

Page 553: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

551

7.3.3.2. Definiciones Se declara una estructura llamada CFG01 con los descriptores de la

comunicación, como sólo 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 aplicación.

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), Tamaño del descriptor en bytes DSC_DEV, Descriptor tipo DEVICE 0x0200, Número de versión del USB en formato BCD 0x00, Código de Clase 0x00, Código Subclase 0x00, Código Protocolo EP0_BUFF_SIZE, Tamaño de paquete máximo para el EP0, ver usbcfg.h 0x04D8, ID Fabricante 0x8008, ID Producto, elegido por el programador 0x0000, Número de versión del dispositivo en formato BCD 0x01, String índice de fabricante 0x02, String índice del producto

Page 554: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

552

0x00, String índice del número de serie del dispositivo 0x01 Número de configuraciones posible ;

7.3.4.2.2. Descriptor De La Configuración 1 CFG01=

Descriptor de configuración sizeof(USB_CFG_DSC), Tamaño del descriptor en bytes DSC_CFG, Tipo del descriptor CONFIGURACIÓN sizeof(cfg01), Longitud total de datos de esta configuración 1, Número de interfaces en esta configuración 1, Valor del índice de esta configuración 0, String índice de configuración _DEFAULT, Atributos, ver usbdefs_std_dsc.h 50, Consumo máximo de corriente (2X mA)

Descriptor de la interfaz sizeof(USB_INTF_DSC), Tamaño del descriptor en bytes DSC_INTF, Tipo de descriptor INTERFACE 0, Número de Interface 0, Número alterno de configuración 2, Número de Endpoints en esta interfaz 0, Código de la Clase 0, Código de la Subclase 0, Código del Protocolo 0, String índice de interfaz

Descriptor Del Endpoint Se define el Endpoint 1 tanto en entrada como en salida del tipo Bulk, con la

clase genérica 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 structbyte bLength;byte bDscType;word string[1];sd000= sizeof(sd000),DSC_STR,0x0409;

Descriptor Del Nombre Del Fabricante rom structbyte bLength;byte bDscType;word string[25];sd001= sizeof(sd001),DSC_STR, 'G','H','G';

Page 555: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

553

Descriptor Del Nombre Del Dispositivo rom structbyte 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 1 #define OUTPUT_PIN 0

7.3.5.3. Puerto Define los puertos utilizados con el nombre del componente conectado.

#define Distancia PORTAbits.RA0 #define Fin1 PORTAbits.RA1 #define Fin2 PORTAbits.RA2 #define Fin3 PORTAbits.RA3 #define Bombillas PORTBbits.RB0 #define LED1 PORTBbits.RB1 #define LED2 PORTBbits.RB3 #define Zumbador PORTBbits.RB2 #define PaPD PORTBbits.RB4 #define PaPC PORTBbits.RB5 #define PaPB PORTBbits.RB6 #define PaPA PORTBbits.RB7 #define Sentido1 PORTCbits.RC0 #define PWM PORTCbits.RC1 #define Sentido2 PORTCbits.RC2 #define Dmenos PORTCbits.RC4

Page 556: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

554

#define Dmas PORTCbits.RC5 #define Verde PORTCbits.RC6 #define Rojo PORTCbits.RC7

7.3.5.4. USB Define los puertos relativos al USB, este código 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 Públicos En este apartado se definen las funciones a las cuales se va a acceder desde otros

archivos.

void Inicializacion(void); void Aplicacion(void); #endif

Page 557: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

555

7.3.7. USER.C Este archivo se ha creado para la aplicación, siendo totalmente nuevo.

La mayor parte de las funciones empiezan con if (!OFF), esta instrucción comprueba si la variable OFF es distinta de uno. Esta variable es la encargada de determinar si se ha recibido la instrucción de encender el coche o no.

7.3.7.1. Incluye Añade las librerías necesarias para la ejecución del código 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]; //Define un buffer intermedio para las transmisiones de entrada char output_buffer[8]; //Define un buffer intermedio para las transmisiones de salida char OFF=1; //Define una variable para determinar si el coche está encendido //o apagado. Si OFF=1 el coche está apagado

7.3.7.3. Prototipos Privados void Mdelante(void); void Mdetras(void); void Giroizq(void); void Giroder(void); void Sensores(void); void Claxon(void); void LucesON(void); void Paro(void); void Apagado(void); void Velocidad(void); void LucesOFF(void); void Encendido(void); void enviar(char datos); void chequeo(void); void ANOpen(void); void BlinkUSBStatus(void);

Page 558: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

556

7.3.7.4. Declaraciones En este apartado se realiza el código 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; //Configura los puertos como E/S dependiendo de su uso TRISB=0; TRISC=0; PORTA=0; PORTB=0; PORTC=0; Rojo=0x01; //Enciende el LED bicolor con el color rojo para indicar que el //dispositivo tiene corriente ADCON1=0xFF; //Inicialización del conversor analógico, todo E/S digitales 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 algún dato chequeo();

Page 559: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

557

7.3.7.4.3. void chequeo(void) Esta función es la que se encarga de determinar un comando y saltar a la función

adecuada.

void chequeo(void) switch (input_buffer[0]) //reconoce el comando y salta a la función 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;

Page 560: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

558

7.3.7.4.4. void enviar(void) Esta función 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); //Envía los datos

7.3.7.4.5. void Mdelante(void) Esta función activa las salidas oportunas para que el coche avance.

void Mdelante(void) if (!OFF) //Comprueba que el coche no esté apagado Velocidad(); //Activa la velocidad deseada Sentido1=1; //Se encienden los motores CC, para que el coche avance Sentido2=0;

7.3.7.4.6. void Mdetras(void) Esta función activa las salidas oportunas para que los motores retrocedan

void Mdetras(void) if (!OFF) Velocidad(); //Activa la velocidad deseada Sentido1=0; //Se encienden los motores CC, para que el coche retroceda Sentido2=1;

Page 561: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

559

7.3.7.4.7. void Velocidad(void) Esta función cambia el duty cicle del PWM2 para modificar la velocidad del

coche.

void Velocidad(void) long dato; OpenPWM2(0xFF); //Inicializa el PWM switch (input_buffer[2])

Esta rutina transforma los dos bytes recibidos en un long para modificar el Duty Cicle del PWM que es de 10bits. Realiza una transformación 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 máxima.

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 función cambia el duty cicle del PWM2 para modificar la velocidad del

coche.

void Paro(void) Sentido1=0; Sentido2=0;

Page 562: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

560

7.3.7.4.9. void Giroizq(void) Esta función 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);

Page 563: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

561

7.3.7.4.10. void Giroder(void) Esta función 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);

Page 564: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

562

7.3.7.4.11. void ANOpen(char c) Esta función activa/desactiva el conversor A/D especificado en c.

void ANOpen(void) OpenADC(ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_20_TAD,ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD, 14); Delay10TCYx(5); //Retraso para que se inice el CA/D

7.3.7.4.12. void Sensores(void) Esta función comprueba los sensores y envía el dato al ordenador por el USB.

void Sensores(void) if (!OFF) SetChanADC(ADC_CH0); //Seleccionamos el canal ConvertADC(); //Comienza la conversión del dato del sensor de distancia while(BusyADC()); //Espera a que termine la conversión output_buffer[0]=ReadADC(); //Lee el dato y lo envía output_buffer[1]=ADRESH; output_buffer[2]=PORTA; //envía el dato de los finales de carrera enviar(3);

7.3.7.4.13. void Claxon(void) Esta función activa el zumbador durante un periodo de tiempo modificable.

void Claxon(void) if (!OFF) Zumbador=1; Delay10KTCYx(30); //Como el Xtal es de 4MHz, el ciclo de instrucción dura 1ms, //esta rutina Zumbador=0; //realiza un retardo de 30000 ciclos de instrucción.

Page 565: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

563

7.3.7.4.14. void Apagado(void) Esta función 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 función enciende el coche.

void Encendido(void) OFF=0;

7.3.7.4.16. void LucesON(void) Esta función 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 función apaga las luces del coche.

void LucesOFF(void) if (!OFF) Bombillas=0; LED2=0; LED1=0;

Page 566: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

564

7.3.7.4.18. void BlinkUSBStatus(void) Esta función 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;

Page 567: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

565

7.4. SOFTWARE DEL ORDENADOR La descripción de la aplicación se realizará en aparatados. Cada apartado será un

form o un módulo.

Los form se mostrarán compilados y sin compilar y una tabla en la que aparezcan los objetos utilizados. En la tabla se comentarán las propiedades del objeto, sólo las que tengan una especial relevancia en la aplicación.

Después de la descripción de los objetos, se analizará el código que, como en el resto de la memoria, aparecerá en Comics Sans MS y los comentarios en Times New Roman.

7.4.1. MÓDULO APIUSB.BAS Los módulos, son archivos en los que sólo aparecen funciones accesibles desde

todos los form del programa.

Este módulo contiene las funciones relativas a la comunicación USB, que ya han sido comentadas anteriormente.

El contenido del módulo es:

Option Explicit

El comando Option Explicit aparece en todos los form y módulos 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

Page 568: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

566

7.4.1.2. Función De Recuperación De Datos Almacenados Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Long, ByVal ByteLen As Long)

Con esta función 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 dirección.

pSrc: variable con la dirección de memoria.

ByteLen: número 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 Periférico id. La identificación del periférico se ha puesto la misma que la del firmware.

Public Const out_pipe = "\MCHP_EP1" 'Las comunicaciones las hacemos con el Endpoint 1 Public Const in_pipe = "\MCHP_EP1"

7.4.1.5. IN_PIPE Y OUT_PIPE Variables Públicas Public myInPipe As Long Public myOutPipe As Long

7.4.1.6. Variables Públicas 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 función 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.

Page 569: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

567

7.4.1.8. Cierre De Las Comunicaciones Sub CloseMPUSBDevice() MPUSBClose (myOutPipe) MPUSBClose (myInPipe) End Sub

Con esta función se cierran las pipe abiertas anteriormente.

7.4.1.9. Función 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 función 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 parámetro en el código de la función o del procedimiento también 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 número de bytes que hay que enviar.

Para llamar a la función MPUSBWrite (comentada anteriormente), se utiliza la función Call porque no se utilizan los datos devueltos por la primera función.

Los argumentos de MPUSBWrite son los descritos anteriormente, utilizando la propiedad VarPtr() cuando el argumento es un puntero.

Page 570: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

568

7.4.1.10. Función 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 el dato almacenado en la dirección de memoria de rec End Function

La función MPUSBRead se llama con Call porque no se aprovechan los datos devueltos.

En la variable direcciones, se almacena la primera dirección de memoria del buffer de entrada s(), para poder guardar los datos recibidos en la variable rec() mediante la función CopyMemory (comentada anteriormente).

Los argumentos se defienen con ByVal, es decir, por valor. Se utiliza esta definición cuando no se quiere que el valor del argumento de llamada cambie con el valor del argumento de la función.

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. También se encuentra el menú para encender y apagar el coche y abrir el resto de form.

Form Inicio Sin Compilar

Page 571: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

569

Form Inicio Compilado

Objetos Del Form Inicio

Objeto Nombre Propiedad Valor

CommandButton Avanza Style

Picture Enabled

Graphical Arriba.ico

False

CommandButton Retrocede Style

Picture Enabled

Graphical Abajo.ico

False

CommandButton Izquierda Style

Picture Enabled

Graphical Izquierda.ico

False

CommandButton Derecha Style

Picture Enabled

Graphical Derecha.ico

False

CommandButton Paro Style

Picture Enabled

Graphical Stop.ico

False

CommandButton Claxon Style

Picture Enabled

Graphical Campana.ico

False

CommandButton Luces Style

Picture Enabled

Graphical BombillaOff.ico

False

CommandButton Off

Style Picture Enabled Visible

Graphical BombillaOff.ico

False

Page 572: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

570

CommandButton Lon Style

Picture Visible

Graphical BombillaOn.ico

False

CommandButton sensores Style Picture

Graphical Cono.ico

Label Label1 Caption Giro: Label Label2 Caption º Label Label3 Caption Velocidad: Label Label4 Caption %

TextBox TextVelocidad Text 0 TextBox TextGiro Text 0

HScrollBar ScrollGiro Max Min

Value

60 0 0

HScrollBar ScrollVelocidad Max Min

Value

100 0 0

Menu Encendido Index 0 Menu Apagado Index 1 Menu Comandos Index 2 Menu Ajuste Index 3 Menu Salir Index 4

CommonDialog CommonDialog

7.4.2.1. Código Del Form Inicio

7.4.2.1.1. Variables Globales 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 válidas para el form; y las declaradas con Public son para todos los form.

Page 573: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

571

7.4.2.1.2. Función 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 función se activa cuando se hace clic en el botón Avanza. Es la encargada de enviar el código de instrucción 1 relativo al comando para activar los motores de CC para que el coche avance.

Los otros dos datos que envía es la velocidad.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.3. Función Claxon_Click Public Sub Claxon_Click() Send_Buf(0) = 6 Send Send_Buf, 1 End Sub

Esta función se activa cuando se hace clic en el botón Claxon. Envía el código 6 para que el microcontrolador active el zumbador.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.4. Función 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 función se activa cuando se hace clic en el botón Derecha. Envía el código 4 para que el microcontrolador active el motor PaP para que el coche gire a la derecha.

El otro byte que envía es el ángulo de giro. El valor introducido en el textbox TextGiro se divide por dos porque el PaP usado en la aplicación 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 línea recta después.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

Page 574: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

572

7.4.2.1.5. Función Form_Load Private Sub Form_Load() OpenMPUSBDevice 'abre comunicaciones If (myOutPipe = INVALID_HANDLE_VALUE) Or (myInPipe = INVALID_HANDLE_VALUE) Then MsgBox "No se ha comunicado con el dispositivo", 0 + 16, "Error" End End If '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 función 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 comunicación 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. Función Form_Unload Private Sub Form_Unload(Cancel As Integer) Send_Buf(0) = 9 Send Send_Buf, 1 CloseMPUSBDevice 'cierra comunicaciones End Sub

Esta función se activa cuando se hace cierra el form Inicio. Envía el código 9 para que el microcontrolador apague el coche y cierra las comunicaciones.

Page 575: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

573

7.4.2.1.7. Función 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 función se activa cuando se hace clic en el botón Izquierda. Es igual que la función Derecha_Click pero cambiando el código de giro para que lo haga a la izquierda.

Los pulsos enviados, en este casos se restan.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.8. Función 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 función se activa cuando se hace clic en el botón Luces. Envía el código 6 para que el microcontrolador active los LEDs y las bombillas.

Al hacer clic comprueba si las luces están encendidas o apagadas. Una vez determinado el estado de las luces, cambia el icono del botón y envía el código de instrucción determinado.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

Page 576: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

574

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:

Page 577: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

575

Send_Buf(0) = 9 Send Send_Buf, 1 CloseMPUSBDevice 'cierra comunicaciones End End Select End Sub

Esta función se activa cuando se hace clic en el menú. Dependiendo del valor de index, que es el índice del elemento pulsado, hace una acción u otra:

Case 0: Encendido: envía el comando para encender el coche y activa todos los objetos del programa.

Case 1: Apagado: envía 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 función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.10. Función 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 función se activa cuando se hace clic en el botón Paro. Envía el código 8 para que el microcontrolador desactive los motores de CC y envía los pulso para que gire el motor PaP para que cuando se vuelva a enviar la instrucción de avanzar, el coche lo haga en línea recta.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

Page 578: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

576

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 función se activa cuando se hace clic en el botón Retrocede. Es igual que la función Avanza_Click pero con el código de instrucción para que el coche retroceda.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.12. Función ScrollGiro_Change Public Sub ScrollGiro_Change() TextGiro.Text = ScrollGiro.Value End Sub

Esta función se activa cuando se hace cambia el valor del ScrollGiro. Cambia el dato del textbox TextGiro al valor del scroll.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.13. Función ScrollVelocidad_Change Public Sub ScrollVelocidad_Change() TextVelocidad.Text = ScrollVelocidad.Value End Sub

Esta función se activa cuando se hace cambia el valor del ScrollVelocidad. Cambia el dato del textbox TextVelocidad al valor del scroll.

Esta función es Public para que se pueda acceder a ella desde cualquier form.

7.4.2.1.14. Función sensores_Click Private Sub sensores_Click() Sensor.Visible = True End Sub

Esta función se activa cuando se hace clic en el botón sensores. Abre el form Sensor.

Page 579: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

577

7.4.2.1.15. Función TextGiro_Change Private Sub TextGiro_Change() If TextGiro.Text Like "#" Or TextGiro.Text Like "##" Then 'Comprueba que el dato introducido es un número 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

Esta función se activa cuando cambia el valor del texto de TextGiro. Comprueba que el valor introducido es válido, si no lo es cambia su valor y el de ScrollGiro a cero y emite un mensaje de error.

7.4.2.1.16. Función 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 número 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

Page 580: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

578

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

Page 581: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

579

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

Page 582: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

580

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 función se activa cuando cambia el valor del texto de TextVelocidad. Comprueba que el valor introducido es válido, si no lo es cambia su valor y el de ScrollVelocidad a cero y emite un mensaje de error. Si es correcto lo envía 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.

Después 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.

Page 583: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

581

7.4.2.1.17. Función 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:

Page 584: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

582

If Avanza.Enabled = True Then TextGiro.Text = TextGiro.Text - 1 End If End Select End Sub

Esta función 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 instrucción, 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

Page 585: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

583

7.4.3. FORM AJUSTE En este form aparecen los botones para ajustar la dirección del coche. Si al

avanzar en línea recta, el coche gira en algún sentido, se podrá modificar desde este form.

Form Ajuste Sin Compilar

Form Ajuste Compilado

Page 586: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

584

Objetos Del Form Ajuste

Objeto Nombre Propiedad Valor

CommandButton Izquierda Style

Picture Enabled

Graphical Izquierda.ico

False

CommandButton Derecha Style

Picture Enabled

Graphical Derecha.ico

False

CommandButton AjDistancia Caption Enabled

Ajustar False

Timer Medidas Interval Enabled

50 False

Timer TimerDistancia Interval Enabled

10 False

CommonDialog CommonDialog

7.4.3.1. Código Del Form Ajuste

7.4.3.1.1. Variables Option Explicit Private Send_Buf(0 To 2) As Byte Dim contador As Integer Dim i As Integer

7.4.3.1.2. Función Derecha_Click Public Sub Derecha_Click() Send_Buf(0) = 4 Send_Buf(1) = 1 Send Send_Buf, 2 Inicio.Angulo = 0 End Sub

Esta función se activa cuando se hace clic en el botón Derecha. Envía 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.

Page 587: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

585

7.4.3.1.3. Función Izquierda_Click Public Sub Izquierda_Click() Send_Buf(0) = 3 Send_Buf(1) = 1 Send Send_Buf, 2 Inicio.Angulo = 0 End Sub

Esta función se activa cuando se hace clic en el botón Izquierda. Envía 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. Función AjDistancia_Click Public Sub AjDistancia_Click() TimerDistancia.Enabled = True End Sub

Esta función se activa cuando se hace clic en el botón AjDistancia. Activa el timer TimerDistancia para que ejecute sus instrucciones.

7.4.3.1.5. Función 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

Page 588: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

586

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 función se activa cuando se completa el intervalo del timer TimerDistancia.

El temporizador comienza con un intervalo de 10ms para que, al pulsar el botón, se active directamente el timer. Depués se cambia el intervalo a 1s para que el programa haga varias medidas de la misma distancia.

Page 589: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

587

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. Función Medidas_Timer Private Sub Medidas_Timer() Dim lectura(0 To 64) As Byte Send_Buf(0) = 5 'Enviamos la orden de leer los sensores Send Send_Buf, 1 recibir lectura, 3 If DatosDistancia(0, i) <= rec(1) Then 'Almacenamos el byte alto más alto de los leídos DatosDistancia(0, i) = rec(1) End If If DatosDistancia(1, i) <= rec(0) Then 'Almacenamos el byte bajo más alto de los leídos DatosDistancia(1, i) = rec(0) End If End Sub

Esta función se activa cuando se completa el intervalo del temporizador Medidas. Esta función realiza las medidas de cada distancia guardando la mayor, que será el valor máximo del intervalo de la medida de la distancia.

Page 590: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

588

7.4.4. FORM SENSOR En este form aparecen dibujos indicando el lugar de choque del coche y la

distancia que detecta hasta el próximo obstáculo.

Form Sensor Sin Compilar

Form Sensor Compilado

Page 591: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

589

Objetos Del Form Ajuste

Objeto Nombre Propiedad Valor

Timer Sensores Interval Enabled

50 False

Label Distancia Caption “” Image Imagen Picture Ninguno.gif Image Image1 Picture Coche.gif

PictureBox Derecho Visible Picture

False Derecho.gif

PictureBox Izquiedo Visible Picture

False Izquiedo.gif

PictureBox Trasero Visible Picture

False Trasero.gif

PictureBox Delantero Visible Picture

False Delantero.gif

PictureBox Ninguno Visible Picture

False Ninguno.gif

7.4.4.1. Código del Form Ajuste

7.4.4.1.1. Declaración De Variables Option Explicit Dim Send_Buf(0 To 2) As Byte

7.4.4.1.2. Función 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

Page 592: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

590

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 más 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

Page 593: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

591

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

Page 594: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

592

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 excepción 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

Page 595: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

593

Objetos Del Form Comandos

Objeto Nombre Propiedad Valor

TextBox Comandos Text Escriba el comando a enviar

CommandButton EnvioComando Caption “Enviar”

Label Label6 Index Caption

0 1:Avanza

Label Label6 Index Caption

1 2:Retrocede

Label Label6 Index Caption

2 3:Giro a la izquieda

Label Label6 Index Caption

3 4:Giro a la derecha

Label Label6 Index

Caption 4

5:Lectura de los sensores activada

Label Label6 Index Caption

5 6:Claxon

Label Label6 Index Caption

7 8:Parar

Label Label6 Index Caption

8 9:Apaga el coche

Label Label6

Index

Caption

9 a_Velocidad:Cambio

de velocidad, el valor tiene que ser

entre 0 y 100

Label Label6 Index Caption

10 b:Apagar luces

Label Label6 Index Caption

11 c:Encender el coche

Label Label6

Index

Caption

12 d_grados:ángulo de giro, el valor tiene

que ser entre 0 y 60º

Label Label6 Index Caption

13 e:Cerrar barra de

comandos

Label Label6 Index

Caption 15

f:Ajustar dirección izquierda

Label Label6 Index Caption

16 g:Ajustar dirección

Page 596: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

594

derecha

Label Label6 Index

Caption 14

h:Lectura de los sensores desactivada

Label Label6 Index

Caption 17

i:Mostrar la ventana de los sensores

Label Label6 Index

Caption 19

j:Ajuste Sensor de Distancia

Label Label6 Index Caption

18 k:Cerrar aplicación

7.4.5.1. Código Del Form Comandos

7.4.5.1.1. Declaración De Variables Option Explicit Dim contComando As Integer Dim comando(5) As String

7.4.5.1.2. Función Comandos_Click Private Sub Comandos_Click() Dim i As Integer For i = 0 To contComando 'Reinicio variables comando(i) = "" Next contComando = 0 Comandos.Text = "" End Sub

Esta función se activa cuando se hace clic en el textBox Comandos. Borra el texto del textBox y reinicia las variables.

7.4.5.1.3. Función 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

Page 597: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

595

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 número pulsado contComando = contComando + 1 Else 'la tecla pulsada no es un número If KeyAscii >= 97 Then If KeyAscii <= 106 Then comando(contComando) = Chr(KeyAscii) 'Guardo en comando la letra pulsada porque es una instrucción 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

Page 598: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

596

Esta función 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 posición 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 código ASCII de la tecla pulsada.

7.4.5.1.4. Función 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

Page 599: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

597

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 están encendidas", 0 + 16, "Error" End If Else MsgBox "El coche está apagado", 0 + 16, "Error" End If Else

Page 600: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

598

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

Page 601: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

599

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 están 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"

Page 602: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

600

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

Page 603: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

601

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 'Reinicio variables comando(i) = "" Next contComando = 0 Comandos.Text = "Escriba el comando a enviar" End Sub

Esta función se activa cuando se hace clic en el botón EnvioComando. Dependiendo del comando pulsado, realiza la función que le corresponda.

Antes de realizar cualquier función, comprueba que el comando sea correcto, si no emite un mensaje de error.

Cada comando correcto salta a la función definida para el objeto que la active, por ejemplo, si el comando es el 1 salta a la función Avanza_Click del form Inicio.

Page 604: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

602

7.4.5.1.5. Función Form_Unload Private Sub Form_Unload(Cancel As Integer) If Inicio.Avanza.Enabled = True Then Sensor.Sensores.Enabled = True End If End Sub

Esta función 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 aplicación, se ha partido del driver del PicUSB

descargado de la página www.hobbypic.com.

Este driver, es una adaptación 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 interrogación.

El archivo .inf sería:

[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"

Page 605: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

603

[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

Page 606: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

604

;------------------------------------------------------------------------------ ; 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 identificación del fabricante y la del dispositivo tiene que ser la misma.

Page 607: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

605

7.6. CONTROL WIIMOTE

7.6.1. INTRODUCCIÓN El WiiMote es el mando de control de la videoconsola de Nintendo Wii. Este

mando dispone de unos acelerómetros que determinan la velocidad y el sentido del movimiento del mismo; además, un chip encargado de hacer fotos que, por medio de la triangulación, determina si el mando se acerca o se aleja de la fuente de luz y si está bocarriba o no.

En la aplicación no se aprovechan estos sensore y se utilizan los botones que disopone.

La comunicación 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 instrucción, hay que realizar un programa

que determine que acción realiza con cada botón.

Para realizar este programa, se utiliza el compilador GlovePIE. Es un compilador diseñado 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 botón 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

Page 608: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 609: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

8. BIBLIOGRAFÍA

Page 610: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 611: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

609

8. BIBLIOGRAFÍA

8.1. LIBROS Enciclopedia de Microsoft Visual Basic 6. Fco. Javier Ceballos.

Microcontroladores PIC. Diseño práctico de aplicaciones 2ª parte. Angulo Usategui y otros.

El Bus USB Guía del Desarrollador. Xavier Fernard.

MPLAB C18 C Compiler Libraries. Microchip.

MPLAB C18 C Compiler Getting Started. Microchip.

MPLAB C18 C Compiler User’s Guide. Microchip.

MPLAB IDE User’s Guide. Microchip.

MPASM Assambler, MPLINK Object Linker, MPLIB Object Librarian User’s Guide. Microchip.

PIC18 Configuration Settings Addendum. Microchip.

PIC18F2455/2550/4455/4550. Datasheet de Microchip.

Cómo programar en C++. Harvey M. Deitel y Paul J. Deitel.

Programación en Lenguaje C. María Luisa Pérez Delgado

Universal Serial Bus Specification Revision 2.0. Compac, HP, Intel y otros.

Implementación de un sistema de desarrollo utilizando los microcontroladores PIC Microchip Tecnology. Manuel Fernando Campos Cerda, Ramiro Castañeda Pérez y Arturo César Contreras Torres.

Curso Programación en C microcontroladores PIC. Introducción al MPLAB C18. Andrés 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.

Page 612: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

610

8.2. APUNTES Programación Visual. Mª Araceli Sánchez Sánchez.

Ampliación de programación. Mª Araceli Sánchez Sánchez.

Tecnología electrónica. Álvaro Sánchez Martín.

Programación Avanzada. Andrés Martín Sánchez.

Sistemas digitales avanzados. José Torreblanca González.

8.3. PÁGINAS 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/

Page 613: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

611

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/

Page 614: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 615: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

B. CÁLCULOS

Page 616: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 617: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

615

1. CÁLCULOS En este apartado, se realizan los cálculos relativos a la modulación de ancho de

pulso y al tiempo de conversión analógica.

1.1. PWM Las ecuaciones utilizadas son:

)2____(4]1)2[(_ TMRdeprescalerdelValorTPRPWMPeriodo OSC •••+=

)2___()4:5:(__ TMRprescalerdelValorTCCPXCONCCPRXLPWMCicleDuty OSC••><=

bits

FF

PWM

OSC

)2log(

)log(M_máxima_PWResolución =

Periodo=1/frecuencia

En la aplicación, se desea una resolución máxima de la onda para poder elegir entre un mayor número de ciclos de trabajo. Con esto, se podrá modificar la velocidad de una forma más precisa.

La resolución máxima que admite el microcontrolador son 10bits.

La frecuencia de oscilación (FOSC) es 1MHz, ya que la configuración del oscilador no modifica la onda de la entrada que es un cristal de 4MHz. Como la frecuencia de oscilación 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 división, obtenemos un valor para PR2 de 255 o, en hexadecimal de FF. Este dato obtenido, es el que se utiliza en la programación a la hora activar el PWM2.

1.2. CONVERSOR A/D En el capítulo del microcontrolador, en el apartado del conversor A/D, se

comenta que el tiempo mínimo de adquisición es de 2,45μs.

En las características 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 adquisición más alto posible aproximándose a los 39ms. Este tiempo de adquisición es de 20 veces el tiempo de adquisición, que sigue siendo del orden de microsegundos por lo que es mucho menor que el tiempo del sensor.

Page 618: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 619: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

C. PLANOS

Page 620: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 621: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 622: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 623: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

!"#$ %&

' '

#()*+($

!"#$ %&

''

Page 624: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 625: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

Page 626: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 627: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

!!"#$%$$&$&$'(

)* +,,

Page 628: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 629: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 630: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 631: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 632: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 633: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 634: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 635: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 636: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 637: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 638: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 639: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

D. PLIEGO DE CONDICIONES

Page 640: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 641: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

639

1. PLIEGO DE CONDICIONES ESPECÍFICAS Y CONSTRUCTIVAS

1.1. DESCRIPCIÓN DEL PRODUCTO El producto diseñado es un coche que nos permitirá enviar y recibir datos desde

el ordenador para controlar la velocidad, sentido y dirección. La tensión continua aplicada al coche debe ser fija de 5V para no quemar los componentes.

Consta de un sistema electrónico formado por 1 PCB en el que se utilizarán componentes electrónicos de tipo discreto, chips integrados y semiconductores de potencia; y de un sistema mecánico en el que se utilizarán motores con sus reductoras y metacrilato para la construcción del chasis del coche.

1.2. FORMA DE EJECUCIÓN La ejecución de las placas se realizará de la siguiente manera:

Obtención de las máscaras de impresión necesarias: el primer paso que hay que dar para realizar un circuito impreso por métodos semiprofesionales es la obtención de una máscara, patrón o fotolito que contenga el diseño del circuito a realizar (pistas, footprints, etc.).

Para transferir el diseño del circuito deseado a la placa para circuito impreso, el método que más nos interesa es el fotolitográfico, que se pasa a describir:

Utilizando un programa informático que permita el diseño de placas de circuito impreso, en este caso el Proteus, se imprimirá el diseño 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 obtención de la placa:

a) Insolación: Si se ha obtenido a través de la impresora un original positivo, se utilizará una placa presensibilizada positiva, que son las más comunes. En estas placas la lámina de cobre está recubierta por una emulsión fotosensible, esto es, si incide la luz solar sobre ellas, en aquellas partes que hayan recibido las radiaciones se produce una reacción química y se descompone la emulsión. Las partes que se hayan tapado con material opaco no reaccionarán químicamente y no se debilitarán sus enlaces químicos.

La insolación, por tanto, consiste en la exposición a la luz actínica (rica en rayos ultravioleta) de la placa presensibilizada a

Page 642: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

640

través de la máscara. Este proceso se puede hacer mediante una máquina insoladora.

Estas máquinas llevan lámparas fluorescentes que irradian luz actínica, una vez alineado el conjunto máscara-placa y pegado por las esquinas con papel celofán, se coloca en la máquina, que lleva una bomba que permite hacer el vacío entre dos planchas transparentes para que la imagen a transferir esté en estrecho contacto con la emulsión fotosensible del cobre de la placa.

El tiempo de insolación en la máquina suele durar entre 3 y 5 minutos, dependiendo del tipo de lámpara y del tipo de placa.

b) Revelado: cosiste en la disolución de la zona de emulsión debilitada por la acción de la luz, en este caso serán las zonas insoladas.

El revelado se realizará con una disolución de 1 litro de agua con una base disuelta como sosa cáustica o hidróxido sódico (NaOH) o cloruro férrico.

La forma de realizar el revelado es moviendo la placa de una forma lenta pero constante dentro de una cubeta de plástico con la disolución anterior. Esto se puede hacer introduciendo la placa en el líquido y moviendo la cubeta, o sujetando la placa con una pinza de plástico por un extremo y haciendo movimiento de vaivén.

El tiempo de revelado depende de la temperatura del agua y de la concentración de la base.

La fase de revelado concluye cuando se vea nítidamente 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 plástico 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 volúmenes, y 200 gramos de ácido clorhídrico rebajado.

El proceso de grabado también es visible, al igual que el de revelado. Una vez concluido se lava la placa con agua, se seca y se elimina la emulsión 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 marcarán todos los nodos sobre el cobre de la placa con un punzón, ejerciendo una cierta presión hasta que quede una

Page 643: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

641

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 sujeción de la placa, una de 3,5 o 4 mm. Por último, se revisará la placa comparándola con el cliché, por si se ha olvidado hacer algún taladro.

e) Soldadura: Se emplea hilo de aleación Sn-Pb al 60% de estaño 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 eléctrica y mediante una resistencia calienta la punta.

El orden de soldado es: 1. Los puentes, realizándolos con sobrantes de los

terminales, puentes o cable de entre 0,5mm y 1mm 2. Zócalos 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 estaño en la unión que ya estará caliente. El estaño 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.

Después de realizar la soldadura hay que cortar los terminales del extremo sobrante para correspondiente conexión.

f) Compilado y programado: Se procede a compilar el firmware del microcontrolador con el compilador MPLAB C18 y la programación del mismo con un programador de microcontroladores y el software WinPic 800.

g) Ensamblado: El último paso para la realización de la palca es la introducción de los integrados en sus respectivos zócalos y la conexión de los componentes externos en sus respectivos conectores.

Page 644: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

642

Fases para la obtención del chasis:

a) Corte: El corte del metacrilato se realizará por medio de una sierra mecánica o manual de metal. Siguiendo los planos.

b) Taladrado: El taladrado se realizará por medio de una taladradora con broca para metal según lo indicado en los planos.

c) Ensamblado: la unión de las piezas se realizará con pegamento rápido 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 diámetro inferior al del tornillo.

Unión de la placa al chasis mediante los separadores y tornillos M3.

Conexión de los motores y sensores a la placa.

Comprobación del correcto funcionamiento:

Si al mandar la instrucción 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.

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 llamaría Mdetras y al contrario.

Si se ha modificado el firmware, se compila y se programa el microcontrolador.

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 pasaría a llamarse Giroizq y al contrario.

Una vez modificado el firmware, se compila y se programa el microcontrolador.

Page 645: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

643

1.3. PLAZOS Y ORDEN DE EJECUCIÓN 1. Diseño de placas de circuito impreso mediante programa informático

Proteus. 2. Impresión del diseño en papel vegetal para su posterior tratado mediante

impresora láser o de inyección. 3. Exposición a la luz actínica de la placa presensibilizada a través de máscara,

mediante una insoladora. 4. Revelado de la placa mediante una disolución de 1 litro de agua con una

base o con NaOH y posterior limpieza con chorro de arena. 5. Eliminación del cobre descubierto en el revelado mediante una

concentración de agua y ácido clorhídrico. 6. Aplicación 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. Colocación de los componentes en los nodos de las placas. 10. Soldadura de los componentes a la placa mediante hilo de aleación Sn-Pb al

60% de Sn y al 40% de Pb. 11. Corte del extremo sobrante del terminal del componente. 12. Realización de pruebas. 13. Corte del metacrilato para el chasis. 14. Taladro del metacrilato con brocas con el tamaño indicado en los planos. 15. Unión de las piezas de metacrilato según lo indicado en los planos. 16. Unión de la placa al chasis mediante separadores metálicos. 17. Conexión de los motores y sensores. 18. Prueba del montaje total.

Page 646: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

644

1.4. MATERIALES

1.4.1. MATERIALES DEL LABORATORIO NECESARIOS PARA LA PARTE ELÉCTRICA

1. Software informático Proteus Versión 6.3. Para la realización de placas electrónicas, utilizándose para el trazado de pistas su librería Layout.

2. Láminas Transparentes para Impresoras Láser. Se utiliza para elaborar esquemas de alta resolución de PCB y otros diseños mediante cualquier impresora láser. Sus características son:

Se obtienen diagramas de gran densidad con toda nitidez

Lámina transparente de 75 μm Recubrimiento especial de sujeción y fijación de alta resolución

3. Máquina insoladora. Con luz actínica y temporizador. 4. Cubeta de plástico para ataque químico. Características:

Longitud 313mm. Anchura 264mm. Profundidad 58mm. Bandejas rígidas de poliestireno adecuadas para contener soluciones de

revelado y ataque químico (hidróxido de sodio y cloruro férrico) empleadas en la producción de PCBs.

5. Gafas de seguridad cómodas y ligeras, disponen de una moldura de PVC suave y de unos cristales de policarbonato. Tienen la homologación 2092 nivel 1, proporcionan protección contra el polvo, salpicadura de sustancias químicas 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 protección completa.

7. Punzón para pistas. Para utilizarlo con placas de pistas. Proporciona un método simple de interrumpir las pistas de cobre. Después de introducir el punzón, 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 térmica. Tanto en el momento de la soldadura como en las pausas de esta labor, el soldador permanece conectado a la corriente eléctrica. Resulta adecuado para trabajos repetitivos y numerosos.

10. Carrete de hilo de estaño-plomo con una proporción del 60%-40% respectivamente.

11. Flux en frasco de 20ml con pincel exento de residuos.

Page 647: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

GUILLERMO DAVID HERRERO GONZÁLEZ

645

1.4.2. MATERIALES PARA LA REALIZACIÓN DE LA PLACA 1. Placa fotosensibilizada para fabricación de PCB’s de una cara de 80x100mm 2. Microinterruptores conmutadores de tipo Final de Carrera 3. Diodos de potencia: 1N4007 4. Driver: ULN2803 5. Driver: U293D 6. Condensador electrolítico de 47μF y 25V 7. Condensadores cerámico de 27pF y 100nF 8. Condensador cerámico de 100nF 9. Resistencias de 1/4W de 1KΩ y 10KΩ 10. Diodo LED bicolor de tres terminales 11. Diodos LED rojo superbrillantes 12. Motores de corriente continua de 5V con su reductora 13. Motor Paso a Paso bipolar de 5V con su reductora 14. Cristal de cuarzo de 4MHz 15. Zumbador de 5V 16. Sensor de distancia tipo GP2Y0A21YK 17. Bombillas 18. Conectores de 2 y 3 terminales 19. Conector USB tipo B hembra para circuito impreso 20. Zócalo de perfil bajo estañado: 16, 18 y 28 pines 21. Separadores hexagonales metálicos

1.4.3. MATERIALES DE LABORATORIO NECESARIOS PARA LA PARTE MECÁNICA

1. Taladradora 2. Brocas de acero para metal 3. Sierra mecánica para metal 4. Sierra manual para metal 5. Gafas y guantes de protección

1.4.4. MATERIALES PARA LA REALIZACIÓN DEL CHASIS 1. Metacrilato 2. Engranajes 3. Pegamento rápido para metacrilato 4. Ejes de acero 5. Ruedas de caucho sintético 6. Arandelas de acero 7. Anillas de retención

Page 648: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

646

1.5. REALIZACIÓN DE LAS PRUEBAS Se realizarán 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 realizarán pruebas con el sistema global de funcionamiento. Gracias a ello se podrá determinar el correcto funcionamiento del sistema global.

Page 649: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

E. PRESUPUESTO

Page 650: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 651: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

649

1. PRESUPUESTO DE LA PARTE ELÉCTRICA Nº de Orden Componentes Unidades Precio Unitario Precio Total

1 Diodo de potencia 1N4007 8 0,07 0,562 Diodo LED bicolor de tres terminales 1 0,80 0,803 Diodo LED rojo superbrillante 2 0,50 1,004 Resistencia de 1kΩ y 1/4W 2 0,03 0,065 Resistencia de 10kΩ y 1/4W 3 0,03 0,096 Condensador cerámico de 27pF 2 0,08 0,167 Condensador cerámico de 100nF 1 0,09 0,098 Condensador electrolítico de 47μF y 25V 1 0,12 0,129 Motor de CC con redutor 2 5,54 11,08

10 Motor Paso a Paso bipolar 1 29,27 29,2711 Cristal de cuarzo de 4MHz 1 0,84 0,8412 Circuito integrado ULN2803 1 0,56 0,5613 Circuito integrado L293D 1 3,61 3,6114 Microcontrolador PIC18F2455 1 9,58 9,5815 Zumbador 1 2,70 2,7016 Conmutador Final de Carrera 3 2,55 7,6517 Sensor de distancia GP2Y0A02YK 1 19,53 19,5318 Bombilla 5V 2 0,38 0,7619 Conector 2 terminales 6 0,24 1,4420 Conector 3 terminales 6 0,60 3,6021 Conector USB tipo B hembra 1 1,55 1,5522 Placa fotopositiva 80x100mm 1 4,45 4,4523 Separadores 4 0,27 1,0824 Cloruro Férrico 1 2,70 2,7025 Revelador 1 2,70 2,7026 Cable de 0,75mm de diámetro (metros) 1 0,81 0,8127 Cable de 1,5mm de diámetro (metros) 8 0,84 6,7228 Cable USB tipo A-B (5 metros) 1 14,75 14,7529 Zócalo de 28 terminales 1 0,26 0,2630 Zócalo de 18 terminales 1 0,14 0,1431 Zócalo de 16 terminales 1 0,11 0,11

Total sin I.V.A. 128,7716% IVA 20,61Total (€) 149,38

Page 652: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

650

2. PRESUPUESTO DE LA PARTE MECÁNICA Nº de Orden Componentes Unidades Precio Unitario Precio Total

1 Juego de engranajes módulo 0,5 1 9,00 9,002 Juego de ruedas de caucho sintético 1 10,00 10,003 Arandelas, ejes 1 12,00 12,004 Anillas de retención 1 12,00 12,005 Metacrilato (60x25x1cm) 1 15,00 15,006 Pegamento para Metacrilato 1 1,75 1,757 Tornillos M3 16 0,30 4,808 Tornillos S2 8 0,30 2,409 Tornillos S4 6 0,30 1,80

Total sin I.V.A. 68,7516% IVA 11,00Total (€) 79,75

3. TOTALIZACIONES Nº de Orden Presupuesto Precio Total

1 Parte Eléctrica 128,772 Parte Mecánica 68,75

Total sin I.V.A. 197,5216% IVA 31,61Total (€) 229,13

Page 653: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

F. CONCLUSIÓN

Page 654: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR
Page 655: CONEXIÓN AL PUERTO USB MEDIANTE UN MICROCONTROLADOR

653

1. CONCLUSIÓN El objetivo principal del proyecto es la comunicación 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 año), existe muy poca información en español de este tema, tanto para el micro como para el ordenador.

El proceso de búsqueda de información ha sido muy largo y con el impedimento del idioma. Además, la necesidad de aprender otro lenguaje de programación para el microcontrolador que, aunque no sea el mejor, es el único con una versión 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 librerías más 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 cómo hacerlo.

Una vez entendido los pasos, partiendo de los ejemplos de Microchip, se estudiaron todas las librerías para saber que hay que modificar para desarrollar una comunicación adaptada a cada aplicación.

Una vez lograda la comunicación 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 librería MPUSBAPI.dll en otros lenguajes de programación como el Delphi.

Al conseguir comunicar el ordenador con el microcontrolador por medio del Visual Basic, se observó que no se puede realizar la conexión sin trabajar con punteros. Esto fue novedoso ya que el VB no se desarrolló para trabajar con este tipo de variables.

Al lograr la comunicación bidireccional, se desarrolló el coche para demostrar de una forma visible que la transmisión de datos es real y no se está simulando.

Como conclusión de este trabajo fin de carrera, comentar las experiencias obtenidas del autor:

Conocer el puerto USB y sus características. Aprender un nuevo lenguaje de programación 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 informáticas.

Por último, agradecer al tutor D. José Torreblanca González su aceptación y tutela de este trabajo fin de carrera.