Forum: Mikrocontroller und Digitale Elektronik AVR Assembler: Unterschiede zwischen OUT und STS


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
0 lesenswert
nicht lesenswert
Kurze Frage, weiß hier bestimmt irgendjemand und ich kanns mir gerade 
nicht so recht erklären...

Bei den größeren ATMega-AVRs liegen viele Peripherie-Adressen/Ports 
außerhalb des mit IN und OUT adressierbaren Bereichs, diese müssen dann 
mit LDS und STS gelesen oder geschrieben werden.

Was ich nicht verstehe, ich kann dies nicht einheitlich mit LDS und STS 
für alle diese Portzugriffe machen. Wenn ich z.B. STS auf eine mit OUT 
erreichbare Adresse ausführe, funktioniert das nicht bzw. der Controller 
verhält sich merktwürdig, daß entweder Teile des Programms oder der 
Peripherie gar nicht oder nicht richtig funktionieren. Ersetzt man das 
STS dann durch ein OUT ohne weitere Änderungen, funktioniert alles 
wunderbar.

Wo liegt der Unterschied zwischen beiden Befehlen, warum führt ein STS 
auf niedrige Portadressen zu Problemen?

Danke...

von Purzel H. (hacky)


Bewertung
0 lesenswert
nicht lesenswert
Atmel fragen.
Das Doofe daran ist, falls man sich ASM antun muss, dass die Handhabung 
des Ports von einem Controller zum naechst groesseren wechseln kann. zB 
vom 324 zum 644. Bedeutet alles kontrollieren und ersetzen. Da die 
Befehle moeglicherweise auf Laufzeit und Speicherplatz optimiert sind, 
kann das nochmals eine Problemursache sein.

: Bearbeitet durch User
von Falk B. (falk)


Bewertung
1 lesenswert
nicht lesenswert
@ Ben B. (Firma: Funkenflug Industries) (stromkraft)

>Bei den größeren ATMega-AVRs liegen viele Peripherie-Adressen/Ports
>außerhalb des mit IN und OUT adressierbaren Bereichs, diese müssen dann
>mit LDS und STS gelesen oder geschrieben werden.

Stimmt.

>Was ich nicht verstehe, ich kann dies nicht einheitlich mit LDS und STS
>für alle diese Portzugriffe machen. Wenn ich z.B. STS auf eine mit OUT
>erreichbare Adresse ausführe, funktioniert das nicht bzw. der Controller
>verhält sich merktwürdig,

Nö, das geht schon. Aber  . . .

>Wo liegt der Unterschied zwischen beiden Befehlen, warum führt ein STS
>auf niedrige Portadressen zu Problemen?

Weil die Headerfiles nicht auf STS ausgelegt sind, wo es auch ein OUT 
tut.

Alle per OUT erreichbaren Register sind mit ihrer OUT-Adresse definiert. 
Will man sie per STS ansprechen, muss man 0x20 addieren.

sts PORTA+0x20,R0

Dito bei den Register außerhalb des OUT-Adressbereichs, die sind mit 
ihrer normalen STS-Adresse definiert. Ein Out-Zugriff ist in keinster 
Weise möglich.

Leider hat der Assembler keine direkte Möglichkeit, eine 
Überkreuznutzung zu prüfen.

von Peter D. (peda)


Bewertung
1 lesenswert
nicht lesenswert
Falk B. schrieb:
> Leider hat der Assembler keine direkte Möglichkeit, eine
> Überkreuznutzung zu prüfen.

Ja das ist lästig. Man kann dem mit einem Macro abhelfen:
1
.macro  xout
2
.if  @0 > 0x3F
3
  sts  @0, @1
4
.else
5
  out  @0, @1
6
.endif
7
.endmacro
8
;---------------------------
9
.macro  xin
10
.if  @1 > 0x3F
11
  lds  @0, @1
12
.else
13
  in  @0, @1
14
.endif
15
.endmacro

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
0 lesenswert
nicht lesenswert
Hm okay danke. Ich dachte mir schon, daß es da irgendwo eine 
Verschiebung in den Adressbereichen gibt, wußte nur nicht wo.

Hilft mir nur nicht viel weiter, außer ich würde die Headerfiles 
modifizieren (die +20h-Addition in den Headerfiles vornehmen).

Naja, muß ich mir das Vereinheitlichen abgewöhnen und immer zuerst mit 
OUT probieren, wenn's ein Assemblerfehler gibt, dann durch STS ersetzen. 
Leider ist im Quellcode nicht so leicht ersichtlich, ob eine Adresse 
noch mit OUT erreicht werden kann oder nicht und zwischen den 
Controllern wirds da auch noch Unterschiede geben.

Oki, danke euch trotzdem.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@ Ben B. (Firma: Funkenflug Industries) (stromkraft)

>Naja, muß ich mir das Vereinheitlichen abgewöhnen und immer zuerst mit
>OUT probieren, wenn's ein Assemblerfehler gibt, dann durch STS ersetzen.

So würde ich das nicht so machen.

>Leider ist im Quellcode nicht so leicht ersichtlich, ob eine Adresse
>noch mit OUT erreicht werden kann oder nicht

Aber sicher! Erstens arbeitet man mit den Registernamen und die stehen 
im Datenblatt in der Registerübersicht. Da weiß man, ob OUT oder STS 
gefragt ist!

>und zwischen den Controllern wirds da auch noch Unterschiede geben.

Tja, ein paar Nachteile muß Assembler halt haben. Der C-Compiler nimmt 
einem diese "Drecksarbeit" ab.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
0 lesenswert
nicht lesenswert
Klar könnte man im Datenblatt nachschauen. Ist aber einfacher, den 
Assembler das machen zu lassen und bei Bedarf auf STS zu korrigieren, 
als wenn ich jetzt jede einzelne Adresse nachschlage.

Ich mag Assembler nunmal und ich bin nicht schlecht damit. Kleine Macke 
von mir. C habe ich nie wirklich gelernt, ich bin zwar sehr gut in PHP 
und C soll dem recht ähnlich sein... Allerdings gibts in C so viele 
verschiedene und nicht kompatible Stile, daß ich lieber bei Assembler 
bleibe anstatt C für das bißchen AVR zu lernen. Der Befehlssatz der AVRs 
ist ja gar nicht so verkehrt, da hat man es auf den PICs schwerer.

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ist aber einfacher, den
>Assembler das machen zu lassen und bei Bedarf auf STS zu korrigieren,
>als wenn ich jetzt jede einzelne Adresse nachschlage.

Kannst du doch. Neben den von PeDa vorgesclagenem Makros gibt es noc 
einige andere:

http://ww1.microchip.com/downloads/en/AppNotes/doc2550.pdf
http://ww1.microchip.com/downloads/en/AppNotes/AVR001.zip

MfG Spess

von S. Landolt (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Jetzt ist G. schrieb:
> dass die Handhabung
> des Ports von einem Controller zum naechst groesseren wechseln kann. zB
> vom 324 zum 644

Wie sollte das sein, wenn beide im selben Datenblatt stehen und es dort 
nur eine Tabelle 'Register summary' gibt?

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wie sollte das sein, wenn beide im selben Datenblatt stehen und es dort
>nur eine Tabelle 'Register summary' gibt?

Das stimmt für den AtMega644p/pa. Die ATMega644(V) haben ein eigenes 
Datenblatt.

MfG Spess

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Jetzt ist G. schrieb:
> Das Doofe daran ist, falls man sich ASM antun muss, dass die Handhabung
> des Ports von einem Controller zum naechst groesseren wechseln kann. zB
> vom 324 zum 644.

Eher nicht.
Nur von alt zu neu, z.B. ATmega8 zu ATmega88 oder ATtiny26 zu ATtiny261.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Das stimmt für den AtMega644p/pa. Die ATMega644(V) haben
> ein eigenes Datenblatt.

Das stimmt, trotzdem sind die Adressen gleich, d.h. die ursprüngliche 
Aussage ist aus der Luft gegriffen.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:

> Tja, ein paar Nachteile muß Assembler halt haben. Der C-Compiler nimmt
> einem diese "Drecksarbeit" ab.

Tja, gerade in diesem Fall ist das Argument völlig daneben, da kann man 
in Assembler leicht denselben Luxus geniessen wie in C. Nämlich durch 
Verwendung solcher Makros wie den von PeDa geposteten.

Das Problem ist nur: Längst nicht alles ist so leicht mit einfachen, 
"nichtinvasiven"(*) Makros abzuhandeln.

(*) nichtinvasiv ist vielleicht kein sonderlich glücklicher Ausdruck, 
mir ist nur gerade kein passenderer eingefallen. Ich meine damit solche 
Makros, die bei jedem gegebenen Ziel den bestmöglichen Code erzeugen 
können, ohne dabei jemals weitere Resourcen in Anspruch nehmen zu 
müssen. Diese Sache in/out vs. lds/sts ist ein Beispiel für diese Klasse 
von Makros.

Ein Beispiel für das Gegenteil wäre der Zugriff auf einzelne Bits in 
IO-Registern, die mal mit sbi/cbi/sbis/sbic möglich sind, mal nicht und 
in letzterem Fall dann halt ein MCU-Register als zusätzliche Resource 
benötigen würden, um die Funktion abzubilden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.