Forum: Mikrocontroller und Digitale Elektronik Pointer-Problem


von Lars (Gast)


Lesenswert?

Hi Forum,
ich bekomme beim unten gezeigten Code beim Ausführen folgende 
Alarmmeldung:

../programm.c:316: warning: passing argument 1 of 'button' from 
incompatible pointer type

unsigned int button( volatile unsigned int *port, unsigned int pin )
{
  if ( !( *port & ( 1 << pin ) ) )
  {
        _delay_ms( 100 );

        if ( *port & ( 1 << pin ) )
        {
            _delay_ms( 100 );

    return 1;
        }
    }

    return 0;
}



button1 = button( &PINF, PF1  );

Weshalb muss ich hier eigentlich einen Pointer verwenden?
Gruß

von auch Klaus Wachtler (Gast)


Lesenswert?

vielleicht uint8_t* statt unsigned int* nehmen?
Je nachdem, als was PINF vereinbart ist.

von auch Klaus Wachtler (Gast)


Lesenswert?

bzw. volatile uint8_t* natürlich

von Lars (Gast)


Lesenswert?

Hallo Klaus,
vielen Dank für die Antwort.

> Je nachdem, als was PINF vereinbart ist.

Wie meinst du das?
Warum wird da eine Warnmeldung angezeigt, wenn ich unsigned int nehme?
Ich kapiere es nicht ganz.Gruß

von .gast (Gast)


Lesenswert?

> > Je nachdem, als was PINF vereinbart ist.

> Wie meinst du das?

Er meint, dass du die Zeile mit der Deklaration von PINF bitte auch 
nochmal posten sollst.

von Lars (Gast)


Lesenswert?

Oh je,
jetzt steh ich voll auf der Leitung. PINF ist ja im Grunde keine 
Variable.

  DDRF = 0x00;
  PORTF = 0xFF;

Wie muss ich den PIN deklarieren???

von Klaus W. (mfgkw)


Lesenswert?

Lars schrieb:
> Wie meinst du das?

PINF wird ja irgendwo in einer Headerdatei definiert sein.
Wenn da z.B. steht:
1
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
2
...
3
#    define __SFR_OFFSET 0x20
4
...
5
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
6
...
7
#define PINF      _SFR_IO8(0x00)
dann steht ... PINF ... letztlich für:
1
  ... (*(volatile uint8_t *)((((0x00))+0x20))) ...
, also irgendeine Zahl, behandelt als vol.-Zeiger auf uint8_t, dann das 
genommen, worauf dieser Zeiger 0 zeigt.

Wenn du dann &PINF schreibst, ist dieser Ausdruck ein volatile uint8_t* 
und damit nicht kompatibel mit einem volatile unsigned int *.
Schließlich erwartet deine Funktion ja einen Zeiger auf unsigned int.

(Nachdem du nicht verrätst, welchen Rechner du hast, musst du selber 
durch die Headerdateien laufen und suchen. Mein Beispiel ist aus der 
Headerdatei für den atmega128.
Es wird wohl ein AVR sein, und abgesehen von den konkreten Werten geht 
das ja alles nach diesem Schema.)

von Klaus W. (mfgkw)


Lesenswert?

PS: meine Quelltextfragmente sind aus sfr_defs.h und iom128.h,
(nicht, daß ich hier noch den Titel Lügenbaron bekomme für heimliches 
Abschreiben)

von Lars (Gast)


Lesenswert?

Jetzt wirds klarer!
vielen Dank Klaus!

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.