ATTiny13 Interrupt 0 löst falsch aus.

OP #3358672
Lesenswert?

Hallo Forum!

Vermutlich bin ich zu blöd.
Ich bastel schon eine Weile am Interrupt 0 rum.

Mit dem dem Code löst der Interrupt auf PB1 (Pin6,DIP) aus.

Habe alles rauf und runter versucht. Irgendwas mache ich falsch.

So habe ich zwar nicht mehr selbstauslösende Interrupts, aber das darf 
doch nicht sein.
PB0 als Eingang oder Ausgang gesetzt, mit Pullup und ohne.
Entweder der Interrupt löst von selbst aus, durch Anfassen der Platine 
oder der Interrupt löst auf PB0 und PB1 aus.

So schnell frage ich nicht, aber da hänge ich jetzt.
Das ist meine erste ISR die ich für den Tiny schreibe.
Auf dem ATmega328 funktionieren der INT0 wie erwartet und wie im Buch.

Im  Moment dient das alles noch zum testen, aber ich will mir einen 
Tester für mein Auto bauen.
1
#define F_CPU 1000000
2
#define interrupt_Led  PB3
3
#define blink_Led    PB2
4
#define interrupt_Line  PB0
5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8

9

10

11
ISR(INT0_vect)
12
{
13
    
14
  PORTB  |=  (1<<interrupt_Led);  _delay_ms(500);
15
  PORTB  &= ~(1<<interrupt_Led);  _delay_ms(300);
16
  PORTB  |=  (1<<interrupt_Led);  _delay_ms(500);
17
  PORTB  &= ~(1<<interrupt_Led);
18
  
19
  
20
  
21
}
22

23

24
int main(void)
25
{
26
  
27
  
28
  DDRB  |=    (1<<interrupt_Led)  |  (1<<blink_Led);
29
  DDRB  &= ~  (1<<interrupt_Line);
30
  PORTB  |=   (1<<interrupt_Line)  |  (1<<PB1)  |  (1<<PB4);  // Pullup high 
31
  PORTB  &= ~  (1<<interrupt_Led);
32

33
  //########################################################################
34

35
  MCUCR  &= ~  (1<<ISC00)  &~  (1<<ISC01);
36
 
37
  GIMSK  |=    (1<<INT0);
38
  
39
  
40
  
41
  
42
  
43
  sei();
44
  
45
  //########################################################################
46

47
while (1)
48
{
49
 
50
  
51
  PORTB  |=    (1<<blink_Led);  _delay_ms(100);
52
  PORTB  &= ~  (1<<blink_Led);  _delay_ms(100);
53
  
54
}
55

56
  return 0;
57
}
OP #3358698
Lesenswert?

Jetzt hab ich noch mal die unbelegten Pins (PB1 u. PB4) als Eingänge 
geschaltet, so wie es auch im Datenblatt steht und dann die Pullups 
eingeschaltet.

Der Interrupt funktioniert sehr gut - nur auf dem falschen Pin, auf PB1.
Auf PB0 und PB4 passiert nichts, wenn ich die auf Low ziehe. Nur auf PB1 
löst der Interrupt aus und das sehr sauber. Als wären die Pins 
vertauscht.
Geht aber nicht, ist Streifenraster und den Interrupt löse ich an den 
Beinchen selbst aus.
So kann ich das zwar verwenden, aber befriedigend ist das nicht, wenn 
ich nicht weiß wieso das so ist.
Vielleicht erbarmt sich ja mal der liebe Karl Heinz Buchegger meiner. 
:-)
1
#define F_CPU 1000000
2
#define interrupt_Led  PB3
3
#define blink_Led  PB2
4
#define interrupt_Line  PB0
5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8

9

10

11
ISR(INT0_vect)
12
{
13
    
14
  PORTB  |=    (1<<interrupt_Led);  _delay_ms(500);
15
  PORTB  &= ~  (1<<interrupt_Led);  _delay_ms(300);
16
  PORTB  |=    (1<<interrupt_Led);  _delay_ms(500);
17
  PORTB  &= ~  (1<<interrupt_Led);
18
  
19
  
20
  
21
}
22

23

24
int main(void)
25
{
26
  
27
  
28
  DDRB   |=    (1<<interrupt_Led)  |  (1<<blink_Led);
29
  DDRB   &= ~  ((1<<interrupt_Line)  |  (1<<PB1)  |  (1<<PB4));
30
  PORTB  |=    (1<<interrupt_Line)  |  (1<<PB1)  |  (1<<PB4);     
31
  PORTB  &= ~  (1<<interrupt_Led);
32

33
  
34
  MCUCR  &= ~  ((1<<ISC00)  |  (1<<ISC01));
35
  GIMSK  |=    (1<<INT0);
36
  
37
  sei();
38
  
39
  while (1)
40
{
41
  
42
  
43
  PORTB  |=   (1<<blink_Led);  _delay_ms(100);
44
  PORTB  &= ~ (1<<blink_Led);  _delay_ms(100);
45
  
46
}
47

48
  return 0;
49
}
OP #3358709
Lesenswert?

Stefan Ernst schrieb:
> F. Fo schrieb:
>> Der Interrupt funktioniert sehr gut - nur auf dem falschen Pin, auf PB1.
>
> Wieso "falscher Pin"? INT0 ist auf PB1.
> Auf PB0 ist PCINT0.

Ich weiß auch nicht, manchmal hat man was an den Augen oder einen Knoten 
im Kopf.

Vielen Dank!


Ich mag es gar nicht sagen, aber daran halte ich mich jetzt zwei Wochen 
(mit Unterbrechungen) auf.
Na ja, dafür kenne ich nun alle Parameter und Verhaltensweisen des Tinys 
rauf und runter. Das lernt ja auch.

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