Fórum témák
» Több friss téma |
Van néhány I/O port bitem szétszórva különböző PORT -ok közt. Pl: PORTA<2:0>, PORTB<3:1> és PORTB<6:5>.
Ezeket szeretném virtuálisan egy unsigned char változóként kezelni, és ezután a változóval hagyományos műveleteket végezni. Így tudnék megoldást, de sajnos az alábbi kód éppen nem elégíti ki a feltételeket, mert önálló változókat deklarál és nem a meglévő port lábakat illeszti be.
Hogy tudnám a fenti problémát megoldani?
Ezt beállítottam, igaz nem 4,75V-ra, hanem 5V ra. A Vdd-miatt reklamált, írta, hogy connection failed. Akkor ez lehet a probléma?
Másold ide a hihaüzenetet.
Nem írtad, hogy milyen PIC-re írtad, de PIC18F14k22-re átírtam, hogy értsd, de ha szükséges meg mondod milyen PIC-re kell és át írom.
Itt a @ azt jelzi, hogy egy adott címen lesz az unio és a 0xF80 a PIC180F14k22-es PORTA címe. A bbb-nek azért kell int-nek lennie, hogy lekezelje az egész memóriát mert, ha belegondolsz két byte-ról beszélünk, ha csak a biteket vezérled akkor lényegtelen, de ha byte (16 bit hosszú) szinten akarsz hozzáférni akkor így kell. És a PORTB-t úgy csináltam meg, hogy lásd, hogy lehet biteket kihagyni. A hozzászólás módosítva: Jan 21, 2016
A típusa dsPIC33 és C30 fordítóval dolgozom.
Értem miért választottál int típust, de nekem összesen max 8 bitem lesz amit egyben kellene kezelnem. Erre praktikusan elegendő lesz a char típus. Jó megoldás lehet a @ használata, ha ezzel PORTA vagy inkább most LATA (alsó, felső) címére tehetem az uniont. Eddig ezt a lehetőséget nem ismertem, használata sajnos a C30 al syntax errorral fordul. Azon gondolkodom hogy a legjobb megoldásban gondolkodunk -e mikor a probléma megoldására uniont használunk. Ugyanis ha jól értem a dolgot mindenképpen szükségünk lesz kitöltő üres bitekre a struct testben, mert egyébként nem tudjuk a LATx nem használt biteit átlépni. Sőt hogy eljussunk LATB, majd LATC -ig a memóriában nem kevés bitet kell átlépni. Ez pedig "darabossá teszi " a bbb -t is. Nekem viszont egyben kellene, szépen sorjában a használt LATx bitek bbb -ben, hogy szokásos byte műveletek végezhetőek legyenek majd rajta. Szóval mi a véleményed a fentiekről?
Segítséget szeretnék kérni tőletek. Soros kommunikáció, főleg most rs-232 kellene több tervemhez de nem tudom, hogy kezdjek hozzá.
Most pic18f4620 mikrovezérlőm van és pic18-at használok. Valaki el tudná magyarázni hogy tudnám használni a pic18 fordító gyári usart.h-át. Vagy valakinek valami jó program rs-232-höz? Szópot (usb-s) most vettem, így már az se lehet akadály. Angolul csak egy pár szót tudok sajnos , ezért is megy nehezebben a programozás.
Ezt így direktben nem fogod tudni megoldani, a struktúra bitjei a memóriában folytonosan helyezkednek el, neked meg pont nem az kellene. A legtöbb amit tenni tudsz, hogy külön függvényt (vagy makrót) írsz ami az így létrehozott változó tartalma alapján átmásolgatja a megfelelő helyekre a biteket. C++ -ban talán megoldható lenne operátor átdefiniálással közvetlenebbül is, de az átmásoló függvényt ott is meg kellene írni hozzá, ami ott is ugyanannyi (vagy az objektumok miatt még több) utasításciklus alatt futna le.
Megjegyzem: a 16bites PIC-ekhez nem tudom, hogy létezik-e C++ fordító. A hozzászólás módosítva: Jan 21, 2016
Sajnos ez a darabossá teszi dolgot nem tudom hogy lehet kikerülni. Szerintem ezt nem lehet megcsinálni így, ahogy szeretnéd. A C30-nál __attribute__((address(0x....))), ha esetleg még is ezt használnád.
Szia! A típus 24HJ128GP502 a bekötés pedig a képen látható, bár már nem vagyok benne biztos hogy ez megfelelő.
Szia! A nekem is az RA3-mon van a LED. a TRIS és ODCA regisztereket jól állítottam, viszont a felhúzást nem kapcsoltam ki. Viszont eleve, lehet hogy rosszul is kötöttem be. Több verziót találtam a bekötésre... A felhúzást kikapcsolom, és konfigutrációs szót átírom!
A bekötés jó, a nyitott nyelőelektródás mód viszont nem létkérdés, az általános célú totem-pole digitális kimenettel is működni fog. Remélem, persze, hogy az ábrán jelzett VCC a mikrovezérlő tápfeszültségével megegyezik...
A bekötés nyitottnyelős kimenethez pont jó, de totemoszlop módban is ugyanúgy működni fog.
Konfigurálás: - FOSC regiszter OSCIOFNC bitjének törlése (OSC2/CLKO kimenet tiltása) - FOSC regiszter POSCMD bitjeinek beállítaása (Elsődleges oscillátor tiltva, vagy EC mód) - PMCON regiszter PMPEN bitjének törlése (PMP modul tiltása)
cassis: azt hiszem a kérdésem egyben a te válaszod is lehet..
Uraim, egy sebességre kiélezett kérdésem lenne, illetve, hogy melyiket célszerűbb használni. PIC18F442-es MCU-ról lenne szó. Lenne egy 16bit-es adat amelyet több port bit-jeire akarok kiíratni, de nem tudom melyik lenne a legjobb választás. Egy sima rutin függvény, vagy esetleg egy makro használata? Mind kettő esetben egy erre létrehozott UNION struktúrát használok amelyek megkapják az értéket és szétválogatják bitekre.. Tehát a MAKRO-s megoldás:
Emitt pedig a függvényes megoldás:
A kérdés: melyik a gyorsabb és melyik a jobb választás és miért? Előre is köszi... A hozzászólás módosítva: Jan 23, 2016
A makrós gyorsabb, mert elmarad a függvényhívás, a visszatérés, és paraméterátadás a vermen keresztül. De miért nem nézed meg a "disassembled list" ablakban mit művelt a fordító? Egyébként szerintem erre leggyorsabb a következő kód, ami bitenként 4 utasítással csinálja meg:
Csak ez meg egy rakat sort fog eredményezni és látszatra ez mint, ha több is lenne, már mint utasításilag mint mondjuk a makro.
A makro csak bitenként 1 utasítást hajt végre nem?
Nincs vizsgálat csak egyszerűen betölti a az adatot, független mi is van benne. Vagy nem jól gondolom? "disassembled list": ilyet még nem használtam..
Sziasztok!
Kérnék egy kis segítséget táblázat olvasással kapcsolatban. Egy PIC24HJ12GP201-ről lenne szó amiben az ADC-nek van 16 bufferje amit sorban ki szeretnék olvasni az átalakítás után. Az első buffer címét beleteszem a TBLPAG-be majd beállítom a tableoffsetet és kezdem kiolvasni az értékeket. De rossz értékeket kapok vissza. Eddig még csak szimulációban próbáltam élőben még nem. Lehet hogy én rontok el valamit vagy az MPLAB nem tudja jól lekezelni a dolgot? Itt a két kód a táblázat beállításáról és a kiolvasásról:
A segítséget előre is köszönöm!
Az hogy a C forrásban 1 utasításnak látszik az nem azt jelenti, hogy 1 gépi utasítás alatt meg is csinálja. Azért nézd meg a disassebled list-ben mit fordít belőle a fordító program.
A tblrdl ill. a tblrdh a program memóriát olvassa. Neked a sima mov [w1++],w2 kellene.
Nagyon szépen köszönöm! Nem is tudtam hogy így is lehet használni a mov utasítást. Mondjuk gondolhattam volna mert lényegében a [w1++] al csak a regiszter címére mutatok. Na most már ezt is tudom.
Szimuláld le és nézd meg, hogy mennyi ideig tart ( egy-egy rész, ami érdekel, akár egy-egy sor! )!
Az a baj, hogy ameddig a hardver nincs kész illetve nem tudom élesben tesztelni, nem fog kiderülni, mennyire kritikus az idő.
Egy flash memóriát fogok majd írni, de talán mivel úgy is kell engedélyezni az írást, belefér az időbe, hogy kiossza a PIC portjai illetve bitjei közt az adatot. Ha nem akkor nagy gáz lesz Idézet: Szerintem az volt a kérdés, hogy melyik utasítás/ok mennyi ideig tart/anak, ezt nem befolyásolja a harver...most is ki tudod próbálni és a gyorsabbat választani ! „A kérdés: melyik a gyorsabb és melyik a jobb választás és miért?” A hozzászólás módosítva: Jan 23, 2016
Működik a totemoszlop mód! Köszönöm!
Ment a pont, meg tudtam nézni a listában az utasítások számát...
MAKRO-val 6x16==96, IF feltétellel 4x16==64 És kissi-nek is köszönöm a segítséget, neki is megy az értékelés..
Ugyan a C-hez szemernyi sem konyítok, de ha jól értelmeztem, akkor egy adatot bitenként akarsz kitenni különböző portlábakra.
Amennyiben igen, akkor dobd ki azt a fordítót, ami egy 3 soros asm. utasítást 6 sorra fordít, mert az egyébb aljasságokra is képes.
Jó majd akkor kidobom és te leprogramozol nekem mindent ami kell oké?
Vagy még sem? ... Akkor még használnám.. Remélem érted az iróniát....
Van humorérzékem.
Azt írtad, eléggé időkritikus ez a rész. Úgy hallottam, be lehet szúrni asm. betéteket a C-be. Ha ez macro esetében is működik, akkor ezt ajánlanám. A macro ugyan sok helyet foglal, de gyorsabb lefutású.
Igen, van ilyen lehetőség.
Meglátom mennyire lesz kritikus a flash memóriának az időzítés. Ha nagyon akkor kipróbálom az asm részeket makro-ba tölteni és úgy beírni a biteket. Egyelőre a flash memória írása, olvasása és törlése amit meg kell írjak, és őszintén kezdek kicsit belekeveredni a dolgokba Bővebben: AM29F800 Ha ebben tudsz segíteni az jó lenne: Bővebben: itt a topikja...
Ha nem szempont, hogy meginog a címláb (úgy is az írás/olvasás idején fontos hogy a kívánt érték legyen rajta lehet így is csinálni:
Így csak három utasítás bitenként (ennél asm-ben sem lehetne rövidebben megoldani). Akkor lehetne még gyorsítani, ha vannak összetartozó részek, amikor 4-5 bit is a soron következő portlábra megy.
Ez utóbbi lesz, ha kritikus lesz az időzítés.
Egyelőre le kell majd tesztelnem és az megmutatja, ha nem jó.. |
Bejelentkezés
Hirdetés |