Forum: Mikrocontroller und Digitale Elektronik 8051-Port 2 und ULN2803 - Problem


von C. L. (calle)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich bin ein wenig am verzweifeln mit der Ansteuerung eines ULN2803 am 
Port 2 vom AT89C51CC03.
Der ULN hängt direkt ohne Widerstand am Port 2.7 und schaltet ein Relais 
auf diesem Board (4mA Schaltleistung werden benötigt):
http://www.amazon.de/Kanal-Relay-Relais-Module-Arduino/dp/B00AEIDWXK/ref=sr_1_1?ie=UTF8&qid=1447058086&sr=8-1&keywords=relaisboard

Man ließt ja schon einiges an Problemen zu dem Thema, dennoch habe ich 
keine Lösung parat.
Grundsätzlich funktioniert die Ansteuerung ertmal, aber nicht 
zuverlässig.
D.h. manchmal klappt es, dann wieder nicht.

Was micht echt stutzig macht ist folgendes:
Wenn ich mit dem Logiktester direkt an den Port P2.7 messe, bekomme ich 
zwar je nach Zustand eine echte "0" aber kein
echtes High, sondern es scheint irgendwie zu schweben. Die Ausgangsstufe 
des 8051 hat ja Pullup´s, also werde ich warscheinlich nicht genügend 
Strom aus diesen Port bereitgestellt bekommen um das High auf dem 
Logiktester angezeigt zu bekommen.
Trotzdem schaltet sich genau in diesem Moment das Relais ein, obwohl das 
definitiv nicht das Programm macht!
Ebenso scheint sich dieser Ausgang dann auch zu halten.
Wieso kann ich von aussen mit Messungen an diesem Port ihn zu schalten 
bringen?
Im Datenblatt des 8051 steht m.M.n. das nur bei Adresszugriff auf Port 2 
hier der Pullup wirkt, ist das mein Fehler?
Alles komisch irgendwie.

Im Programm wird das hier gemacht (Auszug):

//Deklaration
unsigned char bit WarmwasserZirkulationspumpe @ 0xA6; // P2.6


// in der MAIN werden dann anfangs erst alle Ausgänge einmal mit "0" 
beschrieben und einfach anhand einer temporären Variable geschaltet.

RelaisReserve1 = 0; // Alles erstmal definiert auf "0" setzen
RelaisReserve2 = 0;
RelaisReserve3 = 0;
RelaisReserve4 = 0;
WarmwasserZirkulationspumpe = 0;

.
.
.
.
.
.


if (WarmwasserZirkulationspumpeTmp == 1)
    {
    WarmwasserZirkulationspumpe = 1;          // Pumpe ein
    Zur_Visu[43] = 0;
    Zur_Visu[44] |=0x01;                      // 16bit 30021 Bit 0..7
    }
else
    {
    WarmwasserZirkulationspumpe = 0;          // Pumpe aus
    Zur_Visu[43] = 0;
    Zur_Visu[44] &=0x0FE;                     // 16bit 30021 Bit 0..7
    }


Was mache ich falsch bzw. was kann ich noch machen?
Invertieren in Software und dann mit 7404? Muss das sein?
Pullup / pulldown?

Gruß CL

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

C. L. schrieb:
> Im Datenblatt des 8051 steht m.M.n. das nur bei Adresszugriff auf Port 2
> hier der Pullup wirkt, ist das mein Fehler?

Wenn Du die Antwort schon gelesen hast, wieso lötest Du nicht 
probehalber mal kurz einen Pullup dorthin?
Das wäre bestimmt schneller gegangen als diesen langen Text zu 
schreiben.

von Peter D. (peda)


Lesenswert?

C. L. schrieb:
> Ich bin ein wenig am verzweifeln mit der Ansteuerung eines ULN2803 am
> Port 2 vom AT89C51CC03.

Hau einfach den ULN2803 raus.
Das Relaisboard kann direkt vom 8051 angesteuert werden (low aktiv).

von Georg G. (df2au)


Lesenswert?

Der Pullup am Port2 ist immer wirksam, allerdings ist er relativ 
schwach, IIRC sind es so 50kOhm. Im Moment das Zugriffs wird kurzzeitig 
ein niederohmiger Pullup für einen Takt parallel geschaltet.

Der ULN2803 hat etwa 3kOhm + 2 Diodenstrecken Eingangswiderstand. Du 
kannst dir also ausrechnen, was da an Spannung zu messen ist.

Allerdings reichen die 100uA Strom aus dem Port aus, um dein Minirelais 
via ULN2803 anzusteuern.

Da Dein Relais eigene Treiber hat, geht es - wie Peda schrieb - auch 
ohne ULN2803.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.