Hallo, ich Versuche Relais über eine Transistorschaltung vom µC (Atmega
128) aus anzusteuern. Zum Testen wollte ich "nur" mal die Ports
schalten. Ich habe die Test.asm kompiliert und anscheinend auch
erfolgreich übertragen. und es tut sich trotzdem nichts. Fehler an der
Transistorschaltung hab ich schon ausgeschlossen indem ich den
entsprechenden Pfad jeweis mit 5V beaufschlagt habe --> funktioniert.
Wenn ich im Studio das "Programm" simulier macht er's ja auch. Könnt
ihr mir vielleicht noch weiterhelfen. Tu mich recht schwer, hab noch
keine Erfahrung
Deine Interrupt-Vektor-Tabelle ist eigentlich falsch, was aber in diesem
Fall nicht das Problem ist. Beim Mega128 ist jeder Eintrag zwei Wörter
groß, damit man statt rjmp einen jmp nehmen kann, weil rjmp nicht den
ganzen Speicher erreichen kann.
An welchen Pins sind die Relais denn angeschlossen? Dir ist schon klar,
daß du bei jedem Port nur das unterste Bit als Ausgang geschaltet hast
und alle anderen Pins nur zu Eingängen mit aktiviertem Pull-up machst?
Übrigens: Statt für jeden Pin einzeln ein sbi zu machen, würde es auch
ein:
Hallo Christoph,
Hast Du denn schon mal die I/O-Grundlagen aus dem AVR-Tutorial dieser
Seite ausprobiert? Damit kannst Du dann auch ein Problem bei der
Programmübertragung auf den mega128 ausschließen. Wenn Du das dann am
Laufen hast, sollte es auch keine Schwierigkeiten mit Deiner
Relais-Steuerung mehr geben.
In Deinem Code solltest Du Deine Versuche auf den Port beschränken, an
dem Du auch die Relais angeschlossen hast. Im übrigen fällt mir auf,
dass Du jeweils immer nur Pin 0 eines Ports als Ausgang konfigurierst,
alles andere bleiben Eingänge. Durch die sbi-Befehle schaltest Du von
diesen Eingängen dann nur den Pullup-Widerstand ein, der
verständlicherweise die Relais-Stufe nicht ansteuern kann.
Ansonsten fallen mir nur allgemeinere Gründe ein, warum es bei Dir
nicht klappt. Falsche Beschaltung von /PEN, falscher Quarz, falsche
Fuse-Einstellungen, usw.
Hoffentlich hilft Dir das erstmal weiter. Wenn nicht, stelle mal einen
Schaltplan und Deine Fuse-Einstellungen bereit, um nicht raten zu
müssen.
Roland
Hi,
hab das selbe Problem beim ATmega8515.
du kannst den BrownOut ausschalten. Setz bei den Fuses das BODEN bit
auf 0.
Wenn du alle Bits als Ausgang konfigurieren willst dann ändere
ldi r17, 0x01
in
ldi r17, 0xE7 ; 11100111
Ansonsten überpfrüfe den RESET ob er immer auf HIGH ( 0.9*Vcc). Ziehe
den Programmer ab nach dem programmieren, er zieht den Reset auf LOW.
daniel
> Wenn du alle Bits als Ausgang konfigurieren willst dann ändere> ldi r17, 0x01> in> ldi r17, 0xE7 ; 11100111
Wie kommst du darauf, daß das alle Bits als Ausgang konfigurieren soll?
@Rolf
wenn die eine 1 im DDRx einen Ausgangkonfiguriert und er diese PINS
setzt, dann dachte ich mir man kann so die Ausgänge konfigurieren.
Du hast Recht es setzt nicht alle, es setzt nur all die die er auch
angegeben hat.
daniel
Jetzt wo ihr mich drauf hingewiesen hast, nein mir war nicht klar das
ich nur bit0 als Ausgang gesetzt hab. Aus irgend einen Grund hab i
angenommen das der ganze Port damit auf Ausgang geht
also wie schon beschrieben hast auf 0xE7
Zur Beschaltung: PortD 0-2 und 5-7 sind mit Relais versehen Bit 3 und 4
brauch ich später mal wenn ich auf den UART zugreifen will
Und wenn ich jetzt programmier muss ich das Programmerkabel wieder
abstecken damit er losläuft?
Ich verwende übrigen das Savy128 Board von www.chip45.com
Normalerweise läuft der Controller direkt nach dem erfolgreichen
Flash-Vorgang los, das Kabel brauchst Du nicht abziehen. Eventuell ist
es aber je nach Programmer und je nach Übertragungsprogramm möglich
einzustellen, den Controller nach der Programmierung im Reset zu
halten.
Roland
@daniel:
Ah, ich hatte übersehen, daß er nicht alle Bits an den Ports
einschaltet, deshalb hatte ich mich über den "komischen" Wert von
0xE7 gewundert.
So, jetzt läuft er. Der zweite Fehler den ich habe ist das ich die
Pinbelegung des Port falsch "interpretiert" habe.
Ich dachte es sei
1 2 3 4...
13 14 15 16...
aber sie ist halt
1 3 5 7
2 4 6 8....
War im Datenblatt des Boards nicht angegeben (sondern nur Belegung)
Da bin ich jetzt wegem dem Reset drauf gekommen der war dann nämlich
auf Masse.
Lauter Dummheitsfehler also. Danke euch
Eine eigene Frage?
Dieser Thread ist über 20 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.