převod port bitů na číslo PIC18F14k22

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

převod port bitů na číslo PIC18F14k22

#1 Příspěvek 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 ... :oops:

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#2 Příspěvek 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.
Naposledy upravil(a) forbidden dne 24 dub 2015, 11:03, celkem upraveno 1 x.

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#3 Příspěvek od Ladin »

Pro tebe asi blbej dotaz, ale mohl by si upřesnit to naládování jak to napsat? Díky

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#4 Příspěvek 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.

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#5 Příspěvek od Ladin »

Teoreticky bych to jak píšeš i zvládnul, ale prakticky :D .. 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?

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#6 Příspěvek 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.

Uživatelský avatar
dreamer
Příspěvky: 380
Registrován: 22 říj 2014, 02:00

#7 Příspěvek 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

Uživatelský avatar
Jirka525
Příspěvky: 325
Registrován: 22 kvě 2013, 02:00
Bydliště: Psáry JN79GW

#8 Příspěvek 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;
Jirka

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#9 Příspěvek 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?

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#10 Příspěvek 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);

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#11 Příspěvek 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

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#12 Příspěvek od Ladin »

rnbw: jo tak to už vyzerá dobře, jdu to vyzkoušet 8-)

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#13 Příspěvek 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?

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#14 Příspěvek od rnbw »

Ano, tak nejako.

Uživatelský avatar
Jirka525
Příspěvky: 325
Registrován: 22 kvě 2013, 02:00
Bydliště: Psáry JN79GW

#15 Příspěvek 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
Jirka

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“