Forum: Mikrocontroller und Digitale Elektronik ext. Interrupt auf fallende Flanke löst auch auf steigende Flanke aus!


von dost0011 (Gast)


Lesenswert?

Hallo,

ich glaube es nicht. Jetzt habe ich meinen Code soweit 
zusammengestrickt, dass er nur noch aus wenigen Zeilen besteht.
Das Problem: Wenn ich den ext. Interrupt INT0 mit ISC1=1, ISC0=0 auf 
eine fallende Flanke konfiguriere, dann löst der Interrupt trotzdem auf 
eine steigende Flanke aus? Was mache ich falsch?
Wenn man einen Breakpoint an die ISR setzt, dann springt er in Zyklus 
2007 hinein, obwohl PINB von 0 auf 4 springt (steigende Flanke).
Ich weiss mir nicht mehr zu helfen...

Code:
----------------------
1
#define PIN_v_ist PB2
2
3
4
/* local prototypes */
5
int main(void);
6
void init_all(void);
7
void init_Port(void);
8
void init_PWM(void);
9
10
11
#include <avr/io.h>
12
#include <avr/interrupt.h>
13
14
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
15
#define _NOP() do { __asm__ __volatile__ ("nop"); } while (0)
16
17
18
/* -------------------------------------------------- */
19
int main(void)
20
{
21
  init_all();
22
23
  /* Lösche den erzeugten Interrupt */
24
  sbi(GIFR,PCIF);
25
  sbi(GIFR,INTF0);
26
27
  /* Schaltet den Interrupt frei */
28
  sei();
29
  while(1)
30
  {    
31
    _NOP();
32
  }
33
}
34
35
void init_all(void)
36
{
37
  init_Port();
38
  /* The falling edge of INT0 generates an interrupt request */
39
  sbi(MCUCR,ISC01);
40
  /* Interrupt Freischaltung INT0 -> Speed */
41
  sbi(GIMSK,INT0);
42
}
43
44
45
void init_Port(void)
46
{
47
  /* Eingänge und nicht benutzte PINs mit Pullup abschliessen */
48
  PORTB = (1<<PIN_v_ist);
49
}
50
51
52
ISR(INT0_vect)
53
{
54
  _NOP();
55
}

----------------------------------
Stimulidatei:
1
#1
2
PINB = 0
3
#2000
4
PINB = 4

von spess53 (Gast)


Lesenswert?

Hi

>Ich weiss mir nicht mehr zu helfen...

Dann mach es wie alle anderen auch und nimm einen realen Controller, ein 
paar Leds, Taster ... . Den Simulator benutze ich eigentlich nur um 
hardware unabhängige Routinen zu testen.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Hab das gerade mal getestet. Ist ein Fehler im Simulator2. Mit dem 
anderen Simulator werden die Interrpts korrekt ausgelöst.

MfG Spess

von dost0011 (Gast)


Lesenswert?

Vielen vielen Dank.
Welchen Simulator hast Du denn verwendet?
Den könnte ich ja dann auch nehmen, wenn der besser ist...

von spess53 (Gast)


Lesenswert?

Hi

>Welchen Simulator hast Du denn verwendet?

Einfach unter Debug->Select Platfom and Device den AVR Simulator 
auswählen.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

dost0011 schrieb:
> wenn der besser ist...

Der ist nicht "besser", der hat nur andere Fehler...

...

von Karl H. (kbuchegg)


Lesenswert?

Und irgendwann ist mit dem Simulator, jedem Simulator, sowieso Schluss 
und es führt kein Weg mehr an realer Hardware vorbei.

Denn reale Hardware hat nun mal ein paar Eigenheiten, die man nur mit 
sehr sehr viel Aufwand simuliert bekommt. Zb Kontaktprellen, zb 
Spannungspegel die eben nicht genau 5V sind, zb Beeinflussung der 
Versorgungsspannung, zb minmale Schaltzeiten (Relais), zb ....

Den Simulator kannst du benutzen um die grundsätzlichen Programmlogiken 
zu testen, ob Berechnungen stimmen, ob du dich wo mit den Datentypen 
verhaupt hast, .... Aber alles was in die Rubrik 'sitzt mehr oder 
weniger direkt an den I/O Pins' fällt, da ist dir der Simulator nicht 
sehr hilfreich.

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.