Interrupt in AVR Studio simulieren?

OP #3525454
Lesenswert?

Hallo,
ich möchte gerne einen Interrupt simulieren an Port PD2.
gegeben ist das folgende Programm. Nun kann ich doch rechts (Wie auf dem 
Bild bei der I/O View) das 2te Bit bei PORTD setzen und es müsste nach 
einem weiteren Takt den Interrupt auslösen, oder? Das macht es aber 
leider nicht. Habe ich evtl. den Interrupt falsch programmiert? Beim 
MCUCR ist nur das 0te Bit auf 1 gesetzt, sollte also bei jeder 
Taktflankenänderung einen interrupt auslösen.

Gruss Hans
1
 .org 0x000
2
    rjmp main
3
 .org INT0addr
4
    rjmp interrupt
5

6
main:
7

8
////////////////////init stack////////////
9

10
    ldi r16, high(RAMEND)
11
    out SPH, r16
12
    ldi r16, low(RAMEND)
13
    out SPL, r16
14

15
/////////////////init Interrupt///////////
16

17
    ldi r16, (1 << ISC00)
18
    out MCUCR ,r16
19
    ldi r16, (1<<int0)
20
    out GICR, r16
21
    sei
22
/////////////////init ports///////////////
23

24
    ldi r16, 0xFF    // Port B als Ausgang
25
    out DDRB, r16
26
    ldi r16, 0x00
27
    out PORTB, r16
28

29
    ldi r16, 0x00      // Port D als Eingang
30
    out DDRD, r16
31

32
loop:  
33
    rjmp loop
34

35
interrupt:
36
    sbi PORTB, 0
37
    sbi PORTB, 1
38
    reti
Angehängte Dateien:
Gast #3525466
Lesenswert?

Bert Siegfried schrieb:

> Nun kann ich doch rechts (Wie auf dem
> Bild bei der I/O View) das 2te Bit bei PORTD setzen und es müsste nach
> einem weiteren Takt den Interrupt auslösen, oder?

Nein. Damit aktivivierst du nur den Pullup-Widerstand für den Pin, der 
allerdings in einer Simulation vollkommen irrelvant ist...

Wenn du es aber mit dem Eingangs -register PIND versuchen würdest... 
Ja, dann könnte das glatt klappen.
Gast #3525529
Lesenswert?

Alle nötigen register gesetzt?
EICRA, EICRB, EIMSK, PCICR, PCMSK usw...

Um welchen Controller geht es eigentlich?
Beim ATmega2560 z.B. hat MCUCR herzlich wenig mit irgendwelchen 
Interrupts bei Flankenänderung zu tun...
OP #3525551
Lesenswert?

Es handelt sich um den ATMega8.
Hatte mich verschrieben, sorry, ich meinte natürlich das zweite bit von 
PIND nicht den Port, doch der Interrupt wird nicht ausgeführt. Muss ich 
beim ATMega8 noch mehr setzen als in meinem Code, EICRA, EICRB, EIMSK, 
PCICR, PCMSK usw.. sagt mir nicht viel.

Gruss und Danke
Bert
OP #3525992
Lesenswert?

Mein Interrupt wird auch auf dem echten Controller ATMEGA8A nicht 
erkannt, auch der Interrupt aus dem AVR Tutorial hier auf der Seite wird 
nicht unterstützt, habe noch mit einem Multimeter gemessen, der Port PD2 
fällt auf GND wenn ich den Taster betätige, also hat der Controller eine 
veränderte Taktflanke und müsste nach meinem Code doch ein Interrupt 
auslösen? Habe ich evtl. was falsch verstanden?
Hier noch die modifizierte Version, die nach jedem Interrupt das LED ab 
bzw. anschalten soll:
1
/*
2
 * Test2.asm
3
 *
4
 *  Created: 08.02.2014 16:53:30
5
 *   Author: Bert
6
 */ 
7
 .org 0x000
8
    rjmp main
9
 .org INT0addr
10
    rjmp interrupt
11

12
main:
13

14
////////////////////init stack////////////
15

16
    ldi r16, high(RAMEND)
17
    out SPH, r16
18
    ldi r16, low(RAMEND)
19
    out SPL, r16
20

21
/////////////////init Interrupt///////////
22

23
    ldi r16, (1<<ISC00)
24
    out MCUCR ,r16
25
    ldi r16, (1<<int0)
26
    out GICR, r16
27
    sei
28
/////////////////init ports///////////////
29

30
    ldi r16, 0xFF      // Port B als Ausgang
31
    out DDRB, r16
32
    ldi r16, 0x00
33
    out PORTB, r16
34

35
    ldi r16, 0x00      // Port D als Eingang
36
    out DDRD, r16
37

38
loop:  
39
    rjmp loop
40

41
interrupt:
42
    sbis PINB, 0
43
    sbi PORTB, 0
44
    sbic PINB, 0
45
    cbi PORTB, 0
46
    reti
OP #3526004
Lesenswert?

Ich habe noch etwas festgestellt, ich kann die Ports PD2 und PD3 nicht 
für folgendes Programm verwenden, das einfach den Wert bei PD2 bzw PD3 
einliest und ihn bei PB0 ausgibt. Ich habe die Verbindung mit einem 
Multimeter zu den Ports überprüft und sie ist in Ordnung.
1
    ldi r16, 0xFF
2
    out DDRB, r16
3

4
    ldi r16, 0x00
5
    out PORTB, r16
6

7
    out DDRD, r16
8

9

10
 end: 
11
    in r16, PIND
12
    out PORTB, r16
13
    rjmp end
Gast #3526027
Lesenswert?

Bert Siegfried schrieb:
> Ich habe noch etwas festgestellt, ich kann die Ports PD2 und PD3
> nicht
> für folgendes Programm verwenden, das einfach den Wert bei PD2 bzw PD3
> einliest und ihn bei PB0 ausgibt. Ich habe die Verbindung mit einem
> Multimeter zu den Ports überprüft und sie ist in Ordnung.

Dann ist wohl dein Atmega defekt.

Schon dein ursprüngliches Programm funktioniert bei mir sowohl im 
Simulator als auch auf realer Hardware ganz genau wie es soll. D.h.: 
Anfangs sind PB0 und PB1 Low, ab dem ersten Toggeln an PD2 gehen sie auf 
High.

Und auch deine zuletzt gepostete Programmversion funktioniert. Jeder 
Toggle an PD2 bewirkt, daß auch PB0 toggelt. Da profitierst du von der 
Tatsache, das das Eingangsregister immer einen Takt hinterherhängt, 
sonst würde die Konstruktion so nämlich nicht funktionieren.

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