mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: Ausgangsport Togglen leicht gemacht


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich hab grad was entdeckt. Die ganz neuen AVR (zb Mega168 oder
Tiny2313) haben eine nette Funktion. Man kann einen Ausgang auf
einfache Weise Togglen (umschalten). Man muß dazu nur in das
entsprechende PINX Register eine 1 schreiben.
Das geht aber nur bei den ganz neuen AVR, Mega8, 16 und 32 zb können
das nicht.
Vielleicht schnappt das ja der eine oder andere Compilerbauer auf und
kann das als Optimierung implementieren

Autor: Joern G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cooler Hinweis! Danke!
Mehr Infos dazu z.B. im Datasheet von Atmega48/88/168 Kapitel 12.2.2
(Toggling the Pin).
Also eine '1' ins PINxn Register togglet das jeweilige PORTxn Bit
unabhängig vom DDRx Register.

Je nach DDR schaltet man damit den Pin zwischen low und high (0/1) oder
zwischen Hochohmig und Pullup (Z/PU) hin und her.

Damit lassen sich manche Dinge echt beschleunigen.

Hoffentlich findet das Einzug in den winavr!

joern g.

Autor: Schappihunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hoffentlich findet das Einzug in den winavr!

Nun, da winavr frei ist und von gcc kommt, wird es wohl Jahrhunderte
dauern, bis das aufgenommen wird.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hatte das schon vor einer graumen Zeit im GCC Forum gepostet.

Inzwischen gab es schon eine WINAVR Version. Leider nutzt diese immer
noch nicht die Funktion :/

Gruß,
Dirk

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie willst Du denn einen C-Befehl formulieren, der diese Optimierung
nutzen könnte?
Etwa:
PORTB^=(1<<Bit7)   dann müsste der Compiler Ports und interne Register
unterschiedlich behandeln und das auch noch in Abhängigkeit vom genauen
Prozessortyp. Da glaub ich nicht dran...
Aber schreib dir doch ein Makro:
#define PIN(x) (*(&x - 2))  /* address of input register of port x */
#define toggle(port,data) PIN(port)=data

dann schreibst Du toggle(PORTB,(1<<Bit7)) und der Compiler macht, was
Du willst. Vorrausgesetzt, die Regel stimmt noch, dass das
PINx-Register immer genau 2 Adressen unter dem PORTx-Register ist, das
hab ich jetzt nicht im Datenblatt nachgeschaut.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

>PORTB^=(1<<Bit7)   dann müsste der Compiler Ports und interne
>Register unterschiedlich behandeln und das auch noch in Abhängigkeit
>vom genauen Prozessortyp.

Normal dachte ich immer das dafuer Compiler da sind. Um z.B. deinen C
Code in den kuerzesten ASM Code zuwandeln.

Gruß,
Dirk

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein guter Compiler macht sowas auch, der kostet dann aber eben ein paar
k€uro...

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in den kürzesten oder schnellsten, je nach eingeschalteter Optimierung.
Aber was soll so ein Universalcompiler, wie der gcc noch alles
berücksichtigen? Schau dir mal den erzeugten Assemblercode an und
überlege wieviele weitaus nützlicheren Optimierungen dir auf den ersten
Blick einfallen...
Und bei hardwarenaher Programmierung finde ich es überhaupt nicht
schlimm, wenn man solche Dinge von Hand macht. Ausserdem leidet die
Portierbarkeit von Programmcode bei Ausnutzung von solchen Features.

Gruß Uwe

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ausserdem leidet  die Portierbarkeit von Programmcode bei
> Ausnutzung von solchen Features.

Gerade das ist ja der Grund, warum der Compiler das autmatisch machen
sollte. Er weiß durch -mmcu genau, für welchen Mikrocontroller der Code
erzeugt werden soll und ob dieser das Feature hat oder nicht. Wenn ich
es von Hand nutzen will, wird mein Code dadurch prozessorabhängig, und
zudem bekomme ich bei einem Prozessor, der es nicht unterstützt, keinen
Fehler vom Compiler, sondern es funktioniert nur einfach nicht mehr.
Alternativ müßte man das Makro in #ifdef-Verhaue einbetten, um dort
prozessorabhängig für die richtige Wahl zu sorgen.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.