Taster entprellen wie im Tutorial

Gast #536212
Lesenswert?

Hallo,
Ich habe mir eure Vorschläge zu Herzen genommen und habe mich mit dem 
AVR - Tutorial beschäftigt.
Ich möchte eine Abfrage mit einem Taster machen. Wenn der Taster 
gedrückt (Low - Activ), dann führe eine Aktion aus.Im Folgenden ein 
Auszug aus meinem Quelltext:

while (Belichtungsdauer <= 99.00)
{
  if (Taster (&PINB, PB7))               {
    //Aktion ... hier wird die Variable 'Belichtungsdauer
                //hochgezählt

  }
}

//---------------------------------------------------------------------- 
---------------------
//Taster - Funktion:  Entprellen des Tasters

inline uint8_t Taster(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
       while (Zaehler <= 1);
        if ( *port & (1 << pin) )              { 
while (Zaehler <= 1);
            return 1;
        }
    }
    return 0;
}

//---------------------------------------------------------------------- 
---------------------


Zur Erklärung ...
Es handelt sich um die Funktion wie sie im tutorial beschrieben ist. Ich 
habe lediglich die "_delay..." durch eine Timergesteuerte Funktion 
ersetzt ... auch 100ms ..
Und habe die Funktion in 'Taster' umbenannt..

Bekomme nun Fehlermeldungen ... zB. "conflicting Types for 'taster'
aber weiß net wieso?

Mfg Timo
#536218
Lesenswert?

Timo wrote:
> Hallo,
> Ich habe mir eure Vorschläge zu Herzen genommen und habe mich mit dem
> AVR - Tutorial beschäftigt.
> Ich möchte eine Abfrage mit einem Taster machen. Wenn der Taster
> gedrückt (Low - Activ), dann führe eine Aktion aus.Im Folgenden ein
> Auszug aus meinem Quelltext:
>
> while (Belichtungsdauer <= 99.00)
> {
>   if (Taster (&PINB, PB7))               {
>     //Aktion ... hier wird die Variable 'Belichtungsdauer
>                 //hochgezählt
>
>   }
> }
>
> //---------------------------------------------------------------------- 
---------------------
> //Taster - Funktion:  Entprellen des Tasters
>
> inline uint8_t Taster(volatile uint8_t *port, uint8_t pin)
> {
>     if ( ! (*port & (1 << pin)) )
>     {
>        while (Zaehler <= 1);
>         if ( *port & (1 << pin) )              {
> while (Zaehler <= 1);
>             return 1;
>         }
>     }
>     return 0;
> }
>
> //---------------------------------------------------------------------- 
---------------------
>
>
> Zur Erklärung ...
> Es handelt sich um die Funktion wie sie im tutorial beschrieben ist. Ich
> habe lediglich die "_delay..." durch eine Timergesteuerte Funktion
> ersetzt ... auch 100ms ..
> Und habe die Funktion in 'Taster' umbenannt..
>
> Bekomme nun Fehlermeldungen ... zB. "conflicting Types for 'taster'
> aber weiß net wieso?
>

C Regel:
Der Compiler arbeitet deinen Quelltext von oben nach unten
durch und zwar nur einmal.

Jetzt stösst er bei der Bearbeitung von main() auf folgendes

   if (Taster (&PINB, PB7))

Nachdem der Compiler nóch nie irgendwas von einer Funktion
'Taster' gehört hat (die ist im Quelltext weiter unten),
gelten Standardannahmen was Argumenttypen bzw. Returnwerte
betrifft. Die benutzt der Compiler auch und kann so den Aufruf
übersetzen.

Der Compiler geht aber weiter im Text. Und irgendwann erblickt
er dann die Funktion Taster in ihrer vollen Schönheit:

inline uint8_t Taster(volatile uint8_t *port, uint8_t pin)

und jetzt vergleicht der Compiler die Datentypen der Argumente
und des Return Wertes mit denen die er beim Aufruf angenommen
hat, annehmen musste, weil es keinen Protoypen für Taster
gab.
Und siehe da: Die beiden sind nicht identisch. Bzw. sie sind so
dass sie nicht kompatibel sind. Also spuckt der Compiler ein

" conflicting Types for 'taster' "

aus.


Abhilfe: Schreib einen Prototypen füd die Funktion Taster
an den Programmanfang.
Gast #536221
Lesenswert?

Danke Jan...
Also nochmal für Alle ...

Habe vergesser dem Programm mitzuteilen, dass es die Funktion "Taster" 
gibt, sprich ich musste
1
inline uint8_t Taster(volatile uint8_t *port, uint8_t pin);

vor die Hauptfunktion schreiben ...

Danke es läuft
#536222
Lesenswert?

Timo wrote:

> inline uint8_t Taster(volatile uint8_t *port, uint8_t pin)
> {
>     if ( ! (*port & (1 << pin)) )
>     {
>        while (Zaehler <= 1);
>         if ( *port & (1 << pin) )              {
> while (Zaehler <= 1);
>             return 1;
>         }
>     }
>     return 0;
> }
>
> //---------------------------------------------------------------------- 
---------------------
>
>
> Zur Erklärung ...
> Es handelt sich um die Funktion wie sie im tutorial beschrieben ist. Ich
> habe lediglich die "_delay..." durch eine Timergesteuerte Funktion
> ersetzt ... auch 100ms ..

da hier nirgends ersichtlich ist, wann die Zeit gestartet wird
(sprich wann Zaehler auf 0 gesetzt wird), misst deine
'timergesteuerte Funktion' alles Mögliche, nur keine 100 ms


Wenn man eine Zeitdauer messen will, muss man Startzeit und Endzeit
festlegen. Siehs mal so: Wenn du eine Stunde abwarten willst, dann
hilft es dir nichts wenn du zu einer Sanduhr geht, die schon läuft.
Du musst die Sanduhr schon selbst starten und warten bis sie
abgelaufen ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren