Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   705 / 1320
(#) watt válasza trudnai hozzászólására (») Márc 18, 2010 /
 
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:
(#) szilva válasza watt hozzászólására (») Márc 18, 2010 /
 
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.
(#) watt válasza szilva hozzászólására (») Márc 18, 2010 /
 
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...
(#) icserny válasza potyo hozzászólására (») Márc 18, 2010 /
 
Idézet:
„Ezekszerint az NSTDIS bittel gyakorlatilag a prioritásos megszakításokat lehet tiltani/engedélyezni. De ez miért jó így pluszban?”
Vannak érdekes mellékhatásai a PIC24H Family Reference Manual 6.2.4.2 alfejezete szerint:

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...
(#) watt válasza icserny hozzászólására (») Márc 18, 2010 /
 
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.
(#) Hp41C válasza potyo hozzászólására (») Márc 18, 2010 /
 
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
(#) watt válasza Hp41C hozzászólására (») Márc 18, 2010 /
 
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.
(#) potyo válasza Hp41C hozzászólására (») Márc 18, 2010 /
 
É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.
(#) Hp41C válasza watt hozzászólására (») Márc 18, 2010 /
 
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
(#) (Felhasználó 56240) hozzászólása Márc 18, 2010 /
 
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
(#) vilmosd válasza Hp41C hozzászólására (») Márc 18, 2010 /
 
Hali
Erre lattam egy jo megoldast a CCS C-ben:
  1. #use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC)
  2.  
  3. int8 buffer[40];
  4. int8 next_in  = 0;
  5. int8 next_out = 0;
  6.  
  7. #INT_RDA
  8. void serial_isr()
  9. {
  10.    int8 t;
  11.  
  12.    buffer[next_in] = fgetc(PC);
  13.    t = next_in;
  14.    next_in = (next_in+1) % sizeof(buffer);
  15.    if(next_in == next_out)
  16.       next_in=t;        // Buffer full !!
  17. }
  18.  
  19. #define bkbhit (next_in != next_out)
  20.  
  21. int8 bgetc()
  22. {
  23.    int8 c;
  24.  
  25.    while(!bkbhit);
  26.    c = buffer[next_out];
  27.    next_out = (next_out+1) % sizeof(buffer);
  28.    return c;
  29. }
  30. void main() {
  31.    int8 i, msg[32];
  32.  
  33. .
  34. .
  35. .
  36.    for(i=0; bkbhit && i<sizeof(msg); ++i)
  37.          msg[i] = bgetc();
  38. .
  39. .
  40. .
  41. }

Forras: ex_RS232_485.c
Bocs ha nem mondtam ujat.
Udv Vili
(#) cNobody válasza (Felhasználó 56240) hozzászólására (») Márc 18, 2010 /
 
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.
(#) (Felhasználó 56240) válasza cNobody hozzászólására (») Márc 18, 2010 /
 
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?
(#) (Felhasználó 56240) válasza cNobody hozzászólására (») Márc 18, 2010 /
 
(#) cNobody válasza (Felhasználó 56240) hozzászólására (») Márc 19, 2010 /
 
Í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)
(#) steev válasza watt hozzászólására (») Márc 19, 2010 /
 
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
(#) potyo válasza steev hozzászólására (») Márc 19, 2010 /
 
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.
(#) icserny válasza steev hozzászólására (») Márc 19, 2010 /
 
Idézet:
„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 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...).

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:
  1. void _ISR _T2Interrupt (void) {
  2.      t2ticks++;                  //számlálja a túlcsordulásokat
  3.      _T2IF = 0;                  //törli az interrupt jelzőbitet
  4. }
  5.  
  6. void _ISR _T3Interrupt (void) {
  7.      t3ticks++;                  //számlálja a túlcsordulásokat
  8.      _T3IF = 0;                  //törli az interrupt jelzőbitet
  9. }


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.

  1. //--- Timer2 inicializálása: eseményszámlálóként működik
  2. void  configTimer2(void) {
  3.   CONFIG_RB6_AS_DIG_INPUT();    //Digitális bemenenek állítja RB6-öt
  4.   CONFIG_T2CK_TO_RP(6);         //T2 bemenete legyen RP6 (RB6)
  5.   T2CON = T2_OFF | T2_IDLE_CON  //Tétlen módban is számlál
  6.           | T2_GATE_OFF         //Nem kapuzásra használjuk
  7.           | T2_32BIT_MODE_OFF   //letiltja a 32-bites üzemmódot
  8.           | T2_SOURCE_EXT       //Külső forrás (RB6)
  9.           | T2_PS_1_1;          //Előosztó = 1:1
  10.    PR2  = 0xffff;               //Túlcsordulás minden 2^16 impulzus után
  11.    TMR2 = 0;                    //törli a számláló regisztert
  12.   _T2IF = 0;                    //törli az interrupt jelzőbitet
  13.   _T2IP = 2;                    //beállítja az interrupt prioritást
  14.   _T2IE = 1;                    //Engedélyezi az interruptot (túlcsordulás)
  15. }
(#) icserny válasza (Felhasználó 56240) hozzászólására (») Márc 19, 2010 /
 
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:
  1. MCLR (ez a VPP)
  2. VDD   (+5V)
  3. VSS   (GND)
  4. PGD
  5. PDC
  6. PGM  (ez csak LVP módban kell...)


Ez egy PICkit2 kompatibilis ICSP csatlakozó lesz,ezen keresztül a kísérleti áramköben programozható a PIC.
(#) steev válasza potyo hozzászólására (») Márc 19, 2010 /
 
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.
(#) icserny válasza steev hozzászólására (») Márc 19, 2010 /
 
Idézet:
„a prioritásokkal még futok egy kört.”
Első körben állítsd be a prioritásokat azonosnak. Például:
_T1IP = 4;
_T2IP = 4;
(#) (Felhasználó 56240) válasza icserny hozzászólására (») Márc 19, 2010 /
 
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
(#) icserny válasza (Felhasználó 56240) hozzászólására (») Márc 19, 2010 /
 
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
(#) Csaplar hozzászólása Márc 19, 2010 /
 
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
(#) AM2k hozzászólása Márc 19, 2010 /
 
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?

  1. ; Convert 4 bit binary to 4 bit Gray code
  2. ;
  3.      org     0xf7                  ; force table to cross a page boundary
  4. BinaryToGrayCode:
  5.      andlw     0x0F                ; mask off invalid entries
  6.      movwf     temp
  7.      movlw     high TableStart     ; get high order part of the beginning of the table
  8.      movwf     PCLATH
  9.      movlw     low TableStart      ; load starting address of table
  10.      addwf     temp,w              ; add offset
  11.      btfsc     STATUS,C            ; did it overflow?
  12.      incf      PCLATH,f            ; yes: increment PCLATH
  13.      movwf     PCL                 ; modify PCL
  14. TableStart:
  15.      retlw     b'0000'        ; 0
  16.      retlw     b'0001'        ; 1
  17.      retlw     b'0011'        ; 2
  18.      retlw     b'0010'        ; 3
  19.      retlw     b'0110'        ; 4
  20.      retlw     b'0111'        ; 5
  21.      retlw     b'0101'        ; 6
  22.      retlw     b'0100'        ; 7
  23.      retlw     b'1100'        ; 8
  24.      retlw     b'1101'        ; 9
  25.      retlw     b'1111'        ; 10
  26.      retlw     b'1110'        ; 11
  27.      retlw     b'1010'        ; 12
  28.      retlw     b'1011'        ; 13
  29.      retlw     b'1001'        ; 14
  30.      retlw     b'1000'        ; 15
(#) vilmosd válasza AM2k hozzászólására (») Márc 19, 2010 /
 
Hali
A "low TableStart" a tablazat cimenek also byte-ja, a "high TableStart" pedig a felso.
Udv Vili
(#) whalaky hozzászólása Márc 19, 2010 /
 
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....
(#) potyo válasza whalaky hozzászólására (») Márc 19, 2010 /
 
Tápszűrő kondenzátor van?
(#) trudnai válasza whalaky hozzászólására (») Márc 19, 2010 /
 
Kapcsolasi rajz?
(#) Hp41C válasza AM2k hozzászólására (») Márc 19, 2010 /
 
Szia!

Nem lehetne ezt egy kicsit egyszerűbben (és a laphatárra sem kényes):

  1. Bin2Gray                        ; 4 bit binary to 4 bit Gray code
  2.         andlw   0x0F
  3.         movwf   temp
  4.         bcf             STATUS,C
  5.         rrf             temp,f
  6.         xorwf   temp,w
  7.         return

Szia
Következő: »»   705 / 1320
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