Xmega128A4U, Komparator, Interrupt

Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Xmega128A4U, Komparator, Interrupt

 · 
Posted: 28.10.2020 - 15:07  ·  #1
Hallo,
komme nicht mehr weiter.
Möchte den Komparator Interrupt nutzen.

Registereintrag müsste gehen:
Code

Procedure pInit_ACA;
Begin
  ACACTRLA    := %1111 1001;     // IRmode rise, Ilev high, HSm high, HYSm no, E on.
  ACAAC0MUXCTR:= %0011 0101;     // -, Pin6, DAC
End pInit_ACA;

Wie deklariere ich das mit der Einsprungadresse?
Und dort mit einem RJMP zur eigentlichen Interruptabarbeitung?
Meine Assemlerkenntisse sind sehr dürftig.
Könnte in etwa so gehen?
Bzw. was sollte verbessert, geändert werden, daß es funktioniert?
Code

--------
$0088, ACA_INT_base = Analog Comparator on Port A interrupt base
$008A,
$008C,
---------
.org 0x088 
RJMP INTERRUPT_ACOMP
--------
INTERRUPT_ACOMP:
  asm;
   PUSH   _ACCALO
   PUSH   _ACCAHI
   PUSH   _ACCBLO
   PUSH   _ACCBHI
 endasm;
  excl(AD_CNV_1_2);      // ext. AD-Wandler 1 u. 2 starten
  incl(AD_CNV_1_2);
 
 
 asm;
   POP  _ACCBHI
   POP  _ACCBLO
   POP  _ACCAHI
   POP  _ACCALO
   reti
 endasm;
--------


Danke
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: Xmega128A4U, Komparator, Interrupt

 · 
Posted: 28.10.2020 - 18:36  ·  #2
So wie unten dargestellt würde es mir "gefallen".
Was noch fehlt ist der richte Syntax bei den Adressen.
Wer kann mir das zeigen?

Danke

Code

//---------
asm;
 .org 0x088                    // Einsprung-Adresse Interrupt Komparator
  rjmp INTERRUPT_ACOMP
endasm;
//---------
asm;
  Interrupt INTERRUPT_ACOMP;     // Interrupt Komparator, ausführen
  begin
  push _ACCBLO      // werde noch kuken was sonst noch gesichert werden muss
  push _ACCBHI
  push _ACCCLO
  push _ACCCHI
endasm;
  incl(AD_CNV_1_2);            // ext. AD-Wandler 1 u. 2 starten
  excl(AD_CNV_1_2);
  ACACTRLA  AND %1100 1111;    // Komparator Interrupt aus, // IRmode rise, Ilev high, HSm high, HYSm no, E on.
asm;
  pop _ACCCHI
  pop _ACCCLO
  pop _ACCBCHI
  pop _ACCBLO
  reti
endasm;
//---------
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Xmega128A4U, Komparator, Interrupt

 · 
Posted: 28.10.2020 - 20:18  ·  #3
I hope I understand your question

You could look at the samples page, project XMEGA_ADC for ideas.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Xmega128A4U, Komparator, Interrupt

 · 
Posted: 28.10.2020 - 21:15  ·  #4
Hi,
das darf nicht innerhalb des ASM Statements stehen:

Interrupt INTERRUPT_ACOMP; // Interrupt Komparator, ausführen

Das erkennt der Compiler nicht und fügt auch den jump in die Vector Tabelle nicht ein.
Und zu Fuss diesen Jump einbauen, der ist beim nächsten compile wieder weg.
Register Rettung ist im Normalfall nicht nötig. Macht der Compiler...
Und solange nur ACCA, ACCB und ACCCLO/HI benutzt wird ist das auch garnicht nötig.

rolf
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: Xmega128A4U, Komparator, Interrupt

 · 
Posted: 28.10.2020 - 21:36  ·  #5
Danke,
hat sich zunächst geklärt.
Habe im falschen dsc-File nach dem Komparator-Interrupt geschaut.
Da stand, daß der Interrupt nicht unterstützt wird.
Jetzt eben im richtigen dsc-File gesehen, daß es geht.
Quelltext geschrieben und geht ohne Error durch den Compiler.
Also zunächst Entwarnung.
Mann oh Mann ...

Code

Procedure pInit_ACA;             // Komparator initialisieren
Begin
  ACACTRLA    := %1111 1001;     // IRmode rise, Ilev high, HSm high, HYSm no, E on.
  ACAAC0MUXCTR:= %0011 0101;     // -, Pin6, DAC
End pInit_ACA;


Code

Interrupt ACA_INTCOMP0;                // Interrupt Komparator
begin
  push _ACCBLO;
  push _ACCBHI;
  push _ACCCLO;
  push _ACCCHI;
  incl(AD_CNV_1_2);                    // ext. AD-Wandler 1 u. 2 starten
  excl(AD_CNV_1_2);
  ACACTRLA:= ACACTRLA AND %1100 1111;  // Komparator Interrupt aus, // IRmode rise, Ilev high, HSm high, HYSm no, E on.
  nop;
  nop;
  nop;
  nop;
  nop;
  wPTC_Spannung:= SPIinpWordC;
  wPTC_Strom   := SPIinpWordD;
  pop _ACCCHI
  pop _ACCCLO
  pop _ACCBCHI
  pop _ACCBLO
end;


Nach push und pop muß ich noch schauen.
Aber es geht erst mal.

Danke
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Xmega128A4U, Komparator, Interrupt

 · 
Posted: 28.10.2020 - 22:42  ·  #6
If you use the optimiser you should not need to worry about PUSH/POP. The optimiser analyses what registers are used and optimises the PUSH/POP list accordingly, removing any you don't need and adding in any that are required.
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   109   123 · Page-Gen-Time: 0.037635s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI