Buggfix Plus
Aktuellt datum och tid: 11.36 2019-03-26

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 28 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
 Inläggsrubrik: Pic, bit-hantering i XC8.
InläggPostat: 12.06 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
Från bruksanvisningen till XC8:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
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?


Upp
 Profil  
 
InläggPostat: 12.46 2018-12-31 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23664
Ort: Kristinehamn
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.


Upp
 Profil  
 
InläggPostat: 12.49 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
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.


Upp
 Profil  
 
InläggPostat: 12.55 2018-12-31 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23664
Ort: Kristinehamn
"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.


Upp
 Profil  
 
InläggPostat: 12.59 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
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?


Upp
 Profil  
 
InläggPostat: 13.21 2018-12-31 
EF Sponsor
Användarvisningsbild

Blev medlem: 22.54 2006-09-23
Inlägg: 31188
Ort: Borås
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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


Upp
 Profil  
 
InläggPostat: 13.43 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
Tack. :tumupp:


Upp
 Profil  
 
InläggPostat: 13.44 2018-12-31 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23664
Ort: Kristinehamn
"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.


Upp
 Profil  
 
InläggPostat: 14.20 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
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.


Upp
 Profil  
 
InläggPostat: 14.29 2018-12-31 
EF Sponsor
Användarvisningsbild

Blev medlem: 22.54 2006-09-23
Inlägg: 31188
Ort: Borås
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
#ifndef FILNAMN_H
#define FILNAMN_H
extern int var;
#endif

Sedan inkluderar du filnamn.h i alla filer


Upp
 Profil  
 
InläggPostat: 15.06 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
Så i första c-filen ska man inte ha med extern
i deklarationen?


Upp
 Profil  
 
InläggPostat: 15.27 2018-12-31 
EF Sponsor
Användarvisningsbild

Blev medlem: 22.54 2006-09-23
Inlägg: 31188
Ort: Borås
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.


Upp
 Profil  
 
InläggPostat: 16.11 2018-12-31 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
Okej.


Upp
 Profil  
 
InläggPostat: 10.09 2019-01-10 

Blev medlem: 07.14 2007-04-11
Inlägg: 3807
Ort: En_stad
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
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å?


Upp
 Profil  
 
InläggPostat: 10.58 2019-01-10 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23664
Ort: Kristinehamn
volatile bytebits_union var1_un;


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 28 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010