Interrupt-Frage

Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Interrupt-Frage

 · 
Gepostet: 20.12.2020 - 12:41 Uhr  ·  #1
Hallo Zusammen,

ich hätte da mal ne Frage bezüglich Hardware-Interrupts. Es heißt ja, daß der Code in einem IRQ möglichst kurz sein soll, aber leider ist "kurz" eine recht ungenaue Aussage. Konkret: Kann ich einen Touch-Controller via I²C in der Interrupt-Routine abfragen oder sollte ich das eher nicht machen?

Code

Import ...., PCIntD;

Define
  PCintDmask       = $08;                   { IRQ PINS --> PD3 / für Touch     }
  PCintDedge       = $08;                   { rising edge PortD,3              }

.....

Procedure PCIntD3;                               // externer Interrupt an D3
  Begin                                          // Touch betätigt
    Touch:=true;
    TLED:=1;
  End PCIntD3;

--- o d e r ---

Procedure PCIntD3;                               // externer Interrupt an D3
  Begin                                          // Touch betätigt
    TWIinpE(TWITouch,TouchRxData);
    Touch:=true;
    TLED:=1;
  End PCIntD3;


Gruss
Harry
golf
Benutzer
Avatar
Geschlecht:
Herkunft: Donauwörth
Alter: 72
Beiträge: 266
Dabei seit: 11 / 2009
Betreff:

Re: Interrupt-Frage

 · 
Gepostet: 20.12.2020 - 13:24 Uhr  ·  #2
Hallo Harry,
ich kann Dir nicht sagen, was da noch sinnvoll möglich wäre in der Interruptroutine. Ich mache das einfach immer so, daß ich da immer nur ein Flag setzte (Touch:= true) und den Rest in der Hauptroutine.

if Touch= true then
Touch:= false;
TWIinpE....
TLed1:= true;
endif;

golf
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: Interrupt-Frage

 · 
Gepostet: 20.12.2020 - 14:53 Uhr  ·  #3
Hallo Golf,

ich hab es mal getestet und es geht überhaupt nicht. Mein Prog hängt sich komplett auf, wenn ich die TWI-Abfrage im IRQ mache. Ok wieder was gelernt.

Gruss
Harry
Merlin
Administrator
Avatar
Geschlecht:
Alter: 25
Beiträge: 1474
Dabei seit: 03 / 2005
Betreff:

Re: Interrupt-Frage

 · 
Gepostet: 20.12.2020 - 21:32 Uhr  ·  #4
I suspect TWI would not hang for soft SPI but hang with hardware SPI because hardware SPI generates an interrupt, and interrupts are suspended in an interrupt routine! But the flag approach suggested by golf is in any case better, although sometimes a counter is appropriate. 'Small' is of course imprecise but it is time to execute rather than size that is important. For that reason you should never try to execute any kind of comms within an interrupt routine.

Regards

Merlin
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: Interrupt-Frage

 · 
Gepostet: 22.12.2020 - 11:31 Uhr  ·  #5
Hallo Zusammen,

sorry, aber ich muß noch mal Fragen, da das durch das Handbuch nicht eindeutig erklärt wird.

Ich verwende einen PinChangeInterrupt und dieser wird auch korrekt mit der steigenden Flanke ausgelöst, aber wie wird das Flag dafür gelöscht? Oder geschieht das durch die CallBack-Funktion automatisch?

Ich habe folgendes Problem: Der PCInt wird durch einen TouchController ausgelöst. Dieser löst aber zyklisch Interrupts aus, so lange ich den Touch gedrückt halte. Ich hätte gerne, daß der Interrupt nicht beachtet wird, so lange der Touch vom auslösenden Druck immer noch gedrückt ist.

Gruss
Harry

[Edit]Ok noch was: Im Handbuch steht
Code
PCintEmask = %00100001;     // only Pin0 and Pin5 used
PCintEedge = $FF;           // all rising edges

Sollte das nicht PCintEedge = $21; heißen, da ja eh nur 2 Eingänge verwendet werden?
Merlin
Administrator
Avatar
Geschlecht:
Alter: 25
Beiträge: 1474
Dabei seit: 03 / 2005
Betreff:

Re: Interrupt-Frage

 · 
Gepostet: 22.12.2020 - 14:09 Uhr  ·  #6
Zitat
Shouldn't that be PCintEedge = $ 21; mean, since only 2 inputs are used anyway?


It makes no difference. If you think about it $21 means use rising edges for these inputs and falling edges for the rest.
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: 8 · Cache Hits: 14   107   121 · Page-Gen-Time: 0.019224s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI