Forum: Mikrocontroller und Digitale Elektronik Int0 Feuert 2 mal


von Armin A. (10110010)


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?

von Stefan F. (Gast)


Lesenswert?

Welcher Tiny?

von (prx) A. K. (prx)


Lesenswert?

Es schadet nie, wenn man den Typ des Controllers angibt. Allein schon, 
damit nicht nur du selbst weisst, welche Funktion Pin 6 hat.

von Armin A. (10110010)


Lesenswert?

Sorry!
AtTiny13A

von Stefan F. (Gast)


Lesenswert?

Hmm, ich sehe keinen Fehler.

von S. Landolt (Gast)


Lesenswert?

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.

von Simple (Gast)


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.

von Armin A. (10110010)


Lesenswert?

Das würde ich ja tun, wenn ich meinen Programmer ans laufen kriege!
Werde wohl dass erstmal lösen müssen.

von c-hater (Gast)


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.

von Armin A. (10110010)


Lesenswert?

Gibt es den noch andere?
Ich nutze das Atmel Studio 7 und dessen Simulator.

von Tobi T. (chaoselektroniker)


Angehängte Dateien:

Lesenswert?

Hallo,

habe das selbe Problem, auch auf dem Tiny13A. Habe das ganze aber mit 
einer erneuten Abfrage des INT0 und einem Bit , welches beim ersten 
auslösen gesetzt wird beseitigen können. keine besonders elegante 
Lösung, aber sie funktioniert. Code ist im Anhang! (Sorry, ist zweimal 
der selbe..)

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.