Interrupt Frage

  • 1
  • 2
  • 3
  • Seite 2 von 3
miparo
PowerUser
Avatar
Geschlecht:
Herkunft: Germany
Alter: 60
Beiträge: 1017
Dabei seit: 09 / 2007
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 29.05.2026 - 18:08 Uhr  ·  #9
Hi Frank,
auf einem Port gehts auch, sollte etwas so tun:
Natürlich kein PortIntC define mehr nötig

Code

{ Const Declarations }
const
  PIN1_bm: byte = 2;
  PIN2_bm: byte = 4;
  PIN3_bm: byte = 6;

Var
    IntLastState: byte;

procedure PortInt1Init;
const
  PinMask: byte = (PIN1_bm or PIN2_bm or PIN3_bm);
begin
  PORTC.DIRCLR:= PinMask;   // Input
  PIN1CTRLC:= $18;               // PullUp, bothedges
  PIN2CTRLC:= $18;
  PIN3CTRLC:= $18;
  INT1MASKC:= PinMask;      // Bitmask Pin 1,2,3
  INTCTRLC:= 1;
  INTFLAGSC:= 2;
  PMICCTRL:= 1;             //  Low Level Interrupt Executing bit mask.
  IntLastState:= PinC;
end;


procedure PORTC_INT1;             // Interrupt CallBack
var
  currState, XorState : byte;
begin
  currState:= PinC;
  XorState:= currState xor IntLastState;

  // PinC.1
  if (XorState and PIN1_bm) > 0 then
    if (currState and PIN1_bm) > 0 then  // wenn State benötigt wird 
       // steigende Flanke

    else
      // fallende Flanke
    endif;
  endif;

  // PinC.2
  if (XorState and PIN2_bm) > 0 then
    // if (currState and PIN2_bm) > 0 then
  endif;

  // PinC.3
  if (XorState and PIN3_bm) > 0 then

  endif;
  IntLastState:= currState;
end;



///  ---- main 
  EnableInts($87);
  BeepOut(2000, 5);
  PortInt1Init();
....



miparo
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 29.05.2026 - 19:34 Uhr  ·  #10
Ich Danke dir, kann ich Morgen mal testen, aber nicht mehr heute.

Ich melde mich wieder.


Gruß Frank
miparo
PowerUser
Avatar
Geschlecht:
Herkunft: Germany
Alter: 60
Beiträge: 1017
Dabei seit: 09 / 2007
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 30.05.2026 - 00:23 Uhr  ·  #11
Habs allerdings noch nicht getestet, ansonsten mal im Debugger schauen, ob Int1 dann on ist aber so tudelt es beim Xmega .
PortInt macht nichts anderes aktiviert allderdings nur einen Pin.
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 25.07.2026 - 13:39 Uhr  ·  #12
Hallo miparo, sorry aber ich bin jetzt erst dazu gekommen deinen Code zu testen.
Meine Endschalter hängen aber jetzt an PF5 PF6 PF7

ich habe schon versucht deinen Code umzuschreiben, aber das haut nicht hin.
Könntest du helfen ?

Griß Frank
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 61
Beiträge: 2175
Dabei seit: 03 / 2003
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 25.07.2026 - 15:37 Uhr  ·  #13
Compiler Handbuch, 4.8.3 Externe Interrupts XMega
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 25.07.2026 - 18:56 Uhr  ·  #14
Hallo Harry, das habe ich mir durchgelesen.
Und auch gleich eingebaut, dann habe ich Probleme gesehen und mal zum Spaß

Code

define 
  PortIntF = 7, PullUp, bothedges;

Procedure PortIntF; // Interrupt CallBack
begin
  Inc(IntCounter);
end;

loop
  DrawText(25, 10, IntToStr(Intcounter));
endloop



eingebaut, ist das gewollt das die CallBack in schleife aufgerufen wird.

Ich dachte immer wenn ein zustand an diesen Port sich verändert
dann schlägt Interrupt zu. Aber wenn nichts an diesen Port verändert,
dann sollte die doch gar nicht aufgerufen werden.

Mein TFT hat sich überschlagen :-)

GRuß Frank
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 26.07.2026 - 14:03 Uhr  ·  #15
Hallo miparo, vllt kannst du mir einen Tipp geben.
Ich habe den Code umprogrammiert auf PortF
für Pin5 Pin6 Pin7
Die PORTF_INT1; // Interrupt CallBack wird aber nicht aufgerufen durch ein Interrupt.

wenn ich in der loop schleife
DrawText(25, 10, IntToStr(inccounter));
PORTF_INT1;
aufrufe per Code geht alles. Warum lößt das kein Interrupt aus.
Procedure PORTF_INT1;





Code

procedure PortInt1Init;
const
  PinMask: byte = (ENDX_bm or ENDY_bm or ENDZ_bm);
begin
  PORTF.DIRCLR:= PinMask;   // Input
  PIN5CTRLF:= $18;          // PullUp, bothedges
  PIN6CTRLF:= $18;
  PIN7CTRLF:= $18;
  INT1MASKF:= PinMask;      // Bitmask Pin 5,6,7
  INTCTRLF:= 1;
  INTFLAGSF:= 2;
  PMICCTRL:= 1;             //  Low Level Interrupt Executing bit mask.
  IntLastState:= PinF;
end;


Procedure PORTF_INT1; // Interrupt CallBack
var
  currState, XorState : byte;
begin
  currState := PinF and (ENDX_bm or ENDY_bm or ENDZ_bm);
  XorState := currState xor IntLastState;
  // PinF.7
  if (XorState and ENDZ_bm) > 0 then
    if (currState and ENDZ_bm) > 0 then  // wenn State benötigt wird
       // steigende Flanke
       inccounter:= inccounter +1;
    else
      // fallende Flanke
       inccounter:= inccounter +1;
    endif;
  endif;
  IntLastState:= currState;
end;




Code

{$IDATA}
begin
  InitPorts;
  pwm:= 200;
  mDelay(10);
  InitAll;

  mDelay(200);
  PortInt1Init();   //<================
  EnableInts($87);




GRuß Frank
miparo
PowerUser
Avatar
Geschlecht:
Herkunft: Germany
Alter: 60
Beiträge: 1017
Dabei seit: 09 / 2007
Betreff:

Re: Interrupt Frage

 · 
Gepostet: 27.07.2026 - 12:58 Uhr  ·  #16
Hi Frank,
DB lesen Seite 142 😏


INT1MASKC:= INT1MASKC or PinMask; // um nicht andere Ints zu ändern.
INTCTRLF:= 4; // Int1 aktivieren auf PortF ;1 war für Int0

miparo
  • 1
  • 2
  • 3
  • Seite 2 von 3
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   140   154 · Page-Gen-Time: 0.024083s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI