Forum: Mikrocontroller und Digitale Elektronik Interrupt Attiny13 und Atmel Studio 7


von Robin J. (rjanow)


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

von Tim T. (tim_taylor) Benutzerseite


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

: Bearbeitet durch User
von Robin J. (rjanow)


Lesenswert?

Danke für die schnelle Antwort.
Manuelles setzen von INTF0 funktioniert (Ohne manuelles setzen wird die 
Interrupt Flag erst beim 2ten Durchgang gelöscht/gesetzt).
Allerdings springt das Programm dann bei jeglicher Änderung am 
Interrupt-PIN in die Routine. Naja. Ich gucke mal wie sich das Programm 
auf dem IC verhält.

Gruß

von c-hater (Gast)


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.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Ich habs auch durch den 4.19 SimV2 laufen lassen, bei mir löst er auch 
beim 1. Mal doppelt aus. Das Auslösen bei jeder Flanke kommt noch dazu.

von Oliver S. (oliverso)


Lesenswert?

c-hater schrieb:
> und zwar zwischen der Flankenwahl und dem sei. Dieses explizite Löschen
> des Interruptflags ist bei vielen Interrupts empfehlenswert.

Ist aber laut Datenblatt in diesem Fall nicht explizit erforderlich.

Oliver

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.