Hallo, ich bin gerade am Coden und suche eine möglicht optimale variante um eine LED oder einen Port Per Funtion ider #define ein bzw. auszuschalten. das war mein ansatz: #define LedOn() PORTA |= (1<<BitLed) #define LedOff() PORTA &= (0<<BitLed) -----> //eine 1 für an, eine 0 für off #define LedOnOff(x) PORTA = ????????? so geht es zwar aber ich denke es ist nicht so effizient: void LedOnOff(char x){ if(x==1) LedOn(); else LedOff(); } was ist dafür der Effizenteste Code,.. der quellcode sollte so kompatibel wie möglich sein, um ihn bei verschiedenen Compilern nur mit minimalen änderungen nutzen zu können. (AVR, MSP, HC08,..) Danke MfG Sebastian
Effizienter geht es nicht. Der Compiler ist nicht ganz so blöde, d.h. er berechnet alle konstanten Ausdrücke sofort. Peter
mal ne Frage am Rande: Hat wirklich schon mal jemand ein C-Programm von einem auf einen völlig anderen MC portiert, also nicht so zum Spass, sondern weil notwendig? Ich habs noch nie gemacht, und auch noch nie Bedarf dafür gehabt.
Komplette Programme wohl nicht, aber einzelne Unterprogramme schon. Warum soll man das Rad immer neu erfinden. Z.B. meinem Scheduler in der Codesammlung sieht man die Herkunft vom 8051 noch an. Allerdings habe ich für das Portieren nach AVR geschlagene 10 Sekunden gebraucht :-) Peter
@Sebastian, Deine Macros sind falsch. Eine 0 zu schieben hat keinen Effekt. Anbei der richtige Code und das ganze als Macro. Bei konstanten Ausdrücken ist das Macro kürzer als die Funktion. Macros und deren Parameter auch grundsätzlich komplett klammern. Sonst gibts Ärger bei verschachtelten Macros oder zusammengesetzten Ausdrücken. Peter
Hallo, danke für die korrkeur, ich habe den fehler vorhin auch schon gefunden. war wohl schon etwas früh g aber was genau macht diese zeile: #define LedOnOffM(x) ((x) ? LedOn() : LedOff()) wozu ist das "?" zeichen, wie genau funkt. die zuweisung von x an die variablen LedOn() und LedOff(). Ich habe n meinem C Buch nix darübergefunden. Ich muss meinenen Code teileweise für avr, 851 und HC08 schreiben. wenn der Code Ordentlich geschrieben ist reicht es meistends die Defines mit den richtigen Vriablen zu füllen zb. AVR --> HC08 PORTA -->PTA. MfG Sebastian
a ? x : y Wenn a ungleich 0, werte x aus, ansonsten werte y aus. Kann als Ersatz für "if" verwendet werden.
"wozu ist das "?" zeichen" Sollte man als C-Programmierer kennen. Anbei die BC-Hilfe dazu. Nachfolgend der Auszug aus dem Listing des WINAVR: LedOnOff(1); 72: 81 e0 ldi r24, 0x01 ; 1 74: f3 df rcall .-26 ; 0x5c LedOnOffM(1); 76: c5 9a sbi 0x18, 5 ; 24 LedOnOffM(0); 78: c5 98 cbi 0x18, 5 ; 24 Er hat also wirklich alles gemacht, was zur Compilezeit zu machen war. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.