- MCLR (ez a VPP)
- VDD (+5V)
- VSS (GND)
- PGD
- PDC
- PGM (ez csak LVP módban kell...)
Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Távolba szakadt hazánkfia "eltűnt"! Azért hidd el, feltűnik annak, aki megszokta, hogy jelen vagy! Üdv újra a fedélzeten! :wave:
Azért előfordulhat. Persze nem általános, és nem is a PIC-eknél találkoztam ilyennel, hanem még anno i8085-Z80 környékén. Ott ugyanis mondjuk volt 1 interrupt láb, amire rá volt kötve ezer periféria vagy-kapcsolatban. A processzor számára minden interrupt "ugyanolyan" volt, és mindenféle I/O-kkal kellett kideríteni, hogy miért is következett be. Ott tehát a kiszolgáló rutin legeleje mindenképpen reentráns kellett, hogy legyen, amennyiben a nested interruptokat megengedtük.
Szerk.: a PIC-ekben gyakorlatilag egy elég komoly interrupt-kezelő hardver is benne van, ami lehtővé teszi, hogy ezekkel a gondokkal ne kelljen egy átlagos programozónak foglalkoznia.
Igen, értem. A régi procik esetében vehetjük úgy is, hogy volt egy rutin, aminek a megszakítási prioritása a legmagasabb volt, ez megszakított minden folyó megszakítást addig, amíg eldöntötte, hogy a folyó megszakítást(okat) megszakítsuk-e a forrástól függően. Ott minden visszatérési címet el kellett menteni, egymásba ágyazottan.
Szerencsére egyszerűbb az életünk a PIC-ekkel... Idézet: Vannak érdekes mellékhatásai a PIC24H Family Reference Manual 6.2.4.2 alfejezete szerint:„Ezekszerint az NSTDIS bittel gyakorlatilag a prioritásos megszakításokat lehet tiltani/engedélyezni. De ez miért jó így pluszban?” Interrupts are nestable by default. Any ISR in progress can be interrupted by another source of interrupt with a higher user-assigned priority level. Interrupt nesting can be disabled by setting the Interrupt Nesting Disable (NSTDIS) control bit (INTCON1<15>). When the NSTDIS control bit is set, all interrupts in progress force the CPU priority to level 7 by setting IPL<2:0> = 111. This action effectively masks all other sources of interrupt until a RETFIE instruction executes. When interrupt nesting is disabled, the user-assigned interrupt priority levels have no effect except to resolve conflicts between simultaneous pending interrupts. The IPL<2:0> bits (SR<7:5>) become read-only when interrupt nesting is disabled. This prevents the user software from setting IPL<2:0> to a lower value, which would effectively re-enable interrupt nesting. Ezt most hirtelenjében nem is értem pontosan, hogy a már bebillent flag-ekre, vagy a többszörösen egymásba ágyazott és megszakított kiszolgálásokra vonatkozik. Mindenestre egy bitet könyebb átírni, mint kismilló periféria interrupt prioritási szintjét módosítani... Idézet: „Mindenestre egy bitet könyebb átírni, mint kismilló periféria interrupt prioritási szintjét módosítani...” Én is pont arra gondoltam, hogy előfodulhat olyan logikai kapcsolat a megszakítások között, (vagy más egyéb esemény miatt), aminek a meglétekor meg kell szüntetni a prioritásokat. Ezzel a bittel ez elég gyorsan megy. Igaz ilyen feladattal még nem találkoztam, vagy nem gondoltam rá, hogy így is meg lehet oldani.
Szia!
Szerencsére erre gondoltak a tervezők, az ilyen perifériáknál szokott lenni egy fifo is (a picben a RCSTA bitjeivel együtt tárolódik a vett adat). A kiolvasás tehát a vett sorrendben történik. A megszakítás kérés az első vett karakternél bejön, addig kell olvasni, amíg a fifo ki nem ürül. Ha kevesebbet olvasunk ki, mint amennyi a fifo -ban van, a kérés fennmarad.... A 16F- et kivéve (stack nagyon kicsi, regiszter nem menthető a stackre) minden pic-ben megcsinálható. A 18F -ben két szint van (alacsony és magas prioritású megszakítás), a nagyobbakban több. Pl: A 18F-ben a stackra mentjük a W és STATUS (és minden mentendő) regisztereket, és újra engedélyezzük a megszakítást, a visszaállítás előtt ismét letiltjuk, visszatöltjük a stackről a STATUS és W (és a többi) regisztereket, visszatérünk. Még van egy lehetőség amivel a kiszolgálás ütemezése variálható - az ok azonosítását többféle módon is végezhetjük: - sorra vesszük a perifériákat, amelyik kérés aktív, azt kiszolgáljuk, lépünk a következőre... - sorra vesszük a perifériákat, amelyik kérés aktív, azt kiszolgáljuk, visszatérünk a legelső vizsgálatára... A második akkor célszerű, ha a sor elejére a rövid kiszolgálási idejű, gyors kiszolgálást iénylő, gyakran beérkező kéréseket tesszzük. (Túl sok kérésnél a listában hátul levőre csak későn (vagy egyáltalán nem) jut vezérlés) Sziasztok
Nyílván ez a megoldás csak az időben egyenetlenül beérkező, de összességében lekezelhető mennyiségű adatra működik, mert különben a fifo is betelik.
Én arra gondoltam, hogy várok egy 20 bájtos bejövő adatot, bejött az első, ki akarom venni a hardveres pufferből, de közben bejött a második, erre az megszakítja az előző kiszolgálását, ekkor kiveszem a másodikat, és azt teszem a 20 bájtos saját pufferem nulladik helyére. Viszont belegondolva, ha közvetlenül lehet utasítással másolni két regiszter között, akkor ez sem fordulhat elő, mert ha még nem olvastam ki a soros port pufferéből, akkor a második megszakítás kiolvasásakor az elsőnek bejött bájtot fogom kiolvasni, és átmásolni a saját pufferembe, majd az elsőnek bejött megszakítást a hardveres puffer olvasásakor a másodikként beérkezett adatot olvassa ki és teszi át a saját pufferembe. Szóval ezesetben mindenféleképpen jó sorrendben lesznek az adatok a saját pufferemben. Szóval elnézést kérek a zavarkeltésért
Szerk.: előbb írtam, mint olvastam, nem látok olyan utasítást, amivel közvetlenül lehetne másolni két regiszter között. Akkor viszont mégis fennáll a dolog - még ha eléggé elméleti is.
Szia!
Igen, a kiszolgáló rutinban addig kell olvasni (ciklikusan) a vett adatokat (kiértékelni a státusz információt), amig ki nem ürül a fifo. Pontosan más (fontosabb) megszakítások kiszolgálási ideje alatt beérkező adatoknak készült ez a fifo. A soros kommunikáció sebességéhez megfelelő teljesítményű kontrollert kell választani (a szokásos sebességek (max 38400bit/s) mellett a 16F kettős buffere már elég). Szia
Sziasztok most szeretném meg építeni a Watt tervezet programozott
A kérdésem az lenne, hogy én azért panelra szeretném megtervezni de, a teszthez való kapcsolást hogy tudom hozzá építeni, mert jó lenne, ha nem rángatnám a lábait, mert sokat nem bírnak Én kezdő vagyok A teszt kapcsolás a Topi cikkében: http://www.hobbielektronika.hu/cikkek/nullarol_a_robotokig_-_pic_mi...9.html És még egy kérdés a 16f877 lehet vele programozni? Reménykedem hogy mindet
Hali
Erre lattam egy jo megoldast a CCS C-ben:
Forras: ex_RS232_485.c Bocs ha nem mondtam ujat. Udv Vili
Szia
Olvasd vissza amit írtál, utána próbáld meg érthetően leírni mégegyszer és akkor talán hamarabb kapsz választ.
Oké akkor még egyszer
Meg szeretném építeni a Watt WLPT Vpp mini v4 PIC programozó v4 A kérdés, az hogy építsem hozzá a teszt áramkört, mert nem szeretném kivenni sokszor a picet És másik kérdés milyen piceket tud programozni?
A teszt kapcsolás ez lenne:
http://www.hobbielektronika.hu/cikkek/nullarol_a_robotokig_-_pic_mi...l?pg=9
Így már mindjárt világosabb a dolog
Szóval az égető az azt a PIC-et tudja égeti amit a szoftver, amit használsz hozzá. Az ilyen LPT-s égetőkkel sokan szenvednek a 16F-es PIC-ek programozásával. Oshon progival ajánlatos próbálkozni. Ha már írtad az előbb hogy kezdő vagy akkor ajánlom Watt honlapját. Bővebben: Link Rengeteg hasznos infót összegyűjtött. Ajánlom figyelmedbe legelőször mindjárt az elejét: "PIC kezdés" címmel és az alatta lévő két linket. Az elsőn vannak égető progik, és használatuk. (oshon is) A másodikon pedig az első kérdésedre a válasz. (ICSP, hogy egyszer se vedd ki a PIC-et az áramkörből)
Egy pic30f4013-ról van szó. Amiket írtatok azokat átolvastam már, igazából arra voltam kiváncsi, hogy ha kiszolgálás alatt van egy INT akkor a közben érkező INTet mi módon lehet lekezelni, de valószínüleg csak a flag polling lekérdezése az egyetlen.
Amiért kérdés volt az az, hogy a programban két timert használok, T1,T2, mindkettő megszakításos. És ha mindkettő aktív, akkor 1-2 percen belül megzakkan a pic amikor debuggolom (target halted), szimulátorban tökéletesen fut. NSTDIS beállításával viszont már megszűnik a jelenség. (C program) Köszi a válaszokat
Esetleg Errata-ban nézz utána, hogy van-e valami a timerekkel, de nem lenne szabad megzakkannia. Esetleg valami globális változót mindkettő használ és egymásnak valamit felülírnak, ha egyszerre jön be mindkét megszakítás, ilyet tudok elképzelni.
Idézet: A dsPIC30 családdal nem foglalkoztam, de azt hiszem, ugyanúgy van, mint a PIC24H és dsPIC33-nál: minden interrupt-hoz külön vektor tartozik! Ráadásul van egy alternatív interrupt vektor tábla is (például debug-oláshoz...).„Egy pic30f4013-ról van szó... ha kiszolgálás alatt van egy INT akkor a közben érkező INTet mi módon lehet lekezelni?” A többszintű kiszolgálással nem kell izgatni magad, független eseményekként kezelhetők. Mindegyil timerhez külön-külön meg kell írni a kiszolgálást. Pl. az alábbiakban Timer2 és Timer3 túlcsordulásait számlálom:
Az inicializálásból csak az egyiket küldöm el (ebből a _T2IP = xxx sor az érdekes, itt adjuk meg a periféria interrupt kérésének a prioritását. Fontos eseményhez nagyobb, keveésbé fontoshoz kisebb számot rendelünk. Az alapértelmezett szint 4-es. A timerek lehetnek azonos prioritással, akkor nem szakítja meg egyik interrupt a másikat.
A D1 diódát hagyd ki! Nem kell.
Mindkét VDD és a legközelebbi VSS közé tegyél egy-egy 100 nF-os kerámia kondenzátort! Egy hatlábú tüskesorra a megadott sorrendben vezesd ki a PIC az alábbi lábait: Ez egy PICkit2 kompatibilis ICSP csatlakozó lesz,ezen keresztül a kísérleti áramköben programozható a PIC.
Kipróbáltam már úgy is, hogy az egyik megszakításkor végrehajtódó parancsokat kitöröltem teljesen, csak a jelzőbit törlését hagytam meg, és a probléma ugyanúgy fennállt.
icserny: köszi a kódrészletet, a prioritásokkal még futok egy kört. Idézet: Első körben állítsd be a prioritásokat azonosnak. Például:„a prioritásokkal még futok egy kört.” _T1IP = 4; _T2IP = 4;
Szóval, ha módosítom a kapcsolást (D1 diódát hagyd ki! Nem kell Mindkét VDD és a legközelebbi VSS közé tegyél egy-egy 100 nF-os kerámia kondenzátort!) és a programozó PIC foglalat paneljára, rá építem, a tesztkapcsolást akkor a ICSP port-roll nem kel le húzni a programozó PIC foglalatot
Mert azon keresztül meg kapja a betápot ? Ha ez így van, akkor mit kel még tennem pl. kel kapcsolót tennem valahová, hogy a két funcio Tudjam kapcsolni (programozás és tesztelés között) És a 100nF kondik 11/Vdd és 12/Vss közé és 32/Vdd és 31/Vss közé is kell kondi 100nF Jól értetem? Ne haragudj, hogy ilyen alap dolgokat kérdezek de, én meg kérdezem mielőtt füstöltetek valamit
Nem biztos, hogy értem a kérdést...
Én csak arról beszéltem, hogy a belinkelt cikkben található tesztkapcsoláson mit módosíts. De ezt ne építsd rá semmire, és erre se építs rá semmi mást. Ez a kísérleti áramköröd, a programozó "készülék" meg legyen ettől független. Csak a programozáskor kell összedugni, a korábban említett 6 lábú tüskesor segítségével. Utána meg széthúzod a csatlakozót.... A lényeg az, hogy nem a mikrovezérlőt húzgáljuk ki a helyéről, hanem az ICSP csatlakozónál bontunk. A tápfeszülséget nyilvánvalóan csak egy helyről kell megkapni. Watt oldalán is találsz ismertetést az ICSP-ről, de remélem, hogy a Google-val sem vagy haragban! Bővebben: Link
Sziasztok!
Hosszú kihagyás után újra kicsit játszadozni kezdtem egy PIC-el. Egy 18f14k50-est próbálok életre kelteni. Két problémába ütköztem az elején. Frissítettem az MCC18-at a 3.35-ös verzióra, de nincs a 14k50-hez linker script, csak header fájl. Azt le tudom valahonnan külön tölteni? A másik problémám, hogy az ICD2-es valamiért nem akar connectálni. 3.3V-ot kapcsoltam a picre és ezt az üzenetet kapom: Idézet: „ ICDWarn0087: To prevent device damage, the Programming Adapter product (AC164114) is mandatory when using any Microchip Programmer with PIC18F13K50 or PIC18F14K50 parts (except the PIC18F14K50 Processor Extension Pak emulation header) and the target Vdd is above 3.6 volts. Connecting to MPLAB ICD 2 ” A panelt már összeraktam és 3.3V-os stab IC-t raktam rá. Valahogy fel tudom így programozni? Előre is köszi! Üdv.: Zoli
Sziasztok,
Az alábbi kód értelmezésében kérnék egy kis segítséget. high TableStart \ low TableStart - ez mi akar lenni?
Hali
A "low TableStart" a tablazat cimenek also byte-ja, a "high TableStart" pedig a felso. Udv Vili
A következő problémába futottam bele 18F2550-ekkel. (egy másik topicban is feltettem a kérdést, de sajnos ott nem jutottunk előbbre, gondoltam ezt többen látogatják)
Építettem két teljesen egyforma áramkört (nyákok végigmérve, mind a két kütyü müködik) ugyan az a HID program fut mind a kettőben, de az egyiket hol felismeri a windows hol nem, a másikat akár melyik gépre dugom, gond nélkül felismeri. A hibásat is némelyik gép felismeri, némelyk csak néha, és van amelyik egyáltalán. A napokban összeraktam próbapanelen is egz 2550-es USB cuccost, a dolog még érdekesebb. 3 gépből egy 100% ban felismeri mint HID eszközt, a másik kettő soha. Semmi extra, csak a PIC, a kristály és az USB kondi van rajta. Van valakinek valami ilyesmi tapasztalata? A 470n kondir anem érzékeny, azt már cserélgettem, 220n és 10u közt azon a gépen ami felismeri teljesen mindegy melyik van rajta, a többin semmi... Lassan az őrületbe kerget! Túrom a netet, semmi.... Valaki adjon valami tippet hátha....
Szia!
Nem lehetne ezt egy kicsit egyszerűbben (és a laphatárra sem kényes):
Szia |
Bejelentkezés
Hirdetés |