www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Relais, Spannung am IO-Port bricht zusammen


Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mit einem Atmega eine Reihe von Reedrelais ansteuern. An den 
offenen IO-Pins messe ich korrekt 4.89V bei High und ein paar Millivolt, 
wenn der Ausgang auf Low steht. Soweit alles ok.

Wenn ich nun ein Relais an den Ausgang hänge, bricht die 
Ausgangsspannung bei High  ein auf ca. 60mV, das Relais zieht jedoch 
nicht an. Ich habe die Relais schon mit den Labornetzteil angesteuert 
und den Strom gemessen, 10mA - wie zu erwarten bei 5V und 500 Ohm 
Spulenwiderstand.

Warum ist der AVR nicht in der Lage, die 10mA zu treiben? Lt. Datenblatt 
kann er ja "DC Current per I/O ... Pin 40mA" und 200mA insgesamt 
treiben...

Beste Grüße,

Alfred

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alfred schrieb:
> Warum ist der AVR nicht in der Lage, die 10mA zu treiben?

Weil Du die Pins nicht auf Ausgang gesetzt hast.

Peter

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den Portpin auch auf Ausgang geschaltet? Hört sich so an, als 
wenn Du nur den PullUp ein- und ausschaltest... Abgesehen davon brauchst 
Du für das Reed-Relais eine Freilaufdiode, sonst ist der Port bald 
hinüber.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

ich initialisiere den Port so:
DDRC  = 0xFF;
PORTC = 0x00;

Das stimmt doch, oder?

Beste Grüße,

Alfred

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Knut,

die Relais habe die Freilaufdiode eingebaut.

Danke,

Alfred

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alfred schrieb:
> die Relais habe die Freilaufdiode eingebaut

Hast Du dann die Anschlüsse richtig herum gepolt? Weil sonst leitet die 
Diode wenn sie eigentlich nicht soll ;-)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls Du einen Mega16 oder Mega32 verwendest, mach doch mal das JTAG 
aus.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Knut, die Relais sind schon richtig gepolt :-) Zumindest im Schaltplan, 
ich geh die Platine mal durchmessen, hab sie nicht selbst bestückt!

Autor: Alfred (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal die Fuse-Settings...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fuses sehen okay aus. Dass Du als erstes in die Boot-Sektion springst, 
hat mit Deinem Problem ja nichts zu tun. Ich würde mal noch die EESAVE 
setzen, damit Du nicht bei jedem ChipErase das EEPROM mitlöschst.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe jetzt alles nochmal mit einem einzelnen Relais 
durchgespielt. Mit Netzteil schaltet das Relais fein durch und zieht 
dabei 10mA. Der Ausgang des AVR bricht sowohl nach beim Anschießen eines 
Relais als auch bei einem 560Ohm Widerstand zusammen.

Der Port ist als Output konfiguriert, kein JTAG stört den PORTC und 
unbelastet stimmen die High/Low-Pegel. Hat noch jemand eine Idee?

Ratlos,

Alfred

Autor: Jens G. (jensig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also nehmen wir mal 50kOhm Pullup an (lt. DB sinds 20-50kOhm), dann 
wären das 100µA, und die über 500Ohm würden 50mV machen - das ist das 
mindeste. Deine 66mV weisen also rel. eindeutig auf den Betrieb mit 
Pullup hin.
Kaputt ist also vermutlich nix, nur programtechnisch hapert es noch 
etwas bei der IO-Geschichte. Was - das können die Egschbärtn hier nur 
mit Sourcecode herausfinden.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG Interface deaktivieren ;-)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon, guck mal weiter oben ;-)

Alfred, macht Dein Programm noch etwas anderes als den Code, den Du 
vorhin gepostet hast? Führt Dein Programm eine Hauptschleife aus? Wenn 
Du keine Schleife programmiert hast, werden die Ports zwar gesetzt, der 
Controller rennt aber durch den Speicher auf RESET und löscht die Ports 
wieder, woraufhin sie wieder gesetzt werden. Ein unkonfigurierter 
Watchdog könnte ebenfalls zuschlagen und den Controller permanent 
rücksetzen. Am besten postest Du mal Deinen kompletten Code.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohje, ohje!

Ich habs gefunden: Port-Initialisierung in eine Funktion ausgelagert und 
diese nicht aufgerufen. Asche auf mein Haupt!

Und danke an alle, die geantwortet haben :-)

Beste Grüße

Alfred

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Herrn... ;-) Schön dass wir darüber gesprochen haben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.