Probé toda la funcionalidad de mi circuito programador y muchas cosas funcionan, pero algunas no.
Parece borrar todo el contenido de un AT89C4051, pero no programa correctamente el chip. De hecho, parece que nada está programado en absoluto.
Este es el pseudocódigo que uso para el programador:
Clear data (Set address 378h to 0)
Reset counter and enable program mode and wait 100us (Set Control 37Ah to 6)
** At this point, Pin 1=0V which is expected
Raise VPP (Set Control 37Ah to 2)
** Expected 12V at pin 1 but only got 6.8V. Why? I don't know
Raise Step Reset (Set Control 37Ah to 3)
Wait until system ready
Add 10mS delay
Lower Step Reset (Set Control 37Ah to 2)
Wait until system ready
Reset count / lower VPP (Set Control 37Ah to 6)
Y para cada byte:
Set data (Set Control 378h to data)
Wait 100uS
Raise Step Reset (Set Control 37Ah to 1)
Wait until system ready
Wait 2mS
lower Step Reset (Set Control 37Ah to 0)
Wait until system ready
Repeat for remaining bytes
Como referencia, "reinicio de paso elevado" significa que el pin 4017 IC está configurado en alto y "reinicio de paso inferior" significa que el pin de reinicio está bajo. Una vez que cae, la habilitación de programación permanecerá baja durante al menos la mitad del tiempo definido por el circuito del temporizador 555, luego se elevará y luego de que se pulse el reloj, el sistema estará listo.
Casi todo funciona, pero hay
UN PROBLEMA PRINCIPAL
Cuando instruí al sistema para aumentar el voltaje VPP, lo hizo, pero de una manera extraña.
La resistencia que uso entre 12VDC y RST del micro es de 100K solo porque la hoja de datos de Atmel establece que la corriente de programación máxima es de 250uA . Entonces, al usar 100K, estoy usando 12VDC/100K=120uA.
Entonces, sin un microcontrolador conectado, la operación es precisa. El medidor muestra muy cerca de 12V. Sin embargo, cuando saqué un microcontrolador en funcionamiento de un sistema en funcionamiento y lo inserté en este circuito y medí el voltaje después de realizar exactamente las mismas operaciones, solo obtengo entre 6 y 7V.
Miré otros circuitos y no he visto que otros usen resistencias de 100K como pull-ups. De hecho, encontré que la resistencia pull-up es de solo 2.7K en el siguiente circuito en: http://www.oocities.org/dinceraydin/8051/index.html
Mi pregunta es ¿por qué se usaría una resistencia tan pequeña para la programación cuando el manual establece claramente que hay un límite superior para la corriente que se puede proporcionar para VPP?
¿Se supone que debo violar esa especificación para que el programador funcione?
Y como referencia, este es mi circuito: y la línea diagonal en el medio es parte de una flecha, no de un cable.
ACTUALIZAR
Busqué en Internet y encontré OTRO circuito programador que usa una resistencia VPP BAJA (1K).
La URL está aquí: http://students.uta.edu/rx/rxr5243/projects/prog/
La imagen está aquí: http://students.uta.edu/rx/rxr5243/projects/prog/schematic.gif
Si la corriente a través de la resistencia es de 120 uA, el voltaje será de 12 V, lo que significa que en realidad obtendrá 12 V-12 V = 0 V en el pin. Ese límite superior es un límite de lo que dibujará el microcontrolador, no un límite de lo que se debe suministrar.
Lo que sucede es que el microcontrolador solo consume aproximadamente 60 uA, pero la resistencia cae 60 uA * 100 K = 6 V, por lo que el voltaje de salida es 12 V-6 V = 6 V. Necesita una resistencia pull-up mucho más pequeña, de modo que la corriente de programación máxima no afecte mucho el voltaje de salida.
Si usa una resistencia de 2.7K, por ejemplo, a 250uA, el voltaje en el pin será 12-(250uA*2.7k)=11.325V, lo cual es aceptable.
editar: en realidad, según la hoja de datos, debe tener al menos 11.5V. Una resistencia de 2.7K funcionará (casi con seguridad), pero técnicamente debería ser (12-11.5)/250uA=2Kohm como máximo.
usuario152879
BeB00
usuario152879
BeB00
BeB00