Forum: Compiler & IDEs Pin Change Interrupts vs Me


von Moritz S. (moritzs)


Angehängte Dateien:

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
}

von Avr (Gast)


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!

von Bernd (Gast)


Lesenswert?

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

wo?

von Karl H. (kbuchegg)


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)

von Bernd (Gast)


Lesenswert?

Moritz S. schrieb:
> Die Taster sind hardwaremäßig mit
> 1u und 10k entprellt

hast du überprüft ob das funktioniert?

von Moritz S. (moritzs)


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.

von Piefke (Gast)


Lesenswert?

Moritz S. schrieb:
> 20MHz bei Atmega8 geht net und erzeugt extrem seltsame
> Fehlersymptome.

Aber 5V Vcc hast Du schon, oder gibts du dem Controller nur 3V?

von Moritz S. (moritzs)


Lesenswert?

Piefke schrieb:
> Moritz S. schrieb:
>> 20MHz bei Atmega8 geht net und erzeugt extrem seltsame
>> Fehlersymptome.
>
> Aber 5V Vcc hast Du schon, oder gibts du dem Controller nur 3V?

5V: Check!

von Rolf Magnus (Gast)


Lesenswert?

Moritz S. schrieb:
> 20MHz bei Atmega8 geht net und erzeugt extrem seltsame
> Fehlersymptome.

20 MHz kann der aber eigentlich. Ist es wirklich ein 8 und nicht ein 8L?
Vielleicht ist es auch ein Problem mit deiner Schaltung.

von Moritz S. (moritzs)


Lesenswert?

Also in dem Datenblatt vom Atmega8(L), das ich habe (von Mai 2008) steht 
auf Seite 2:
0 - 8MHz (ATmega8L)
0 - 16MHz (ATmega8)

von 20MHz steht da nichts.

von Rolf Magnus (Gast)


Lesenswert?

Ah stimmt. Ich hatte das mit dem Mega88 verwechselt. Bei dem waren's 20 
Mhz. Mein Fehler.

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.