mikrocontroller.net

Forum: Compiler & IDEs MSP430 Interrupt-Quelle erkennen


Autor: m@is (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: m@is (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
     }

}

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: m@is (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo m@is!

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

Gruß,
Patrick...

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wenn mehrere bits gleichzeitig gesetzt sein können musst du so
abfragen:

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

Autor: m@is (Gast)
Datum:

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

Autor: R2D2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi R2D2!

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

Autor: da-p!mp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.