an meine erzeugte Funktion PORTs übergeben

OP #1825685
Lesenswert?
• ▲
▼
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);
#1825716
Lesenswert?
• ▲
▼
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.
#1825717
Lesenswert?
• ▲
▼
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);
OP #1825734
Lesenswert?
• ▲
▼
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?
OP #1825740
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.