Forum: Mikrocontroller und Digitale Elektronik extern Funktionsprototyp + Aufruf


von Rafi D. (alexanderw)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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.

von Michael B. (michael_b93)


Lesenswert?

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...

von Peter II (Gast)


Lesenswert?

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.

von Rafi D. (alexanderw)


Lesenswert?

super...danke
das mit den makros ist eine Super Idee...

sollten makros mit bedacht eingesetzt werden... gibts nachteile beim 
einsatz?

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.