Pic, bit-hantering i XC8.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Pic, bit-hantering i XC8.

Inlägg av BJ »

Från bruksanvisningen till XC8:

Kod: Markera allt

union both
{
  unsigned char byte;
  struct
  {
    unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
  } bitv;
} var;

This allows you to access
byte
as a whole (using var.byte), or any bit within that vari-
able independently (using
var.bitv.b0
through
var.bitv.b7


Just nu ska jag använda flera liknande variabler.
Men vad händer om jag struntar i "bitv" och "var"
i deklarationen?
Kan man skriva both.b0 då, i stället för var.bitv.b0?

Jag vet inte om det ena eller det andra sättet
är bäst när man ska deklarera flera/många variabler,
men blir det samma sak?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Pic, bit-hantering i XC8.

Inlägg av Icecap »

Vad är det du vill?

Det exempel anger hur du skapar en byte (var.byte) där du kan komma åt de enstaka bits (var.bitv.bx). Du kan inte utelämna var hhv. bitv då du i så fall inte har en struktur.

Om du vill skapa fler variabler som delar minnesutrymme - och de är ganska lika - kan man ju deklarera en typedef och använda den.

Så beskriv vad du vill, det finns ganska säkert lösningar.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Jag vill skapa variabler som är skilda
från varandra, men där det både går att
använda variablerna som vanliga variabler,
och som variabler där man kän läsa och
ändra enstaka bitar.
Jag vill inte använda t.ex. eller + skift just nu,
utan komma åt bitarna direkt.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Pic, bit-hantering i XC8.

Inlägg av Icecap »

"Jag vill inte använda t.ex. eller + skift just nu, utan komma åt bitarna direkt."

Den där fattar jag inte.
Med 'var.bitv.b0' ÄR det direkt tillgång till bitten och inget annat. var.bitv.b0 = 0; ställer den bit till '0'!
Med 'var.byte' ÄR det direkt tillgång till byten och inget annat.

Eller vänta nu...
Menar du att du inte vill fjolla dig runt med AVR-sättet (blabla |= 1<<någon_bitvärde)?
I så fall kan jag verkligen fatta det - och med sättet ovan kan du släppa det.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Precis! :)

Okej.
Vad händer med namnet "both" då?
Kan jag göra flera unioner som heter "both"
och skapa en variabel det sista man gör i unionerna?
Eller hur gör man?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Pic, bit-hantering i XC8.

Inlägg av TomasL »

Det enklaste är om du gör en typedef och använder den när du skapar dina variabler
nånting i stil med.

Kod: Markera allt

typedf union byte_bits_union {
		unsigned char byte;
		struct {
				unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
		}bits;
}bytebits_union;
Detta lägger du förmodligen i main.h

Du kan sedan skapa hur många variabler som helst, till exempel

Kod: Markera allt

bytebits_union var1_un;
bytebits_union var2_un;
bytebits_union var3_un;
bytebits_union var4_un;
bytebits_union var5_un;
bytebits_union var6_un;
Samtliga dessa variabler blir nu en kopia av unionen du skapade i main.h
Du kan alltså använda både hela bytes och enskilda bitar i samtliga variabler du skapar som typen "bytebits_union", var5.bit.b1m var4.byte och så vidare
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Tack. :tumupp:
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Pic, bit-hantering i XC8.

Inlägg av Icecap »

"both" är ett ord som på engelsk betyder "båda". Det är menat som att du kan komma åt båda variabler med var deras namn men det finns ingen som heter "both.någonting".

Om du vill ha en array kan du göra det på sättet som TomasL anger.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Okej.

En annan fråga: globala variabler.
Hur gör man? Det var länge sedan jag gjorde det i c. :humm:
Just nu har jag bara en c-fil, men med avbrotts-
hantering i.

Var skapar jag variablerna?
I main.h?
I main.c? Utanför alla funktioner?
Ska något stå före? extern, global, ...?
Jag har letat, men inte hittat svaret.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Pic, bit-hantering i XC8.

Inlägg av TomasL »

i h-filen som skall inkluderas i varje fil där du vill ha variablerna deklarerar du variabeln med extern i första c-filen deklarerar du och initialiserar variabeln som vanligt.

I h-filen skall du ha följande:

Kod: Markera allt

#ifndef FILNAMN_H
#define FILNAMN_H
extern int var;
#endif
Sedan inkluderar du filnamn.h i alla filer
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Så i första c-filen ska man inte ha med extern
i deklarationen?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Pic, bit-hantering i XC8.

Inlägg av TomasL »

Nej, extern har du h-filen.
Detta talar om för kompilatorn att det finns en variabel med detta namn, och att den deklareras någon annan stans.
På så sätt kan kompilatorn skapa referenser till variabeln överallt där den används.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Okej.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Pic, bit-hantering i XC8.

Inlägg av BJ »

Kod: Markera allt

typedef union byte_bits_union
{
  unsigned char byte;
  struct
  {
    unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
  } bits;
} bytebits_union;

bytebits_union var1_un;
Om jag vill göra dom "volatile", hur skriver jag då?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Pic, bit-hantering i XC8.

Inlägg av Icecap »

volatile bytebits_union var1_un;
Skriv svar