in der header steht: #define PORT_LED PORTA #define LED_GRUEN PINA3 extern void LedOn(uint8_t PinNummer, uint8_t Port); und in der c sieht das wie folgt aus: void LedOn(uint8_t PinNummer, uint8_t Port) { Port |= (1<<PinNummer); } int main(void) { /* Initialisierungen */ TimerInit(); IoInit(); Uart0Init(UBRR_BERECHNUNG(BAUD_RATE,F_CPU)); /* UART0 Test, einmalig */ Uart0Puts("\n\n\n\r"); Uart0Puts("UART OK\n\r"); /* LED Test */ LedOn(LED_GRUEN,PORT_LED); _delay_ms(500); sei(); while(1){} } In diesem leuchtet die LED gar net auf. Ersetze ich jedoch LedOn(LED_GRUEN,PORT_LED); durch PORT_LED |= (1<<LED_GRUEN); dann leuchtet diese auf... ich kann nicht ersehen wo der wurm ist programmieren tu ich unter AS6... apropo, weiß jemand wo ich AS6.1 her kriege, außer von atmel.com?
ist ja klar warum das nicht geht void LedOn(uint8_t PinNummer, uint8_t Port) { Port |= (1<<PinNummer); } der Port ist hier nur noch eine Int variable. Und kein Port mehr.
Probiers mal mit: extern void LedOn(uint8_t PinNummer, volatile uint16_t Port); void LedOn(uint8_t PinNummer, volatile uint16_t Port) { Port |= (1<<PinNummer); } oderso. Wie Peter II schon festgestellt hat...
aber ich glaube das ganze ist eh nicht gut für den Optimierer, ich bin mir nicht sicher ob er es wirklich zu einem "set pin" umwandelt. Vermute fast, das er jedesmal den Port liest, das oder macht und den Port wieder screibt. Soetwas macht man mit einem Makro, dann gibt es auch dein Problem nicht mehr.
super...danke das mit den makros ist eine Super Idee... sollten makros mit bedacht eingesetzt werden... gibts nachteile beim einsatz?
Michael B. schrieb: > Probiers mal mit: > > extern void LedOn(uint8_t PinNummer, volatile uint16_t Port); > > void LedOn(uint8_t PinNummer, volatile uint16_t Port) > { > Port |= (1<<PinNummer); > } > > oderso. Würde auch noch nichts helfen void LedOn(uint8_t PinNummer, volatile uint16_t* Port) { *Port |= (1<<PinNummer); } so würde es gehen. Aber eigentlich möchte man das nicht, weil der Optimizer dann nur noch in speziellen Fällen eine Chance hat, das auf die kürzest mögliche Form zu bringen (er muss die Funktion inlinen können, um eine Chance zu haben)
Rafi Dafi schrieb: > sollten makros mit bedacht eingesetzt werden... gibts nachteile beim > einsatz? Generell gesehen: Natürlich. Man muss immer im Hinterkopf haben, dass Makros nur eine Textersetzung sind und nicht mehr. D.h. ein Makro wird (mehr oder weniger) genau so aufgelöst, als ob du im Editor ein Copy&Replace machen würdest. Das kann manchmal gut gehen, das kann manchmal aber auch ins Auge gehen. Daher ist es wichtig, dass man als Programmierer weiß, dass man es mit einem Makro zu tun hat. Und genau deswegen gibt es die einzige Konvention, an die sich weltweit alle C-Programmierer halten: Makronamen werden ausschliesslich in Grossbuchstaben geschrieben und umgekehrt sind Namen ausschliesslich in Grossbuchstaben exklusiv für Makros reserviert.
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.