Forum: Mikrocontroller und Digitale Elektronik asm Portpin schalten


von Bruno M. (brumay)


Lesenswert?

Hallo,

gibt es mit asm eine einfache Möglichkeit einen Portpin von Eingang auf 
Ausgang und von Ausgang auf Eingang zu schalten? Ersteres geht ja noch 
relativ einfach mit schieben, wie ist es aber beim Zweiten?

von jau (Gast)


Lesenswert?

Bruno M. schrieb:
> relativ einfach mit schieben, wie ist es aber beim Zweiten?

Wenn es mit CBI nicht geht, mal mit ziehen versuchen.

von leo (Gast)


Lesenswert?

Bruno M. schrieb:
> Hallo,
>
> gibt es mit asm eine einfache Möglichkeit einen Portpin von Eingang auf
> Ausgang und von Ausgang auf Eingang zu schalten?

Hast du schon die zahlreichen Tutorials gelesen, e.g.
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Logik

Du sagst nicht ueber deine Architektur, hier also mal AVR.

> Ersteres geht ja noch
> relativ einfach mit schieben, wie ist es aber beim Zweiten?

Mit Schieben hat das nichts zu tun.

leo

von c-hater (Gast)


Lesenswert?

Bruno M. schrieb:

> gibt es mit asm eine einfache Möglichkeit einen Portpin von Eingang auf
> Ausgang und von Ausgang auf Eingang zu schalten?

Ja.

> Ersteres geht ja noch
> relativ einfach mit schieben, wie ist es aber beim Zweiten?

Weder für das eine noch für das andere muss man irgendwas schieben. 
Maximal zur Assemblierungszeit, wo's wirklich niemanden interessiert...

Ob's noch was besseres gibt als das, was dieses Schieben zur 
Assemblierungszeit erfordert, kann man nur herausbekommen, wenn du dich 
auf eine Zielarchitektur festlegst...

Möglicherweise ist es sogar nötig, den konkreten Port zu 
spezifizieren...

Assembler ist easy. Schwierig ist die Hardware...

von Bruno M. (brumay)


Lesenswert?

das ist mir zu theoretisch:
im Moment mache ich es so:
1
in    temp, DDRA
2
ori    temp, 0b01000000 
3
out    DDRA, temp 
4
5
6
in  temp, DDRA
7
andi  temp, 0b10111111 
8
out  DDRA, temp

geht es auch einfacher?

von S. Landolt (Gast)


Lesenswert?

Da es sich augenscheinlich um AVR8 handelt: sbi und cbi.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Da es sich augenscheinlich um AVR8 handelt

Hähä, ich kenne mindestens drei andere Architekturen, wo das ebenfalls 
gültiger Code wäre...

von Bruno M. (brumay)


Lesenswert?

super, danke!

Ich dachte das geht nur um Ports ein- bzw. auszuschalten. Das man damit 
auch Richtunsbits schalten kann war mir neu.

von S. Landolt (Gast)


Lesenswert?

> Hähä, ich kenne mindestens drei andere Architekturen

Mag sein, aber ich kenne hier nur einen brumay, haha.

von c-hater (Gast)


Lesenswert?

Bruno M. schrieb:
> super, danke!
>
> Ich dachte das geht nur um Ports ein- bzw. auszuschalten. Das man damit
> auch Richtunsbits schalten kann war mir neu.

Dann lies' endlich diese Scheiß-InstructionSetReference. Dann wirst du 
feststellen, dass das selbst auf AVR8 nicht für jeden Port funktioniert, 
weder für den Port selber noch für das zugeordnete Direction-Register.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:
>> Hähä, ich kenne mindestens drei andere Architekturen
>
> Mag sein, aber ich kenne hier nur einen brumay, haha.

Troll? Meine KI zeigt nur 86% Wahrscheinlichkeit, also praktisch 
vernachlässigbar. Mir selber ist der Nick auch nicht erinnerlich.

Die Frage ist: kam das jetzt tatsächlich von S. Landolt...

Nix ist sicher...

von S. Landolt (Gast)


Lesenswert?

Das kam sehr wohl von mir, c-hater, und ganz offen&ehrlich: manchmal 
öden Sie mich an.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Das kam sehr wohl von mir, c-hater, und ganz offen&ehrlich: manchmal
> öden Sie mich an.

Das verstehe ich jetzt nicht.

Was hast du an meinem Einwand auszusetzen, dass das gezeigte Stück Code 
nicht ausreicht, um auf eine Architektur schließen zu können?

Und was hast du an meinem Einwand auszusetzen, dass cbi/sbi halt auch 
auf AVR8 nicht für jeden Port funktionieren?

von S. Landolt (Gast)


Lesenswert?

Ihr unsäglicher, allzu oft beleidigender Umgangston, seit neuestem diese 
alberne "KI-Troll-Wahrscheinlichkeit".
  Dass ich rein fachlich sehr viel von Ihnen halte, das ist bekannt und 
bedarf keiner weiteren Erwähnung (solange Sie nicht gerade von 
Wegwerf-Einmalsteckbrettern schwadronieren).

von S. Landolt (Gast)


Lesenswert?

> ... dass cbi/sbi halt auch
> auf AVR8 nicht für jeden Port funktionieren

Das wird Bruno M. dann doch früh genug gemeldet bekommen, wenn er einen 
solchen Fall zu assemblieren versucht. Er wollte eine simple Antwort auf 
eine simple Frage, nicht die AVR8-Welt erklärt haben.

Und ja, Ihr Einwand war berechtigt: jeder, der in die 
Assemblerprogrammierung einsteigt, sollte frühzeitig, in einer ruhigen 
Stunde, das 'Instruction Set Manual' zumindest grob Befehl für Befehl 
durchgehen, um einen Überblick über das Verfügbare zu erhalten. Aber das 
lässt sich doch auch anders sagen als mit "lies' endlich diese 
Scheiß-InstructionSetReference".

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Ihr unsäglicher, allzu oft beleidigender Umgangston

Wo genau hier in diesem Thread?

> seit neuestem diese
> alberne "KI-Troll-Wahrscheinlichkeit".

Das sind tatsächlich die Ergebnisse einer KI. Es ist sicher immer noch 
so, dass die manchmal völlig albern sind. Im Allgemeinen liegt sie aber 
doch schon sehr gut. Und sie wird ständig besser...

> solange Sie nicht gerade von
> Wegwerf-Einmalsteckbrettern schwadronieren

Du hast noch keine Steckbretter der DDR der späten 70er Jahre benutzt, 
scheint mir, sonst würdest du nicht von "schwadronieren" reden, sondern 
mir unmittelbar zustimmen...

Kann sein, dass heutige besser sind. Fakt ist aber: sie können 
prinzipbedingt nicht besser sein als Löten. Wenn du das abstreitest, 
hast du dich von jetzt auf gleich vollkommen disqualifiziert...

von Timmy (Gast)


Lesenswert?

Du kannst mit cbi sbi alle wichtigen IO-Register umschalten. Je weiter 
weg du vom Elementaren kommst, desto höher ist die Wahrscheinlichkeit, 
dass es fehlschlägt.

Welche Register via cbi/sbi zugreifbar sind findest du zum jeweiligen 
AVR-Bauteil in seinem Datenblatt unter "Register Summary".

Anscheinend fehlt bei dir aber noch viel Grundlagenwissen. Deshalb 
probiere einfach aus, womit du cbi/sbi verwenden kannst und womit nicht. 
Der Compiler gibt dir eine Fehlermeldung raus, wenn du auf ein Register 
zugreifen willst, was "zu weit weg ist".

Die Register DDRx PORTx PINx gehen aber natürlich alle, und noch viele 
weitere.

Assembler ist toll.

von Rolf M. (rmagnus)


Lesenswert?

Timmy schrieb:
> Die Register DDRx PORTx PINx gehen aber natürlich alle,

Das gilt zwar fast überall, aber nicht ganz. Beim Atmega64 geht es 
beispielsweise nicht mit PORTF und PORTG sowie den dazugehörigen DDR- 
und PIN-Registern.

von Timmy (Gast)


Lesenswert?

Interessant. Ich nutze die atmegas nicht aktiv, sondern nur die tinys 
und, wenn es mal was stärkeres sein muss, direkt die xmegas.

Bei den xmegas gibt es auch die Eigenart, dass nur 4 ports via sbi/cbi 
zugreifbar sind. Dort kann ich aber mit PORTCFG_VPCTRLx selbst 
bestimmen, welche Ports ich im IO-Space haben will.

Die xmegas haben aber auch noch viel mehr Register für die IO-Ports.

PORTx_DIR
PORTx_DIRSET
PORTx_DIRCLR
PORTx_DIRTGL
PORTx_OUT
PORTx_OUTSET
PORTx_OUTCLR
PORTx_OUTTGL
PORTx_IN
PORTx_INTCTRL
PORTx_INTMASK
PORTx_INTFLAGS
PORTx_REMAP
PORTx_PINxCTRL

Die xmegas sind einfach genial.

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.