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   1059 / 1203
(#) attika válasza Elektro.on hozzászólására (») Dec 13, 2018 /
 
Nálam ez úgy mokodott, hogy mplabx ipe elindit és úgy dugtam rá a pk3-at, hogy nyomva tartottam a kis gombot ami rajta van.
Utána már felismerte és tudtam használni.
(#) Hp41C válasza Elektro.on hozzászólására (») Dec 13, 2018 /
 
Olyan példánnyal küzdök, amit valami szélütés ért és a következőket csinálja:
Nem kapcsolódott hozzá sem az MpLab sem az MpLabX sem a Pk3 még akkor sem, ha a gombot lenyomva csatlakoztattam az USB -hez.
Kiolvashatatlan volt.
Törlés után kiválóan lehet programozni, de semelyik általam ismert firmware -t beleírva sem kapcsolódik hozzá sem az MpLab sem az MpLabX sem a Pk3 még akkor sem, ha a gombot lenyomva csatlakoztattam az USB -hez.
Valamelyikkel (most nem emlékszem melyikkel) az USB eszközöknél megjelent valami. A PID és a VID jó volt, HID eszközként nem lehetett megtalálni.
A hozzászólás módosítva: Dec 13, 2018
(#) Josi777 hozzászólása Dec 14, 2018 /
 
Sziasztok.

Rég óta az MPLAB IDE v8.92-őt használom Pickit3 programozóval. Aztán ezt felraktam egy laptopra is és azon is jól működött. Viszont ezek után a PC-n már nem látja a programozót, a laptop pedig felismeri a programozót, de a Pic-et nem látja. MPLAB X IDE v5.1-el viszont működik. Nem tudom, hogy a laptopos használat okozhatta-e. Két különböző típusú (18F1330 és 10F220) Pic-el teszteltem, újakkal is.
Találkozott-e már valaki ezzel a problémával és van-e rá megoldás?
(#) Hp41C válasza Josi777 hozzászólására (») Dec 14, 2018 /
 
Az MpLabX 5.xx eltérő programot tölt le a PICkit3 -ba, amivel a régi MpLab8.vv nem tud együtt működni.
(#) Josi777 válasza Hp41C hozzászólására (») Dec 14, 2018 /
 
És ezt a régi MPLAB v8.nn nem tudja visszaírni, hogy újra jó legyen?
(#) glaci hozzászólása Dec 16, 2018 /
 
Sziasztok!
Új problémával találkoztam a mikroc-ben. Szorzást szeretnék elvégezni több számmal:


int i;
long int j;
j=i*24*3600;
ezt a szorzást hibásan végzi el.
A j=i*86400; hibátlan. Miért?
(#) bbb válasza glaci hozzászólására (») Dec 16, 2018 /
 
Tippre azt mondanám, hogy a "j" típusát rosszul határozza meg és az int mérete miatt túlcsordul. A 24 és a 3600 is belefér az int16 határaiba, viszont a 86400 már túllóg rajta. Amikor az első verziót próbálod, akkor szerintem int16-nak deklarálja a változókat és mikor összeszorozza, akkor túlcsordul. A második esetben viszont látja, hogy túllóg az int16-on, ezért int32 lesz, amibe viszont vígan belefér.
(#) rolandgw válasza bbb hozzászólására (») Dec 16, 2018 /
 
Az elég durva lenne, ha fordító futási időben a PIC-el számoltatná ki a 24*3600 értékét.
(#) cross51 válasza rolandgw hozzászólására (») Dec 16, 2018 /
 
Mikro C, ki tudja.
A legegyszerűbb tudja az ember, hogy nem fér el a szám. Ezek miatt nem szabad bízni egyik fordítóban se.
Vagy castolni az i-t (longra) vagy 24 vagy 3600 mögé egy L és már longban is számol.
(#) glaci válasza glaci hozzászólására (») Dec 16, 2018 /
 
Sziasztok!
Azt hiszem meg van a megoldás. Típus konverzióval kell kiegészíteni műveletet:tehát
j=(long)i*24*3600; és az eredmény hibátlan. Viszont a j=(long)(i*24*3600); is hibás eredményt ad. Csak az előző formátum ad jó eredményt.
A kérdésben bemutatott j=i*86400; azért adott jó eredményt, mer 86400 maga is long.
(#) glaci válasza cross51 hozzászólására (») Dec 16, 2018 /
 
Egyébként a te javaslatod is jó eredményt ad.
(#) rolandgw válasza glaci hozzászólására (») Dec 16, 2018 /
 
Idézet:
„azért adott jó eredményt, mer 86400 maga is long.”

A 24*3600 is long.

test.PNG
    
(#) bbb válasza rolandgw hozzászólására (») Dec 17, 2018 /
 
Nem tudom feltűnt-e, de már rögtön long int a j változód ezen a képen. Próbáld meg, hogy int16-nak definiálod és rögtön be kell, hogy jöjjön a hiba, amit felvetett.
Nekem itt most csak VisualStudio c++ van felrakva, ahol short int-ként kell definiálni az int16-ot, ez ne zavarjon meg.
A hozzászólás módosítva: Dec 17, 2018

shortint.png
    
(#) kissi válasza rolandgw hozzászólására (») Dec 17, 2018 /
 
Szia!

Idézet:
„A 24*3600 is long.”

A szorzatuk igen, de egyenként egyik szorzandó sem volt long, ezért az eredmény is int-ben képződik ( és az íródik be a long j-be!)! Ezért kell az egyiknek longnak lennie vagy kényszeríteni rá ( cast!) !
A hozzászólás módosítva: Dec 17, 2018
(#) rolandgw válasza bbb hozzászólására (») Dec 17, 2018 /
 
Miért kellene int16-ként definiálni?
Bővebben: Link
(#) bbb válasza rolandgw hozzászólására (») Dec 17, 2018 /
 
Akkor megint elmondom.
Az eredeti felvetésben a típus int volt. Ez a te általad is mellékelt táblázat szerint 2 bájt hosszú, azaz INT16. Ha így definiálod, ahogy az eredeti kérdés szólt, akkor láthatod, hogy előjön a hiba, mert nem kasztol rögtön a fordító, mikor azt látja, hogy int16 = int16 * int16 * int16, csakhogy az eredmény már nem fér be az int16 határba. Ezt te megmutattad, hogy ha úgy csinálod, hogy int32 = int16 * int16 * int16, akkor nem jött elő a hiba, mert belefért. Erre írtam neked, hogy próbáld ki az eredeti kérdést, s azután rájössz mi volt a gond.
S egész pontosan az eredeti kérdés úgy szólt, hogy miért nem működik az int16 = int16 * int16 * int16 úgy, ahogy szeretné, ha az int16 = int16 * int32 viszont megy. Ugyanis ez utóbbi esetben a fordító automatikusan kasztol és az int16 méretű j változó helyett int32 méretű lesz belőle.
A hozzászólás módosítva: Dec 17, 2018
(#) kissi válasza bbb hozzászólására (») Dec 17, 2018 /
 
Itt long int, azaz 32 bitesként deklarálta...
(#) bbb válasza kissi hozzászólására (») Dec 17, 2018 /
 
Akkor azt elnéztem. Ezzel együtt a gond az, hogy mikor kasztol a fordító. Mert az [int32](int16*int16*int16) eredménye az lesz, hogy int32-re kasztol egy int16 méretű számot. Ugyanis előbb történik meg a szorzás (aminél ugyebár nem fog kasztolni, mert csak int16 számok vannak benne), majd utána kasztol int32-re. Ha viszont a szorzáson belül bárhol is van már egy kasztolt int32 szám, akkor az eredmény is int32 lesz.
(#) kissi válasza bbb hozzászólására (») Dec 17, 2018 /
 
Szia!

Igen, ezt írtam én is itt !
(#) rolandgw válasza kissi hozzászólására (») Dec 17, 2018 /
 
Ott egy kommutatív kifejezés van, a konstansok szorzásával kellene kezdeni, ezek után castolni az i-t.
Az meg nonszensz lenne, ha az előbbit a PIC-el végeztetné, odaírnál három konstans float szorzatot és megtelne a PIC.
(#) kissi válasza rolandgw hozzászólására (») Dec 17, 2018 /
 
Idézet:
„ezek után castolni az i-t.”
Szerintem az lenne a nonszensz, ha ezt engedély, ill. utasítás, azaz tudtom nélkül csinálná ( jól jön, hogy pl. egy int-ből csak a belevalót teszi a byte-ba és nem cast-olja figyelmeztetés nélkül !)

szerk.: A PIC-el történő szorzásról senki nem beszélt ! !
A hozzászólás módosítva: Dec 17, 2018
(#) glaci hozzászólása Dec 17, 2018 /
 
Sziasztok!
Pic eeprom jába szeretnék adatokat írni és onnan visszaolvasni. Annyi már kiderült, hogy a pic eepromja bájtonként tárolja az adatokat. Tehát, ha egy int számot írok bele, azt két bájton fogja tárolni,
pl:2018-at ami hexadecimálisan 07 E2 úgy fogja tárolni, hogy az 07 számot egy bájton és a E2 számot a következő bájon. Vissza olvasáskor úgy járok el helyesen, hogy veszek egy int változót, majd ebbe beolvasom a 07-t majd az << operátorral eltolom 8 bittel ezzel elkerül a felső bitek helyére, majd beolvasom az E2-t a változóba és megkapom a változóban, az eepromban tárolt számot. Helyes az elgondolásom?
(#) kissi válasza glaci hozzászólására (») Dec 17, 2018 /
 
Igen, csak byte-onként tudod elmenteni, ill. visszaolvasni, de a byte-ok helyére íráskor és olvasáskor Neked kell figyelni !
Idézet:
„veszek egy int változót, majd ebbe beolvasom a 07-t majd az << operátorral eltolom 8 bittel ezzel elkerül a felső bitek helyére,”

Ez idáig OK,

Idézet:
„majd beolvasom az E2-t a változóba és megkapom a változóban, az eepromban tárolt számot.”

Ha "csak" beolvasod, akkor felülírod, hozzá kell adnod, hogy a magasabb helyiértékű byte-ot is meghagyd a helyén !
(#) glaci válasza kissi hozzászólására (») Dec 17, 2018 /
 
Ok! Köszönöm szépen!Megértettem.
(#) cross51 válasza glaci hozzászólására (») Dec 17, 2018 /
 
Én viszont nem így olvasnék az eeprom-ból.
8 bit emlékeim szerint nem olyan effektív a bit tologatás én.
Az int-re csinálnák egy byte-os pointer és címzéssel olvasnék
  1. int data;
  2. unsigned char* p = (unsigned char*)data;
  3. int addr = 0x8000; // csak pelda
  4. EEPROM_Read_Array(addr, p, 2); // a 2-ő arra utal, hogy 2 byte-ot olvas majd a függvény
(#) Hp41C válasza glaci hozzászólására (») Dec 18, 2018 / 1
 
  1. typedef u_n_i_o_n _INT_VAL
  2. {
  3.     int Val;
  4.     BYTE v[2];
  5.     struct
  6.     {
  7.         BYTE LB;
  8.         BYTE HB;
  9.     } byte;
  10.     struct
  11.     {
  12.         unsigned char b0:1;
  13.         unsigned char b1:1;
  14.         unsigned char b2:1;
  15.         unsigned char b3:1;
  16.         unsigned char b4:1;
  17.         unsigned char b5:1;
  18.         unsigned char b6:1;
  19.         unsigned char b7:1;
  20.         unsigned char b8:1;
  21.         unsigned char b9:1;
  22.         unsigned char b10:1;
  23.         unsigned char b11:1;
  24.         unsigned char b12:1;
  25.         unsigned char b13:1;
  26.         unsigned char b14:1;
  27.         unsigned char b15:1;
  28.     } bits;
  29. } INT_VAL;
  30.  
  31. INT_VAL year;
  32.  
  33. unsigned char EE_ReadByte(void)
  34. {
  35.     EECON1 = 0;
  36.     EECON1bits.RD = 1;
  37.         EEADR++;
  38.     return EEDATA;
  39. }
  40.  
  41. main{
  42.  EEADR = EE_year_address;
  43.  year.LB = EE_ReadByte();
  44.  year.HB = EE_ReadByte();
  45. }


Az u_n_i_o_n -ból az aláhúzások törlendők. A fórum motor miatt kellenek, ha egybe írom a kulcsszót, üres lesz a hozzászólás.
A hozzászólás módosítva: Dec 18, 2018
(#) glaci válasza Hp41C hozzászólására (») Dec 18, 2018 /
 
Köszi! Majd átrágom magam rajta. Most még nekem elég zavaros. De remélem kitisztul majd.
(#) mhatalyak hozzászólása Dec 19, 2018 /
 
Sziasztok!

PicKit2-vel PicKit V2.61-es szoftverrel miért nem tudom programozni a PIC16f1825 -ös mikrovezérlőt? Régi lenne a szoftver? Ha igen, akkor mivel tudom megoldani?
(#) usane hozzászólása Dec 19, 2018 /
 
Üdv!

Olyan 8 bitest keresek aminek van hardveres szorzó/ósztója. Van valami ami alapján ez kiderül? Vagy pl. a bővítettekre (F1* család) ez elmondható általánosan? Olyan mikro kellene amiben ez megvan, plusz van EEPROM-ja(minimális) és egy UART, egy timer meg egy digital IO kell, hogy legyen benne. Ha nem kellene EEPROM akkor 32 bitest választanék, de azokban meg EEPROM nincs. Vagy esetleg valaki tud olyat amelyikben van?

szerk: Bocsánat. 4IO, nem kettő.
A hozzászólás módosítva: Dec 19, 2018
(#) Hp41C válasza mhatalyak hozzászólására (») Dec 19, 2018 / 1
 
A Pk2devicefile.dat -ot kellene lecserélni V1.62.14 verzióra.
Következő: »»   1059 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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