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
![]()
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 |