Stránka 1 z 2
převod port bitů na číslo PIC18F14k22
Napsal: 24 dub 2015, 10:50
od Ladin
Ahoj, prosím o radu, mám 2 pici 18F14K22, jeden používám jako řadič displeje, druhý pak jako rychlý odečet hodnot pro zobrazení (hodnota 0 až 360). Potřebuji z toho druhého do prvního posílat okamžitou hodnotu čísla 0 až 360, rozhodl jsem se vytvořit takový buffer pomocí devíti společných I/O vstupů(výstupů). Do 9 se vejde hodnota 0 až 512. No a teď problém jak napsat něco, co převede hodnotu 9 náhodných pinů (C7 je použito pro SPI, nelze použít celý PORTC) do jednoho čísla.
Představa:
Kód: Vybrat vše
int cislo = {LATAbits.LATA0, LATAbits.LATA1, LATAbits.LATA2, LATCbits.LATC0, LATCbits.LATC1, LATCbits.LATC2, LATCbits.LATC3, LATCbits.LATC4, LATCbits.LATC5};
Předem díky za trpělivost, mám dost velké mezery v C ...

Napsal: 24 dub 2015, 10:57
od forbidden
Naláduješ těch 8 bitů do jednoho bajtu a pak otestuješ ten devátej, když bude 1, tak přičteš k těm osmi 256.
Napsal: 24 dub 2015, 10:59
od Ladin
Pro tebe asi blbej dotaz, ale mohl by si upřesnit to naládování jak to napsat? Díky
Napsal: 24 dub 2015, 11:05
od forbidden
Přičteš 256, sorry. V Cčku to neumím, píšu v assembleru. Principiálně tak, že otestuješ jednotlivý bity a na základě výsledku zapíšeš na příslušnou pozici do toho výslednýho bajtu.
Napsal: 24 dub 2015, 11:10
od Ladin
Teoreticky bych to jak píšeš i zvládnul, ale prakticky

.. právě, že zatím v Céčku nechápu jak přiřazovat (měnit) proměnným jednotlivé bity, umí to někdo?
Napsal: 24 dub 2015, 11:22
od forbidden
Já se v Cčku taky furt nějak plácám, ale asi bych to dělal pomocí logických operací. Třeba logickej součet neznámýho čísla s maskou třeba 1111 0111. Pokud bude výsledek 1111 1111, tak tam byla jednička, pokud ne, tak nula.
Podívej se třeba
sem.
Napsal: 24 dub 2015, 11:22
od dreamer
No a co takhle:
Nastavit proměnnou na 0
Otestovat nejnižší bit - je-li 1 přičíst jedna.
Otestovat další, je-li 1 přičíst 2.
Další bit 4, 8, atd
atd až k tomu devátému bitu
Napsal: 24 dub 2015, 11:26
od Jirka525
Předpokládám, že tě zajímá jak rozložit (složit) int na dva char a obráceně.
//rozloží int na 2 char
char ch_l,ch_h;
int cislo;
ch_l = cislo & 0xff;
ch_h = (cislo>>8) & 1;
//slozit ze dvou char int
cislo = ch_h*256 + ch_l;
Napsal: 24 dub 2015, 11:50
od Ladin
forbidden: no to je taky možnost, já zase dělal v basicu a tam je to jednoduchý, prostě napíšu,
že w10 = bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8, v céčku bych rád zjistil nejrychlejší možnost, jak přiřadit bity bajtům, takže pomocí maskování a vyhodnocování každého bitu to budu řešit až když zjistím, že to jinak nejde...
dreamer: to už je asi rychlejší, ale pořád mám pocit, že to snad musí jít jednodušejc, ta informace tam je, přece to musí jít napsat přímo...
jirka: to se už blíží tomu co myslím, teď ještě jak dvoum charum přiřadit jednotlivé bity?
něco jako char bajt[0] = 1; bajt[1] = 0; bajt[2] = 1; .... atd ...to nejde?
Napsal: 24 dub 2015, 12:00
od rnbw
Ladin píše:Představa:
Kód: Vybrat vše
int cislo = {LATAbits.LATA0, LATAbits.LATA1, LATAbits.LATA2, LATCbits.LATC0, LATCbits.LATC1, LATCbits.LATC2, LATCbits.LATC3, LATCbits.LATC4, LATCbits.LATC5};
Napriklad (neviem, ako presne to mas zapojene - ktore bity maju najvyssiu vahu):
Kód: Vybrat vše
int cislo = (LATC & 0b111111) << 3 | (LATA & 0b111);
alebo v hexa:
Kód: Vybrat vše
int cislo = (LATC & 0x3f) << 3 | (LATA & 0x07);
Napsal: 24 dub 2015, 12:01
od Ladin
nebo jinak...
mám 16 pinů překlopených na 5V (1111111111111111),
unsigned int cislo je hodnota 0 až 65525 takže cislo by mělo být 0b1111111111111111 nebo také 0xFFFF...
a teď se 16 pinů přepne na (0000111100001111) což je 3855
a chci aby cislo = 3855
Napsal: 24 dub 2015, 12:04
od Ladin
rnbw: jo tak to už vyzerá dobře, jdu to vyzkoušet

Napsal: 24 dub 2015, 12:17
od Ladin
Kód: Vybrat vše
int cislo = (LATC & 0b111111) << 3 | (LATA & 0b111);
to mi přijde jako to pravé, ale abych to mohl použít musím to pochopit..
Jak to chápu:
int cislo =(LATC & 0b111111) .... priradi prvnich 6bitu z portuC do cisla
<< 3 .... posune bity o tri pozice doleva (jako ze uvolni misto pro dalsi tri?)
| (LATA & 0b111) .... pricte na zacatek tri bity z portu A
je to tak spravne?
Napsal: 24 dub 2015, 12:27
od rnbw
Ano, tak nejako.
Napsal: 24 dub 2015, 12:38
od Jirka525
Domníval jsem se že bity už máš uspořádané. Ten můj předchozí příklad zapíše bit0 - bit7 proměnné cislo do bitu0 - bitu7 proměnné ch_l, bit9 proměnné číslo do bit0 proměnné ch_h
Ladin píše:
něco jako char bajt[0] = 1; bajt[1] = 0; bajt[2] = 1; .... atd ...to nejde?
Jde to ale je to trošku komplikovanější. Nemůžeš použít jednoduchý přiřazovací příkaz, musí se dělat to pomocí log. operací
//vložení bitu 3 z ch1 do bitu 5 ch2
char ch1, ch2, pom;
pom = ch1 & 8; //separovani bitu 3
ch2 &= 0xdf; //vynulovani bitu 5
ch2 |= (pom1 << 2); //nastaveni bitu 5
Ale zkušení céckaři by to asi zvládli efektivněji