Deklarowanie zmiennych bitowych w AVR-GCC: Jak to osiągnąć?
Deklarowanie zmiennej "bitowej" w AVR-GCC
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
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
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
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
- to pozwala uniknac przepisywania wszedzie
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
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
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