Forum: Mikrocontroller und Digitale Elektronik Interrupt in AVR Studio simulieren?


von Bert S. (kautschuck)


Angehängte Dateien:

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

: Bearbeitet durch User
von c-hater (Gast)


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.

von Bert S. (kautschuck)


Lesenswert?

Hallo, hat leider nicht geklappt wenn ich den 2ten Port von PIND auf 
High setzte und dann das Programm weiter laufen lasse.

von c-hater (Gast)


Lesenswert?

Bert Siegfried schrieb:
> Hallo, hat leider nicht geklappt wenn ich den 2ten Port von PIND
> auf
> High setzte und dann das Programm weiter laufen lasse.

Nicht den zweiten Port, sondern Bit 2 von PIND. Das ist das dritte 
Kästchen von rechts in der Zeile, wo PIND davorsteht...

von Kaj (Gast)


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...

von Bert S. (kautschuck)


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

: Bearbeitet durch User
von Bert S. (kautschuck)


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

von Bert S. (kautschuck)


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

: Bearbeitet durch User
von c-hater (Gast)


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.

von Bert S. (kautschuck)


Lesenswert?

danke, werde ihn wechseln.

Gruss Bert

von Bert S. (kautschuck)


Lesenswert?

Seltsam ist, dass ich im Simulator keine Interrupts simulieren kann, 
obwohl es jetzt auf dem Atmega8 funktioniert. Auch Timer interrupts 
gehen nicht, obwohl der Overflow erreicht wird.

von LostInMusic (Gast)


Lesenswert?

Pullups für PORTD? Mal die internen aktivieren?

von spess53 (Gast)


Lesenswert?

Hi

>Seltsam ist, dass ich im Simulator keine Interrupts simulieren kann,
>obwohl es jetzt auf dem Atmega8 funktioniert. Auch Timer interrupts
>gehen nicht, obwohl der Overflow erreicht wird.

Schon mal mit dem 4er Studio

http://www.atmel.com/tools/studioarchive.aspx

probiert? Der Simulator vom 6er Studio scheint etwas verbugt zu sein.

MfG Spess

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.