www.mikrocontroller.net

Forum: Compiler & IDEs Taster per Interrupt entprellen?


Autor: Dan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich hab ein kleines Problem. Ich versuche die 2 Taster an meinem myAVR 
Board für zwei verschiedene Zwecke zu verwenden. Dazu muss ich die 
beiden Taster entprellen. Hier treten Probleme auch, zum einen bekomme 
ich Fehler durch die debounce funktion:
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}

Und zwar diese:

compilieren ...  In file included  from qertwert2.cc:21:

c:/programme/myavrworkpadplus/winavr/bin/../avr/include/avr/delay.h:36:2 
:  warning: #warning "This file has been moved to ."
 In file included  from 
c:/programme/myavrworkpadplus/winavr/bin/../avr/include/avr/delay.h:37,

from qertwert2.cc:21:
c:/programme/myavrworkpadplus/winavr/bin/../avr/include/util/delay.h:89: 
3:  warning: #warning "Compiler optimizations disabled; functions from 
won't work as designed"

Keine Ahnung was mir der Compiler damit sagen will. Zudem habe ich neben 
den Hauptprogramm noch einen sehr schnellen Timer am Laufen. Durch die 
Delayfunktionen könnte es daher zu Problemen kommen. Deswegen dachte ich 
mir, man könne einfach durch einen anderen Interrupt schauen welcher 
Taster gedrückt ist, beispielsweise so:

SIGNAL(SIG_INTERRUPT0)
{

if( !(PIND & ( 1 << PD2)) )
{
    
//etwas machen
}
else if( !(PIND & ( 1 << PD3)) )
{
//etwas anderes machen
}

}

Das ganze also in der Interruptroutine testen. Warum funktioniert das 
nicht? Nur der erste Teil des if -Statements wird bei mir ausgewertet.

MfG

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dan wrote:
> compilieren ...  In file included  from qertwert2.cc:21:
>
> c:/programme/myavrworkpadplus/winavr/bin/../avr/include/avr/delay.h:36:2 :
> warning: #warning "This file has been moved to ."
>  In file included  from
> c:/programme/myavrworkpadplus/winavr/bin/../avr/include/avr/delay.h:37,
>
> from qertwert2.cc:21:
> c:/programme/myavrworkpadplus/winavr/bin/../avr/include/util/delay.h:89: 3:
> warning: #warning "Compiler optimizations disabled; functions from won't
> work as designed"
>
> Keine Ahnung was mir der Compiler damit sagen will.
Er sagt Dir doch recht präzise, was er sagen will! Die erste Meldung ist 
zwar unvollständig, aber sie bezieht sich aller Wahrscheinlichkeit nach 
darauf, dass in Deinem Programm irgendwo ein "#include<avr/delay.h>" 
steht, wo ein "#include<util/delay.h>" hingehört. Die delay.h war bei 
älteren Versionen im Ordner avr und ist seit längerem schon im Ordner 
util untergebracht.

Die zweite Meldung besagt, dass Du die Compiler-Optimierungen nicht 
aktiviert hast. Die Funktionen aus der delay.h funktionieren aber nur 
richtig, wenn die Optimierung aktiv ist!

Abgesehen davon ist SIGNAL genauso veraltet. Schau bitte mal intensiv 
ins AVR-GCC-Tutorial in die entsprechenden Abschnitte. Da steht 
wie's geht.

> Zudem habe ich neben
> den Hauptprogramm noch einen sehr schnellen Timer am Laufen. Durch die
> Delayfunktionen könnte es daher zu Problemen kommen. Deswegen dachte ich
> mir, man könne einfach durch einen anderen Interrupt schauen welcher
> Taster gedrückt ist,
Interrupt und Taster vertragen sich nicht ohne weiteres! Interrupts sind 
zur Auswertung mechanischer Kontakte viel zu schnell. Genau deshalb 
haben viele Leute sich bemüht, Entprellroutinen zu schreiben.

> beispielsweise so:
>
>
> 
> SIGNAL(SIG_INTERRUPT0)
> {
> 
> if( !(PIND & ( 1 << PD2)) )
> {
> 
> //etwas machen
> }
> else if( !(PIND & ( 1 << PD3)) )
> {
> //etwas anderes machen
> }
> 
> }
> 
Nee, genau so geht es nicht! Hier wird schließlich überhaupt nichts 
entprellt. Das ist aber unbedingt erforderlich.

Autor: Dan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke, das mit der Library hat sich gelegt, aber wie stelle ich die 
Optmierung ein oder aus? Bzw. verschiedene Formen von Optimierung? Gibts 
da ein Tutorial für? Finde das GCC-Tutorial hier für nicht wirklich 
hilfreich.
MfG

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.