8051-Port 2 und ULN2803 - Problem

OP #4342279
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
Angehängte Dateien:
#4342344
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.