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


von Markus (Gast)


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

von Joern G. (Gast)


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.

von Schappihunter (Gast)


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.

von Dirk (Gast)


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

von Uwe Nagel (Gast)


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.

von Dirk (Gast)


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

von Benedikt (Gast)


Lesenswert?

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

von Uwe Nagel (Gast)


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

von Rolf Magnus (Gast)


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.

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.