kapu48 írta:16 Bit széles I/O-ra akarok a 8 bitet 3 – 10 biteken forgalmazni úgy, hogy közben a többi Bits ne változzon!
Bocsi, de nagyon zavarja a szememet és úgy tűnik következetesen használod.
Magyarul 1 bit, 2 bit, 3 bit, 100 bit.
Olyan, h bit
s olyan csak angolul van.
Remélem nem sértettelek meg vele.
kapu48 írta:
Külön van input/output regiszter.
Részlet az adatlapból:
I / O port adatok nyilvántartása
Minden GPIO két 16-bites memória-térképezett adatnyilvántartások: input és output adatok nyilvántartása
(GPIOx_IDR és GPIOx_ODR).
GPIOx_ODR tárolja az adatokat a kimenetre, akkor az írási / olvasási hozzáférhető.
(GPIOx_IDR), Az adatbevitel keresztül az I / O tárolja az input adatok regisztrálj
(GPIOx_IDR), egy csak olvasható regiszter.
Ez a furcsa magyarságú szöveg valami webes fordítóból jött? Azt hiszem többet érnénk az eredeti, angol nyelvű verzióval.
Bocsi, h most csak ilyen fikázósnak tűnő dolgokat írtam...
kapu48 írta:
A fordító minden verziódat elfogadta!
Még szép

Nekem azt mondták az okosok, h legjobb
ANSI C-t használni, akkor bármilyen fordítóra átválthatunk mégis működőképes lesz.
kapu48 írta:
Most már csak ki kel választanom melyik a jó nekem?
Csúnya, ha azt mondom, h ezek közül egy sem?
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kapu48 írta:
A D port 3. bitjétől olvasok 8 bitet: __IO uint8_t glcd_add = GPIOD->IDR<< 3 & 0xff;
Mivel a bitenkénti és (
&) magasabb precedenciájú, mint a shiftelés (
<<), így először össze-és-eli a 3-mat és az FF-et, ami nem meglepő módon 3-mat ad eredményként, ennyi bittel eltolja az IDR értékét BALRA, azaz mexorozza 2^3 = 8-cal és ezt az értéket teszi bele a glcd_add nevű változódba, annak is a felső 5 bitjébe. Előtte azok a hettyenpittyek nem tudom mit csinálnak, talán szintaktikai hibát jeleznek, talán sorminták

(Azaz ide tök fölöslegesek, azok csak a változó deklarációnál kellenek.)
Esetleg ez lehet egy működő megoldás:
Bár akkor már ez olvashatóbb:
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kapu48 írta:
A D port 3. bitjétől írok 8 bitet: GPIOD->ODR<< 3 & 0xff = glcd_add;
Ez már valamivel jobb, legalább jó irányba shiftel

Az & FF értelmetlen benne és szintaktikailag sem helyes.
Kód: Egész kijelölése
GPIOD->ODR = (GPIOD->ODR & ~( 0xff << 3 )) | (glcd_add<<3);
~ bináris NOT, azaz minden bitet átfordít
0xff << 3 azt a 8 mező széles "ablakot" tolja be a helyére, tehát balra 3 bittel, ahová írni szeretnél
GPIOD->ODR & ~( 0xff << 3 ) az ODR eredeti tartalmából kitörli azt a 8 bitet, ahová írni fox, a többit maghagyja.
| bitenkéti OR, ez meg beteszi a kívánt 8 bitedet a helyére, megőrizvén az eredeti tartalmat.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kapu48 írta:
Vagy:
A D port 3. bitjétől olvasok 8 bitet: __IO uint8_t glcd_add = GPIOD->IDR<< (8+3) & 0xff;
Több helyen hibás. Magyarázatot és helyes verziót lásd följebb...
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kapu48 írta:
A D port 3. bitjétől írok 8 bitet: GPIOD->ODR<< 8+3 & 0xff = glcd_add;
Több helyen hibás. Magyarázatot és helyes verziót lásd följebb...
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kapu48 írta:
Melyik a jó?
Amiket én írtam
kapu48 írta:
A rotálás és maszkolás része még nem tiszta.
Igazából ez nem rotálás, hanem shiftelés (bit-eltolás).
A rotálásnál a kimenő bitet visszatesszük a másik oldalra. Shiftelésnél 0-k kerülnek be (illetve attól függ, h aritmetikai vagy logikai shiftelés, mert megőrizheti az előjelbitet is, de most ezzel ne foglalkozz).
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kapu48 írta:
Mi kerül a változóba, vagy a portra?
És a fennmaradó Biteken a soros I/O-k vannak azokat így nem piszkáljuk?
És nagyon köszönöm a segítséget!
Dúrtam a fenti doksikat de ilyen frappáns megoldást nem találtam.

Köszi
Ne izélgetésnek vedd, de SOKKAL jobban tudnál haladni ha valami C könyvön végigmennél és végig csinálnád a feladatokat.
ingyenes, online C kurzusok
magyarul