/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
WinAVR, AtmelAVR og PORT enkelt ben
Fra : Ukendt


Dato : 15-12-04 17:16

Hej ?

Er der nogen der ved, om det kan lade sige gøre at skrive (altså noget
compiler-bart) der kan sætte en port ben høj/lav?

Jeg har tidligere brugt CodeVisionAVR hvor følgende har kunne lade sig gøre:

PORTB.1 = 0; //sætter Port B bit 1 lav

I WinAVR er det så vidt jeg kan se nødvendigt at AND'e eller OR'e med hele
portens værdi:

PORTB |= 1<<2; //sætter Port B bit 1 høj

Er det virkelig nødvendigt at skrive det således i WinAVR?

Mvh Jens Rauff



 
 
Bertel Brander (15-12-2004)
Kommentar
Fra : Bertel Brander


Dato : 15-12-04 20:17

Jens Rauff wrote:
> Hej ?
>
> Er der nogen der ved, om det kan lade sige gøre at skrive (altså noget
> compiler-bart) der kan sætte en port ben høj/lav?
>
> Jeg har tidligere brugt CodeVisionAVR hvor følgende har kunne lade sig gøre:
>
> PORTB.1 = 0; //sætter Port B bit 1 lav
>
> I WinAVR er det så vidt jeg kan se nødvendigt at AND'e eller OR'e med hele
> portens værdi:
>
> PORTB |= 1<<2; //sætter Port B bit 1 høj
>
> Er det virkelig nødvendigt at skrive det således i WinAVR?

På nogle processorer kan man lave noget i stil med:

typedef struct
{
unsigned int P0 : 1;
unsigned int P1 : 1;
unsigned int P2 : 1;
unsigned int P3 : 1;
unsigned int P4 : 1;
unsigned int P5 : 1;
unsigned int P6 : 1;
unsigned int P7 : 1;
}PortStruct;

#define PortB (*(PortStruct *)0x1234)

int main()
{
PortB.P0 = 1;
return 0;
}

Du skal selv finde addressen på porten og erstatte 0x1234 med
den rigtige addresse.
Du kan måske også erstatte 0x1234 med &PORTB

/b
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Troels Thomsen (17-12-2004)
Kommentar
Fra : Troels Thomsen


Dato : 17-12-04 16:59


Min iom128.h gør (vha nogle makroer i iomakro.h) at jeg kan skrive

PORTB_Bit7 = 1;

Hvis du har en anden version af compilerern skal du måske skrive
PORTB_PORTB7 = 1. Kig i din headerfil.

For de interesserede / til inspiration for præprocessorinteresserede:


***************************************************************************/
* SFR_B(AVR, 0x1F)
* Expands to:
* __io union {
* unsigned char AVR; // The sfrb as 1 byte
* struct { // The sfrb as 8 bits
* unsigned char AVR_Bit0:1,
* AVR_Bit1:1,
* AVR_Bit2:1,
* AVR_Bit3:1,
* AVR_Bit4:1,
* AVR_Bit5:1,
* AVR_Bit6:1,
* AVR_Bit7:1;
* };
* } @ 0x1F;
* Examples of how to use the expanded result:
* AVR |= (1<<5);
* or like this:
* AVR_Bit5 = 1;

***************************************************************************/

Her er makroerne, ( der skal læses bagfra, fordi de bruger hinanden)

#define __BYTEBITS(_NAME,_A,_B,_C,_D,_E,_F,_G,_H) \
unsigned char _NAME ## _ ## _A:1, \
_NAME ## _ ## _B:1, \
_NAME ## _ ## _C:1, \
_NAME ## _ ## _D:1, \
_NAME ## _ ## _E:1, \
_NAME ## _ ## _F:1, \
_NAME ## _ ## _G:1, \
_NAME ## _ ## _H:1;

#define SFR_B_BITS(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H) \
__io union { \
unsigned char _NAME; /* The sfrb as 1 byte */ \
struct { /* The sfrb as 8 bits */ \
__BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \
}; \
} @ _ADDR;

#define SFR_B(_NAME, _ADDR) SFR_B_BITS(_NAME, _ADDR, \
Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)


"Jens Rauff" <jensrauff hos tiscali punktum dk> skrev i en meddelelse
news:41c0631f$0$239$edfadb0f@dread12.news.tele.dk...
> Hej ?
>
> Er der nogen der ved, om det kan lade sige gøre at skrive (altså noget
> compiler-bart) der kan sætte en port ben høj/lav?
>
> Jeg har tidligere brugt CodeVisionAVR hvor følgende har kunne lade sig
gøre:
>
> PORTB.1 = 0; //sætter Port B bit 1 lav
>
> I WinAVR er det så vidt jeg kan se nødvendigt at AND'e eller OR'e med hele
> portens værdi:
>
> PORTB |= 1<<2; //sætter Port B bit 1 høj
>
> Er det virkelig nødvendigt at skrive det således i WinAVR?
>
> Mvh Jens Rauff
>
>



JohnK (08-02-2005)
Kommentar
Fra : JohnK


Dato : 08-02-05 22:53



> Er der nogen der ved, om det kan lade sige gøre at skrive (altså noget
> compiler-bart) der kan sætte en port ben høj/lav?
>

se desuden i sfr_defs.h

jeg bruger nedenstående ... da dette gør koden mere porterbar.

//------------ Programmers lazy corner --------------------------
#define TOGGLEBIT(flagaddr,pos) if(bit_is_set(flagaddr,pos)){ \
cbi(flagaddr,pos);} \
else {sbi(flagaddr,pos);}

#define SETBIT(var, bitno) sbi(var,bitno); //bitno 0..7
#define CLRBIT(var, bitno) cbi(var,bitno); //bitno 0..7


Omkring AVR ... ville jeg nok se mere på www.avrfreaks.net

rg,
johnk



Søg
Reklame
Statistik
Spørgsmål : 177453
Tips : 31962
Nyheder : 719565
Indlæg : 6408143
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste