Resumen : Tengo dos circuitos: Uno en breaboard y otro en PCB. Tengo dos microcontroladores: Uno comercial (preprogramado) y uno personal (con el que intento recrear el comercial). El uC comercial funciona en ambos circuitos y mi recreado funciona solo en el breadboard. No entiendo como uno puede funcionar en ambos y el otro no.
Contexto
Descargo de responsabilidad : Todos los recursos como esquemas, imágenes, código, etc. se pueden encontrar a continuación. Trato de ser lo más exhaustivo posible con esta pregunta.
He comprado un sencillo circuito de dados eléctricos, que "tirará" un dado con sólo pulsar un botón. Esto utiliza LEDs y un uC para hacer y vino preprogramado (ver abajo para una imagen). Cuando se pulsa el botón, los LED parpadearán y cuando se suelta, el número tirado se mantendrá durante 3 segundos, hasta que los LED se apagan. Esto es super simple, que consiste sólo en LEDs, resistencias, baterías, un botón, y un uC que es ATTiny13 por Atmel.
Mi objetivo es recrear la programación del uC yo mismo y, con el tiempo, construir circuitos similares yo mismo (empezar poco a poco, ¿no?).
Ahora, tengo los esquemas de la comercial (ver primera imagen de abajo) y reconstruido todo en mi protoboard (ver segunda imagen de abajo). He validado este circuito tomando el ATTiny13 de la versión comercial (es extraíble debido a un zócalo) y lo puso en mi circuito hecho a sí mismo. Todo funciona perfectamente.
Entonces empecé a programar mi primer ATTiny13. Hice algunas pruebas sencillas de parpadeo de LEDs y luego probé un script de dados de una página web para probarlo (ver código más abajo). Todo esto funciona perfectamente en mi protoboard. También rodar los dados funciona muy bien.
En el momento, pongo esto en el PCB comercial (con los mismos esquemas), nada funciona. Ni el script del parpadeo ni el de los dados hacen que parpadee ningún LED. Pulsando el botón no cambia nada.
Se me ocurren muchas cosas que podrían ser un problema, pero todo se reduce a un punto: "Cuando la placa de circuito impreso y el circuito de la protoboard tienen el mismo esquema y son similares, un uC que funcione en uno, funcionará en el otro". Esto es cierto para el comercial, pero no para el mío. Estoy realmente desconcertado por esto y mis limitados conocimientos de electrónica me están alcanzando ahora. ¿Tal vez los PCBs se comportan de manera diferente después de todo? He comprobado a fondo ambos circuitos y parecen ser exactamente iguales a los esquemas.
Estoy muy feliz por cualquier ayuda o pista en la dirección correcta. Actualmente ni siquiera sé qué buscar. Creo que podría descuidar algo fundamental aquí.
Gracias por tomarte el tiempo de leer y responder, ¡te lo agradezco mucho!
Recursos
Información general
R1 - 5.6k Ohm
R2 - 10k Ohm
R3 R4 R6 - 15 Ohm
R5 - 120 ohmios
Vcc son tres pilas de 1,5 V (4,5 V)
Microcontrolador: ATTiny13 Ficha de datos
Para la programación, utilizo el IDE Arduino y un Arduino Nano como ISP (he seguido esta guía ). Programo el ATTiny con los siguientes ajustes (aunque apenas sé nada sobre el significado de los mismos):
BOD: 4.3V
EEPROM: EEPROM retenida
Reloj: 1,2 MHz, osc. interno
Horario: Micros desactivados
Esquema del circuito
Circuito Breadboard
Circuito PCB
Código
/*
* The LEDs are arranged like this
*
* LED3 LED6
* LED2 LED7 LED5
* LED1 LED4
*
*
*
* AtTiny13 Pins
* ---------------------
* 1_o___8 5V
* LED34 2_____7 LED25
* LED7 3_____6 LED16
* GND 4_____5 BTN
* -----------------------
*
*
*/
// The pins will be addressed using their PB Number (see above)
int pinLed16 = 1;
int pinLed25 = 2;
int pinLed34 = 3;
int pinLed7 = 4;
int pinButton = 0;
int buttonState;
long ran;
int time = 2000;
void setup ()
{
pinMode (pinLed16, OUTPUT);
pinMode (pinLed25, OUTPUT);
pinMode (pinLed34, OUTPUT);
pinMode (pinLed7, OUTPUT);
pinMode (pinButton, INPUT);
// This resulted in an error, so it is commented out for now.
//randomSeed(analogRead(A3));
}
void loop()
{
buttonState = digitalRead(pinButton);
if (buttonState == HIGH){
ran = random(1, 7);
if (ran == 1){
digitalWrite (pinLed7, HIGH);
delay (time);
}
if (ran == 2){
digitalWrite (pinLed16, HIGH);
delay (time);
}
if (ran == 3){
digitalWrite (pinLed34, HIGH);
digitalWrite (pinLed7, HIGH);
delay (time);
}
if (ran == 4){
digitalWrite (pinLed16, HIGH);
digitalWrite (pinLed34, HIGH);
delay (time);
}
if (ran == 5){
digitalWrite (pinLed16, HIGH);
digitalWrite (pinLed34, HIGH);
digitalWrite (pinLed7, HIGH);
delay (time);
}
if (ran == 6){
digitalWrite (pinLed16, HIGH);
digitalWrite (pinLed25, HIGH);
digitalWrite (pinLed34, HIGH);
delay (time);
}
}
digitalWrite (pinLed16, LOW);
digitalWrite (pinLed25, LOW);
digitalWrite (pinLed34, LOW);
digitalWrite (pinLed7, LOW);
}