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
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.
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 ;-)
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.
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
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.
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.
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
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.