Forum: Mikrocontroller und Digitale Elektronik µC macht was er will


von Läubi (Gast)


Lesenswert?

.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.

von crazy horse (Gast)


Lesenswert?

hast du das Relais über einen npn oder pnp angesteuert?
Ansonsten: "(bzw. 0b1000000)" bezieht sich auf PortD.7, den gibts
beim 2313 gar nicht :-)

von Läubi (Gast)


Lesenswert?

BC547 NPN mit 4,7K Vorwiederstand am Port des AVRs.
Hab mal alles auf 1 gesezt oder alles auf 0 haber tut sich nix.

von crazy horse (Gast)


Lesenswert?

hm, bleiben nur noch:
-Takt
-Reset
-Spannungsversorgung
-Chip defekt

von Läubi (Gast)


Lesenswert?

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?

von Santa Klaus (Gast)


Lesenswert?

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.

von crazy horse (Gast)


Lesenswert?

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!

von Santa Klaus (Gast)


Lesenswert?

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).

von pripri (Gast)


Lesenswert?

hallo,
was bedeudet <<, gibts auch ein >> ?
danke

von Santa Klaus (Gast)


Lesenswert?

"<<" 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.

von Läubi (Gast)


Lesenswert?

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.

von Santa Klaus (Gast)


Lesenswert?

Kannst Du mal den Schaltplan hier posten?

von A.K. (Gast)


Lesenswert?

Ganz sicher kein Verdrahtungsfehler? Beispielsweise fehlender
GND-Anschluss vom Controller oder sowas in der Art. Lieber mal
nachmessen.

von Läubi (Gast)


Lesenswert?

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

von pripri (Gast)


Lesenswert?

@ 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

von Andi (Gast)


Lesenswert?

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

von pripri (Gast)


Lesenswert?

@ 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

von Andi (Gast)


Lesenswert?

Och mönsch, war nicht ernst gemeint.
Nur wenn da jemand was total verwurschtelt...

Gruß
Andi

von ...HanneS... (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.