Hallo µC Fans: ich habe hier ein Problem. Ich schreibe gerade ein Programm für mein Atmega 32. Ich möchte in meinem Programm eine eigene Funktion schreiben. Dabei muss ich diese Funktion ein INT Wert, sowie PORT-bezeichnung und PIN nummer übergeben. Ich habe schon alles ausprobiert. Irgend wie klappt die Übergabe von PORT und PIN nicht. Habt Ihr eine Idee? Hier ist meine Funktion: void blinkLed (int zeit, volatile uint8_t *p_port, volatile uint8_t *p_pin){ int modulo= zeit%2; if (modulo==0) BitSetzen(*p_port, *p_pin); if(modulo==1) BitLoeschen(*p_port, *p_pin); } So soll der Aufruf einer funktion sein: blinkLed (sekunde, PORTA, PIN1);
Für den PIN braucht du keinen pointer. Für PORT schon, du musst aber statt PORTA &PORTA, die Adresse übergeben. Das mit dem Modulo lässt sich so besser Lösen
1 | zeit&1 |
Hier der verbesserte code: (ohne bitSetzen/löschen)
1 | void blinkLed (int zeit, volatile uint8_t *p_port, uint8_t |
2 | p_pin){ |
3 | |
4 | if(zeit&1) { |
5 | *p_port |= p_pin; |
6 | }
|
7 | else { |
8 | *p_port &= ~p_pin; |
9 | }
|
10 | |
11 | //So soll der Aufruf einer funktion sein:
|
12 | |
13 | blinkLed (sekunde, &PORTA, PA1); |
Wie du siehst, habe ich auch PIN1 durch PB1 ersetzt, denn PIN1 ist nicht definiert.
Waldemar T. schrieb: > blinkLed (sekunde, PORTA, PIN1); erst mal ist PIN1 nur eine 3-bit-Konstante, warum also einen 16bit Pointer als Parameter benutzen? zweitens hast du den Port zwar richtig als Pointer deklariert, übergeben tust du aber einen PORT und keine Adresse.
1 | void blinkLed (int zeit, volatile uint8_t *p_port, uint8_t p_pin){ |
2 | |
3 | if( zeit%2 == 0) |
4 | {
|
5 | BitSetzen(*p_port, p_pin); |
6 | }else{ |
7 | BitLoeschen(*p_port, p_pin); |
8 | }
|
9 | }
|
10 | |
11 | |
12 | blinkLed (sekunde, &PORTA, PIN1); |
zu spät ;) Luk4s K. schrieb: > Das mit dem Modulo lässt sich so besser Lösen > zeit&1 der Compiler macht eh das gleiche draus
Luk4s K. schrieb: > Wie du siehst, habe ich auch PIN1 durch PB1 ersetzt, denn PIN1 ist nicht > definiert. warum soll PIN1 nicht definiert sein? [..]\winavr20090313\avr\include\avr\portpins.h die wird auch automatisch durch die avr/io.h angezogen. Ich hab die noch nie includiert und benutze auch lieber die genereischen PIN-Kosntanten, als die speziellen.
Vlad Tepesch schrieb: > der Compiler macht eh das gleiche draus Aber ich glaube der OT will bestimmt was anderes erreichen.
Luk4s K. schrieb: > Für den PIN braucht du keinen pointer. > Für PORT schon, du musst aber statt PORTA &PORTA, die Adresse > übergeben. > Das mit dem Modulo lässt sich so besser Lösen
1 | zeit&1 |
> > Hier der verbesserte code: (ohne bitSetzen/löschen) >
1 | > void blinkLed (int zeit, volatile uint8_t *p_port, uint8_t |
2 | > p_pin){ |
3 | >
|
4 | > if(zeit&1) { |
5 | > *p_port |= p_pin; |
6 | > } |
7 | > else { |
8 | > *p_port &= ~p_pin; |
9 | > } |
10 | > //So soll der Aufruf einer funktion sein: |
11 | > blinkLed (sekunde, &PORTA, PA1); |
12 | >
|
Habe ausprobiert, geht trotzdem nicht? Hm, woran kannst liegen?
Vlad Tepesch schrieb: > Waldemar T. schrieb: >> blinkLed (sekunde, PORTA, PIN1); > > erst mal ist PIN1 nur eine 3-bit-Konstante, warum also einen 16bit > Pointer als Parameter benutzen? > > zweitens hast du den Port zwar richtig als Pointer deklariert, übergeben > tust du aber einen PORT und keine Adresse. > > > [c] > void blinkLed (int zeit, volatile uint8_t *p_port, uint8_t p_pin){ > > if( zeit%2 == 0) > { > BitSetzen(*p_port, p_pin); > }else{ > BitLoeschen(*p_port, p_pin); > } > } blinkLed (sekunde, &PORTA, PIN1); Super Vlad, danke, scheint zu funktionieren.
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.