Forum: Mikrocontroller und Digitale Elektronik PIC + C18 Syntax


von Diotor (Gast)


Lesenswert?

Hi,
gibt es die Möglichkeit Bitgruppen als ganzes anzusprechen?
z.B hat mein PIC im ADCON0 Register die Gruppe CHS (CHS3-CHS0).
Und jetzt möchte ich z.B. einfach ADCON0.CHS = 1010 zuweisen, statt über 
ADCON0bits.CHSx jedes einzeln anzusprechen. Geht sowas?

Gruß

von Marco S. (sharkman)


Lesenswert?

Hi.

Du kannst das über eine Maskierung der Bits machen.

ADCON0 = ADCON0 | 0b00001010;

Bin mir grad nicht mit der Positon sicher und ich bin mir grad auch 
nicht sicher, ob das nicht irgendwo zwischengespeichert werden muss. 
Ansosten sollte das passen.

von André H. (andrekr)


Lesenswert?

Das ist eine gute Frage.

Was auf jeden Fall gehen müßte: die entsprechende Variable aus deiner 
Architektur-Include rausklauen und eine eigene machen.

Also wenn die z.B. so aussieht:
1
typedef struct {
2
  unsigned ADON:1;
3
  unsigned :1;
4
  unsigned GO:1;
5
  unsigned CHS0:1;
6
  unsigned CHS1:1;
7
  unsigned CHS2:1;
8
  unsigned ADCS0:1;
9
  unsigned ADCS1:1;
10
} __ADCON0bits_t;
11
12
extern volatile __ADCON0bits_t __at (0x00) ADCON0bits;

kannst du dir machen:
1
typedef union {
2
  struct {
3
    unsigned ADON:1;
4
    unsigned :1;
5
    unsigned GO:1;
6
    unsigned CHS:3;
7
    unsigned ADCS0:1;
8
    unsigned ADCS1:1;
9
  };
10
  struct {
11
    unsigned ADON:1;
12
    unsigned :1;
13
    unsigned GO:1;
14
    unsigned CHS0:1;
15
    unsigned CHS1:1;
16
    unsigned CHS2:1;
17
    unsigned ADCS0:1;
18
    unsigned ADCS1:1;
19
  };
20
} my_ADCON0bits_t;
21
22
extern volatile my_ADCON0bits_t __at (0x00) ADCON0bits;

von Lehrmann M. (ubimbo)


Lesenswert?

Die Anmerkung von Andre ist mit Sicherheit interessant ...

Standartmäßig sind mir keine Varianten bekannt - ich würde das 'normal' 
so machen:

ADCON0 |= ((1 << MEINBIT0) | (1 << MEINBIT1) | (1 << MEINBIT2) | (1 << 
MEINBIT3));

wobei MEINBITx immer für die BitNr steht!

// setzt Bit 0 und 2 in PORTB auf "1"

Genaueres findest du unter 
http://www.mikrocontroller.net/articles/Bitmanipulation

Hast du mal probiert was passiert wenn du:

ADCON0.CHS = 0b00001010;

wählst? Ich tippe mal auf einen Fehler - wäre zu schön wenn's so ginge

von AS (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> ADCON0.CHS = 0b00001010;
>
> wählst? Ich tippe mal auf einen Fehler - wäre zu schön wenn's so ginge

C18 benutze ich zwar nicht (das ist doch dieser furchtbare HI-TECH
Compiler, oder?) auf allen anderen Microchip-Compilern,
C30, C32 ist so etwas Standard und funktioniert bestens:

  ADCON0.CHS = 0b1010;
  ADCON1.ACQT = 0b101;
  ADCON1.ADCS = 0b110;

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.