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
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 } }
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.
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
Hallo m@is! Das Byte gibts doch: P2IFG ;) Hab bisher auch noch keine andere Variante gesehen... Gruß, Patrick...
Aber wenn mehrere bits gleichzeitig gesetzt sein können musst du so abfragen: if ((P2IFG & 0x04)>0) ...
Danke Fritz, daran hatte ich nicht gedacht, jetzt gehts :) Gruß m@is
@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
Hi R2D2! Ich weiss, aber für andere ist es trotzdem leichter zu lesen (find ich halt).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.