Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   742 / 1210
(#) cassis hozzászólása Jan 20, 2016 /
 
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.

  1. union aaa
  2. {
  3.         unsigned char bbb;
  4.         struct
  5.         {
  6.         unsigned char   RA0 : 1 ;
  7.         unsigned char   RA1 : 1 ;
  8.         unsigned char   RA2 : 1 ;
  9.         unsigned char   RB1 : 1 ;
  10.         unsigned char   RB2 : 1 ;
  11.         unsigned char   RB3 : 1 ;
  12.         unsigned char   RB5 : 1 ;
  13.         unsigned char   RB6 : 1 ;
  14.         };
  15. };
  16.  
  17. union aaa ccc;


Hogy tudnám a fenti problémát megoldani?
(#) szucsistvan123 válasza Hp41C hozzászólására (») Jan 20, 2016 /
 
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?
(#) Hp41C válasza szucsistvan123 hozzászólására (») Jan 21, 2016 /
 
Másold ide a hihaüzenetet.
(#) cross51 válasza cassis hozzászólására (») Jan 21, 2016 /
 
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.
  1. union aaa
  2. {
  3.     unsigned int bbb;
  4.    
  5.     struct
  6.     {
  7.  
  8.         unsigned char   RA0 : 1 ;
  9.         unsigned char   RA1 : 1 ;
  10.         unsigned char   RA2 : 1 ;
  11.         unsigned :5;
  12.         unsigned :4;
  13.         unsigned char   RB4 : 1 ;
  14.         unsigned char   RB5 : 1 ;
  15.         unsigned : 1 ;
  16.         unsigned char   RB7 : 1 ;
  17.  
  18.     };
  19. };
  20.  
  21. union aaa ccc @ 0xF80;


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
(#) cassis válasza cross51 hozzászólására (») 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?
(#) misu888 hozzászólása Jan 21, 2016 /
 
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.

usart.h
    
(#) benjami válasza cassis hozzászólására (») Jan 21, 2016 /
 
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
(#) cross51 válasza cassis hozzászólására (») Jan 21, 2016 1 /
 
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.
(#) Balagemann2031 válasza Zsora hozzászólására (») Jan 22, 2016 /
 
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ő.

od.jpg
    
(#) Balagemann2031 válasza icserny hozzászólására (») Jan 22, 2016 /
 
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!
(#) icserny válasza Balagemann2031 hozzászólására (») Jan 22, 2016 /
 
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...
(#) Zsora válasza Balagemann2031 hozzászólására (») Jan 23, 2016 / 1
 
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)
(#) don_peter hozzászólása Jan 23, 2016 /
 
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:
  1. #define DATA_SEND(){\
  2.         MEM_D0 = ADAT.D0;\
  3.         MEM_D1 = ADAT.D1;\
  4.         MEM_D2 = ADAT.D2;\
  5.         MEM_D3 = ADAT.D3;\
  6.         MEM_D4 = ADAT.D4;\
  7.         MEM_D5 = ADAT.D5;\
  8.         MEM_D6 = ADAT.D6;\
  9.         MEM_D7 = ADAT.D7;\
  10.         MEM_D8 = ADAT.D8;\
  11.         MEM_D9 = ADAT.D9;\
  12.         MEM_D10 = ADAT.D10;\
  13.         MEM_D11 = ADAT.D11;\
  14.         MEM_D12 = ADAT.D12;\
  15.         MEM_D13 = ADAT.D13;\
  16.         MEM_D14 = ADAT.D14;\
  17.         MEM_D15 = ADAT.D15;\
  18. }\

Emitt pedig a függvényes megoldás:
  1. void DataSend(SETDATABIT ADAT){
  2.         MEM_D0 = ADAT.D0;
  3.         MEM_D1 = ADAT.D1;
  4.         MEM_D2 = ADAT.D2;
  5.         MEM_D3 = ADAT.D3;
  6.         MEM_D4 = ADAT.D4;
  7.         MEM_D5 = ADAT.D5;
  8.         MEM_D6 = ADAT.D6;
  9.         MEM_D7 = ADAT.D7;
  10.         MEM_D8 = ADAT.D8;
  11.         MEM_D9 = ADAT.D9;
  12.         MEM_D10 = ADAT.D10;
  13.         MEM_D11 = ADAT.D11;
  14.         MEM_D12 = ADAT.D12;
  15.         MEM_D13 = ADAT.D13;
  16.         MEM_D14 = ADAT.D14;
  17.         MEM_D15 = ADAT.D15;
  18. }


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
(#) benjami válasza don_peter hozzászólására (») Jan 23, 2016 / 1
 
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:
  1. if(ADAT.D0) MEM_D0 = 1;
  2. if(!ADAT.D0) MEM_D0 = 0;
  3. ...
  4. if(ADAT.D15) MEM_D15 = 1;
  5. if(!ADAT.D15) MEM_D15 = 0;
(#) don_peter válasza benjami hozzászólására (») Jan 23, 2016 /
 
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?
  1. MEM_D0 = ADAT.D0;

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..
(#) edison14 hozzászólása Jan 23, 2016 /
 
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:

  1. mov        #tblpage(ADC1BUF0), W0
  2.          mov       W0, _TBLPAG
  3.          mov       #tbloffset(ADC1BUF0), W1
  4.  
  5.          tblrdl   [W1++], W2


A segítséget előre is köszönöm!
(#) benjami válasza don_peter hozzászólására (») Jan 23, 2016 /
 
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.
(#) Hp41C válasza edison14 hozzászólására (») Jan 23, 2016 / 1
 
A tblrdl ill. a tblrdh a program memóriát olvassa. Neked a sima mov [w1++],w2 kellene.
(#) edison14 válasza Hp41C hozzászólására (») Jan 23, 2016 /
 
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.
(#) kissi válasza don_peter hozzászólására (») Jan 23, 2016 /
 
Szimuláld le és nézd meg, hogy mennyi ideig tart ( egy-egy rész, ami érdekel, akár egy-egy sor! )!
(#) don_peter válasza kissi hozzászólására (») Jan 23, 2016 /
 
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
(#) kissi válasza don_peter hozzászólására (») Jan 23, 2016 / 1
 
Idézet:
„A kérdés: melyik a gyorsabb és melyik a jobb választás és miért?”
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 hozzászólás módosítva: Jan 23, 2016
(#) Balagemann2031 válasza Zsora hozzászólására (») Jan 23, 2016 /
 
Működik a totemoszlop mód! Köszönöm!
(#) don_peter válasza benjami hozzászólására (») Jan 23, 2016 /
 
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..
(#) sonajkniz válasza don_peter hozzászólására (») Jan 23, 2016 /
 
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.
(#) don_peter válasza sonajkniz hozzászólására (») Jan 23, 2016 /
 
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....
(#) sonajkniz válasza don_peter hozzászólására (») Jan 23, 2016 /
 
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ú.
(#) don_peter válasza sonajkniz hozzászólására (») Jan 23, 2016 /
 
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...
(#) benjami válasza don_peter hozzászólására (») Jan 23, 2016 / 1
 
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:
  1. MEM_D0 = 0;
  2. if(ADAT.D0) MEM_D0 = 1;

Í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.
(#) don_peter válasza benjami hozzászólására (») Jan 23, 2016 /
 
Ez utóbbi lesz, ha kritikus lesz az időzítés.
Egyelőre le kell majd tesztelnem és az megmutatja, ha nem jó..
Következő: »»   742 / 1210
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem