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   874 / 1210
(#) Hp41C válasza don_peter hozzászólására (») Nov 14, 2016 /
 
Az (unsigned int*) ptr = eedata_addr; a ptr -be a tömb kezdőcímét teszi.
A törlés minimális egysége egy Flash memória lap, így minimum ekkora tömböt kell lefoglalni. Az App Note -ben egy kis írás optimalizálás is van a Flash memória korlátozott írási száma miatt.
PIC32 programming specfication
(#) don_peter válasza Hp41C hozzászólására (») Nov 14, 2016 /
 
Ez a két adat pontosan mit takar?
NUM_DATA_EE_PAGES
NUMBER_OF_INSTRUCTIONS_IN_PAGE
(#) Hp41C válasza don_peter hozzászólására (») Nov 14, 2016 / 1
 
A PIC32MX???795 lapméret 1024 utasítás azaz 4096 byte. Ha ekkora EEProm méret elég, akkor
const unsigned int eedata_addr[1024]__attribute__ ((aligned(4096)))={0};
(#) don_peter válasza Hp41C hozzászólására (») Nov 14, 2016 /
 
Bőven elég, még sok is..
Ki is próbálom, most még a léptetés kicsit makacskodik, de lassan tiszta lesz a kép.
Köszönöm a segítséget.
(#) don_peter válasza Hp41C hozzászólására (») Nov 14, 2016 /
 
Még annyi kérdésem lenne, hogy említetted az újraírás korlátait.
Azt hol lehet olvasni, hogy mennyiszer lehet újra írni a flash memóriáját?
Illetve itt nem úgy működik az írás mint az eeprom esetében, hogy bármikor újra írhatom az egyes területeket igaz?
Itt elsőnek ki kell szednem az adatokat, módosítani majd törölni a flash-t majd vissza írni a friss adatot igaz?
(#) Hp41C válasza don_peter hozzászólására (») Nov 14, 2016 /
 
Idézet:
„Azt hol lehet olvasni, hogy mennyiszer lehet újra írni a flash memóriáját?”

Az adatlapjában és a PIC32_RefMan_Ch05_Flash_Programming -ben
Idézet:
„Illetve itt nem úgy működik az írás mint az eeprom esetében, hogy bármikor újra írhatom az egyes területeket?”

Egy üres, törölt (0xFFFFFFFF értékű) szót át lehet írni. Ha a memóriaszó már nem üres, benne 1 értékű bitet át lehet írni 0 -ra törlés nélkül. ((nem ajánlott módszer)).
Egy 0 értékű bitet nem lehet 1 -re írni, csak törlés után. Törölni csal lapot lehet.
(#) pajti2 válasza don_peter hozzászólására (») Nov 14, 2016 /
 
Idézet:
„tomb_address= (unsigned)enyem_tomb;”

Ez az egy sor annyit csinál, hogy az enyem_tomb értékét, aminek a típusa egyébként unsigned int pointer, belerakja egy unsigned int változóba. A pic32 egész családja 32 bites, a címek mind 32 bitesek. A C ugyan különbséget tesz érték és pointer típus között, de azok mind csak ugyan úgy értékek. Az a sor annyit tesz, hogy beleírja az adott értéket (amit a fordítóval számoltatsz ki) a memória változóba, és integer típust ad neki, amit könnyebb utána kezelni aritmetikával. Ha nincsen szükséged numerikus műveletekre a címmel, nem szükséges átalakítani. Azt a kód részletet hirtelenjében csak azért ollóztam egybe, hogy rámutassak, mennyire egyszerűen lehet kezelni.

Ami a memória tömb létrehozását illeti, részemről valóban megfeledkeztem róla, hogy flash lap határra kellene rakni, és méretileg is jobb egész egységenként kezelni, @Hp41C kolléga már leírta részletesen. Az olyasmit, hogy csak 10 byte kell, jobb lenne elfelejteni. Amikor törlöd az egész lapot, nagyon sok minden egyéb is megsérülhet rajta, nem csak az a 10 byte lesz kitörölve. Egész lapokban kellene gondolkodnod.

A kikopás pedig olyasmi, hogy konfig adatokat még bátran rábízhatsz az mx795 flash-re, de ha rendszeresen frissülő munkaadatokról van szó, talán jobb lenne valami sd kártyára journalingolni a blokkokat. Teljesen mindegy, mennyit bír, a lényeg, hogy az nagyon korlátos érték lesz. Néhány program arra használja a flash kikopást, hogy biztosan csak időkorlátosan tudjon működni egy program. Ha nem az a szándékod vele, én azt jósolnám, csalódni fogsz a használhatóságában.
(#) Laslie hozzászólása Nov 14, 2016 /
 
Sziasztok!
Azt lenne a kérdésem, hogy a vicsys féle "Tanítható időzítő" hex fájl egy az egyben felhazsnálható-e egy 12F629-es PIC-ben?
12F629-es van itthon, a 12F675-öst pedig vennem kellene.
(#) Bakman válasza Laslie hozzászólására (») Nov 14, 2016 /
 
A két kontrollernek egy adatlapja van. A 675-ösben van ADC, a 629-esben nincs. A kapcsolás ezt nem használja, elvileg mennie kell 629-esben is.
(#) Laslie válasza Bakman hozzászólására (») Nov 14, 2016 /
 
Erre gondoltam én is, de mivel nem vagyok annyira otthon a PIC-ekben, ezért gondoltam megkérdezem. Köszönöm.
(#) don_peter válasza Laslie hozzászólására (») Nov 14, 2016 /
 
Nekem van PIC12F675 egy rakattal, bár SMD. Ha van SMD 629-ed, akkor szívesen cserélném veled..

pajti2: értem és köszi a magyarázatot.
Hp41C fórumtársunk javaslatát használom, az véleményem szerint is stabilabb lesz.
Már csak az a kérdésem, amit feljebb meg is említettél, hogy a PIC32-esek 32bit-es adatokat kezelnek.
A kérdésem pedig az, hogy érdemes ebben is gondolkodnom, tehát 32bit-es adatokkal vagy meg lehet oldani, hogy a címzésnél csak byte-okat lépkedjen?
Vagy pont az a lényeg, hogy 32bit-es az alap, és így mondjuk egy címre ugorva 32bit-es adatot kapunk?
Pl:
  1. cim = (unsigned int*)eedata_addr;    // itt megkapjuk a kezdő címet;

Aztán ki akarom nyerni a rajta lévő adatot: Pl:
  1. adat = *(unsigned int*)eedata_addr;


Meg lehet azt csinálni, hogy byte-onként kérjem le vagy ezt már csak a lekért 32bit-es adattal léptessem ki?
pl:
  1. unsigned char adat = *(unsigned char*)eedata_addr;
Vagy ebben az esetben csak a 32bit utolsó egy byte helyi értékén lévő adatot kapom vissza?

Remélem érthető amit kérdezni akarok...
Persze nem gond a 32bit kezelése sem, csak érdekel a dolog..
A hozzászólás módosítva: Nov 14, 2016
(#) Laslie válasza don_peter hozzászólására (») Nov 14, 2016 /
 
Köszönöm, de csak DIP tokos van. Nem arról van szó, hogy nem tudnám megvenni, csak, ha nem muszáj, akkor nem költenék rá feleslegesen.
(#) Hp41C válasza don_peter hozzászólására (») Nov 14, 2016 / 1
 
Idézet:
„Meg lehet azt csinálni, hogy byte-onként kérjem le vagy ezt már csak a lekért 32bit-es adattal léptessem ki?”

  1. cim = (unsigned char*)eedata_addr;    // itt megkapjuk a kezdő címet;
  2. unsigned char adat = *cim++; // byte - osan lépked...
A hozzászólás módosítva: Nov 14, 2016
(#) siemenstaurus hozzászólása Nov 15, 2016 /
 
Szép napot!
Szeretném ha meglesnétek a beállításokat.
PIC18f14K50
Amit szeretnék:
-RC összes kimenet
-RB összes bemenet
-RA3 bemenet
-RA4 kimenet

Lefordul, fut, de az állapotjelző LED RA4-en folyamatosan világít.
Az a láb egyben AN3/OSC2/CLKOUT.
Ez bezavarhat?
Csúnya a kód, de én csak hobbi szinten űzöm, viszont eddig működtek. A ciklusokat most tanulom.
Köszönöm!

  1. #include <p18f14k50.h>
  2. #pragma config LVP = OFF
  3. #pragma config WDTEN = OFF
  4. #pragma config MCLRE = OFF
  5. #define NA (PORTBbits.RB7 == 0)   //nyomogombok
  6. #define N1 (PORTBbits.RB5 == 0)
  7. main()
  8. {
  9. TRISC = 0x0000;               // PORTC összes kimenet
  10. ANSELH = 0;
  11. ANSEL = 0;
  12. LATC=0b00000000;
  13. TRISAbits.TRISA4=0;   //csak RA4 kimenet
  14. LATAbits.LATA4=0;
  15. j=5000;
  16. vaganyut=0;
  17.  
  18. while(1)
  19. {
  20.  if (vaganyut==1)
  21. {
  22. LATA=0b00010000;
  23. }
  24.  
  25. if (NA && N1)  
  26. {
  27. vaganyut = 1;         //RA4 led világít amig a feltétel lefut
  28. LATC= 0b00000010;
  29. Keses(j);                             //meghivott kulso függvény
  30. vaganyut=0;            
  31. }
  32.  
  33. }
  34. }
A hozzászólás módosítva: Nov 15, 2016
(#) don_peter válasza siemenstaurus hozzászólására (») Nov 15, 2016 /
 
Csak pár észrevétel..
Ez a PIC nem 8bit-es?
  1. TRISC = 0x0000;               // PORTC összes kimenet
Helyett
  1. TRISC = 0;               // Decimális vagy
  2. TRISC = 0x00; // Hexa vagy
  3. TRISC = 0b00000000; // Bináris
Illetve nyomógomb mögé kellene még valami ami pergésmentesít.
Mert így amíg nyomva van a gomb sokszor lefuthat egymás után a feltétel.
A hozzászólás módosítva: Nov 15, 2016
(#) siemenstaurus válasza don_peter hozzászólására (») Nov 15, 2016 /
 
De igen, megszaladt az ujjam MPLAB-ban helyesen van írva.
(#) don_peter válasza siemenstaurus hozzászólására (») Nov 15, 2016 /
 
Idézet:
„-RA3 bemenet”
Ez kimaradt:
  1. TRISA = 8; // Decimális vagy
  2. TRISA = 0x08;    // Hexa vagy
  3. TRISA = 0b00001000;    // Bináris vagy
  4. TRISAbits.TRISA3 = 1;

Azon portokat amit nem használsz azokat állítsd kimenetre.
Idézet:
„#define NA (PORTBbits.RB7 == 0) //nyomogombok
#define N1 (PORTBbits.RB5 == 0)”
A gombokat érdemes bemenetre tenni és azt figyelni.
10k-os ellenállással felhúzni VCC-re majd egy gombbal GND-re lehet húzni PIC lábát.
Tehát RB5 és RB7 is bemenetnek kell lennie, azt amúgy nem is állítod sehol..
Példa:
  1. TRISB = 0b10100000;
Közben nézegetem még...
A hozzászólás módosítva: Nov 15, 2016
(#) pajti2 válasza don_peter hozzászólására (») Nov 15, 2016 / 1
 
  1. unsigned char adat = *(unsigned char*)eedata_addr;
Természetesen meg lehet tenni, kicsi igazítás a deklarációban:
  1. unsigned char* adat_pointer = (unsigned char*)eedata_addr;
És persze lehet karakteresen is léptetni a pointert, vagy ha tudod fixen, hogy melyik indexhez akarsz hozzáférni, esetleg egy változón keresztül indexelsz, még léptetni sem feltétlenül kell. Pld:
  1. unsigned char adat_chr= adat_pointer[0];
A tömb legelső elemét kérdezi le, C-ben a számozás fixen 0-tól indul.
  1. unsigned int adat_index= 1; adat_chr= adat_pointer[adat_index];
A tömb második elemét fogja lekérni.

A 32 bites mag egy lehetősége a 32 bites feldolgozás, nem kötelező élni vele. Ha byte-onként akarsz adatot feldolgozni, csináld byte-onként. Ha meg tudod szervezni 32 bitesre is 8 bites helyett a feldolgozást, gyorsabb lesz a feldolgozásod ugyan azon az órajelen.
A hozzászólás módosítva: Nov 15, 2016
(#) cross51 válasza don_peter hozzászólására (») Nov 15, 2016 /
 
Nem igazán olvastam végig az összes hozzászólást (idő híján), de ha esetleg segít nekem van egy tesztelt és működő flash író kódom 32mx170f256b-re.

C++-ban készült de ki tudod szedni a lényeget belőle
(#) don_peter válasza cross51 hozzászólására (») Nov 15, 2016 /
 
Köszi, C#-ban íródik a kódom, de nyilván fel lehetne használni a tiédet is..
Hp41C javaslatán elindulva már megírtam a szükséges kódokat.
Most más miatt szívok, de ez már csak így van.
(#) f2f2 hozzászólása Nov 16, 2016 /
 
18F46K22...
Nem tudtam 2 órás megfeszített erőfeszítéssel sem az MSSP1
SPI módban elindítani az órajelet

RC3 pin SCK1 MSSP1 SPI mode
SSPxM<3:0>:1010 Clock output if TRIS=0 ANSEL=0
vagyis SSP1CON1 = 0b00101010
SSP1STAT=0
PMD1 bit6 bit=off MSSP1 enable

Mi kellhet még, hogy ez ketyegjen tartósan ?
(felhúzó ellenállást 10k tettem rá)
Kössz
(#) pajti2 válasza f2f2 hozzászólására (») Nov 16, 2016 /
 
Az spi lábak ütközhetnek az analóg funkciókkal, amit ki kell kapcsolnod, és digitális beállításokkal, amit az spi port funkcionalitásnak megfelelően kell beállítanod. Mindazokat még az spi configja előtt. Azok rendben vannak?
(#) cross51 válasza f2f2 hozzászólására (») Nov 16, 2016 /
 
Itt Látod az CKE CKP bitek hatását.
Nálam okozott már problémát, hogy a CKE = 0 volt, annyit módosíts, hogy SSP1STAT = 0x40 vagy SSP1STATbits.CKE = 1.

De nem ettől van a hiba ez csak a későbbi szívást oldhatja meg.
Ha az SSPxM így van konfigolva akkor az SSPxADD-al kell beállítani az órajelet bár RESET-nél 0 az értéke úgyhogy kéne menjen.
Próbáld ki SSP1CON1 = 0b00100010-val hátha működni fog.
A leírtak alapján többet nem tudok írni.
(#) f2f2 válasza pajti2 hozzászólására (») Nov 17, 2016 /
 
jegyzem amit írtatok kösszi
Az ANSEL en kívül lehet még analóg funkció ?
A konkrét RC3 pinre írnak gondolom a digitalon kívűl
AN15 SCK SCL
namost ha ANSEL 0 és SSPxM<3:0>:1010 Clock output SPI módban kérve
akkor még lehet valami más is?
A megszakítás kezelésből nem kell semmi, hogy ketyegjen a órajel ?
(#) pajti2 válasza f2f2 hozzászólására (») Nov 17, 2016 /
 
Az analógot kikapcsolod mind, a trisben az sdo / sck kimenet legyen, az sdi bemenet, az spi configot hagyd alapon, és kösd vissza az sdo-t az sdi-re közvetlenül. Terhelést ne köss rá semmit, a vezeték rövid legyen. Az sck kimenetet hagyd szabadon lebegni. A proci órajel forrást hagyd belső 8 mhz-en, és felezd / negyedeld le. Nem néztem meg ugyan annak a procinak az adatlapját, de majd megtalálod ezeket mind. Aztán küldj ki egy byte-ot, és gyújts ki egy ledet, ha sikerült ugyan azt vissza is olvasni. Ha sikerült visszaolvasni, a felprogramozásnak kutya baja. Amik lehetnek, hogy az adó/vevő között valami csúnya terhelés van ott, vagy a vevő van elcseszerintve, azt nem tudom. Kapcsolási rajzot meg semmit sem adtál, vakon kotorászunk mind, hogy milyen problémád is van valójában.
(#) siemenstaurus válasza don_peter hozzászólására (») Nov 17, 2016 /
 
Köszönöm! Sokat segítettél, megint letisztult pár dolog.
(#) don_peter hozzászólása Nov 18, 2016 /
 
Srácok, adott egy 74LVC86-os OR GATE IC, amely 4 csatornás, csatornánként 2 bemenet mind kettőt 3v-al hajtok, illetve 1 kimenet ami csatlakozik a NorFlash memória címbitjével.
Az a, bemenetét PIC-el, a b, bemenetét szintillesztőn keresztül 68K-val hajtom 3v-on.
Az y vagy is kimenet a NorFlash memória címbitre csatlakozik.
A 74LVC86 IC egy bizonyos időközönként meghal és nem tudom miért.
Semmi másra nem használom, csak az utolsó 4 memória címbiteinek vezérlésére.

Van valakinek ötlete miért hal meg állandóan az IC?
Bővebben: Adatlap (74LVC86)

ui: túl lehet vezérelni PIC-el esetleg ezt az IC-ét?
A hozzászólás módosítva: Nov 18, 2016
(#) Bakman válasza don_peter hozzászólására (») Nov 18, 2016 /
 
Úgy érted, hogy 3V-os tápfesz mellett 5V-os bemeneti feszültséget kap valahol?
(#) gyoran válasza don_peter hozzászólására (») Nov 18, 2016 /
 
Hogyan hal meg? Ez az IC a bemenetén lekezel 5.5V-ot is. Táp viszont max 3,6 V lehet.
(#) don_peter válasza Bakman hozzászólására (») Nov 18, 2016 /
 
Nem.
Maximum 3.2v-ot kap Vcc-n és bemenetén is.
Már a második hal meg a kapcsolásomon.
Nem értem mi üti ki..

gyoran: hát pont ez az.. Még is már a 2. pusztult meg..
A hozzászólás módosítva: Nov 18, 2016
Következő: »»   874 / 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