Forum: Mikrocontroller und Digitale Elektronik Taster entprellen wie im Tutorial


von Timo (Gast)


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

von Karl H. (kbuchegg)


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.

von Timo (Gast)


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

von Karl H. (kbuchegg)


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.

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.