Interrupt-Frage

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

Interrupt-Frage

 · 
Posted: 20.12.2020 - 12:41  ·  #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
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: Interrupt-Frage

 · 
Posted: 20.12.2020 - 13:24  ·  #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
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Interrupt-Frage

 · 
Posted: 20.12.2020 - 14:53  ·  #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
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Interrupt-Frage

 · 
Posted: 20.12.2020 - 21:32  ·  #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
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Interrupt-Frage

 · 
Posted: 22.12.2020 - 11:31  ·  #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
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Interrupt-Frage

 · 
Posted: 22.12.2020 - 14:09  ·  #6
Quote
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.
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   106   120 · Page-Gen-Time: 0.033272s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI