Forum: Compiler & IDEs MSP430 Interrupt-Quelle erkennen


von m@is (Gast)


Lesenswert?

Hallo erstmal,

ich möchte bei einem Interrupt, je nachdem von welchem Pin des Port 2
dieser ausgelöst wurde, eine Funktion ausführen und danach wieder in
den LPM_0 zurückkehren.

Bisher habe ich immer beide Funktionen durchlaufen lassen, kostet aber
zuviel Zeit.

Eine Idee für mich? Soll ich in der ISR die Flags P2IFG.x mit
switch-case-Anweisung abfragen oder gibt es einen eleganteren Weg?

Gruß m@is

von m@is (Gast)


Lesenswert?

Sieht jetzt so aus, funktioniert, aber ist das effizient?


interrupt [PORT2_VECTOR] void eingang (void)
{
  if (P2IFG == 0x04)
     {
      mach was
     }


  if (P2IFG == 0x01)
     {
      mach was anderes
     }

}

von Fritz Ganter (Gast)


Lesenswert?

Hallo m@is!

Switch braucht bei mir (avr-gcc) mehr code als die if. Können auch
beide zugleich gesetzt sein? Wenn nicht, kannst noch ein else zwischen
die if machen und den unwahrscheinlicheren Fall als erstes schreiben,
dann steigt die Wahrscheinlichkeit, dass er das 2. if überspringt.
Switch schaut nur besser aus, ist aber langsamer, aber schau selber in
die Assemblerausgabe.

von m@is (Gast)


Lesenswert?

Hallo Fritz,

ich wollte sicher gehen das es ok ist in der ISR die Quellen so zu
selektieren, ist wohl die einzige Lösung. Habe gehofft das es irgendwo
ein Byte gibt in dem für jeden Port-Pin ein Bit gesetzt wird...

Danke für Deine Antwort

Gruß m@is

von OldBug (Gast)


Lesenswert?

Hallo m@is!

Das Byte gibts doch: P2IFG ;)
Hab bisher auch noch keine andere Variante gesehen...

Gruß,
Patrick...

von Fritz Ganter (Gast)


Lesenswert?

Aber wenn mehrere bits gleichzeitig gesetzt sein können musst du so
abfragen:

 if ((P2IFG & 0x04)>0)
...

von m@is (Gast)


Lesenswert?

Danke Fritz, daran hatte ich nicht gedacht, jetzt gehts :)
Gruß m@is

von R2D2 (Gast)


Lesenswert?

@Fritz:
> if ((P2IFG & 0x04)>0)
das >0 kannst du dir sparen. Alles was <>0 ist wird von compiler als
TRUE interpretiert.

also kannst du auch einfach
if (P2IFG & 0x04)
schreiben.
Ist kürzer und auch leichter zu lesen.

R2D2

von Fritz Ganter (Gast)


Lesenswert?

Hi R2D2!

Ich weiss, aber für andere ist es trotzdem leichter zu lesen (find ich
halt).

von da-p!mp (Gast)


Lesenswert?

also jungs nach langem überlegen bin ich zu der meinung gekommen, dass
das die beste lösung wäre!


struct device

{

  char           *name;                      /* interface name

*/



  /* I/O specific fields */

  unsigned long  mem_end;                    /* shared mem end

*/

  unsigned long  mem_start;                  /* shared mem start

*/

  unsigned long  base_addr;                  /* device I/O address

*/

  unsigned char  irq;                        /* device IRQ number

*/



  unsigned char  tbusy;                      /* transmitter busy flag

*/

  struct device  *next;                      /* link to next device

*/

  unsigned char  dev_addr[MAX_ADDR_LEN];     /* interface hw address

*/

  struct sk_buff_head  buffs[DEV_NUMBUFFS];  /* transmit queues

*/



  /* pointers to device specific service routines */

  int (*init)(struct device *dev);

  int (*open)(struct device *dev);

  int (*stop)(struct device *dev);

  int (*hard_start_xmit)(struct sk_buff *skb, struct device *dev);

  void (*set_multicast_list)(struct device *dev, int num_addrs, void

*addrs);

  struct enet_statistics* (*get_stats)(struct device *dev);

};

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.