Fórum témák
» Több friss téma |
Közben rájöttem, hogy nem jól fordítottam le: 900 16bites bináris értéke == 0000 0011 1000 0100
A hozzászólás módosítva: Máj 3, 2014
Idézet: „Van egy bits adatstruktúra is. Az mit csinál?” Lehetővé teszi, hogy a szó 16 bitjét külön tudd kezelni:
Köszönöm a türelmed és az érthető magyarázatokat is.
Így már menni fog a dolog....
Közben még azt nem értem miként töltődik fel az adatstruktúra két változója.
Tehát ha mondjuk: temp.Val = 900; A kérdés: miért és milyen elv szerint rendezi el önkényesen az átadott adatokat? Tehát betöltődik az első 8bit az .LB változóba és túlcsordulás esetén a maradék 8bit az .RB változóba töltődik? Tehát 900 16bites bináris megfelelője == 0000001110000100 A feltöltés tehát úgy jön létre, hogy az .LB = 00000011 és itt túlcsordul, de mivel van alatta is egy változó oda tölti be a maradékot? .RB = 10000100 Előre is köszi...
Az union azért union, mert használhatod 16 bitesnek is, 2x 8 bitesnek is és 16x 1 bitesnek is.
A fordító is így kezeli. Ha temp.VAL néven hivatkozol rá, akkor 16 bitesnek értemezi a fordító Ha temp.BYTE.LB vagy temp.BYTE.HB akkor 2db 8 bitesként akármelyiket írhatod függetlenül. Persze feltöltheted a 900-as értéket így is: temp.BYTE.HB= 900/256; temp.BYTE.LB= %256; Ha csak valamelyik bitet akarod piszkálni, akkor pl.: temp.bits.b15 =1; Ha nem union lenne a fordító állandóan kukorékolna. üdv.: Foxi
Köszi... közben kísérleteztem és rájöttem, hogy az érték amelyet megkap azt hexában tárolja és leosztja a 16bitet 2külön 8bites egységgé.
Így már értem miként töltődnek fel a változók..ez volt a lényeg, ...
- Binárisan tárolja
- Bájtokban kezeli, s az unionban deklarált "darab" vagy "nagyobb egység" változóid ugyanannak a memóriaterületnek a más-más módon történő hozzáféréseit jelentik - majd a C fordító dolga, hogy ezt megszervezze.
Köszi a kiigazítást. Így már teljesen világossá vált a működése.
Közben a sok segítség amit kaptam már pár dolgot megtanított, ha van kedvetek nézzétek meg miket alakítottam PS3 ventilátor szabályozás Led digitális PWM vezérléssel 4x4-es mátrix keypad PIC-el Nyilván 2hónap tanulás után még nem nagy dolgok, de próbálkozom erősen. A hozzászólás módosítva: Máj 4, 2014
Szervusztok!
A mellékletben kapcsolási rajzon 2db 887-es UART kommunikációba kötve. Az egyik program fájl az adóé, a másik a vevőé. A cél, hogy minél több bemenet állapotát tudjam átvinni az U1 PIC-ről az U2 PIC-re. A jelenlegi megoldásban csak RB0-RB7-ig megy át UART-tal. Legalább 16 bitet szeretnék átvinni U1-ről U2-re és vissza ugyanígy. Persze, eddig akárhogy variáltam a programot, nem jött össze. Kérem a segítségeteket! Köszönöm!
Több byte átvitele is megoldható, ha az adó és vevőoldalon is gondoskodsz a küldésről és a fogadásról. Például az adó oldalon egymás után küldöd az A, majd a B port adatait, a vevőben pedig figyeled a sorrendet, az első adatot az A portra, a másodikat a B-re küldöd.
A mikrovezérlők közötti kommunikációra lényegesen hatékonyabb megoldás az I2C és az SPI. Utóbbiaknál az adatátvitel kötegelve történik, így nem kell bíbelődni az adatok sorrendjével, sokkal gyorsabb, biztonságosabb.
A következő problémám lenne, adott egy tengely ami jó esetben 90rpm-mel forog. Készítenem kell egy kütyüt amin van 3 led, ha a fordulatszám 85 és 95 között van akkor a középső világít, ha alatta akkor a bal oldali ha felette akkor a jobb oldali. Hogy tudnám ezt legegyszerűbben kivitelezni?
Én arra gondoltam, hogy indítok egy timert és megvárom amíg beérkezik mondjuk 45 impulzus. Igy a frissitési gyakoriság fél perc lenne, mert ha csak 1-2 beérkezett impulzust várnék meg akkor nagy lenne a hiba.(persze ha tul sokáig nem érkezik meg a 45 impulzus akkor is kigyujtom a jobb oldali ledet) Érzékelőnek egyenlőre egy reed relé van berakva, de eléggé prelleg, ha külső megszakítás lábra küldöm rá , elhúzok előtte egy mágnest és a megszakítás rutinban növelek egy változót 1el, akkor egy mágneselhuzásnál random 1-3 közötti értékkel növekszik a változó.
Szerintem hall elemet használj. Ha nem ragaszkodsz a mágneshez, használhatsz reflexiós optót is, ekkor elég egy fehér (vagy fekete) pöttyöt tenned. A legjobb és leggyorsabb feldolgozási eredményt akkor kaphatnád, ha 2 bejövő impulzus közötti időt mérnéd meg. Ebből 2 dolog következtethető: 1. van forgás, 2. mérhető a fordulatszám (idő).
Igen ám, csak egyelőre nem tudom, hogy oldjam meg. Küzdöttem az I2C-vel, de sokra nem mentem vele. Egy nyúlfarknyi kis programot, ha mellékelnél példának, azt megköszönném. Összefoglalva, nem tudom megoldani, hogyan címezzem meg egyik PIC kimeneteinek megcímzését a másikból.
Igen gondoltam én is, hogy hall elemet kellene használni, van is itthon TLE4935. Akkor azt mondod csak a két impulzus közti időt mérjem? egyébként ez valami biciklire lesz, hogy lássák megfelelő ütemben tekernek e.
Itt találsz példaprogramot: AN734. Itt egy memóriatömböt tudsz írni-olvasni, hogy oda milyen adatokat teszel a Te dolgod.
Idézet: „Using the Mid-Range Enhanced Core PIC16 Devices’ MSSP Module for Slave I2C Communication” Ez egy új application note, a 16F1xxx -ekhez. 16F887 hagyományos midrange kontroller. AN735 - Using the PICmicro MSSP Module for I2C Communications A régi application note pedig hibás volt... Ráadásul egyes 16F88x verzióknál nem működott az órajel nyújtás (clock stretching). Uart -tal sem bonyolult: Egy távirat formát kell definiálni. Mondjuk "AbfBed" legyen a távirat: a nagy betük azonosítsák a portot, a kis betük pedig az értéket két byte -on hexában kódolva. Ha a vétel rendben megy, az érték a helyére tehető. Ha a vétel során hiba keletkezett, a következő nagybetűig el kell dobni a karaktereket. A hozzászólás módosítva: Máj 5, 2014
Hello!
Egy röpke kérdés. Szükségem van a PIC ICSP lábbaira, (DAT és CLK). Analóg bemenetként, vagy digitális kimenetként OPTO meghajtására. Melyik a célszerűbb? A lényeg, hogy minél kevesebb legyen az izolációs alkatrész (ha lehet semmi ) A hozzászólás módosítva: Máj 5, 2014
Analóg bemenetként - Egy soros elválasztó elleállás kell az analóg forrás és a láb közé, de a mintavevő kapacitás töltésénél az ellenálláson eső feszültség rontja a pontosságot.
Digitális kimenetként OPTO meghajtására - Csak akkor okoz problémát, ha a MCLR láb is le van tiltva. Célszerű a LED meghajtását egy közbenső meghajtóval leválasztani. Az optók által vezérelt áramkör megkaphatja a programozási jeleket. A hozzászólás módosítva: Máj 5, 2014
Köszönöm a választ, közben átgondoltam, én is az analóg bemenet mellet szavazok, kapacitív érintőgombként használom a bemenetet ,elhagynám azt az ellenállást is, programozáskor úgysem érintgeti senki. Viszont közben felvetődött egy női probléma(a méret a lényeg).Még egy i/o kellene, csakhogy az említett funkciók közül az MCLR egyikre sem használható.
Mivel kimenetként nem tudom semmiképp használni, az a kérdés, hogy tudom megoldani fényérzékelésre digitális bemenetként. Ha lett volna még szabad lábam akkor egy fototranyó az analóg bemenetre és kész, többit a szoftver megoldja, így viszont hardveres probléma lett. Vagy építek a fototranyó és a PIC közé valami küszöbérték kapcsolót, hogy az MCLR-t tudjam használni, vagy másik PIC. Tudsz olyan 8 bites 28 lábú PIC-et amiben benne van a touch modul, minimum 9 analóg csatorna, és legalább 8 MIPS-es de 12-nek jobban örülnék. Ezen agyalok most. 20-ról 28 lábra váltani még mindíg kisebb helyet foglalna mint a küszöbkapscsoló, gondolom. Ám mégegy ötletem támadt, a 8db analóg touch bemenetet mátrixba kötöm, és így megspórolok 2 lábat, ám ezt még nem csináltam, nem tudom hogy működik majd. A hozzászólás módosítva: Máj 5, 2014
Belső oszcillátorral két láb felszabadulhat. Itt kikeresheted a megfelelőt.
Az még egy láb (Vcap) veszteség a 28 lábú tokoknál. 16F193x
A hozzászólás módosítva: Máj 5, 2014
Mi sem egyszerűbb?! Sok egyértelmű dolgot leírtatok. Az I2C-vel is jutottam valamire, de nem mikroC-ben íródott és így néhány függvény megfelelőjét nem találtam meg.
Ahogy mondod, az UART-tal sem bonyolult, csak egy távirat formát kell definiálnunk...csak! De hogyan? Kedves Barátaim, benne vagyok a topikcímben: KEZDŐ! Ha valóban segíteni akartok, akkor vegyétek figyelembe, ha meg nincs hozzá(-m) türelmetek, akkor megköszönöm az eddigi segítségeteket!
Megnézve az általad linkelt pic adatlapját láttam hogy van benne LCD driver. Ez mit jelent?
Ha fogok egy 7szegmenses kijelzőt és rákötöm akkor csak a megfelelő regiszterbe beírok egy számot és ennyi? nem kell tovább törődnöm vele? Ilyennel akkor egyszerűen tudnék vezérelni 2db 4x7 szegmenses kijelzőt is?
Ha ilyen LCD-re gondolsz, akkor elvileg igen, csak az a probléma, hogy a 16F1939 csak 24 szegmenst tud vezérelni, ennek az LCD-nek 32 szegmense van (mondjuk választhatsz 16F1947-et, ami 46 szegmenst tud ). Ha az LCD multiplexálva lenne akkor tudna több szegmenst is (max. 4x). Nekem a másik problémám az volt, hogy rengeteg lábat elvisz egy ilyen kialakítás, jól végig kell gondolni milyen egyéb perifériákat "áldozol" be.
Nem arra gondoltam hanem erre! De most látom hogy ez nem is Lcd.
Ebböl lenne 4 egymás mellett és ebböl lenne még egy, meg kellene 2 analog bemenet. Egyik a feszültséget mutatná a másik meg az áramerösséget.
Ez elég olcsó: Bővebben: Link
Ha galvanikusan összefügg a feszültség és az áram és a feszültség mérés a mérőben, akkor egy kis külön áramkör kell az áramból származó jel átalakítására.
Ez tök jó, amit én vettem az csak áramot, vagy csak feszt tud.
Elteszem ezt a linket.
Hello!
MPlab-al, debug módban lépésenként vagy animálva vizsgálva a PIC timerei valós időben futnak? |
Bejelentkezés
Hirdetés |