Estoy tratando de activar los relés con un 8051. Para esto, P2 está conectado a la matriz ULN2803A de Darlington, y los relés están conectados a las salidas correspondientes del ULN2803A.
Primero, intenté probar si el circuito está funcionando, con este código muy simple:
#include <at89c51cc03.h>
void main()
{
P2 = 0xFF;
while (1)
{
}
}
No pasó nada. Luego encontré este código en el sitio web de Keil, para volver a conducir los relés:
#include <reg52.h>
#define relayport P2
void Delay_ms(int);
void main()
{
do
{
relayport = 0xFF; //All relays On
Delay_ms(1000);
relayport = 0x00; //All relays Off
Delay_ms(1000);
}while(1);
}
void Delay_ms(int k)
{
int j;
int i;
for(i=0;i<k;i++)
{
for(j=0;j<100;j++)
{
}
}
}
Esto funcionó, por alguna razón ... los relés comenzaron a activarse y desactivarse.
La pregunta es, ¿por qué no funcionó el primer código? Esperaba que el primer código girara y mantuviera los relés encendidos. La variante es AT89C51CC03.
Editar: se observa el mismo comportamiento defectuoso cuando hice lo siguiente, con la intención de activar y desactivar los relés una vez:
void main(){
relayport = 0xFF; //All relays On
Delay_ms(1000);
relayport = 0x00; //All relays Off
Delay_ms(1000);
while(1);
}
Muy raro ... ¿Alguien sabe qué se debe hacer en el caso de que quiera activar los relés una vez y luego ingresar al superloop?
Edit 2: Parece que es un error muy específico, porque el programa también se está comportando normalmente en el depurador de software. Voy a informar a Keil.