flexibles Schalten von bits

Gast #566865
Hallo


Ich arbeite mit einem gcc-Compiler auf einem ARM7-Controller.
Das Setzen und Löschen von Bits funktioniert einwandfrei. Trotzdem frage 
ich mich, ob es nicht noch eine flexiblere Lösung für das Problem gibt.
Aktuell erfolgt das Setzen und Rücksetzen über:

#define LED1_ON  IOSET  = (1<<21); // Pin 25 auf HIGH schalten
#define LED1_OFF  IOCLR  = (1<<21); // Pin 25 auf LOW schalten


gerne hätte ich aber eine Lösung wie etwa

unsigned char ON  = 0;
unsigned char OFF = 1;

LED1 = ON; // schalte LED ein
LED1 = OFF; // schalte LED aus

Wieso? Tja, je nach Hardware möchte man einen Ausgang oftmals als activ 
Low oder active High ansprechen. Im zweiten Fall muss ich nur mehr ON 
und OFF entsprechend initialisieren.

Gibt es in gcc hier auch eine elegante und effiziente Lösung?

Vielen Dank

Klaus
Gast #566875
noch eine Ergänzung:
du könntest dir ein Makro schreiben, um ein Bit zu setzen/löschen und 
diesem dann per define den Ausgang übergeben
(also zb LED definieren auf PORTB bzw. PB0 und das dann dem Makro zum 
setzen/löschen geben
Gast #566939
Hallo

Vielen Dank für die Infos.


@wulf: der entscheidende Vorteil ist, dass ich die Pins während der 
Programmlaufzeit ändern kann.

@yahlo: Habe dort eine Lösung gefunden. Sie sieht folgendermassen aus:

für alle, die es interessiert:
1
typedef unsigned char byte ;
2

3
struct bitVector 
4
{
5
  byte b0:1;
6
  byte b1:1;
7
  byte b2:1;
8
  byte b3:1;
9
  byte b4:1;
10
  byte b5:1;
11
  byte b6:1;
12
  byte b7:1;
13
  byte b8:1;
14
  byte b9:1;
15
  byte b10:1;
16
  byte b11:1;
17
  byte b12:1;
18
  byte b13:1;
19
  byte b14:1;
20
  byte b15:1;
21
  byte b16:1;
22
  byte b17:1;
23
  byte b18:1;
24
  byte b19:1;
25
  byte b20:1;
26
  byte b21:1;
27
  byte b22:1;
28
  byte b23:1;
29
  byte b24:1;
30
  byte b25:1;
31
  byte b26:1;
32
  byte b27:1;
33
  byte b28:1;
34
  byte b29:1;
35
  byte b30:1;
36
  byte b31:1;
37
} __attribute__((__packed__));
38

39
#define BIT(r,n) (((volatile struct bitVector *)&r)->b##n)
40

41
#define MODUL_LED     BIT(IOPIN,10)  // schalte IO-Pin
42

43
int main(void)
44
{  
45
    unsigned long i;
46

47
    IODIR |= 0x10000400;
48
    while (1==1)
49
    {    
50
       MODUL_LED = 1; // schalte Led aus
51
       for (i=0; i<0x1FFFFF; i++);
52
       MODUL_LED = 0; // schalte Led ein
53
       for (i=0; i<0x1FFFFF; i++);
54
    }
55
    return 0;
56
}

Beste Grüsse und nochmals vielen Dank für den hilfreichen Tipp!

Klaus


Gast #566974
Hallo Peter

Vielen Dank für Deine Info. Das könnte ein gemeine Fehlerquelle sein. 
Mir geht es neben der Flexibilitä v.a. auch um Effizienz des Codes:)

Hast du vielleicht eine idealiere Lösung oder habe ich mich da zu früh 
gefreut?

Beste Grüsse

Klaus.
Gast #567459
>der entscheidende Vorteil ist, dass ich die Pins während der
>Programmlaufzeit ändern kann.
ahh... Schon klar!
Du willst quasi wie bei zB PonyProg die Ausgänge invertiert oder nicht.
Eine Lösung, die funktionieren kann aber nicht muss (Überblick ist 
wichtig!)
Dort wo du invertiert/nicht inv. umstellst, setzt du die Ausgänge und 
überall wo es nötig ist, toggelst du sie. Kommt aber auch vor allem auf 
die Anwendung an, ob es so geht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.