Taster per Interrupt entprellen?

Gast #1100499
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:
1
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
2
{
3
    if ( ! (*port & (1 << pin)) )
4
    {
5
        /* Pin wurde auf Masse gezogen, 100ms warten   */
6
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
7
        _delay_ms(50); 
8
        if ( *port & (1 << pin) )
9
        {
10
            /* Anwender Zeit zum Loslassen des Tasters geben */
11
            _delay_ms(50);
12
            _delay_ms(50); 
13
            return 1;
14
        }
15
    }
16
    return 0;
17
}

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:
1
SIGNAL(SIG_INTERRUPT0)
2
{
3

4
if( !(PIND & ( 1 << PD2)) )
5
{
6
    
7
//etwas machen
8
}
9
else if( !(PIND & ( 1 << PD3)) )
10
{
11
//etwas anderes machen
12
}
13

14
}

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

MfG
#1100508
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:
>
>
1
> 
2
> SIGNAL(SIG_INTERRUPT0)
3
> {
4
> 
5
> if( !(PIND & ( 1 << PD2)) )
6
> {
7
> 
8
> //etwas machen
9
> }
10
> else if( !(PIND & ( 1 << PD3)) )
11
> {
12
> //etwas anderes machen
13
> }
14
> 
15
> }
16
>
Nee, genau so geht es nicht! Hier wird schließlich überhaupt nichts 
entprellt. Das ist aber unbedingt erforderlich.
Gast #1100683
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.