Interrupt - richtig so?

  • 1
  • 2
  • 3
  • 4
  • Seite 1 von 4
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 16:28 Uhr  ·  #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
Geschlecht:
Alter: 25
Beiträge: 1473
Dabei seit: 03 / 2005
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 16:42 Uhr  ·  #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
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 68
Beiträge: 776
Dabei seit: 06 / 2013
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 17:53 Uhr  ·  #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
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 988
Dabei seit: 09 / 2007
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 17:58 Uhr  ·  #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
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 18:09 Uhr  ·  #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
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 988
Dabei seit: 09 / 2007
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 18:11 Uhr  ·  #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
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 18:18 Uhr  ·  #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
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: Interrupt - richtig so?

 · 
Gepostet: 19.03.2018 - 18:35 Uhr  ·  #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
  • Seite 1 von 4
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   136   150 · Page-Gen-Time: 0.036264s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI