Forum: Mikrocontroller und Digitale Elektronik Interrupt stört Pin


von atmel (Gast)


Lesenswert?

Hallo

ich benütze beim atmega 128 den Timer Interrupt. Ich brauche den Timer 
Interrupt nur in der Software und nicht Hardware.

Mein Problem ist jetzt wenn der Interrupt ausgeführt wird dass das auch 
den OC-Pin beeinflusst.

Kann man das irgendwie ausschalten?

MfG

von spess53 (Gast)


Lesenswert?

Hi

>Kann man das irgendwie ausschalten?

Ja. Die passenden COM-Bits auf Null setzen.

MfG Spess

von atmel (Gast)


Lesenswert?

Die sind von Haus aus auf null

von spess53 (Gast)


Lesenswert?

Hi

>Die sind von Haus aus auf null

Dann passiert auch nichts mit dem Pin.

MfG Spess

von atmel (Gast)


Lesenswert?

Wenn ich aber den Timer Interrupt auskommentiere verhält es sich normal 
jedoch wenn der ISR programmiert ist wird der OC-Pin beeinflusst. Woran 
kann das sonst liegen?

von Floh (Gast)


Lesenswert?

atmel schrieb:
> Woran kann das sonst liegen?

Zeile 42 enthält die falsche Zuweisung an die Timerregister, ist doch 
ganz einfach.

von holger (Gast)


Lesenswert?

>Mein Problem ist jetzt wenn der Interrupt ausgeführt wird dass das auch
>den OC-Pin beeinflusst.

Welchen?

von spess53 (Gast)


Lesenswert?

Hi

>Woran kann das sonst liegen?

An deiner geheimen ISR? Das Setzen/Löschen/Toggeln der zugehörigen 
OC-Pins hat nichts mit dem Interrupt zu tun. Das passiert in der 
gewählten Betriebsart des Timers auch ohne Interrupt.

MfG Spess

von 2ter Gast (Gast)


Lesenswert?

Na da wird doch im Interrupt der Out Pin getoggelt. Oder auch... Kunde 
zum Meister: "Irgendwas am Auto ist locker", worauf der Meister später 
sagt "irgendwas fest gezogen".

Du merkst, wir raten einfach mal drauf los...

von atmel (Gast)


Lesenswert?

Hier ist der Code
1
static volatile bool variable = 0;
2
3
int main(void)
4
{
5
    //Sensor X+        LOW Active
6
    DDRE &= ~(1<<DDE6);
7
    //Sensor X-
8
    DDRE &= ~(1<<DDE7);
9
10
    //Taster X+
11
    DDRB &= ~(1<<DDB0);
12
    //Taster X-
13
  DDRB &= ~(1<<DDB2);
14
15
  //Enable          LOW Active
16
    DDRB |= (1<<DDB1);
17
    PORTB &= ~(1<<PORTB1);
18
19
    //Motor Direction X      HIGH Active
20
    DDRD |= (1<<DDD5);
21
    PORTD |= (1<<PORTD5);
22
 
23
24
    //Motor Clock X        LOW Active
25
    DDRB |= (1<<DDB5);
26
    PORTB |= (1<<PORTB5);
27
  
28
29
    TCCR1B |= (2<<CS10);  //kein prescaler
30
    TIMSK |= (1<<TOIE1);  //overflow interrupt enable
31
32
    sei();
33
34
35
    static bool sensor_x_plus;
36
    static bool sensor_x_minus;
37
38
39
40
    while (1)
41
    {
42
        if (~PINE & (1<<PE6))
43
        {
44
            sensor_x_plus = true;
45
        }
46
        else
47
        {
48
            sensor_x_plus = false;
49
        }
50
51
        if (~PINE & (1<<PE7))
52
        {
53
            sensor_x_minus = true;
54
        }
55
        else
56
        {
57
            sensor_x_minus = false;
58
        }
59
       
60
        if (~PINB & (1<<PB0) && (sensor_x_plus != true))
61
        {
62
            PORTD |= (1<<PORTD5); 
63
64
            if(variable == 0)
65
            {
66
                PORTB &= ~(1<<PB5);
67
            }
68
            else if (variable == 1)
69
            {
70
                PORTB |= (1<<PB5);
71
            }
72
        }
73
        else if (~PINB & (1<<PB2) && (sensor_x_minus != true))
74
        {
75
            PORTD &= ~(1<<PORTD5);  
76
77
            if(variable == 0)
78
            {
79
                PORTB &= ~(1<<PB5);
80
            }
81
            else if (variable == 1)
82
            {
83
                PORTB |= (1<<PB5);
84
            }
85
        }
86
        else
87
        {
88
            PORTB |= (1<<PB5);
89
        }
90
}
91
92
93
ISR (TIMER1_OVF_vect)
94
{
95
    if (variable == 0)
96
    {
97
        variable = 1;
98
    }
99
    else if (variable == 1)
100
    {
101
        variable = 0;
102
    }
103
}

von atmel (Gast)


Lesenswert?

Nachdem PB5 auf 1 gesetzt wird und der Debugger weiter springt wird PB5 
automatisch wieder gelöscht.

von holger (Gast)


Lesenswert?

>Nachdem PB5 auf 1 gesetzt wird und der Debugger weiter springt wird PB5
>automatisch wieder gelöscht.

Naja, was solls, dein Programm macht das halt nicht so wie du
es dir vorstellst. Ganz normale Sache.

von atmel (Gast)


Lesenswert?

Was ich aber nicht verstehe wenn ich den Interrupt auskommentiere bleibt 
der Pin gesetzt. Was ist falsch am Interrupt?

von Peter D. (peda)


Lesenswert?

atmel schrieb:
> Was ich aber nicht verstehe wenn ich den Interrupt auskommentiere bleibt
> der Pin gesetzt.

Ich rate mal, Du kommentierst den Handler aus (ganz böses Foul) und 
nicht das Setzen des Enable-Bits (wäre richtig).

Und dann schlägt eben der Bad-ISR-Handler zu.


Peter

von holger (Gast)


Lesenswert?

>Was ich aber nicht verstehe wenn ich den Interrupt auskommentiere bleibt
>der Pin gesetzt. Was ist falsch am Interrupt?

Vermutlich nichts.

von atmel (Gast)


Lesenswert?

Wenn ich den Handler auskommentiere dann funktioniert es falsch
Wenn Enable-Bits auskommentiert dann richtig
Wenn Handler und Enable-Bits gesetzt dann falsch
Wenn Handler und Enable-Bits aukommentiert dann richtig

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.