www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Direktno naslavljanje bitov na I/O priključkih

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
silvanb
Član
Član



Pridružen-a: Sre 25 Sep 2013 8:36
Prispevkov: 34
Aktiv.: 0.24
Kraj: Solkan

PrispevekObjavljeno: Čet Nov 28, 2013 9:29 pm    Naslov sporočila:  Direktno naslavljanje bitov na I/O priključkih Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Čet Nov 28, 2013 9:39 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
silvanb
Član
Član



Pridružen-a: Sre 25 Sep 2013 8:36
Prispevkov: 34
Aktiv.: 0.24
Kraj: Solkan

PrispevekObjavljeno: Sob Nov 30, 2013 6:12 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Tomazp
Član
Član



Pridružen-a: Sob 02 Feb 2008 13:24
Prispevkov: 559
Aktiv.: 2.64
Kraj: Ljubljana

PrispevekObjavljeno: Sob Nov 30, 2013 6:55 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Sob Nov 30, 2013 7:07 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
silvanb
Član
Član



Pridružen-a: Sre 25 Sep 2013 8:36
Prispevkov: 34
Aktiv.: 0.24
Kraj: Solkan

PrispevekObjavljeno: Ned Dec 01, 2013 2:01 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Ned Dec 01, 2013 2:20 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.36

PrispevekObjavljeno: Ned Dec 01, 2013 9:10 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
silvanb
Član
Član



Pridružen-a: Sre 25 Sep 2013 8:36
Prispevkov: 34
Aktiv.: 0.24
Kraj: Solkan

PrispevekObjavljeno: Ned Dec 01, 2013 12:35 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tonko
Član
Član



Pridružen-a: Sob 25 Jun 2005 13:45
Prispevkov: 541
Aktiv.: 2.28
Kraj: Črnomelj

PrispevekObjavljeno: Pon Dec 02, 2013 8:50 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 8 dni


Powered by phpBB © 2001, 2005 phpBB Group