www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik an meine erzeugte Funktion PORTs übergeben


Autor: Waldemar T. (bender007)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht 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
zeit&1

Hier der verbesserte code: (ohne bitSetzen/löschen)
void blinkLed (int zeit, volatile uint8_t *p_port, uint8_t
p_pin){

    if(zeit&1) {
        *p_port |= p_pin;
    }
    else {
        *p_port &= ~p_pin;
}

//So soll der Aufruf einer funktion sein:

blinkLed (sekunde, &PORTA, PA1);
Wie du siehst, habe ich auch PIN1 durch PB1 ersetzt, denn PIN1 ist nicht 
definiert.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

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);

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> der Compiler macht eh das gleiche draus

Aber ich glaube der OT will bestimmt was anderes erreichen.

Autor: Waldemar T. (bender007)
Datum:

Bewertung
0 lesenswert
nicht 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
zeit&1
>
> Hier der verbesserte code: (ohne bitSetzen/löschen)
>
> void blinkLed (int zeit, volatile uint8_t *p_port, uint8_t
> p_pin){
> 
>     if(zeit&1) {
>         *p_port |= p_pin;
>     }
>     else {
>         *p_port &= ~p_pin;
> }
>  //So soll der Aufruf einer funktion sein:
>  blinkLed (sekunde, &PORTA, PA1);
> 


Habe ausprobiert, geht trotzdem nicht? Hm, woran kannst liegen?

Autor: Waldemar T. (bender007)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.