MSP430 Interrupt-Quelle erkennen

Gast #77876
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
Gast #77878
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.
Gast #77879
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
Gast #77883
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
Gast #77885
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);

};

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren