mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster entprellen wie im Tutorial


Autor: Timo (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jan...
Also nochmal für Alle ...

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

vor die Hauptfunktion schreiben ...

Danke es läuft

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.