Interrupt Attiny13 und Atmel Studio 7

#5818346
Lesenswert?

Hallo,

ich stehe etwas auf dem Schlauch und hoffe hier kann mir jemand helfen.
Ich habe ein einfaches Programm mit einer Interrupt-Routine in Assembler 
erstellt. Dieses funktioniert allerdings noch nicht wie gewollt.
Problem ist, dass das Programm zwei mal die Interrupt-Routine 
durchläuft, bevor der normale Programmablauf fortgesetzt wird. Ich habe 
das Programm bis jetzt nur in der Simulationsumgebung von Atmel Studio 
getestet. Kann jemand einen Formfehler finden, oder liegt es vielleicht 
an Atmel Studio?

Gruß
Robin

Code:
1
.include "tn13def.inc"
2

3
  rjmp Anfang
4
  rjmp Interrupt
5
  reti 
6
  reti
7
  reti
8
  reti
9
  reti
10
  reti
11
  reti
12
  reti
13

14

15
Anfang:
16

17
  ldi r21,1<<INT0        // Int0 setzen
18
  out GIMSK,r21
19
  clr r21
20
  ldi  r21,1<<ISC00 | 1<<ISC01  // steigende Flanke
21
  out  MCUCR,r21
22
  clr r21
23
  sei              // globale Interrupts zulassen
24

25
  Hauptprogramm:
26
    nop
27
    nop
28
    nop
29
  rjmp Hauptprogramm
30

31
  Interrupt:
32
    nop
33
  reti
Persönliche Seite #5818451
Lesenswert?

Würde sagen das es ein Fehler im Simulator ist, der das External 
Interrupt Flag 0 nicht beim Aufruf der ISR löscht. Hab in der 
Vergangenheit immer wieder feststellen müssen das die Peripherie des AVR 
nur sehr schlecht im Simulator abgebildet wird, von daher würde es mich 
nicht wundern wenn da vergessen wird das Ext Int Flag zu löschen oder 
das der Simulator auch bei anderen Änderungen des INT0 Pins reagiert.

Kannst ja mal spaßeshalber testen ob ein manuelles Löschen des Flags was 
ändert:
1
Interrupt:
2
 LDI R21,(1<<INTF0)
3
 OUT GIFR,R21
4
 RETI
Gast #5818714
Lesenswert?

Robin J. schrieb:

> Problem ist, dass das Programm zwei mal die Interrupt-Routine
> durchläuft, bevor der normale Programmablauf fortgesetzt wird. Ich habe
> das Programm bis jetzt nur in der Simulationsumgebung von Atmel Studio
> getestet. Kann jemand einen Formfehler finden, oder liegt es vielleicht
> an Atmel Studio?

Ich hab's mal mit dem Studio4.19 getestet.

Mit dem SimulatorV2:
Doppelauslösung ist da nicht festzustellen, aber dafür reagiert er immer 
auf jede Flanke, ganz egal, wie die ISC0x Bits gesetzt wurden.

Mit dem SimulatorV1:
Ebenfalls keine Doppelauslösung festzustellen, und sogar die Flankenwahl 
per ISC0x funktioniert hier erwartungsgemäß. Bloß LowLevel verhält sich 
nicht in jedem Detail wie in der Realität.


Allerdings habe ich auch in deinen Code bei der Initialisierung noch 
zwei Zeilen eingefügt:

 ldi r21,1<<INTF0
 out GIFR,r21

und zwar zwischen der Flankenwahl und dem sei. Dieses explizite Löschen 
des Interruptflags ist bei vielen Interrupts empfehlenswert.

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