Forum: Mikrocontroller und Digitale Elektronik INTLVL0 INTLVL1 bei AVR128


von Peter S. (cbscpe)


Lesenswert?

Ich wollte mal die interrupt levels des AVR128 ausprobieren. Da bin ich 
auf etwas gestossen was mich etwas stutzig macht.

Ich habe da eine Subroutine die kommuniziert mit einer interrupt routine 
über einen Ring-Buffer. Diese sub-routine disabled natürlich immer die 
interrupts wenn sie etwas in den Ring-Buffer schreibt und die Pointer 
nachführen muss.

Bis jetzt habe ich diese Subroutine mit "reti" abgeschlossen. Das 
funktioniert auf dem AVR128 nicht mehr. Erst als ich das reti durch ein 
sei und ret ersetzt habe funktioniert es.

Und bevor ich da mit dem INTLVL1 beginne, wie ist das mit den beiden 
interrupt levels und dem I-Flag im SREG? Wie spielt das mit den LVL1EX 
und LVL0EX Flags im CPUINT_STATUS Register zusammen? Sehe ich das 
richtig, dass der Trick mit RETI das I-Flag nicht mehr setzt sondern nur 
diese LVL0/1EX Flags zurücksetzt und man das I-Flag nur noch mit SEI und 
CLI manipulieren sollte?
1
serout_0:
2
  push  zl
3
  push  zh
4
serout_0wait:
5
  cli
6
  lds  zl, tx0cnt    ;;; Get number of characters in buffer
7
  inc  zl      ;;; We want to add a character
8
  brne  serout_0nowait    ;;; Not full, so we will not wait
9
  ldi  zl, low(serout0)  ;;;
10
  ldi  zh, high(serout0)  ;;;
11
  call  block      ;;; 
12
  rjmp  serout_0wait    ; Then wait until there is room
13
14
serout_0nowait:
15
  sts  tx0cnt, zl    ;;; There is space in ring buffer
16
  lds  zl, tx0inptr    ;;; Get input pointer
17
  inc  zl      ;;;
18
  sts  tx0inptr, zl    ;;; Update input pointer
19
  clr  zh      ;;;
20
  subi  zl, low(-tx0ring)  ;;;
21
  sbci  zh, high(-tx0ring)  ;;;
22
  st  Z, char      ;;;
23
  lds  zl, USART3_CTRLA  ;;; Activate the data register empty
24
  sbr  zl, USART_DREIE_bm  ;;; interrupt so the ISR picks up the
25
  sts  USART3_CTRLA, zl  ;;; queued character(s)
26
  pop  zh      ;;;
27
  pop  zl      ;;;
28
;  reti        ;;;<<<< geht nicht
29
  sei
30
  ret

von c-hater (Gast)


Lesenswert?

Peter S. schrieb:

> Bis jetzt habe ich diese Subroutine mit "reti" abgeschlossen. Das
> funktioniert auf dem AVR128 nicht mehr.

Du meinst mit "AVR128" vermutlich "AVRyyyDx", richtig?

Wenn das so ist, dann: viele Tricks der "classic AVR8" funktionieren da 
nicht, haben bei den XMega (deren Erben die AVRyyyDx sind) noch nie 
funktioniert. Deren Interruptsystem ist schlicht etwas anders gestrickt.

Fazit: Lies', verdammt noch mal, das verdammte Datenblatt.

von Peter S. (cbscpe)


Lesenswert?

Ja ich meine die AVR128Dx Reihe. Das Datenblatt zum AVR128DB habe ich 
vor mir aber da steht leider sehr wenig drin und das verlinkte AVR 
Instruction Manual schwiegt zu diesem Thema. Dein Fazit kannst du dir an 
den Hut stecken.

von c-hater (Gast)


Lesenswert?

Peter S. schrieb:

> Das Datenblatt zum AVR128DB habe ich
> vor mir aber da steht leider sehr wenig drin und das verlinkte AVR
> Instruction Manual schwiegt zu diesem Thema.

Sehr eigenartig. Die mir vorliegenden Dokumente (genau die von dir 
genannten) sind eigentlich recht gesprächig. Es steht zwar sicher nicht 
alles Wissenswerte darin, aber die Funktionsweise des Interruptsystems 
schon. Wenn man nun auch noch das der "classic AVR8" kennt, hauen einem 
die Unterschiede quasi mit der nackten Faust in's Gesicht. Allein die 
Tatsache der Nichtexistenz von CPUINT bei den Klassikern sollte doch 
hinreichend potentiellen Lesestoff liefern...

Man muss ihn dann einfach auch noch verstehen und schon weiß man, warum 
es so ist, wie es ist...

> Dein Fazit kannst du dir an
> den Hut stecken.

Jaja, getroffene Hunde jaulen...

von Peter S. (cbscpe)


Lesenswert?

Die Lösung ist einfacher, das Kapitel PMIC im XMEGA enthält mehr 
informationen.

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.