Forum: Compiler & IDEs Taster per Interrupt entprellen?


von Dan (Gast)


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

von Johannes M. (johnny-m)


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.

von Dan (Gast)


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

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.