Forum: Mikrocontroller und Digitale Elektronik ATTiny13 Interrupt 0 löst falsch aus.


von F. F. (foldi)


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
}

: Bearbeitet durch User
von Martin K. (maart)


Lesenswert?

Tut zwar nichts direkt zur Sache, aber delays in einer ISR? Oh, oh, 
das gibt Megger von Eckhaaard.

von F. F. (foldi)


Lesenswert?

Martin Kreiner schrieb:
> Tut zwar nichts direkt zur Sache, aber delays in einer ISR? Oh, oh,
> das gibt Megger von Eckhaaard.

Ist doch nur zum testen.

von F. F. (foldi)


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
}

von Stefan E. (sternst)


Lesenswert?

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.

von F. F. (foldi)


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.

: Bearbeitet durch User
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.