Elektronika.lt
 2025 m. gruodžio 24 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

Elektronika.lt portalo forumas

Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo. Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.

Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius, kurie nesilaiko forumo taisyklių. Pastebėjus nusižengimus, prašome pranešti.

Dabar yra 2025 12 24, 01:33. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » Kokį kompiliatorių naudojate ?
Jūs negalite rašyti naujų pranešimų į šį forumą
Jūs negalite atsakinėti į pranešimus šiame forume
Jūs negalite redaguoti savo pranešimų šiame forume
Jūs negalite ištrinti savo pranešimų šiame forume
Jūs negalite dalyvauti apklausose šiame forume
 
  
Puslapis 23
Pereiti prie Atgal  1, 2, 3  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 26, 17:53 Pranešti apie taisyklių pažeidimą Atsakyti su citata
degama
Naujokas
Naujokas
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
Be abejo, kai programos eigoje reikia keisti parametrus, toks užrašymas
UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);
yra akivaizdesnis. Jį ir aš dabar stengiuosi naudot.

Bet daugelio registrų reikšmių keisti netenka, kitiems vistiek reikia surašyti pradines reikšmes. Čia ir pasitarnauja tas "blogasis" codevision kodo generatorius. Jo lange paprasčiausiai sužymi varneles ar pasirenki iš galimų variantų. Tai dar aiškiau, ir datasheet esmė prieš nosį.

Be to, jei neklystu UCSR0B = 0x18 sukompiliavus flash'e užims mažiau vietos nei pirmasis užrašymas.
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 26, 18:13 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
degama rašo:
Be to, jei neklystu UCSR0B = 0x18 sukompiliavus flash'e užims mažiau vietos nei pirmasis užrašymas.


Flashe vietos betkuriuo metodu parasius jis uzims lygiai 0. Ar zinai kodel?

EDIT:
reiktu man patikslint. Jei ziurim i tai, kaip programa yra store'inama flashe, tada betkokiu atveju (kad ir kaip tu ta priskyrima parashysi), po transliatoriaus viskas vistiek verciama i ASM ir uzims lygiai tiek pat.
Jei kalbam apie uzimama vieta programos veikimo metu, tai registrai yra atskirai nuo flasho ir tokiu atveju ta priskirta reiksme flashe nieko neuzima.


Paskutinį kartą redagavo Socrates, 2011 06 26, 20:38. Redaguota 1 kartą
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 26, 20:24 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Edzma
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Tai kad cia tik registro nustatymai....
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 26, 22:22 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
besigincydami kas geriau pamirsote _VB(), kas kiek sumazina bardaka, bet cia vienbitems reiksmems, o kai nustatomos keliu bitu reiksmes tai keiksmazodis tas (1<<xyz)
nezinau kodel uCU c kalboje neaudojamos tokios union konstrukciojs kaip b: x[,y]
tada reikiama reiksme nurodoma tiesiog .b=x ???
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 26, 22:37 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL rašo:
besigincydami kas geriau pamirsote _VB(), kas kiek sumazina bardaka, bet cia vienbitems reiksmems, o kai nustatomos keliu bitu reiksmes tai keiksmazodis tas (1<<xyz)
nezinau kodel uCU c kalboje neaudojamos tokios union konstrukciojs kaip b: x[,y]
tada reikiama reiksme nurodoma tiesiog .b=x ???


briedas kazkoks tokios macro ir isvis jas reiktu panaikint.
O del antro teiginio, tai siulau pasidometi strukturomis.
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 26, 22:49 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
as kaip tik apie ta pati, tik klausiu kodel ju niekas nenaudoja, o naudoja iskrypeliskas mazochistines nesamones?
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 01:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Dreifas
Moderatorius
Moderatorius
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje ICQ numeris
WinAVR ir kiti AVR GCC toolsai naudoja AVRLibc paketą, kur visi registrai yra nurodomi kaip paprasti C kintamieji naudojant makro komandas
PVZ:

Kodas:
#define DDRD (*(volatile uint8_t *)(0x2A))


Tad automatiškai reikėtų perkonfigūruoti AVRLIBC į kitokią strukūrą, kur būtų naudojami union su bit packed struktūromis. Kaip suprantu union su packed bit field struktūromis negali būti pririšami prie hardwaro dėl to kad nukenčia programos portabilumas. Kitas svarus argumentas, naudojant shift (<<) operatorių galima manipuliuoti iš karto keletu bitų registre. Naudojant packet bit struktūras galima manipuliuoti tik vienu bitu vienu metu.
Įdomumo dėlei sumečiau programėlę kur naudoja packed bitfield struktūrą kreipimuisi i registro bitus:

Kodas:
#include <avr/io.h>
//union struktura DDRD registrui
typedef union DDRD_u {
   //visas baitas
  uint8_t u8byte;
  //bit-field struktura
  struct {
    uint8_t B0 :1;
    uint8_t B1 :1;
    uint8_t B2 :1;
    uint8_t B3 :1;
    uint8_t B4 :1;
    uint8_t B5 :1;
    uint8_t B6 :1;
    uint8_t B7 :1;
  };
} DDRD_u;
//io address + offset = memory address
#define DDRDu (*(volatile DDRD_u *) (0x0A+0x20))
//Iprasta bitu nustatymo forma
void InitPortShift(void)
{
//Pinai PB0,PB1,PB2, PB3 - output (shift)
DDRD|=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
}
void InitPortPacket(void)
{
//Pinai PB0,PB1,PB2,PB3 - output (bitfield)
DDRDu.B0=1;
DDRDu.B1=1;
DDRDu.B2=1;
DDRDu.B3=1;
}

int main(void)
{
InitPortShift();
InitPortPacket();
   while(1)
   {
      //loop
   }
}


Žiūrim i .lss failą:
funkcija
Kodas:
void InitPortShift(void)
{
//Pinai PB0,PB1,PB2, PB3 - output (shift)
DDRD|=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
}

kompilioujasi i:
Kodas:
in   r24, 0x0a
ori   r24, 0x0F
out   0x0a, r24

t.y. nuskaito porto reikšmę, OR su nustatymo reikšme ir vėl įrašoma į registrą. Visi bitai preprocesoriaus yra automatiškai sudedami į vieną kintamąjį.

Sekanti funkcija:
Kodas:
void InitPortPacket(void)
{
//Pinai PB0,PB1,PB2,PB3 - output (bitfield)
DDRDu.B0=1;
DDRDu.B1=1;
DDRDu.B2=1;
DDRDu.B3=1;
}

kompiliuojasi į:
Kodas:
sbi   0x0a, 0
sbi   0x0a, 1
sbi   0x0a, 2
sbi   0x0a, 3

čia matome, jog kiekvienam bitui nustatyti ir naudojama atskira ASM komanda.
Taigi norint nustaty registro bitų reikšmes naudojant poslinkio metodą norint išsaugoti nenaudojamus bitus (OR operacija) reikia 3 ASM komandų arba trijų MCU taktų.
Naudojant packed bit field struktūrą kievieno bito nustatymui turime rašyti atskirą eilutę. kiekviena eilutė - po vieną papildomą SBI ASM komandą.
Bet kaip minėjau standartiškai AVRLIBC nėra pritaikytas supakuotų bitų struktūroms - tad norint jas naudoti tenka apsirašyti jas patiems.
GCC yra optimizuota bitų nustatymui naudojant postūmį (<<), nematau problemos naudoti ją - nebent tikrai kai kam atrodo tai mazohizmas.
Kadangi iškyla kodo portabilumo klausimai, yra nerekomenduojama naudoti bitfield truktūrų pririšimui prie hardware. Visai kita kalba taupant atmintį naudoti jas saugant įvairias flag reikšmes ir pan.
P.S. beje Algi - įdomią temą užkabinai Wink Panaršęs, pabandžiau sudėlioti viską į savo vietas. Tikiuosi nepersistengiau ir nenuvažiavau į lankas.
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 07:27 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
kaip cia pasakius, tuo atveju, kai dalis porto yra output, dalis input, o kita dalis Z, tada sbi ir cbi yra geresnis sprendimas viena bita majacint nei in/logine operacija/out, juolab tarp in ir out gali ivykti nevienas interrupt, kuris bandys pakeist to paties porto bitus Very Happy
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 17:44 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL rašo:
kaip cia pasakius, tuo atveju, kai dalis porto yra output, dalis input, o kita dalis Z, tada sbi ir cbi yra geresnis sprendimas viena bita majacint nei in/logine operacija/out, juolab tarp in ir out gali ivykti nevienas interrupt, kuris bandys pakeist to paties porto bitus Very Happy


O kaip AVR'e Z busena isstatoma? Smile
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 19:24 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
DDRx nustacius reikiama bita i "1"
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 21:15 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL rašo:
DDRx nustacius reikiama bita i "1"


DDRx nustacius i 1 gausi prievada kaip OUTPUT ir ten niekaip nepadarysi Z busenos. Is esmes Z busena teisingiausiai butu input with weak pull-up, tokiu atveju isivaizduoju turetu but DDRx=0, PORTx=1.
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 22:39 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Z busena gaunama irasius I PORT ir DDR nulius jei PORT bus vienetas kai DDR 0 tai tada turesim pullup.


beje del namipuliavimo bitais reikia nepamirsti kad asamblerio SBI/CBI komanda naudoja 2 ciklus kai PORT komanda naudoja viena cikla.

tai jei svarbu greitis geriau atskiru bitu neadresuoti.
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 27, 23:36 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
su AVR tik pradedu, gal susimaisiau del DDRx reiksmes (specialiai pazejau datasytan, tikrai 1 out), o sbi/cbi ir turi du ciklus sunaudot, nes realiai skaito DDRx i ALU, keicia bita ir tik tada iraso atgal. kiek kitaip yra su AVR32 branduoliu, kiek paskaitinejau, ten galima adresuoti ir tik bitus.
PORT komandu rinkinys pakeisti reikiama reiksme uzima ne 1 takta, o visus tris, nes pradzioj nuskaitoma porto reiksme registran, veliau atliekama manipuliacija ir tik veliau irasoma i porta. taigis sbi/cbi vistiek laimi 1 cikla ir kas svarbiausia - nepertraukiama interrupto, kai kitokios manipuliacijos neteisingai programuojant labai netgi gali sukelti kolizijas.
del viso kito ginco, tai priklauso nuo kompiliatoriaus optimizacijos ir jei kompiliatorius nera bukas, tai esant ijungtai optimizacijai sugebetu viska suvesti ir i ta pati pavojinga in/manipulate/out arba sbi/cbi, priklausomai kas greiciau, trumpiau ir t.t.
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 28, 02:21 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
sakykim mes norim sigeneruoti koki nors impulsa, tai

jei naudosin SBI/CBI
eikes 4 taktu

bet jei naudosim PORT komanda tai nes galim pirma isirasyti norimus varisntus i registrus.


sakykim

a=PINA;
b=A | 1;

while{
PORTA=a;
PORTA=b;
}

veiks beveik dvigubiai greiciau
 Kokį kompiliatorių naudojate ?
PranešimasParašytas: 2011 06 28, 07:16 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
cia irgi logiska, bet jei reiktu reaguoti pertraukime ir reiktu kuo maziau veluoti, tai velgi laimi sbi/cbi. nuo situacijos tai priklauso ir kaip optimizuoja kompiliatorius.
taip jau nusistovejo, kad mikrovaldikliu softe bitus skaiciuoja pagal poslinkiu skaiciu norimai maskei gauti, o ne kaip visam normaliam pasaulyje iskarto gatava maske.
jei seniau bit7=0b10000000, tai dabar bit7=7, nors jei atliktum a!=bit7 be << tai gautum visai kitoki rezultata, bet taip jau nutare tie, kurie rase pradines bibliotekas mikrovaldikliams ir viskas. aisku galima apsirasyt savaip ir gaut elegantiskesni koda, bet jau tie autoriai nemokejo ar tingejo isnaudoti ENUM operatoriu visais imanomais budais.
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie Atgal  1, 2, 3  Toliau
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Full feature custom PCB prototype service

Sveiki ir ekologiški maisto produktai

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

„Mokslo sriuba“

www.matuok.lt - Interneto spartos matavimo sistema

Programuotojas Tautvydas – interneto svetainių-sistemų kūrimas

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

Draugiškas internetas

FS25 Tractors
Farming Simulator 25 Mods, FS25 Maps, FS25 Trucks
ETS2 Mods
ETS2 Trucks, ETS2 Bus, Euro Truck Simulator 2 Mods
FS22 Tractors
Farming Simulator 22 Mods, FS22 Maps, FS25 Mods
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija
FS25 Mods
FS25 Maps, FS25 Cheats, FS25 Install Mods
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps
ATS Trailers
American Truck Simulator Mods, ATS Trucks, ATS Maps
Must have farming mods
Farming simulator modhub, Best farming simulator mods
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Ets2 mods, Ats mods, Beamng drive mods
allmods.net
„MokslasPlius“ – mokslui skirtų svetainių portalas
www.mokslasplius.lt
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
LTV.LT – lietuviškų tinklalapių vitrina
www.ltv.lt/technologijos/
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
Mokslo festivalis „Erdvėlaivis žemė“
www.mokslofestivalis.eu
Reklama


Reklama