Int0 Feuert 2 mal

OP #4826372
Lesenswert?

Hallo,

Ich habe hier ein kleines Programm, das mir noch den letzten Nerv Raubt.

  rjmp  RESET          ; Reset Handler
    rjmp  INT0H            ; IRQ0 Handler
    RETI                 ; PCINT0 Handler
    RETI                 ; Timer0 Overflow Handler
    RETI                 ; EEPROM Ready Handler
    RETI                 ; Analog Comparator Handler
    RETI                 ; Timer0 CompareA Handler
    RETI                 ; Timer0 CompareB Handler
    RETI                 ; Watchdog Interrupt Handler
    RETI                 ; ADC Conversion Handler

RESET:
  LDI r16, low (RAMEND)
  OUT SPL, r16     ; Setzt sen StackPointer auf Anfang
  LDI r16, 0b00000010
  OUT PORTB, r16     ; PullUp
  LDI r16, 0b01000000
  OUT GIMSK, r16     ; Aktiviert Interupt INT0
  LDI r16, 0b00000011
  OUT MCUCR, r16     ; Interupt nur bei Steigender Flanke
    SEI

Loop:
  inc R17
  rjmp Loop

INT0H:
  PUSH R15
  IN R15,SREG       ; Save SREG

  inc R18

  OUT SREG, R15     ; Restore SREG
  POP R15

  RETI

Wenn ich im Simulator auf Pin6 Signal gebe, Wird der Interrupt gefeuert.
Nach dem RETI aber nochmal!

Warum?
Wenn ich dann weiter Das Signal an Pin6 Änder wird es nur ein mal 
gefeuert.

Seltsamerweise aber auch wenn ich das Signal weg nehme, obwohl ich sage, 
dass er nur bei Steigenden Flanken auslösen soll.

Kann mir jemand die Ursache dazu nennen, oder ist das einfach nur der 
Simulator und der Tiny arbeitet später richtig?
Gast #4826429
Lesenswert?

Im postfaktischen Zeitalter muss man natürlich der 
komplex-verschwurbelten Simulation glauben, statt der einfachen Logik 
und Empirie. :)

Ich würde in der Isr eine led toggeln, um zu sehen ob er 2mal feuert... 
allerdings entprellt, falss eine Taste der Trigger ist.
Gast #4827182
Lesenswert?

S. Landolt schrieb:

> Wie ich schon beim letzten Mal schrieb, funktioniert es mit meinem alten
> Simulator; der Interrupt wird beim Setzen von PINB1 genau einmal
> ausgelöst, beim Rücksetzen nicht.

Das schriebst du nicht, jedenfalls nicht in diesem Thread. Oder ich bin 
blind. Wenn du dich auf einen anderen Thread beziehst, dann solltest du 
ihn auch verlinken...

Und übrigens: der AVR-SimulatorV1 hat bekanntermassen einen Riesenhaufen 
Bugs. Eigentlich hat die Emulation der Peripherie sogar nur recht wenig 
mit der Realität zu tun, könnte man sogar sagen.

Dafür ist immerhin die MCU perfekt emuliert. Hier klemmt es wiederum an 
einigen Stellen beim SimulatorV2 (jedenfalls bei dem im Studio4 
verfügbaren Entwicklungsstand). Er bildet aber dafür die Peripherie 
(soweit unterstützt) doch sehr treffend ab.

Schön, wenn man wählen kann und nicht beide Eigenschaften gleichzeitig 
benötigt. Ansonsten wird die Arbeit mit dem Simulator echt übel. Da muss 
man probieren und sich ggf. selber Workarounds für die konkrete 
Anwendung ausdenken. D.h.: neben den üblichen release- und debug-Builds 
muss es u.U. noch einen speziellen simulator-Build geben. Nicht gerade 
schön, aber doch oft sehr hilfreich bei der Fehlersuche an anderer 
Stelle.

Nämlich immer dann, wenn ein echter Debugger nicht mehr weiter hilft, 
weil man damit zwar recht zuverlässig das "Sichtbarwerden" eines Bugs 
detektieren kann, aber völlig aufgeschmissen ist, wenn man sich davon 
ausgehend sozusagen zeitlich "rückwärts" zum eigentlichen Bug 
durcharbeiten muss, denn dabei hilft einem ein in-circuit-Debugger exakt 
kein bissel weiter. Das geht nur im Simulator, wo man recht einfach ein- 
und dieselbe Situation beliebig oft reproduzieren kann.

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