Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

převod port bitů na číslo PIC18F14k22
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 9:50    Předmět: převod port bitů na číslo PIC18F14k22 Citovat

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:

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 ... Embarassed
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8964
Bydliště: Brno (JN89GF)

PříspěvekZaslal: pá duben 24 2015, 9:57    Předmět: Citovat

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 forbidden dne pá duben 24 2015, 10:03, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 9:59    Předmět: Citovat

Pro tebe asi blbej dotaz, ale mohl by si upřesnit to naládování jak to napsat? Díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8964
Bydliště: Brno (JN89GF)

PříspěvekZaslal: pá duben 24 2015, 10:05    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 10:10    Předmět: Citovat

Teoreticky bych to jak píšeš i zvládnul, ale prakticky Very Happy .. 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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8964
Bydliště: Brno (JN89GF)

PříspěvekZaslal: pá duben 24 2015, 10:22    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
dreamer



Založen: Oct 22, 2014
Příspěvky: 383

PříspěvekZaslal: pá duben 24 2015, 10:22    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jirka525



Založen: May 22, 2013
Příspěvky: 325
Bydliště: Psáry JN79GW

PříspěvekZaslal: pá duben 24 2015, 10:26    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 10:50    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 33751
Bydliště: Bratislava

PříspěvekZaslal: pá duben 24 2015, 11:00    Předmět: Citovat

Ladin napsal(a):

Představa:
kód:

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:
int cislo = (LATC & 0b111111) << 3 | (LATA & 0b111);

alebo v hexa:
kód:
int cislo = (LATC & 0x3f) << 3 | (LATA & 0x07);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 11:01    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 11:04    Předmět: Citovat

rnbw: jo tak to už vyzerá dobře, jdu to vyzkoušet Cool
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladin



Založen: Apr 07, 2015
Příspěvky: 32

PříspěvekZaslal: pá duben 24 2015, 11:17    Předmět: Citovat

kód:
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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 33751
Bydliště: Bratislava

PříspěvekZaslal: pá duben 24 2015, 11:27    Předmět: Citovat

Ano, tak nejako.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jirka525



Založen: May 22, 2013
Příspěvky: 325
Bydliště: Psáry JN79GW

PříspěvekZaslal: pá duben 24 2015, 11:38    Předmět: Citovat

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 napsal(a):


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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.14 sekund