Pin Change Interrupts vs Me

OP #2970937
Lesenswert?

Hallo Zusammen,
bei dem unten angehängten "Minimalbeispiel" für einen Atmega8 werden 
zwei Taster ("up" & "down") abgefragt. Die Taster sind hardwaremäßig mit 
1u und 10k entprellt und lösen Pin Change Interrupts (fallende Flanke) 
aus.

Entsprechend soll sich die 7Segmentanzeige von 0 bis 7 ändern. Wenn 
setMotorSpeed() auskommentiert ist, funzt dies einwandfrei.
Wenn die Funktion einkommentiert ist, werden teilweise zwei 
Increments/Decrements auf einmal gemacht.

Hat da jemand eine Erklärung für??
(kompletter Code im Anhang)
1
// Set speed of motor lvl (1..8)
2
void setMotorSpeed( uint8_t lvl )
3
{
4
    OCR2 = lvl * 16;
5
}
6

7
ISR( INT0_vect )
8
{
9
    if( level < 7 )
10
        ++level;
11
}
12

13
ISR( INT1_vect )
14
{
15
    if( level > 0 )
16
        --level;
17
}
18

19
int main( void )
20
{
21
    // Init uC
22
    init();
23
    
24
    level = 0;
25
    enableLevelChoice();
26

27
    // Infinite loop  
28
    while( 1 )
29
    {
30
        showDigit( level );
31
      //setMotorSpeed( level + 1 );  // Wenn diese Funktion auskommentiert ist klappt es!             
32
    }
33

34
    return 42;
35
}
Angehängte Dateien:
Gast #2970954
Lesenswert?

Im Timer INT braucht man die Modulo Berechnung auf clicks nur dann, wenn 
man wirklich 0..254 braucht. Bei 0..255 läuft ein uint8_t auch selbst 
über, braucht aber dafür nicht so lange, und das in einer ISR!
#2972204
Lesenswert?

Moritz S. schrieb:

> Entsprechend soll sich die 7Segmentanzeige von 0 bis 7 ändern. Wenn
> setMotorSpeed() auskommentiert ist, funzt dies einwandfrei.
> Wenn die Funktion einkommentiert ist, werden teilweise zwei
> Increments/Decrements auf einmal gemacht.


Moooment.
Hängt dein Motor schon drann?

Denn dann wäre das dir Untertreibung des Jahres, das alles funktioniert, 
wenn die Funktion auskommentiert ist.


(Im übrigen warte ich jetzt auf die Fraktion derjenigen, die immer 
wieder nicht müde werden zu betonen, dass man Tastenentprellen mit 
Hardware und Interrupt machen soll, weil das ja auch immer soooo toll 
funktioniert)
OP #2972501
Lesenswert?

Bernd schrieb:
> Moritz S. schrieb:
>> (kompletter Code im Anhang)
>
> wo?

im Anhang :) (also da, wo steht "Angehängte Dateien: main.c (2,7 KB, 21 
Downloads) | Codeansicht")

Das Entprellen hat funktioniert, denn das Incrementen/Decrementen des 
Zählerwerts ging ja ohne Probleme (kein einziges Erhöhen um 2 bei vielen 
Tastendrücken)

Ich bin mir jetzt nicht sicher, wo genau die Über/Untertreibung besteht. 
Ist aber auch hinfällig: Nachdem irgendwann der uC angefangen hat, 
verlässlich von 3 auf 5 (anstatt auf 4) zu incrementen, wurden wir 
allgemein nachdenklich. Es lag dann daran, dass der Quartz zu schnell 
war. 20MHz bei Atmega8 geht net und erzeugt extrem seltsame 
Fehlersymptome.

Sorry für die Konfusion.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren