TEMA: BLOQUEADOR DE MICROCONTROLADORES MICROCONTROLADORES ATMEL. OBJETIVOS: Objetivo General:
Desbloquear mínimo dos dispositivos diferentes Atmel, incorporado una alarma luminosa para indicar desbloqueo correcto o incorrecto.
Objetivos Específicos:
Identificar cada uno de los elementos que componen al microcontrolador Atmel (ATMEGA324P y ATMEGA644P). Identificar las capacidades, ventajas y desventajas que posee el microcontrolador, microcontrolador, en cuanto a su programación, programación, para sus aplicaciones aplicaciones reales.
Diseño (programa y diagramas): Programa: .include "m324Pdef.inc" "m324Pdef.inc" ;******************************* ;******************************* define variables ************************************ .def temp=r16 .def data=r17 ;variables usadas para colocar los bits de fabrica .def h_fuses=r18 .def l_fuses=r19 .def e_fuses=r20 .def b_fuses=r21 ; variables usadas en la lectura de fusibles .def alto=r22 .def bajo=r23 .def exte=r24 .def bloc=r25 inicio: ;**************************************** ;************************************************************ ************************************** ******************** ** ;******************** puntero de pila en ram estatica *************************** *************************** ;**************************************** ;************************************************************ ************************************** ******************** ** ldi temp,low(ramend) temp,low(ramend) out spl,temp ldi temp,high(ramend) temp,high(ramend) out sph,temp
;***************************************************************************** ;******************** configuracion de puertos ******************************* ;***************************************************************************** ;para programacion paralelo ser temp out ddra,temp out porta,temp
;carga 0xff ;configura todo portb como salida ;apaga todo portb inicializando el puerto en 1
sbi ddrb,0 sbi portb,0
;pin exclusivo para XTAL1 ;apaga portd,0 inicializando el pin en 1
;para DATA ser temp out ddrc,temp out portc,temp
;carga 0xff ;configura todo portb como salida ;apaga todo portb inicializando el puerto en 1
;para el pulsador, led verde, led rojo y amarillo ldi temp,0b11111110 out ddrd,temp salida de 3 leds ldi temp,0b00000001 out portd,temp
;carga 0x01 ;se configura el puerto para la entrada de l boton y ;carga 0x0f ;enciente pullups en el porta e inicia el puerto en 1
;carga los valores de fabrica de los fusibles ldi temp,0b10011001 mov h_fuses,temp ldi temp,0b01100010 mov l_fuses,temp ser temp mov e_fuses,temp ser temp mov b_fuses,temp ;limpia las variables antes de iniciar el bucle clr alto clr bajo clr exte clr bloc cli
;deshabilita permiso global de interrupciones
;***************************************************************************** ;******************** inicia el bucle del programa ***************************
;***************************************************************************** bucle: sbic pind,0 rjmp bucle call delay_10ms
;boton presionado? (cero logico?) ;no, verifica otra vez ;si, delay para eliminar rebotes
sbic pind,0 rjmp bucle sbi portd,3
;boton continua presionado? ;no, verifica otra vez ;enciende el led amarillo para identificar que comenzo el
call erase cbi portd,3 call reprograma call lectura verifica:
;llama a la subrutina para la borrado de los fusibles
proceso
;despues de haber hecho la lectura de los fusibles ;ahora comprueba si son iguales a los de fabrica clr temp cpse h_fuses,alto inc temp cpse l_fuses,bajo inc temp cpse e_fuses,exte inc temp cpse b_fuses,bloc inc temp cpi temp,0x00
;pregunta si el valor de temporal es
igual a cero breq micro_desbloqueado ;si lo es que el microcontrolador esta desbloqueado call micro_bloqueado desbloquear el micro
;de no serlo llama a la subrutina para
jmp verifica ;regresa del desbloqueo cambiando los valores de los fusibles y vuelve a verificar su valor micro_desbloqueado: sbi portd,1 desbloqueado call delay_10ms cbi portd,1 jmp bucle
;enciende el led verde para identificar que esta ;llama a una demora de 10 s ;regresa al bucle
;***************************************************************************** ;******************** finaliza el bucle del programa ************************* ;***************************************************************************** ////////////////// SUBRUTINA DE LECTURA DE FUSIBLES /////////////////////////////// lectura: ;inicio de subrutina de lectura de los fusibles clr alto clr bajo clr exte clr bloc ser temp out ddrc,temp ldi temp,0x04 ;envia comando para la lectura de los fusibles out portc,temp //------> DATA cbi porta,4 //------> XA0 puerto A,4 sbi porta,5 //------> XA1 puerto A,5 cbi porta,3 //------> BS1 puerto A,3 nop call pulso_xtal nop call lee_fuse_high call lee_fuse_low call lee_extended_fuses call lee_lock_bits ret ///////////////////////////////////////////////////////////////////////// ////////////////////// ;--------------------------------------------------------------------------------------------///////////////////////// SUBRUTINA DE RECONFIGURACION DE FUSES /////////////////////////////// micro_bloqueado: sbi portd,2 call delay_10ms cbi portd,2 ret
;enciende el led rojo para identificar que esta bloqueado ;llama a una demora de 10 s
///////////////////////////////////////////////////////////////////////// ////////////////////// ;---------------------------------------------------------------------------------------------
.include "retardos.inc" .include "inicio_com.inc" .include "erase_fuses.inc" .include "reprograma_fuses.inc" .include "lectura_fuses.inc" Diagramas: MATERIALES: 2 microcontrolador ATMEGA324P. Bread Board. Pulsador Resistencias Grabador de ARV Fuente Cables Led Software (AVR estudio, Proteus, Eagle)
MARCO TEÓRICO: CARACTERÍSTICAS: Microcontrolador AVR de 8 bits de alto rendimiento y bajo consumo. Arquitectura Avanzada RISC 131 instrucciones. La mayoría de un solo ciclo de reloj de ejecución. 32 registros de trabajo de 8 bits para propósito general. Funcionamiento estático total. Capacidad de procesamiento de unos 20 MIPS a 20 MHz. Multiplicador por hardware de 2 ciclos
Memorias de programa y de datos no volátiles de alta duración 16/32/44 K bytes de FLASH auto programable en sistema
512B/1K/2K bytes de EEPROM 1/2/4K bytes de SRAM Interna Ciclos de escritura/borrado: 10.000 en Flash / 100.000 en EEPROM Retención de Datos: 20 años a 85ºC / 100 años a 25ºC Sección opcional de código Boot con bits de bloqueo independientes. Programación en sistema del programa Boot que se encuentra dentro del mismo chip. Operación de lectura durante la escritura. Bloqueo programable para la seguridad del software.
Interface JTAG Capacidades de Boundary Scan de acuerdo con el estándar JTAG Soporte Extendido Debug dentro del chip Programación de FLASH, EEPROM, fusibles y bits de bloqueo a través de la interface JTAG.
Características de los periféricos Dos Timer/Contadores de 8 bits con prescalamiento separado y modo comparación. Un Timer/Contador de 16 bits con prescalamiento separado, modo comparación y modo de captura. Contador en Tiempo Real con Oscilador separado 6 Canales para PWM ADC de 10 bits y 8 canales Modo Diferencial con ganancia seleccionable a x1, x10 o x200. Interface serie de dos hilos con byte orientado. Dos puertos Seriales USART Programables Interfaz Serial SPI maestro-esclavo Watchdog Timer programable con oscilador independiente, dentro del mismo chip. Comparador Analógico dentro del mismo Chip Interrupt and Wake-up on Pin Change
Características especiales del microcontrolador Power-on Reset (en el encendido) y detección de Brown-out (pérdida de polarización) programable. Oscilador RC interno calibrado. Fuentes de interrupción externas e internas. 6 modos de descanso: Idle, Reducción de Ruido ADC, Power-save, Powerdown, Standby y Standby extendido.
Encapsulados para Entradas/Salidas (E/S) 32 líneas de E/S programables. PDIP de 40 pines, TQFP y QFN/MLF de 44 pines.
Voltajes de Operación 1.8 – 5.5V para el ATMEGA 164P/324P/644PV 2.7 – 5.5V para el ATMEGA 164P/324P/644P
Velocidad de Funcionamiento ATMEGA 164P/324P/644PV: 0 – 4MHz @ 1.8 – 5.5V - 10MHz @ 2.7 – 5.5V
ATMEGA 164P/324P/644PV: 0 – 10MHz @ 2.7 – 5.5V - 20MHz @ 4.5 – 5.5V
Consumo de energía a 1MHz, 1.8V, 25ºC para el ATMEGA 164P/324P/644P Activo: 0.4mA Modo Power-down: 0.1uA Modo Power-Save: 0.6uA (Incluye RTC de 32 Khz)
CONFIGURACIÓN DE PINES Pines de Salida del ATmega164P/324P/644P
CHIP ERASE El Chip Erase borraría las memorias Flash y la EEPROM más los bits bloqueados. Los bits bloqueados no son reseteados hasta que la memoria de programa ha sido completa de borrar. Los bits de los Fusibles no son cambiados. El Chip Erase seria realizado después que la Flash y la EEPROM son reprogramadas. Nota 1: La memoria EEPROM es preservada durante el Chip Erase si el fusible EESAVE es programado. Cargando los comandos “Chip Erase” 1. Poner XA1, XA0 a “10”. Esto habilita la carga de los comandos. 2. Poner BS1 a “0”. 3. Poner DATA a “1000 0000”. Este es el comando para el Chip Erase. 4. Dar a XTAL1 un pulso positivo. Esto cargaría los comandos. 5. Dar a WR un pulso negativo. Esto inicializa al Chip Erase. RDY/BSY van en bajo. 6. Esperar hasta que RDY/BSY esté en alto antes de cargar el Nuevo comando.
Programando los Bits Bajos del Fusible El algoritmo para programar los Bits Bajos del fusible se describe a continuación. 1. A: Cargar Comando “0100 0000”. 2. C: Cargar Datos de Byte Bajos. Programar bit n = “0” y bit n = “1” borra el bit del fusible. 3. Dar a WR un pulso negativo y esperar para que RDY/BSY este en alto.
Programando los Bits altos del Fusible El algoritmo para programar los Bits altos del fusible se describe a continuación: 1. A: Cargar Comando “0100 0000”. 2. C: C: Cargar Datos de Byte Bajos. Programar bit n = “0” y bit n = “1” borra el bit del fusible. 3. Poner BS2, BS1 a “01”. Esto selecciona el byte alto de datos. 4. Dar a WR un pulso negativo y esperar para que RDY/BSY este en alto. 5. Poner BS2, BS1 a “00”. Esto selecciona el byte bajo de datos.
Programando los Bits Extendidos del Fusible El algoritmo para programar los Bits Extendidos del Fusible se describe a continuación: 1. A: Cargar Comando “0100 0000”. 2. C: Cargar Datos de Byte Bajos. Programar bit n = “0” y bit n = “1” borra el bit del fusible. 3. Poner BS2, BS1 a “10”. Esto selecciona el byte extendido de datos. 4. Dar a WR un pulso negativo y esperar para que RDY/BSY este en alto. 5. Poner BS2, BS1 a “00”. Esto selecciona el byte bajo de datos.
Programando los Bits de Bloqueo El algoritmo para programar los Bits de Bloqueo se describe a continuación: 1. A: Cargar Comando “0010 0000”. 2. C: Cargar Datos de Byte Bajos. Bit n = “0” programa el bit de bloqueo. Si el modo 3 LB es programado (LB1 y LB2 es programado), esto no es posible en los bits bajos de Bloqueo por ningún modo de programación externo. 3. Dar a WR un pulso negativo y esperar para que RDY/BSY este en alto. Los bits bloqueados solo pueden ser limpiados ejecutando el Borrado de Chip.
Leer Fusibles y Bloquear Bits El algoritmo para leer el Fusible y Bloquear Bits es descrito a continuación: 1. A: Cargar Comando “0000 0100”. 2. Poner OE a “0”, y BS2, BS1 a “00”. El estado de los bits en alto del Fusible pueden ahora ser leídos en DATA (“0” significa que ha sido programado).
3. Poner OE a “0”, y BS2, BS1 a “11”. El estado de los bits en alto del Fusible pueden ahora ser leídos en DATA (“0” significa que ha sido programado). 4. Poner OE a “0”, y BS2, BS1 a “10”. El estado de los bits extendidos del Fusible pueden ahora ser leídos en DATA (“0” significa que ha sido programado). 5. Poner OE a “0”, y BS2, BS1 a “01”. El estado de los bits de bloqueo pueden ahora ser leídos en DATA (“0” significa que ha sido programado). 6. Poner OE a “1”.
Características de la Programación en Paralelo
Pruebas: No se obtuvo un buen resultado al momento de las pruebas, no funcione. Se tuvo un número grande de micros bloqueados.
Resultados: No se logró obtener el programa adecuado para la construcción del desbloqueador.
Conclusiones:
Se llegó a determinar que para la realización del desbloqueado se debe tomo en cuenta la configuración de los fusible en alto y bajo. La configuración de los fusibles es dependiente de cada micro y del acceso a ellos. Se debe de llevar una secuencia de pasos para la construcción del desbloqueador, borrar, reprogramar, la lectura y verificación. Para verificar su funcionamiento está limitado por la poca facilidad para simularlo en software. Si no se tiene una adecuada estructura en el programa y su construcción hay un alto grado de bloqueo de los micros.
La poca información respecto al acceso a los fusibles.
Recomendaciones:
Se sugiere la tutoría permanente del profesor para construcción de este desbloqueador o preferiblemente realizarlo en clase. Tener un buen número de micros para la verificación del funcionamiento. Buscar la información más contundente y real para la configuración de los fusibles.