 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
silvanb Član

Pridružen-a: Sre 25 Sep 2013 8:36 Prispevkov: 34 Aktiv.: 0.24 Kraj: Solkan
|
Objavljeno: Čet Nov 28, 2013 9:29 pm Naslov sporočila: Direktno naslavljanje bitov na I/O priključkih |
|
|
Pred leti, ko sem se ukvarjal s PIC mikrokontrolerji, sem program pisal tako, da sem direktno manipuliral s posameznimi biti registrov. Na ta način je bil program preglednejši, sama asm koda pa se zaradi tega ni povečala. V header-ju sem si definiral makro, s pomočjo katerega sem enostavno deklariral spremenljivke. Navajam primer:
#define BITNUM(adr,bit) ((unsigned)(&adr)*8+(bit))
bit D7 @ BITNUM(PORTD,7);
bit D6 @ BITNUM(PORTD,6);
bit D5 @ BITNUM(PORTD,5);
bit D4 @ BITNUM(PORTD,4);
bit D3 @ BITNUM(PORTD,3);
bit D2 @ BITNUM(PORTD,2);
bit D1 @ BITNUM(PORTD,1);
bit D0 @ BITNUM(PORTD,0);
bit DATA @ BITNUM(PORTB,0);
bit CS @ BITNUM(PORTB,1);
Sedaj sem se pričel ukvarjati z ARM mikrokontrolerji (uporabljam uVision razvojno orodje) in žal ne vidim možnosti deklaracije spremenljivke dolžine enega bita. V programski kodi posledično ne morem uporabljati preglednih zapisov, kot kaže spodnji primer:
if (D0 == 1)
{
DATA = 1;
}
else
{
CS = 0;
}
Ali je mogoče kdo uspel najti kakšen trik, ki bi to omogočal? Uporabe klica funkcije ne pride v poštev, ker bo to upočasnilo delovanje programa.
Hvala za nasvete! _________________ Silvan |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Čet Nov 28, 2013 9:39 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
silvanb Član

Pridružen-a: Sre 25 Sep 2013 8:36 Prispevkov: 34 Aktiv.: 0.24 Kraj: Solkan
|
Objavljeno: Sob Nov 30, 2013 6:12 pm Naslov sporočila: |
|
|
Kroko hvala za nasvet. Hm, skoraj bolj elegantna se mi zdi rešitev z rabo mask ter operacijami AND in OR, ki je tudi najbolj razširjena. Je pa res, da se s strukturami zelo lepo parametre združuje v množice, kar se mi zdi zelo uporabno.
Če Keil-ov uVision prevajalnik primerjam s PICC (katerega sem uporabljal pri programiranju PIC mikrokontrolerjev), pri uVision zelo pogrešam funkcionalnost, ki bi omogočala deklaracijo spremenljivke tipa bit. Če bi imeli to možnost na voljo, bi bilo moč pisati kodo bolj pregledno, kar bi bilo v veliko pomoč pri razhroščevanju (debug-iranju). Pa tudi drug za drugim bi kodo lažje brali.
Ima mogoče še kdo kak predlog, komentar? _________________ Silvan |
|
Nazaj na vrh |
|
 |
Tomazp Član


Pridružen-a: Sob 02 Feb 2008 13:24 Prispevkov: 559 Aktiv.: 2.64 Kraj: Ljubljana
|
Objavljeno: Sob Nov 30, 2013 6:55 pm Naslov sporočila: |
|
|
Andrej, ali ni v zgornjem primeru ustreznejša uporaba pointerjev bob->bits... oz. to pri ARM ni potrebno? Šele dobro spoznavam ARM okolje. |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sob Nov 30, 2013 7:07 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
silvanb Član

Pridružen-a: Sre 25 Sep 2013 8:36 Prispevkov: 34 Aktiv.: 0.24 Kraj: Solkan
|
Objavljeno: Ned Dec 01, 2013 2:01 am Naslov sporočila: |
|
|
Jup, bit ni standardni tip spremenljivke v C-ju. Verjetno so pri CCS-ju uspeli narediti wrapper (v čarovnije ne verjamem), glej povezavo. _________________ Silvan |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Ned Dec 01, 2013 2:20 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Ned Dec 01, 2013 9:10 am Naslov sporočila: |
|
|
CCS ima precej take "magije", ki nima veze s C. MikroC je še večja žalost, pri tem ne vem niti to, zakaj ima C v nazivu.
V standardnem C lahko uporabiš bitna polja (kot je že Kroko dal primer), ali pa makroje za set/reset/test bita:
Koda: |
#define SET_BIT(adr,bit) ((adr)|=(1<<bit))
#define CLR_BIT(adr,bit) ((adr)&=~(1<<bit))
#define TEST_BIT(adr,bit) (!!((adr)&(1<<bit))) |
_________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
silvanb Član

Pridružen-a: Sre 25 Sep 2013 8:36 Prispevkov: 34 Aktiv.: 0.24 Kraj: Solkan
|
Objavljeno: Ned Dec 01, 2013 12:35 pm Naslov sporočila: |
|
|
Sam se trenutno poslužujem sledečega zapisa, ki je pogosto uporabljen v praksi; se mi zdi še najbolj pregleden:
Koda: |
#define O_Lcd_D4 (1 << 10) // Port 0
#define O_Lcd_D5 (1 << 11) // Port 0
#define O_Lcd_D6 (1 << 12) // Port 0
#define O_Lcd_D7 (1 << 13) // Port 0
IOPIN0 = (IOPIN0 | O_Lcd_D5 | O_Lcd_D4) // set bits
& ~(O_Lcd_D7 | O_Lcd_D6); // clear bits
|
_________________ Silvan |
|
Nazaj na vrh |
|
 |
tonko Član


Pridružen-a: Sob 25 Jun 2005 13:45 Prispevkov: 541 Aktiv.: 2.28 Kraj: Črnomelj
|
Objavljeno: Pon Dec 02, 2013 8:50 am Naslov sporočila: |
|
|
Kateri mikrokontroler ?
Pri LPC2148 gre tako:
#define SET_PIN_XX IOSET0 = 0x20000000 //SET OUTPUT PIN
#define CLR_PIN_XX IOCLR0 = 0x20000000 //CLR OUTPU PIN |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|