Interrupt - richtig so?

  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 16:28  ·  #1
Hallo @ all,

Premiere .... das erste mal, daß ich einen Interrupt verwende :) .... hab ich bisher nie gebraucht.
Ich würde nur gerne von euch wissen, ob das so richtig ist.

Ich verwende einen XMega256A3 @ 32 Mhz und am PortD,0 ist ein Taktgeber mit recht genauen 1Hz angeschlossen. Ich möchte nur über den Interrupt an diesem Pin eine LongWord-Variable hoch zählen. Das ist eigentlich alles. Nebenher wird alle 200ms ein Display (98x64 Pixel) refresht.
LongWord habe ich gewählt, da ich nicht weiß, wie lange die Schaltung später mal nonstop in Betrieb ist. So kann das aber 4294967295 Sekunden lang sein. Das sind 136.19 Jahre :D.

Code

Import PCIntD, .....;

Define
  PCintDmask     = $01;             // %00000001  $01--> IRQ PINS --> PD0
  PCintDedge     = $01;             // %rising edge PortD,0

Procedure PCintD0;
  Begin
    PushAllRegs;
    Inc(TimeTick1);
    PopAllRegs;
  End PCintD0;


Wenn ich das Push/PopAllRegs weg lasse, hängt das Programm sofort. So wie es oben ist, läuft es (anscheinend). Kann ich das so lassen oder kann ich was besser machen?
Die Variable TimeTick1 wird im Programm weiter verwendet (klar eigentlich) um eine Zeit zu messen.

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

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 16:42  ·  #2
Hi Harry.

Are you using the optimiser?

If not then I don't know the answer for sure (but I could tell from the asm file). If you are, then you should not need it. If it hangs send me your asm/dsm files via pm (the version that hangs) and I will look at it.

Regards

Merlin
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 767
Registered: 06 / 2013
Subject:

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 17:53  ·  #3
Hallo Harry, ich verstehe das gar nicht das du Probleme damit hast.
Ich habe doch (fast) das selbe und bei mir gehts 100%

Gruß Frank



PS, hier noma mein Code

Code

Device = xmega32A4, VCC=3.3;

Import SysTick,   PCintA;


Define
//Port A Interrupt                 // 10101010  $AA
  PCintAmask     = $55;            // 01010101  $55
  PCintAedge     = $00;            //  $FF all rising edges  $00 all falling edges


{ functions }
Procedure InitPorts;
begin
  PortA := %11111111;       //
  DDRA.0:= 0; //Step X
  DDRA.1:= 0; //DIR X
  DDRA.2:= 0; //Step Y
  DDRA.3:= 0; //DIR Y
  DDRA.4:= 0; //Step Z
  DDRA.5:= 0; //DIR Z
  DDRA.6:= 0; //Step A
  DDRA.7:= 0; //DIR A;
end;

//Interrupt X
Procedure PCintA0;
begin
  If PinDIR_X = true then
    Posi_X:= Posi_X +1;
  else
    Posi_X:= Posi_X -1;
  endif;
end;


miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 17:58  ·  #4
Hi Harry,
alles richtig so.

das Push & Pop MUSS sein im Int aber das ist ein Rattenschwanz deshalb hat Merlin das Push &Pop übernommen und sichert nur noch die nötigen Register.
Oder du machst es selbst kurz.

Code

   ..
  asm;
   PUSH   _ACCBLO
   PUSH   _ACCBHI
   PUSH   _ACCCLO
   PUSH   _ACCCHI
 endasm;
  Inc(TimeTick1); 
 asm;
   POP _ACCCHI
   POP _ACCCLO
   POP _ACCBCHI
   POP  _ACCBLO
 endasm;

  

Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 18:09  ·  #5
Danke :) ..... dann kann ich ja weiter machen ..... nach dem ich den Proz getauscht habe :(. Der ist vermutlich gerade gestorben und ich hab keine Ahnung wieso. Zumindest will der Progger nicht mit ihm reden. Als letztes hab ich die BodLevel-Fuses gesetzt und das wars. Bei Versuch zu proggen redete er nicht mehr mit mir.

@Merlin: I don't use the optimizer.

@Frank: Was macht dein Prog sonst noch so? Prozesse/Tasks drin?

Gruss
Harry
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 18:11  ·  #6
Takt im Progger auf low und die CPU mit etwas Überspannung betreiben. 3.5-3.6 Volt mal probieren

Wobei wir das problem nur vom Xmega128xx kennen. Alle anderen kann man eigentlich nicht abschießen
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 18:18  ·  #7
Hi miparo,

ok teste ich mal. Ich kann den Proz ja mal durch den Progger versorgen. Die BodLevel-Fuses (BodLevel1,2&3 aktiv) standen auf 3.0V (bei 3.3V Versorgungsspannung).

Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Interrupt - richtig so?

 · 
Posted: 19.03.2018 - 18:35  ·  #8
miparo ♥ ♥ ♥ ♥ ♥ ♥

ich hab ihn wieder :) .... die BodLevels sind beim XMega256A3 total anders als beim XMega256A3U.

BodLevel 1, 2 & 3 beim A3 = 3.49V, beim A3U = 3.0V
Ich hab die Fuses von einem Programm mit dem A3U übernommen gehabt.

Danke & Gruss
Harry
  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
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   134   148 · Page-Gen-Time: 0.029624s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI