Forum: Mikrocontroller und Digitale Elektronik Interrupt beim Attiny 2313


von Michael D. (etzen_michi)


Lesenswert?

Guten Tag.

Ich habe mir wirklich viel Zeit gelassen und nachgeschlagen sowie im 
Datenblatt nachgeblättert aber kahm leider nicht zum Ergebnis.

Im Tutorial 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts wird 
der Befehl "GICR" verwendet um den Interrupt für Int0 und Int1 zu 
aktivieren. von der Vorgehensweise sollte das so wie ich mich eingelesen 
habe beim Attiny 2313 auch nicht anders sein, nur kennt er den Befehl 
GICR nicht.

Es handelt sie dabei zunächst um das Testprogramm aus dem Tutorial:
1
.include "tn2313def.inc"
2
 
3
.def temp = r16
4
 
5
.org 0x000
6
         rjmp main            ; Reset Handler
7
.org INT0addr
8
         rjmp int0_handler    ; IRQ0 Handler
9
.org INT1addr
10
         rjmp int1_handler    ; IRQ1 Handler
11
 
12
 
13
main:                         ; hier beginnt das Hauptprogramm
14
 
15
         ldi temp, LOW(RAMEND)
16
         out SPL, temp
17
         ldi temp, HIGH(RAMEND)
18
         out SPH, temp
19
 
20
         ldi temp, 0x00
21
         out DDRD, temp
22
 
23
         ldi temp, 0xFF
24
         out DDRB, temp
25
 
26
         ldi temp, (1<<ISC01) | (1<<ISC11) ; INT0 und INT1 auf fallende Flanke konfigurieren
27
         out MCUCR, temp
28
 
29
         ldi temp, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
30
         out GICR, temp
31
 
32
         sei                   ; Interrupts allgemein aktivieren
33
 
34
loop:    rjmp loop             ; eine leere Endlosschleife
35
 
36
int0_handler:
37
         push temp             ; Das SREG in temp sichern. Vorher
38
         in   temp, SREG       ; muss natürlich temp gesichert werden
39
 
40
         sbi PORTB, 0
41
 
42
         out SREG, temp        ; Die Register SREG und temp wieder
43
         pop temp              ; herstellen
44
         reti
45
 
46
int1_handler:
47
         push temp             ; Das SREG in temp sichern. Vorher
48
         in   temp, SREG       ; muss natürlich temp gesichert werden
49
 
50
         cbi PORTB, 0
51
 
52
         out SREG, temp        ; Die Register SREG und temp wieder
53
         pop temp              ; herstellen
54
         reti

von MWS (Gast)


Lesenswert?

Michael Dierken schrieb:
> der Befehl "GICR" verwendet um den Interrupt für Int0 und Int1 zu
> aktivieren.

GICR ist kein Befehl, sondern ein Register. Das nennt sich im Tiny2313 
anders. Für den neuen Namen schaut man im Datenblatt unter Externe 
Interrupts nach.

von Christian K. (Gast)


Lesenswert?

Michael Dierken schrieb:
> Im Tutorial
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts wird
> der Befehl "GICR" verwendet um den Interrupt für Int0 und Int1 zu
> aktivieren. von der Vorgehensweise sollte das so wie ich mich eingelesen
> habe beim Attiny 2313 auch nicht anders sein, nur kennt er den Befehl
> GICR nicht.

Beim ATtiny2313 muß es statt GICR GIMSK heißen.

Christian

von Michael D. (etzen_michi)


Lesenswert?

Grad nochml getestet, geht .... meinte eigentlich das ich diesen 
Register Namen bereits probiert hatte ... (muss mal nachschauen wenn ich 
wieder am anderen Rechner bin, da er ne ältere AVRStudio Version drauf 
hat.

Vielen Dank

von Michael Dierken (Gast)


Lesenswert?

Habe nun auf dem anderen Rechner getestet ... geht auch, wenn ich das 
aber auf den AVR Schreibe funktioniert es nicht.

Muss man da noch irgendwelche Fuses umstellen?
Kann der AVR defekt sein?
Testprogramme für die einzelnen Aus/Eingänge funktionieren alle.
1
.include "tn2313def.inc"
2
 
3
.def temp = r16
4
 
5
.org 0x000
6
         rjmp main            ; Reset Handler
7
.org INT0addr
8
         rjmp int0_handler    ; IRQ0 Handler
9
.org INT1addr
10
         rjmp int1_handler    ; IRQ1 Handler
11
 
12
 
13
main:                         ; hier beginnt das Hauptprogramm
14
 
15
         ldi temp, LOW(RAMEND)
16
         out SPL, temp
17
 
18
         ldi temp, 0x00
19
         out DDRD, temp
20
 
21
         ldi temp, 0xFF
22
         out DDRB, temp
23
 
24
         ldi temp, (1<<ISC01) | (1<<ISC11) ; INT0 und INT1 auf fallende Flanke konfigurieren
25
         out MCUCR, temp
26
 
27
         ldi temp, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
28
         out GIMSK, temp
29
 
30
         sei                   ; Interrupts allgemein aktivieren
31
 
32
loop:    rjmp loop             ; eine leere Endlosschleife
33
 
34
int0_handler:
35
         sbi PORTB, 0
36
         reti
37
 
38
int1_handler:
39
         cbi PORTB, 0
40
         reti

von spess53 (Gast)


Lesenswert?

Hi

Sollte eigentlich funktionieren. Flasht du auch das richtige Programm?

MfG Spess

von g457 (Gast)


Lesenswert?

> Muss man da noch irgendwelche Fuses umstellen?

Müssen ist relativ. Hier muss man vermutlich nicht.

> Kann der AVR defekt sein?

Klar. Wenn Du ihn noch nicht misbraucht hast ist das aber eher 
unwahrscheinlich.

> Testprogramme für die einzelnen Aus/Eingänge funktionieren alle.

Was tun die und wie äussert sich das?

> wenn ich das aber auf den AVR Schreibe funktioniert es nicht.

#define 'funktioniert nicht'

Wie sieht denn die Außenbeschaltung aus? Insbesondere, aber nicht 
ausschließlich, von PD2 und PD3.

von Michael Dierken (Gast)


Lesenswert?

Missbraucht habe ich das IC nochnicht.

Die Testprogramme sind wie folgt:

1. PB wird 0 - 255 Hochgezählt. Anzeige LED (High = An).
2. Durch drücken der PD (Taster auf Masse) werden die gleichwertigen PB 
geschaltet (sobald alle gedrückt wird wird PB7 auf High geschaltet.


Funktioniert nicht bedeutet das keine LED ausser die für die 
Betriebsspannung auf meinem Board leuchtet.

Programm war auf jeden Fall das richtige ... könnte aber sein das ich 
irgendwo ne Kalte Lötstelle oder so habe weil jetzt gehts ??

Trotzdem vielen Dank

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.