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:
1 | ser r16 |
2 | out PORTB, r16 |
tun, wenn du alle Bits einschalten willst.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.