... nichts für Macro Hasser und simple Thinker!
Hat so einen Hauch von objektorientierter Programmierung ...
Verwendungsbeispiel:
gpioPIN(LED, B, 1); //"object/methodes" creation, name/port/pin
writeLED(0); //init as output, led off
toggleLED();
clearLED();
setLED();
gpioPIN(BUTTON1, B, 2);
BUTTON1onPUP();
uint8_t key = readBUTTON1();
...
AVR/GCC inline Syntax
Michael B. schrieb:> gpio ist aber auch ein I und nicht nur ein O
ja!
> Was macht MCUCR bei PullUps/Downs ?
io-pin pull-up on/off!
3 comments und nur Mist, diese Mittelmässigkeit tut richtig weh!
HansImGlück schrieb:> diese Mittelmässigkeit tut richtig weh!
..immer geil wenn man sich selber für den Grössten hält ...
..immer blöd wenn niemand anderes das auch so sieht ...
..immer schlau mal selbstreflektierend zu ergründen warum dem so ist
Shalömmchen
So ganz pfiffig. Würde ich aber nicht verwenden, weil die IDE die
Funktionen nicht findet. Wenn ich irgendwo "writeLED(0);" sehe im Code,
möchte ich wissen, was genau da passiert und da hinspringen können.
Deshalb (und nur deshalb) würde ich hier statt Präprozessor einen
Textfresser bemühen, der mir aus z.B. einer Leds.txt mit entsprechen
Einträgen wie "LED B 1" eine Leds.h mit Deinen Funktionen explizit
macht.
Ja, ist quasi copy and paste, aber kein Codesmell, wenn es
automatisiert erfolgt.
sid schrieb:> HansImGlück schrieb:>> diese Mittelmässigkeit tut richtig weh!>> ..immer geil wenn man sich selber für den Grössten hält ...> ..immer blöd wenn niemand anderes das auch so sieht ...> ..immer schlau mal selbstreflektierend zu ergründen warum dem so ist
Ob das so ist, kann ich nicht beurteilen. Aber diese drei Antworten sind
tatsächlich alle unsinnig. Die Antwortenden haben sich das Makro
offenbar entweder nicht wirklich angesehen oder es nicht verstanden.
A. S. schrieb:> Deshalb (und nur deshalb) würde ich hier statt Präprozessor einen> Textfresser bemühen, der mir aus z.B. einer Leds.txt mit entsprechen> Einträgen wie "LED B 1" eine Leds.h mit Deinen Funktionen explizit> macht.
Genau. Man muss nicht für alles den Präprozessor verwenden. Gerade für
solche automatische Codegenerierung sind Skriptsprachen wie z.B. python
prädestiniert.
Rolf M. schrieb:> Aber diese drei Antworten sind> tatsächlich alle unsinnig. Die Antwortenden haben sich das Makro> offenbar entweder nicht wirklich angesehen oder es nicht verstanden.
findste? Ich find
Veit D. schrieb:> mach aus...eine Klasse und du bist auf dem> richtigen Weg. :-)
war garnicht so verkehrt,
denn ich stimme
A. S. schrieb:> weil die IDE die> Funktionen nicht findet. Wenn ich irgendwo "writeLED(0);" sehe im Code,> möchte ich wissen, was genau da passiert und da hinspringen können.
dem durchaus zu, besonders bei umfangreicherem Quelltext ist das ganz
hilfreich mindestens n paar Monate später..
und wenn ich Dich recht verstehe bist Du nicht völlig anderer Ansicht
Rolf M. schrieb:> Genau. Man muss nicht für alles den Präprozessor verwenden.
Das nervtötende am TO ist "guck wie clever" und "nix für Weichhirne"
"schau wie geil ich bin" "Ihr seit alle nur Mittelmass, ich bin alpha!"
selbst wenn die Idee richtig (oder sagen wir nicht völlig blödsinning)
ist bringt mich das zum Augenrollen..
(um nicht "kotzen" zu sagen ;))
'sid
PS ADC mit zehn/zwölf bit... super Sache... achje...uiuiui
... der sinile Männerklub führt wieder seine Selbstgespräche!
Mir gefällt die Idee des To und wann begreifen die Macroahnungslosen
mal, dass der Präprozessor Teil der C Programmiersprache ist und kein
Spielzeug für Verwirrte.
Für blinky Led braucht es auch keinen ARM oder C++ ...
DasTutWeh schrieb:> Mir gefällt die Idee des To und wann begreifen die Macroahnungslosen> mal, dass der Präprozessor Teil der C Programmiersprache ist und kein> Spielzeug für Verwirrte.
Das es funktioniert, geschenkt. (bzw. Egal, ich hab den Code nicht
ausprobiert). Und ich nutze den präprozessor weit mehr als jeder
Standard erlaubt. Aber wenn ich so kryptischen Code wollte (im Sinne
von: writeLED?, suche über alle sourcen, was das denn ist), dann könnte
ich auch C++ nehmen.
A. S. schrieb:> Aber wenn ich so kryptischen Code wollte (im Sinne> von: writeLED?,
Ja stimmt, der Bezeichner macht keinen Sinn, da clear/set() das
abdecken.
@To, Dann wohl eher es initLed(...) nennen!
sid schrieb:> Ich find> Veit D. schrieb:>> mach aus...eine Klasse und du bist auf dem>> richtigen Weg. :-)>> war garnicht so verkehrt,
Abgesehen davon, dass wir über C sprechen, wie würdest du das als Klasse
genauso effizient umsetzen? Da könnte man höchstens mit Templates was
basteln, was aber auch nicht einfacher werden wird als das Makro.
> und wenn ich Dich recht verstehe bist Du nicht völlig anderer Ansicht
Richtig. Ich hätte aber wie gesagt eher ein Skript geschrieben, das den
Code generiert, statt das über Makro-Magie zu machen. Ist leichter
lesbar und flexibler.
> Das nervtötende am TO ist "guck wie clever" und "nix für Weichhirne"> "schau wie geil ich bin" "Ihr seit alle nur Mittelmass, ich bin alpha!"
Ich hatte ehrlich gesagt die erste Zeile des Ursprungspostings
übersehen. Vielleicht hätt ich sonst auch anders reagiert.
> selbst wenn die Idee richtig (oder sagen wir nicht völlig blödsinning)> ist bringt mich das zum Augenrollen..
Also ich finde die Idee jetzt nicht völlig blödsinnig, aber auch nicht
unbedingt supergenial.
Ich find die Idee an sich nicht verkehrt - das sind Templates in C. Die
API gefällt mir nicht, aber jeder nach seiner Façon ...
Und weil's noch keiner erwähnt hat: das "|=" in der Toggle-Funktion ist
falsch - muss "=" sein.
Rolf M. schrieb:> Abgesehen davon, dass wir über C sprechen, wie würdest du das als Klasse> genauso effizient umsetzen?
Ohje.. mein Fehler.. ich lese "GCC" und denke "C++"
stimmt.. wird ..uhm...eher "unhandlich" :D
Anderenfalls wär es ja Hupe ob ich LEDwrite(0) oder LED.write(0)
tippe gell ;)
'sid
foobar schrieb:> Und weil's noch keiner erwähnt hat: das "|=" in der Toggle-Funktion ist> falsch - muss "=" sein.
vielleicht hat's keiner erwähnt weil's nicht falsch ist ;)
Ich zitiere mal aus einem Wahllosen Datenblatt (attiny13a in dem fall)
-------Zitat-------
The Port Input Pins I/O location is read only, while the Data Register
and the Data Direction Register are read/write. However, writing a logic
one to a bit in the PINx Register, will result in a toggle in the
corresponding
bit in the Data Register.
-------Zitatende-------
steht so in jedem das mir bisher unterkam...
'sid
sid schrieb:> steht so in jedem das mir bisher unterkam...
Das steht so in jedem Datenblatt bei den Prozessoren, die das Feature
haben. Die älteren haben das nicht.
Oliver
> However, writing a logic one to a bit in the PINx Register, will> result in a toggle in the corresponding bit in the Data Register.
Und wieviele Einer-Bits schreibst du bei z.B. "PINx |= 1" oder
ausgeschrieben "PINx = PINx | 1"?
foobar schrieb:>> However, writing a logic one to a bit in the PINx Register, will>> result in a toggle in the corresponding bit in the Data Register.>> Und wieviele Einer-Bits schreibst du bei z.B. "PINx |= 1" oder> ausgeschrieben "PINx = PINx | 1"?
Das kommt drauf an, welche Instruktion der Compiler draus macht. Bei
einem sbi genau eines. Bei einem in/ori/out (bzw. ld/ori/st) mindestens
so viele, wie vorher Pins gesetzt waren.