.include "2313def.inc" ldi r16, 0xFF out DDRD, r16 ldi r16, 0b0000000 (bzw. 0b1000000) out PORTD, r16 ende: rjmp ende Ich habe an Port-D6 ein Relais über einen Transistor angeschlossen (AT90S2313) was ich (eigetlich) per Controller an/aus schalten wollte. Leider schaltet das Relais komischerweise immer an egal wie ich jezt den Port setze... wenn ich jedoch den Controller lösche (also ohne programm lasse) bleibt das Relais aus. Was mache ich falsch? Habe eigentlich alles so wie im Tutorial gemacht, nur das ich nen relais anstatt einer LED benutze, und laut simulation wird der port richtig gesezt.
hast du das Relais über einen npn oder pnp angesteuert? Ansonsten: "(bzw. 0b1000000)" bezieht sich auf PortD.7, den gibts beim 2313 gar nicht :-)
BC547 NPN mit 4,7K Vorwiederstand am Port des AVRs. Hab mal alles auf 1 gesezt oder alles auf 0 haber tut sich nix.
Also Reset funktionier ganz gut, Takt ist nen 4Mhz Ozilator, spannung eine von nem 5V Spannungsregelr, sollte passen. Wodran ereknn ich wenn der Cip im A**** ist?
Was passiert, wenn Du den Port als Eingang konfigurierst, und ihn dann mit einem Draht auf +5 V oder GND legst? Kannst Du so das Relais ein- und ausschalten? Wenn nicht, ist der Transistor oder das Relais defekt (Freilaufdiode 1N4007 o. ä. vorhanden? Wieviel Strom zieht das Relais? Schafft der BC547 den noch?). @crazy horse: >"(bzw. 0b1000000)" bezieht sich auf PortD.7, Wieso denn das? 0b1000000 6543210 Die "1" steht an Stelle Nr. 6, also Port _D.6_, nicht D.7.
stimmt:-), verzählt. Kommt aber auch daher, dass ich,wenn schon binär, dann auch alle 8 bits schreibe (0b01000000). Es lebe die Hex-Schreibweise!
Die "0b01000000" mit allen acht Stellen zu schreiben, halte ich auch für sehr sinnvoll, aber weißt Du, was mir persönlich am besten gefällt? Es ist dieses Ungetüm: 1<<PD7 | 0<<PD6 | 1<<PD5 | 1<<PD4 | 1<<PD3 | 1<<PD2 | 1<<PD1 | 1<<PD0 (bei PortA dann natürlich mit "PA7"..."PA0" etc.). Ich verwende das konsequent bei allen I/O-Sachen. Ich kann direkt sehen, welche 0 oder 1 zu welchem Pin gehört. Es stecken aber noch andere Vorteile darin. Wenn ich diese Zeile z. B. von einer ATmega8-Source "mal schnell" per Copy&Paste in ein 2313-Listing kopiere, dann wird beim nächsten Build sofort der "PD7"-Eintrag angemeckert, und ich dadurch daran erinnert, daß es PD7 beim 2313 nicht gibt. Das und Ähnliches finde ich so gut, daß ich den erhöhten Schreibaufwand für das Ungetüm gerne in Kauf nehme (ich nutze grundsätzlich jede Möglichkeit zur Vermeidung von Fehlern in Programmen aus).
"<<" bedeutet Linksshift. 0b1110110<<6 = 0b1110110000000 0bXYZ<<3 = 0bXYZ000 1<<N = 0b1000...000000 | ...543210 <-- Stellen-Index | Stelle Nr. N 1<<N = 2^N 0<<N = 0 ">>" ist für Rechtsshift, wird jedoch seltener verwendet. Ist es klargeworden? Für weitere Infos verweise ich auf die AVR-Assembler-Online-Hilfe.
Also das Relasi ist in ordnung, das Problem ist ja gerade das das IMMER anschaltet wenn ich den µC programiere, und Frelaufdiode ist vorhanden (1N4001) SOlbald spannung weg ist geht er ja auch wieder aus, sobald ich saft draufgeb schaltet das Relais ein wenn ich nen Programm im AVR habe.... sehr merkwürdig.
Ganz sicher kein Verdrahtungsfehler? Beispielsweise fehlender GND-Anschluss vom Controller oder sowas in der Art. Lieber mal nachmessen.
Also ich habe jezt mal das ganze mit nem Mega16 probiert und ein paar LEDs drangehangen... und ES GEHT!! LED Disco sach ich nur g Werde nachher mal den anderen Nochmal dranhängen, ich glaube es könnte daran legen, das mir nicht klar war das ich mit yaap bevor man Write Flasch benuzt, erase Controller und nach dem Programmen Verify machen muß. (Oder Autoprogramm... aber das hab ich eben erst gefunden) naja, auf jedenfall danke schonmal für die Lösungsansaätze :) und ich bn guter hoffnung das es morgen funzt :D
@ santa klaus, avr studio folgende zeilen .def temp = r16 1<<temp meldet syntaxerror bei deinem konstrukt 1<<PD7 | 0<<PD6 | 1<<PD5 | 1<<PD4 | 1<<PD3 | 1<<PD2 | 1<<PD1 | 1<<PD0 ebenfalls. in hilfe nix gefunden, kenne das < von c, aber nicht von assembler mfg ip
Mann, mann, mann... ...das ist doch im Einsatz zum laden eines Registers: ldi r16, 1<<PD7 | 0<<PD6 | 1<<PD5 | 1<<PD4 | 1<<PD3 | 1<<PD2 | 1<<PD1 | 1<<PD0 oder in Verbindung mit OR oder AND: ori r16, 1<<3 ;setzt Bit 3 in Register r16 equivalent zu 8 andi r16, 1<<3 | 1<<4 ;löscht alle Bits in r16 ausser 3 und 4 equivalent zu 24 Das mit dem <</>> (shift left/right n-Bits) wird zur Assemblierungszeit angewendet also in einen festen Wert umgerechnet. Z. B. wird aus "ANDI r16, 1<<3 | 1<<4" der Befehl "ANDI r16,24" (3x shift(8)+4x shift(16). Gruß Andi
@ andi mann... ging das schnell mit deiner antwort vielen dank mann... mann... lernt doch immer noch was dazu. ;-) wobei die "normale" schreibweise mir lieber ist. mfg ip
Och mönsch, war nicht ernst gemeint. Nur wenn da jemand was total verwurschtelt... Gruß Andi
@Pripri: Ich lese aber die symbolische Schreibweise lieber, denn dann brauche ich nicht wegen jedes Bits im Datenblatt nachschlagen. Und deshalb schreibe ich auch so. Wenn du aber leiber kryptische Zeilen wie ldi r16,0x01 schreibst, dann tu es. Hatte ich zu Beginn auch mal gemacht. Bringt aber nix, da 0x01 weißderGeierwas bedeuten kann, ein symbolischer Bitname aber eindeutig ist. Wenn du diese symbolischen Namen nicht magst, warum nutzt du dann überhaupt Assembler (sind doch auch nur symbolische Namen für Maschinenbefehle), kannst doch gleich Maschinencode schreiben, also die 16-Bit-Hexzahl. Oder auch als Binärzahl. ...
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.