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   881 / 1203
(#) makait1 válasza Bakman hozzászólására (») Dec 3, 2016 /
 
18f4620... A D portját szereném digit bemenetnek használni. De ugyaníg jártam a 16f877A-nál is
324 Undeclared identifier 'ANSEL' in expression
324 Undeclared identifier 'ANSELH' in expression
(#) makait1 válasza makait1 hozzászólására (») Dec 3, 2016 /
 
void main()
{

TRISB=0b00001000;
PORTB=0b00000001;
TRISC=0;
PORTC=0b00000000;
TRISD=1;


ANSEL =0;
ANSELH =0;

while(1)
{

Az ANSEL és ANSELH szavakat alá is húzza piros hullámos vonallal, és nem fordítja le, a fenti hibaüzenettel.
A hozzászólás módosítva: Dec 3, 2016
(#) Bakman válasza makait1 hozzászólására (») Dec 3, 2016 /
 
Olvastad a kontroller adatlapját? ANSEL regiszter nincs benne.
(#) makait1 válasza Bakman hozzászólására (») Dec 3, 2016 /
 
Akkor hogy lehet átállítani digitre?
(#) Bakman válasza makait1 hozzászólására (») Dec 3, 2016 /
 
A TRISB regisztert megtaláltad, a TRISA-t nem? Az 'A' portnak is megvannak a regiszterei. Ha analog bemenet kell, akkor az ADCON0 - ADCON2 regisztereket kell használni, konkrétan az ADCON1-ben lehet megadni, hogy melyik láb legyen analóg vagy digitális.
A hozzászólás módosítva: Dec 3, 2016

Shot_710.jpg
    
(#) makait1 válasza Bakman hozzászólására (») Dec 3, 2016 /
 
Nagyon köszönöm. Már működik is.
(#) f2f2 hozzászólása Dec 3, 2016 /
 
18F46K22
SPI órajelet használnám másra dolog SCKx pin...folyt
nos valaki tanácsa bejött tényleg kiküldök byte ot elindul, de le is áll
vagyis ha állandóan kiküldök akkor életben tartom az órajelet.
Másképp nem lehet, hogy ez magától működjön ?
Esetleg 1et kiküldök, de onnantól ne álljon le ?
Ha nem be kell építenem a ciklusba
több potya utasítás lassító tényező
Melyik feltételt kell ennél kérdeznem, hogy szabad e SDOx buffer kiküldésre ?
Már elmosódik minden a fáradtságtól.
Kössz
(#) gazspe hozzászólása Dec 3, 2016 /
 
Sziasztok!
Egy pic16f628a-val C-ben a timer1 modullal szeretnék egy órát csinálni. A pic közben más feladatot is ellátna. Kérdésem lenne, hogy hogy lehet a delay függvényt tmr1 (esetleg tmr0-val, de akkor a következő kérdésem erre is vonatkozik) regiszterek értékének változásával felírni (ne akassza meg az MCU-t arra az időre). Továbbá belső órajelet szeretnék használni, 4 Mhz-n a tmr1 15 környéki értékkel csordul túl, ami alapján megadtam neki az időalapegységet. Szeretném ezt a beosztást finomítani, tudom valahogy külön figyeltetni a TMR1H:TMR1L regiszterpárnak az értéknövekedését (óra pontosítására is jó lenne)? Ha sikerülne valahogy elérnem, hogy ne 16 bites túlcsordulásnál növeljen változó értéket, hanem mondjuk 12-13 bit környékén, az már megfelelő beosztás lenne.
Ha valami kirívó marhaságot kérdeztem, akkor elnézést, kezdő vagyok még a témában.
Válaszokat köszönöm.
Jelenleg így néz ki:
"/*
int clock()
{
T1CON = 0b00000001; //set timer1 config bit: enable, internal clock, prescale: 1:1
while (1) //continous process
{
while (! TMR1IF); //TMR1 overflow
TMR1IF = 0;
Count ++;
if (Count == 15)
{
Count = 0;
sec++;
}
*/"
A hozzászólás módosítva: Dec 3, 2016
(#) kissi válasza gazspe hozzászólására (») Dec 3, 2016 /
 
Szia!
Idézet:
„Ha sikerülne valahogy elérnem, hogy ne 16 bites túlcsordulásnál növeljen változó értéket, hanem mondjuk 12-13 bit környékén, az már megfelelő beosztás lenne.”

Azt nem tudod megoldani, mert a hardver úgy van kialakítva, hogy a 16 bites számláló túlcsordulásánál okozzon megszakítást, de senki nem mondta, hogy a számlálónak 0-ról kell indulnia ! Azaz pl. 10000-re állítva már csak 55536 impulzus kell a túlcsorduláshoz ( a kezdőértéket kell megfelelően megválasztani ! ) !
(#) gazspe válasza kissi hozzászólására (») Dec 3, 2016 /
 
Köszönöm a gyors választ. Akkor TMR1H vagy TMR1L regiszterek kezdeti értékét kell megadnom a túlcsordulás után (gondolom elég az egyiknek túlcsordulnia mindkettő resetjéhez)?
Vagyis hasonló módon?:
while (! TMR1IF); //TMR1 overflow
{
TMR1IF = 0;
TMR1H = 0b0001000;
Count ++;
if (Count == 15)
}
(#) kissi válasza gazspe hozzászólására (») Dec 4, 2016 /
 
Nem igazán így kell gondolkoznod !
A TMR1H és TMR1L együtt egy 16 bites regisztert alkotnak ( így tudnak 65535-ig elszámolni!). Ki kell számolnod a léptetési időt ( TCY=4/fosc + az esetlegesen bekapcsolt osztók ), pl. 4 MHz-es órajelnél osztás nélkül 1 us. Szeretnél mondjuk 10ms-os túlcsordulásokat, ez azt jelenti, hogy 10 ms/ 1 us--> 10000-et kellene számolni a túlcsordulásig! Ennek érdekében 65536 - 10000= 55536-ról kell indítanod a számlálót, ami hexában ( számológéppel könnyű átváltani !) 0xD8F0, azaz ezt kell a timerbe kezdőértékként betenni ! Ezt úgy lehet, hogy először beteszel a TMR1H-ba 0xD8-at ( a felső byte-ot!), majd TMR1L-be 0xF0-t ( az alsó byte-ot!) ! Vigyázz, mert a berakási sorrend sem mindegy !
  1. while (! TMR1IF); //TMR1 overflow
  2. {
  3. TMR1IF = 0;
  4. TMR1H = 0xD8;
  5. TMR1L = 0xF0;
  6. Count ++;
  7. if (Count == 100) (masodperc++; count=0;)
  8. }

Remélem érthető voltam így hajnalban !?
A hozzászólás módosítva: Dec 4, 2016
(#) kissi válasza kissi hozzászólására (») Dec 4, 2016 /
 
Már nem tudtam tovább szerkeszteni...!
Ezt még később pontosíthatod és kiegészítheted, mert ez így egy jó alap !
A hozzászólás módosítva: Dec 4, 2016
(#) gyoran válasza gazspe hozzászólására (») Dec 4, 2016 /
 
Szia
Én mindenképpen a Timer1-et használnám, mert az "igazi" 16 bites. Vagy tennék rá külső 32 kHz-es kavicsot (Kvarcot) és/vagy használnám az előosztót.
Az egyetlen kritikus az, hogy ha a Timer 1 túlcsordul, akkor interruptot generál és ha az ezt lekezelő rutin sokáig reagál rá akkor az pontatlanságot okozhat.
(#) sonajkniz válasza gyoran hozzászólására (») Dec 4, 2016 /
 
Idézet:
„ha az ezt lekezelő rutin sokáig reagál rá akkor az pontatlanságot okozhat.”

Milyen sokáig? 32KHz-s kvarccal, előosztás nélkül csaknem 2 másodperced van rá, hogy elvégezd a számításokat és töröld a flag bitet. Ennyi már csak elég!?
(#) eSDi válasza treshold hozzászólására (») Dec 4, 2016 /
 
Beírod a keresőbe, hogy "mplabx" és az első helyen megtalálod. Nem hinném, hogy ez csak nálam lenne így.

Mint ahogy, már más is írta a PICkit 3 Stand Alone Programmer-t felejtsd el ehhez a PIC típushoz (Meg egyébként is. Én is csak vész esetére használom, régebbi típusokhoz). MPLAB X-ből sem a 3.10-es kell, mert az sem tudja. A legújabbat töltsd le!
(#) gazspe válasza gyoran hozzászólására (») Dec 4, 2016 /
 
Timer1-et szeretném, egyenlőre arra is van írva a kód, csak mivel elég sekélyesek a programozási ismereteim, ezért bizonyos problémákat elemi függvényekkel és értékadásokkal hidalok át.
Idézet:

Már nem tudtam tovább szerkeszteni...!
Ezt még később pontosíthatod és kiegészítheted, mert ez így egy jó alap !

Köszönöm szépen, így néz ki jelenleg a két kezdőérték kivételével a kódom, de mindjárt azt is javítom. .
Lenne még egy-két kérdésem:
-van 3-5V-os stab tápom itthon, de csak egy darab. Ha beszeretném építeni valahova a szerkezetemet, akkor egy stabkockás telefontöltő 3-3,5V-on, vagy egy RLC szűrős telefontöltő 5V-on elviszi a mikrovezérlőmet?
-hogy tudom a delay fv.-t úgy megkerülni, hogy ne akassza meg az MCU-t arra az időre? Jelenleg egy programozható, több (>4) ágú öntöző rendszeren dolgozom, 16×2-es LCD hd44780-as driverrel. Amiket találtam LCD illesztő függvények, mind delay-t használnak. Ezért gondoltam, hogy finomítom TMR1 overflow változóját, így akár ms-es nagyságrendeket viszonylag kis szórással meg tudok adni az általam "count"-ként deklarált változó növekedésével (alap helyzetben ~4 ms-enként interruptol, ami 4 ms-es időzítésre nem feltétlen a legalkalmasabb, kis pechhel 1 ms-t sem ér el a 4 ms-nek várt érték). Erről az elképzelésről tud valaki véleményt mondani, esetleg egy jobb lehetőséget felvázolni?
-mennyire mondható stabilnak a belső órajel? Annyit tudok róla, hogy nagyban függ a feszültségtől és a hőmérséklettől, valamint természetesen tűrése van. Ha kvázi stacionárius feltételeket tudok biztosítani neki, akkor alkalmas lehet pontos (max differencia: másodperc/nap) időzítésre, valamint konkrétan a 16f628a esetében a gyártó által megadott +-1%-os tűrés értékét lehet állandónak tekinteni? (szóval, ha egyik nap egy másodpercet késett a tűrés miatt (pl.: a kvarc -0,2%-os eltérése miatt), akkor következő nap nem fog 1 mp-t sietni(következő nap is -0,2%-os eltérése lesz)?)
-karakterláncok megjelenítésére alkalmazzak char tömböt(n×m), vagy valahoyg be tudom ültetni a stringeket C-be?
Válaszokat köszönöm előre is és utólag is, továbbra is tartom, hogyha nagyon nagy marhaságot kérdezek, vázolok fel, elnézést, lényegében első "komoly" programom, mind PIC-ek terén, mind általában és az elektronikai ismereteim is hagynak kivetni valót maguk után, de igyekszem.
A hozzászólás módosítva: Dec 4, 2016
(#) kriszrap hozzászólása Dec 4, 2016 /
 
sziasztok))
Az órám nál lenn egy óra frissités(Timer0) (60sec) másik a beállítást nézi.
Ez irányadó lehet???Bővebben: Link
(#) shirke hozzászólása Dec 4, 2016 /
 
Hali!
CCS C fordítóval hogyan lehet high-speed pwm-et beállítani?
(#) pajti2 válasza gazspe hozzászólására (») Dec 5, 2016 /
 
-Tápfesz. A telefonos töltők némelyikének időnként nullára is leesik a kimeneti feszültsége. Jobb lenne az áramkör bemenetedre legalább egy diódát + kondenzátort odarakni (az értéke felhasználás függő).
-Delay. Használj aszinkron állapotgépeket a főciklusból. Akkor a delay-d modellezett lesz csak. Viszont akkor az egész alkalmazást aszinkron design szerint kell készítened, és az sokkal több türelem kérdése. Nem mindenkinek van türelme az aprólékos munkához.
-Tűrés. A tűrés azt jelenti, hogy akár stabilan rajta maradhat az egyik korláton. Nincsen rá olyan szabály, hogy végül 0-ra ki kellene jönnie a végösszegnek.
-C stringek: A C alapból is tömbökbe pakolja a karaktereket, azt nevezi stringnek. Külön absztrakt típus csak C++ környezetben van, C környezetben nincs.
(#) kriszrap hozzászólása Dec 5, 2016 /
 
Feljebb elmagyarázták de nem megy ez a Timer számolgatás.
Terv az 1 másodpercenként lefuttatja az interrupt .
Hogyan kellene számolni egy pic16f628 nál 4Mhz külső kristállyal ???
Nagyon megköszönném ha valaki elmagyarázná szájbarágósan.
A hozzászólás módosítva: Dec 5, 2016
(#) pajti2 válasza kriszrap hozzászólására (») Dec 5, 2016 /
 
Van egy adatlap itt: Bővebben: Link

A timer 1 modul a 7-es fejezet, a 46. oldalon kezdődik. Van egy ábra a 47. oldal alján. Ott forrásként megtalálod a belső oszcillátor 1/4-ed jelét (jelen esetedben 4 mhz / 4 = 1 mhz lesz a betápod), amit ki tudsz választani forrásként TMR1CS=1 esetén (regiszter leírás a 46. oldalon), és ott a prescaler :8 osztáshoz (125 khz lesz a betápod) T1CKPS1:T1CKPS0 töltésével (=11, regiszter leírás a 46. oldalon), ami után T1SYNC=1 (regiszter leírás a 46. oldalon) kiválasztja azt a jelet számolni, és használhatod sleep mode-ban is.

Mindenre részletesen találsz todo-t az adatlap teljes elolvasásával. Legalább a szakmai angolnak mennie kell, anélkül moccanni sem tudsz a pic világban.
A hozzászólás módosítva: Dec 5, 2016
(#) nagym6 válasza kriszrap hozzászólására (») Dec 5, 2016 / 1
 
Van erre program is, ha jól emlékszem "Timer Calculator" néven találsz.
Pld.: Bővebben: Link
(#) Hp41C hozzászólása Dec 6, 2016 / 1
 
Egy hasznos olvasmány a timer1 modulról.
(#) kriszrap hozzászólása Dec 6, 2016 /
 
Köszönöm
írok hogy mire jutottam

Szerk:
"TCY (μs)" ez mi???
és "TCY within 15.25 μs"
A hozzászólás módosítva: Dec 6, 2016
(#) kissi válasza Hp41C hozzászólására (») Dec 6, 2016 /
 
Hú, ezt én se figyeltem...Meg voltam győződve arról, hogy az adott PIC ERRATA-jában leírják a vele kapcsolatos anomáliákat, de ez nem szerepel most sem benne ( konkrétan s PIC12F675-öt néztem !) !
Honnan kell tudnom, hogy milyen hibákat melyik doksiban írják le a "millió" közül , van erre valami "kigyűjtés" ( én azt hittem a saját errata az az ! ) ?!
(#) Hp41C válasza kriszrap hozzászólására (») Dec 6, 2016 /
 
Az errata szerint a TMR1H regiszter írásakor megtörténhet, hogy nem veszi figyelembe a TMR1L átfordulásából történő növelést. A TMR1L regiszter az órajel lefutó élére lép.
"TCY within 15.25 μs" - Hány egyszerű utasítás hajtható végre a 32.768kHz magas szintjének ideje alatt.

Ha egy 16F628 4MHz órajellel jár, akkor a 32.768kHz T1 órajel magas szintjének ideje alatt 15.25 egyszerú utasítást tud végrehajtani. Ebbe beleszámít a kérés előtt megkezdett utasítás, a megszakítás rutinra való ugrás, a mentés ideje is.
A legrosszabb helyzet, ha a megszakítás nincs átmenetileg tiltva valami más okból:
-A kérés előtt megkezdett utasítás 2 (goto, call, decfsz, stb)
-Asynchronous interrupt latency = 3-4 TCY
-Mentés: minimum 4 utasítás.
Eddig 10....
Ha más okból tiltva van a megszakítás:
- Másik megszakítás kiszolgálása fut
- Szamafor művelet vagy kritikus szakaszbeli utasítások futnak.
A kiszolgálás(ok) utasításainak számát is bele kell számolni....


Ha még azt is figyelembe kell venni, hogy a timer1 előosztója törlődik, ha a TMR1H vagy TMR1L regisztert írjuk.
A hozzászólás módosítva: Dec 6, 2016
(#) Hp41C válasza kissi hozzászólására (») Dec 6, 2016 /
 
Sajnos nem tudok "kigyűjtések" -ről. Illetve mindenki kigyűjtögeti, ha egyszer belefut...
(#) kriszrap válasza Hp41C hozzászólására (») Dec 6, 2016 /
 
mit értünk egyszerű utasításnak amit az interuptnak kell csálni 6db Shiftelés shiftregiszternek és fényerő beállítása.
(#) kissi válasza Hp41C hozzászólására (») Dec 6, 2016 /
 
Köszi!

Idézet:
„Illetve mindenki kigyűjtögeti, ha egyszer belefut...”


Ezt úgy érted, hogy találkozol egy hibával, ERRATA-ban nem látod, azt hiszed, hogy a programodban van a hiba, sok éjszakát beleölsz... mikor már nincs más ( vagy korábban !) kutakodsz a neten/microchipnél, hogy hátha valamilyen címen írtak erről "tanulmányt" ?!
(#) Hp41C válasza kissi hozzászólására (») Dec 6, 2016 /
 
Pontosan így értem...
Most például hetek óta nem tudom a PIC32MM0064GPL028 -et Serial Executin Mode -ba léptetni.
Programozási módba sikeresen belép, ki tudom olvasni a DeviceId -t jól, még a következő sorozat is lefut talán, az MCHP Status regiszter DEVRST bitjét állítja.
  1. 1. SendCommand (MTAP_SW_MTAP).
  2. 2. SendCommand (MTAP_COMMAND).
  3. 3. statusVal = XferData (MCHP_STATUS).
  4. 4. If CPS (statusVal<7>) is not ‘1’, the device must
  5. be erased first.
  6. 5. XferData (MCHP_ASSERT_RST).
  7. 6. SendCommand (MTAP_SW_ETAP).
  8. 7. SendCommand (ETAP_EJTAGBOOT).
  9. 8. SendCommand (MTAP_SW_MTAP).
  10. 9. SendCommand (MTAP_COMMAND).
  11. 10. XferData (MCHP_DE_ASSERT_RST).
  12. 11. SendCommand (MTAP_SW_ETAP).

Aztán jönnek a problémák:
A PE loader letöltése látszólag sikeres, de amikor átadnám a PE kezdőcímét, a XferFastData hibát jelez.
Apropó mi is a PE kezdőcíme:
A PIC32MX és MZ -nél 0x900, a hozzájuk tartozó PE hex állományában is ez szerepel.
A PIC32MM -lél 0x300 szerepel a hex állományban.
Idézet a DS60001364C ből:
  1. TABLE 11-2: PE LOADER OP CODES
  2. Opcode Instruction
  3. 0xDEAD41A7 lui a3, 0xdead
  4. 0xFF2041A6 lui a2, 0xff20
  5. 0xFF2041A5 lui a1, 0xff20
  6. here1
  7. 0x69E06A60 lw a0, 0(a2)
  8. lw v1, 0(a2)
  9. 0x000C94E3 beq v1, a3, <here3>
  10. 0x8DFA0C00 nop
  11. beqz v1, <here1>
  12. here2
  13. lw v0, 0(a1)
  14. 0xE9406DBE addiu v1, v1,-1
  15. sw v0, 0(a0)
  16. 0xADFB6E42 addiu a0, a0, 4
  17. bnez v1, <here2>
  18. 0xCFF20C00 nop
  19. b <here1>
  20. 0x0C000C00 nop; nop
  21. here3
  22. 0xA00041A2 lui v0, 0xa000
  23. 0x09015042 ori v0, v0, 0x901
  24. 0x0C004582 jr v0
  25. nop

Idézet a gyorsan letagadott / eltörölt DS60001145P -ből:
  1. TABLE 11-4: PE LOADER OP CODES FOR PIC32MM DEVICES ONLY
  2. Op code Instruction
  3. 0xDEAD41A7 lui a3, 0xdead
  4. 0xFF2041A6 lui a2, 0xff20
  5. 0xFF2041A5 lui al, 0xff20
  6. here1:
  7. 0x6A60 lw a0, 0 (a2)
  8. 0x69E0 lw v1, 0 (a2)
  9. 0x94E3000B beq v1, a3, here3
  10. 0x0C00 nop
  11. 0x8DFA beqz v1, here1
  12. 0x0C00 nop
  13. here2:
  14. 0x6950 lw v0, 0 (a1)
  15. 0x6DBE addiu v1, v1, -1
  16. 0xE940 sw v0, 0 (a0)
  17. 0x6E42 addiu a0, a0, 4
  18. 0xADFB bnez v1, here2
  19. 0x0C00 nop
  20. 0xCFF2 b here1
  21. 0x0C00 nop
  22. here3:
  23. 0x41A2A000 lui v0, 0xa000
  24. 0x50420900 ori v0, v0, 0x900
  25. 0x4582 jr v0
  26. 0x0C00 nop


CSak néhány eltérés van:
Az 0x6950 opkód hiányzik az újabb dokumentumból.
Milyen címre is kell ugrani, ha a bűvös "DEAD" megérkezik?
DS60001145P szerint 0x900 -ra, a DS60001364C szerint 0x901 -re ?
Az utasítások a PIC32 -n nem 32 bitre, a PIC32MM -en nem 16 bitre igazítottak?

Az MpLabX IPE röhögve programozza....
Ugye milyen könnyű az élet...
A hozzászólás módosítva: Dec 6, 2016
Következő: »»   881 / 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