Deklarowanie zmiennych bitowych w AVR-GCC: Jak to osiągnąć?

Deklarowanie zmiennej "bitowej" w AVR-GCC





Poprzedni Następny
Wiadomość
Spis treści
From: "tomzor" <tzurek_at_nospam_poczta.onet.pl>
Subject: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Tue, 11 Feb 2003 07:25:02 +0100


W C dla 8051 mozna deklarowac zmienne bitowe np tak:

bdata unsigned char bMyByte; //bajt adresowany bitowo.
sbit jakas_zmienna = bMyByte ^ 0; //bit 0


a jak to zrobic to w AVR-GCC ?



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl>
Subject: Re: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Tue, 11 Feb 2003 09:24:40 +0100


Użytkownik "tomzor" <tzurek_at_nospam_poczta.onet.pl> napisał w wiadomości
news:b2a4un$gqs$1_at_nospam_news.onet.pl...
W C dla 8051 mozna deklarowac zmienne bitowe np tak:

bdata unsigned char bMyByte; //bajt adresowany bitowo.
sbit jakas_zmienna = bMyByte ^ 0; //bit 0


a jak to zrobic to w AVR-GCC ?


Zauważ, że rodzina '51 obsługuje wprost zmienne bitowe. AVR mają tylko
obszar RAM bajtowy, więc pozostaje sztuczka typu.

unsigned char zmienne_bitowe;

#define bit_0 0
#define bit_1 1
.
.
.
#define bit_7 7
..

a w programie, np;

if(zmienne_bitowe& (1<< bit_7) {

}

ustawianie bitu:
zmienne_bitowe|= 1<< bit_7;

kasowanie:
zmienne_bitowe&= 1<< bit_7;

zmiana na przeciwny:
zmienne_bitowe^= 1<< bit_7;

można wszystko robić oczywiście hurtem:
zmienne_bitowe|= (1<< bit_7) + (1<< bit_1) + (1<< bit_0);



--
Pozdrawiam
Bartosz Sarama



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "tomzor" <tzurek_at_nospam_poczta.onet.pl>
Subject: Re: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Tue, 11 Feb 2003 10:22:53 +0100


dzieki



Użytkownik "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl> napisał w
wiadomości news:b2ac3u$2ri$1_at_nospam_news.onet.pl...
Użytkownik "tomzor" <tzurek_at_nospam_poczta.onet.pl> napisał w wiadomości
news:b2a4un$gqs$1_at_nospam_news.onet.pl...
W C dla 8051 mozna deklarowac zmienne bitowe np tak:

bdata unsigned char bMyByte; //bajt adresowany bitowo.
sbit jakas_zmienna = bMyByte ^ 0; //bit 0


a jak to zrobic to w AVR-GCC ?


Zauważ, że rodzina '51 obsługuje wprost zmienne bitowe. AVR mają tylko
obszar RAM bajtowy, więc pozostaje sztuczka typu.

unsigned char zmienne_bitowe;

#define bit_0 0
#define bit_1 1
.
.
.
#define bit_7 7
..

a w programie, np;

if(zmienne_bitowe& (1<< bit_7) {

}

ustawianie bitu:
zmienne_bitowe|= 1<< bit_7;

kasowanie:
zmienne_bitowe&= 1<< bit_7;

zmiana na przeciwny:
zmienne_bitowe^= 1<< bit_7;

można wszystko robić oczywiście hurtem:
zmienne_bitowe|= (1<< bit_7) + (1<< bit_1) + (1<< bit_0);



--
> Pozdrawiam
> Bartosz Sarama
>
>



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jerzy Szczesiul" <jerzy.szczesiul_at_nospam_ep.com.pl>
Subject: Re: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Tue, 11 Feb 2003 10:28:12 +0100


Czesc

Użytkownik "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl> napisał w
wiadomości news:b2ac3u$2ri$1_at_nospam_news.onet.pl...
Zauważ, że rodzina '51 obsługuje wprost zmienne bitowe. AVR mają tylko
obszar RAM bajtowy, więc pozostaje sztuczka typu.

unsigned char zmienne_bitowe;

#define bit_0 0
#define bit_1 1
.
.
.
#define bit_7 7
..

a w programie, np;

if(zmienne_bitowe& (1<< bit_7) {


Kompilator potrafi to znacznie ulatwic. Proponuje
plik naglowkowy na deklaracje i tam m.in.:

**********
typedef unsigned int uint;
typedef unsigned char uchar;

typedef struct
{
uchar Flag1:1;
uchar Flag2:1;
uchar Flag3:1;
uchar Flag4:1;
uchar Flag5:1;
uchar Flag6:1;
uchar Flag7:1;
uchar Flag8:1;
} FlagBits;

typedef union
{
FlagBits Bits;
uchar Byte;
} Flags;

#ifdef MODMAIN
volatile Flags SysFlags;
#else
extern volatile Flags SysFlags;
#endif

#define MS100FLAG SysFlags.Bits.Flag1
#define I2C_BUSY SysFlags.Bits.Flag2
#define PWM_DIR SysFlags.Bits.Flag3

***********
Potem uzywasz juz te flagi normalnie np.
if (MS100FLAG)
{
MS100FLAG = 0;
.................... itd.

( i nie ma zadnych kombinacji - kompilator wypuszcza
optymalizowany asm : np. dla MS100FLAG =0;
mamy ( adres abs zero bo to z pliku relokowalnego )

MS100FLAG = 0;
30: 80 91 00 00 lds r24, 0x0000
34: 8e 7f andi r24, 0xFE ; 254
36: 80 93 00 00 sts 0x0000, r24

czyli sam lepiej nie zrobisz :-)

Natomiast dostep do calego bajtu ( np.dla zerowania
calosci lub wstepnego ustawienia ) masz przez tu przez
SysFlags.Byte

Plik danych / typow *.h
dolaczasz do wszystkich plikow projektu,
w pliku main() definiujac wczesniej MODMAIN
zmiennych globalnych


--
Pozdrowienia
Jurek Szczesiul


========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!news.internetia.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl>
Subject: Re: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Tue, 11 Feb 2003 10:34:10 +0100


Użytkownik "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl> napisał w
wiadomości news:b2ac3u$2ri$1_at_nospam_news.onet.pl...

Autopoprawka

kasowanie:
zmienne_bitowe&= 1<< bit_7;

powinno być oczywiście
zmienne_bitowe&= ~(1<< bit_7);

oraz odpowiednio kasowanie hurtowo:
zmienne_bitowe&= ~((1<< bit_7) + (1<< bit_1) + (1<< bit_0));


--
Pozdrawiam
Bartosz Sarama



========
Newsgroups: pl.misc.elektronika
Subject: Re: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Tue, 11 Feb 2003 19:41:48 +0100
Lines: 16
References: <b2a4un$gqs$1_at_nospam_news.onet.pl> <b2ac3u$2ri$1_at_nospam_news.onet.pl>
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-2
Content-Transfer-Encoding: 8BIT
X-Trace: localhost.localdomain 1044988908 1811 127.0.0.1 (11 Feb 2003 18:41:48 GMT)
NNTP-Posting-Date: Tue, 11 Feb 2003 18:41:48 +0000 (UTC)
In-Reply-To: <b2ac3u$2ri$1_at_nospam_news.onet.pl

Poprzedni Następny
Wiadomość
Spis treści
From: Artur Lipowski <lal_at_nospam_pro.onet.pl>
Subject: Re: Deklarowanie zmiennej "bitowej" w AVR-GCC
Date: Wed, 12 Feb 2003 10:55:14 +0000 (UTC)


In article <b2a4un$gqs$1_at_nospam_news.onet.pl>, tomzor wrote:
W C dla 8051 mozna deklarowac zmienne bitowe np tak:

bdata unsigned char bMyByte; //bajt adresowany bitowo.
sbit jakas_zmienna = bMyByte ^ 0; //bit 0


a jak to zrobic to w AVR-GCC ?

Tak jak już napisano struktura bitowa + unia i masz bardzo łatwy dostęp bez
zabawy z przesuwaniem (<<).
Co więcej masz szansę dostać dosyć efektywny kod bo zwykle udaje się to
zoptymalizować do zmiennych rejestrowcyh i tam jest już dostęp bitowy.

BTW. W AVR-GCC (avr-libc) przyjęło się używać makra _BV(któryś_bit) zamiast
(1 << któryś_bit).

Pozdrawiam,
--
Artur Lipowski

========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai