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   41 / 1204
(#) watt válasza Hp41C hozzászólására (») Jan 9, 2010 /
 
Idézet:
„Most terveztem a PicKit2-höz egy 74HC125-tel működő illesztő fokozatot ilyen mérésekhez...”

Jó megoldás.
(#) pajti2 hozzászólása Jan 9, 2010 /
 
Még mindig rendetlenkedik az SPI.

Az nSS-re gyanakodtam én is, de multiméter szerint rendben van.

Gyanakodtam oszcillátor configra, de ha a kvarc szinkront sutba is dobom, órajel attól még van, egy villogó led legalábbis ezt igazolja.

Gyanakodtam a peripheral pin selectre, de ha az SPI1 kimenetet be tudom állítani, a többinek is stimmelnie kellene.

Gyanakodtam SPI beconfigolásra, de az analizátor remekül megmutatta, hogy master SCK / SDO rendesen kimentek.

A slave ugyan arra a CKE / CKP / SMP-re van állítva, mint a master. Soros ellenállásokon keresztül kapja a jelet (3k3 hü**eség védelemnek).

Master SDO -> Slave SDI,
Master nCS -> Slave nSS,
Master SCK -> Slave SCK,
Master SDI üresben,
Slave SDO configban kikapcsolva.

És a slave nem kapja meg az adatot:
  1. while (SPI2STATbits.SPIRBF==0);
kifagy.

Találkozott már vki ilyesmivel?
(#) potyo válasza pajti2 hozzászólására (») Jan 9, 2010 /
 
Továbbra is az a kérdés, hogy amikor a Slave felé az adatokat lépteted, akkor annak a SS lábán megvan a megfelelő jelszint?
(#) pajti2 válasza potyo hozzászólására (») Jan 9, 2010 /
 
Igen, tuti megvan. SPI adat kiírás előtt egy külön utasítással húzom le az nSS lábat, és jelenleg az egész pic 230 KHz-es utasítás órajelen ketyeg, ergo a nanosecundumos sebesség meg ilyesmik most tuti nem játszanak. Megállítottam egy "while(1);"-el a programot, az nSS lehúzás és az SPI1BUF töltés között, és rámértem multiméterrel.

Már azon is filozom, okozhat-e bármi problémát, hogy mindkettő SPI busz ugyan ahhoz a pichez tartozik, és hogy valami üzemzavart eredményezne az egymásba átkötésük, de nem találtam erről egy kukkot se az adatlapokban.

Jobb tippem nincs, gyártok egy négyvonalas összekötést, és rámérek analizátorral a master bemenetein az SI / SO lábakra. Bár előre gyanítom, a túloldalról semmi nem tud visszajönni.

Menet közben nem tudom nem észrevenni, hogy ezeknek a perifériáknak a bemeneti lábaival van a gond, mert a kimenetiek a jelek szerint működnek. De perpill nem tudok mit kezdeni ezzel az információval.

Összerakom valami könnyen lemérhető formában a kapcsolást, és feldobom ide a full programot is, nem egy hosszú valami. Hátha valami olyan marhaságot követtem csak el, ami egyébként magától értetődő lenne, és csak én szaladtam rajta keresztül.
(#) watt válasza pajti2 hozzászólására (») Jan 9, 2010 /
 
Idézet:
„Már azon is filozom, okozhat-e bármi problémát, hogy mindkettő SPI busz ugyan ahhoz a pichez tartozik”

Ezt kifejtenéd? Legjobb lenne ha lerajzolnád a jelenlegi SPI kört az összes alkatrésszel, ami rákapcsolódik a vezérlő és adatvonalak bekötésével együtt feltüntetve a bekötött lábak nevét!
(#) edison14 hozzászólása Jan 9, 2010 /
 
Hello !

A haverom épített egy kijelzővezérlőt mely bemutatná a kijelzők multiplexelését. Erre kéne megírni a programot mivel se én se ő nem ért hozzá, és úgy kellene, hogy a gomb egyszeri megnyomására a kijelzőn kirajzolódjon egy szegmens, kétszeri megnyomásra átugorjon a második kijelzőre és így tovább.

A segítséget előre is köszönöm.
(#) pajti2 válasza watt hozzászólására (») Jan 9, 2010 /
 
Szívesen kifejtem. Adva van egyetlen darab PIC, van neki kettő darab SPI interface-e. Vezérlő programot akarok írni, ami az egyik kimenetét átküldi a másik bemenetére, és ezt programból szeretném visszaigazolva látni. Ez a probléma egy sokkal nagyobb problémából lett kinyisszantva, aminek a kulcsa kutakodások szerint valahol ebben gyökeredzik. Egyszerűen csak nem tudok egy ilyen programot működésre bírni. Nem is vitás, simán megérdemlem ezért a szemmel verés esetét, csak légyszi adjatok legalább tippet, merre keressem a hibát.

A teljes "project" egyetlen darab main.c, ezt fordítom le C30-al, és egészben küldöm le. A teljes pic memóriát írom, az itt nem érintett config bitek az erase utáni "1" értéket fogják kapni.

Rajzolni akartam kapcsrajzot is, de éppen rájöttem, hogy most a világon semmi programom nincsen, amivel ilyet tudnék tenni. A kapcsolás egyébként totál egyszerű. Az elrendezésben a pic táplábainál szűrőkondik, pár átkötés a pic saját lábai között, és a PK2 rádugva. Semmi más releváns dolog nincs a PIC-en. Néhány ellenállás, ami vagy földre húz egy lábat, vagy tápra. Hatástalan dolgok, amik az eredeti környezet részei, és nem akarok mindent hulladékra lebontani. Mint a programból alant kiderül, egyébként sem tudnának vizet zavarni. Néhány pic láb pedig "lifegve" marad üresen bemenetként, de 230 KHz-es utasítás órajelnél aligha okoz nagy galibát.

A program:

  1. /*
  2. Atkotesek 3.3K ellenallasokkal:
  3.  #23,RB12,SPI1.SDI -  #5,RB1,SPI2.SDO
  4.   #7,RB3,SPI1.SCK  - #21,RB10,SPI2.SCK
  5.   #4,RB0,SPI1.SDO  - #24,RB13,SPI2.SDI
  6.  #10,RA3,SPI1.nCS  - #18,RB9,SPI2.nSS
  7.  
  8. Egyeb bekotesek:
  9.  #12,RA4-en egy piros led soros 1K-val 3.3-ra kotve.
  10.  #4,PGED1/#5,PGEC1 soros 1.5K-val PK2 ICSP-re kotve.
  11. */
  12.  
  13. #include "p33FJ128GP802.h"
  14.  
  15. _FOSCSEL(FNOSC_FRCDIV16)   // ~0.5 Mhz
  16. _FOSC(OSCIOFNC_ON)     //
  17. _FWDT(FWDTEN_OFF)   // Disable Watchdog timer
  18.  
  19. int main(void) {
  20.   volatile unsigned char b1;
  21.     //--
  22.   AD1PCFGL= 0xFFFF;  //Analog bemenetek digitbe kapcsolva.
  23.     //--------------SPI1 main port beallitasok--------------------
  24.   RPINR20bits.SDI1R= 12; //SDI1 input to RB12
  25.   RPOR1bits.RP3R= 0x08;    //SCK1 output to RB3
  26.   RPOR0bits.RP0R= 0x07;   //SDO1 output to RB0
  27.   LATAbits.LATA3= 1;
  28.   TRISAbits.TRISA3= 0;   //SPI1 nCS output RA3
  29.   SPI1STAT= 0;
  30.   SPI1CON1= 0;  //SPI freq ~ 450 Hz
  31.   SPI1CON2= 0;
  32.   SPI1CON1bits.CKE= 1;
  33.   SPI1CON1bits.MSTEN= 1;
  34.   SPI1STATbits.SPIEN= 1;
  35.     //--------------SPI2 teszt port beallitasok--------------------
  36.   RPOR0bits.RP1R= 0x0A;    //SDO2 output to RB1
  37.   RPINR22bits.SCK2R= 10;    //SCK2 input to RB10
  38.   RPINR22bits.SDI2R= 13;  //SDI2 input to RB13
  39.   RPINR23bits.SS2R= 9;   //nSS2 input to RB9
  40.   SPI2STAT= 0;
  41.   SPI2CON1= 0;
  42.   SPI2CON2= 0;
  43.   SPI2CON1bits.CKE= 1;
  44.   SPI2CON1bits.SSEN= 1;
  45.   SPI2STATbits.SPIEN= 1;
  46.   SPI2BUF= 0x2C; //Mindorokkon-orokke ezt fogja "sugarozni".
  47.     //--------------Allapot jelzo led beallitasa--------------------
  48.   LATAbits.LATA4= 1;  //RA4 nem hasznalt: output high
  49.   TRISAbits.TRISA4= 0;  //RA4: debug led off.
  50.     //--------------Fo program
  51.       //  while(1);  //-megallitas, nCS,nSS: 3.3V
  52.   do {LATAbits.LATA3=0;} while(0);
  53.       //  while(1);  //-megallitas, nSS: 0V
  54.   while (1) {
  55.     SPI1BUF= 0x34;
  56.     while ((SPI1STATbits.SPITBF==1) || (SPI1STATbits.SPIRBF==0));
  57.     SPI1STATbits.SPIROV==0;  //Ezt csak biztos ami biztos alapon.
  58.     b1= SPI1BUF;
  59.     SPI2STATbits.SPIROV==0;  //Ezt csak biztos ami biztos alapon.
  60.     if (SPI2STATbits.SPIRBF==1) {
  61.         //"while()"-t nem tehetek ide, mert lehal.
  62.         // A led egyebkent nem villan fel.
  63.       TRISAbits.TRISA4= 0;  //led on.
  64.       b1=SPI2BUF;}
  65.     continue;}
  66.   return 1;}


A két SPI eszköz SDO-ja került éppen a PK2 programozó lábaira, hogy kényelmes legyen azonnal analizátorral megnézni is (maradt az ICSP eredeti bekötése, ergo SPI1.SDO->CH1, SPI2.SDO->CH2). Analizátor kimenete fotón beillesztve.

Ha valamit zagyván írtam volna le, szóljatok rám, átalakítom kérés szerint.

meres1.JPG
    
(#) Hp41C válasza pajti2 hozzászólására (») Jan 9, 2010 /
 
Szia!

A led-re van egy ötletem: a 49. LATAbits.LATA4=1 és az 50. sorban TRISAbits.TRISA4=0. A led a +3.3V-ra van kötve, tehát nem világít. A 64. sorban az állapot nem változik. TRISAbits.TRISA4=0 helyett LATAbits.LATA4=0 kellene???

Szia
(#) pajti2 válasza Hp41C hozzászólására (») Jan 9, 2010 /
 
Abszolút igaz, elkapkodtam, javítva:

  1. if (SPI2STATbits.SPIRBF==1) {
  2.         //"while()"-t nem tehetek ide, mert lehal.
  3.         // A led egyebkent nem villan fel.
  4.       LATAbits.LATA4= 0;  //led on.
  5.       b1=SPI2BUF;}


Továbbra sem világít.
(#) watt válasza pajti2 hozzászólására (») Jan 9, 2010 /
 
Azt hittem több alkatrész van. Nem kérdezem mi ennek az értelme.

Holnap, ha lesz időm, belemélyedek jobban, mert szerintem az adatlapban lesz a megoldás. Lehet, hogy valamit nem állítottál be jól...
(#) pajti2 válasza watt hozzászólására (») Jan 9, 2010 /
 
Hálás köszönetem minden segítségért.

Jól elszoktam már az Eagle-től, de ezt azért még legyártottam (kapcsrajz mellékelve).

Értelme pedig annyi van, hogy egy sokkal kiterjedtebb kapcsolás simán csak nem működik a lehalt SPI miatt. Pont ugyanúgy nem boldogulok vele, ahogy ezzel a kinyisszantott aprósággal sem. Azért ilyen apró, hogy mégse az egész hóbelebancot hajítsam itt rá valakire, mert az felesleges. Sejtem, hogy a katalógus lapokban lesz valahol a megoldás, de nem tudtam rájönni, hogy hol. Pedig egy párszor már átolvastam őket.

spi_proba.png
    
(#) pajti2 hozzászólása Jan 10, 2010 /
 
Még egy lehetőséget kimerítettem, nevezetesen hogy talán a portok SDI lábával mégiscsak lenne valami bibi. Felprogramoztam csak az SPI1-et, és visszakötöttem az SDO lábát az SDI-re. Az alkalmazott üzemmód phasing mentes: ugyanakkor olvassa be a jelet, amikor a kimeneti clock érvényesíti a kimenetet. Vizsgáltam ciklusban, hogy a kiment, és a visszajött jel egyezett-e. Ha nem, akkor lefagyott volna a ciklus, egyébként meg villog a led. Villogott.

  1. while (1) {
  2.     b1++;
  3.     if (b1 >=52) {
  4.       b1= 0;
  5.         //Cca 25.5 ciklus / sec -> led villogas ~ 0.5 Hz.
  6.       LATAbits.LATA4= ~LATAbits.LATA4;}
  7.     SPI1BUF= b1;
  8.     while ((SPI1STATbits.SPITBF==1) || (SPI1STATbits.SPIRBF==0));
  9.     b2= SPI1BUF;
  10.     if (b2!=b1) while(1);
  11.     continue;}


Elvileg SDO és SDI rendben vannak a jelenlegi felprogramozás alapján is (bármi is hiányzik belőle a teljességhez), analizátor mérés szerint az SCK kimenet is rendben van, az nCS vezérlést pedig multiméterrel mértem ki. Kerestetik annak az oka, hogyan képes az SCK mint bemenet érzéketlenné válni.
(#) icserny válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Idézet:
„Kerestetik annak az oka, hogyan képes az SCK mint bemenet érzéketlenné válni.”

Esetleg a konfigurációs biteknél kellene szélesebbkörű beállítás?

Elsősorban a FICD bitjeire gondolok:

JTAGEN_OFF kellhet. Nem tudom, hogy mi az alapértelmezett beállítása.

ICS_PGD1 való a mostani konfigurációhoz (csak Debug esetén van jelentősége)

Van aztán a BKBUG és COE, amelyek talán nem is szerepelnek minden dokumentációban. Ezeknek 1-ben kell állnia. A fordított logika miatt hülyén néz ki, hogy BKBUG_ON kell, ez kapcsolja KI,hogy a reset Debug módba kapcsoljon! Tehát BKBUG_ON és COE_OFF kell.

Ha új fordítód van, akkor nem kell meglepődni, ha reklamál. Jártam már úgy, hogy az újabb verzióban mikrovezérlő header állományában nem volt definiálva a BKBUG bit.

(#) watt válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Szia! ? Megvárom icserny javaslatainak végeredményét, utána ha kell még, tovább gondoljuk.(Bár icserny ebben most nagyon otthon van, rám nem is nagyon van szükség! )
(#) watt válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Lenne egy kérdésem, bután fog hangozni: Honnan tudod melyik láb az SCKx,SSx,SDOx,SDIx?
Mert én az adatlapban és a csatolt SPI doksiban sem találom sehol.

Miért raktál ekkora ellenállásokat sorba? Én nem tennék, legfeljebb 100...270ohm-ot.
(#) erbe válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Nem gondoltál arra, hogy ez nem egy multitaszkos processzor?
Mindent egymás után képes csak csinálni. Szerintem a saját adását képtelen fogadni, mert amíg ad, nem vesz és fordítva. Bár nem tudom, a kimenetek állapotát meddig tartja, de szerintem kiküld egy adatsort, mire beolvasná, az elszállt.
(#) Hp41C válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Szia!

Ha jól olvasom az adatlapot, a perifériák jeleniek a kivezetésekhez való rendelését az un. Peripheral Pin Select regiszterekben be kell állítani (lehetőleg egy kivezetésre egy funkciót). Kérdésem az lenne, hogy az SPI1 és SPI2 3-3 jelére jól vannak-e beállítva a regiszterek?

Szia
(#) watt válasza erbe hozzászólására (») Jan 10, 2010 /
 
Tévedsz, az SPI hardveres, nem kell processzor teljesítmény hozzá.
(#) watt válasza Hp41C hozzászólására (») Jan 10, 2010 /
 
Most nincs időm adatlapot böngészni(közben programozom), ha te látod írd már meg, hol látható a fentebb kérdezett lábak melyik kimeneten vannak? köszi!
(#) Hp41C válasza watt hozzászólására (») Jan 10, 2010 /
 
Szia!

- Nem találom a direkt kivezetéseknél, csak a "port remap" segítségével lehet kihozni. A kapcsoláson is a RP13, RP12, RP10, RP9 és RP0, RP1, RP3 kivezetésekhez kapcsolódnak az ellenállások.
- A pickit2 a Ch1 és Ch2-n 4k7 lehúzó ellenállás tartalmaz...

A becsatolt leírás 32 üres oldal...

Szia
(#) watt válasza Hp41C hozzászólására (») Jan 10, 2010 /
 
Áh, ezt elfelejtettem, hogy lehet variálni melyik láb mi legyen! Köszi, már képben vagyok!

A pdf nekem megnyílik innen letöltve is. Próbáld ki a Foxit Readert!
(#) pajti2 hozzászólása Jan 10, 2010 /
 
Köszönöm mindenkinek a rászánt idejét, sorban írom a válaszokat.



icserny:

Köszönöm a JTAG tippet, az SPI2 kivezetései amiatt "nem éltek". Az SPI2 most már élet jelenségeket mutat.

A BKBUG és COE annyira nincsen nálam ledokumentálva, hogy az MC oldalról leszedett C30 pic header állományában sincsen benne. Hiába is adnék ilyet a fordítónak, nem sok esélyem van működtetni.

A config regisztereket a header állomány makroival kezelem, így biztos, hogy a nem érintett bitek a törlési 1-ben maradnak. Ha a BKBUG_ON és a COE_OFF is az 1-es bit eredménye, akkor azokkal már nem lesz baj. Ha nem, kellene nekem valami olvasni való, hol láttad ezeket? Melyik bitet billentsem nullába? Ofc ki tudom egészíteni a pic header állományát, de ahhoz info kellene, melyik bit milyen állapotban mit csinál.

Újra átnéztem a config biteket, elvileg már nem siklottam át ottani "taposóaknákon".



watt:

A belinkelt pdf hibás.

Ellenállásból éppen ez volt kéznél. Lelassítottam az SPI buszt 450 Hz-re (!), így a parazita kapacitások / induktivitások plussz soros ellenállás most nem fogják kiszedni a jelalakot az előírt határokból. Természetesen nem így fog üzemelni végleges állapotában, ez csak tesztelési célokat szolgált.

A dsPIC-eken van egy "peripheral pin select" nevű feature. Ha a cél pic doksiját nézed (70292C.pdf MC site-on megtalálható / letölthető), lapozz a 11.4 fejezethez (159/386. oldal). Gyorsban a lényeg annyi, hogy az említett kivezetések alapból sehova sincsenek kivezetve, de van egy konfigurálható jel multiplexer ráillesztve a pic kivezetéseire, és az eldönti a beállítások alapján, hogy hova legyen "bekötve" az adott pic láb. A küldött forráskódban az RP regiszterek programozása állítja be a konfigot:
  1. RPINR20bits.SDI1R= 12; //SDI1 input to RB12
  2. RPOR1bits.RP3R= 0x08;    //SCK1 output to RB3
  3. RPOR0bits.RP0R= 0x07;   //SDO1 output to RB0

Ahogy menet közben az újabb felírásokat nézem, már nyomon vagy magad is.




erbe:

A szitu az, hogy "multitaszkos" a processzor. Több külön logikai áramkör van összeillesztve a belső buszra, és órajel szinkront kap mindegyi. Kvázi egy számítógép perifériákkal egy tokba integrálva. Gondot az jelenthetett volna, ha a működéshez olyan shadow regisztereket is felhasznál a két SPI busz, amik nincsenek duplázva. Akkor biza torkosborzolok miatta. De nem volt erre utaló információm.



Hp41C:

Tegnap éppen emiatt volt külön is hosszú éjszakám, mert lefekvéskor eszembe jutott, mi van, ha hibás az 70292C.pdf MC doksi? Leteszteltem külön az SPI1 működését, és külön az SPI2 működését _is_. Megvannak az életjelenségek. Nincsen tévedés azokban a program sorokban. Külön-külön átmegy az az adat, amit kiküldök, és tényleg az megy át.





Jelenleg még szenvedek kicsit a programon, mert bár az SPI2 már működik, olybá tűnik, nem az az adat megy át a kettő SPI busz között, aminek kellene. Még nem tudok teljes sikerről beszámolni.

Külön-külön önmagába visszacsatolt SPI-vel viszont működik. Rászabadulok analizátorral, és ha nem találom meg a hiba okát, feldobom majd ide a jelenlegi programot, meg a teszt eredményeket.
(#) watt válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Az a soros 3k3 akkor is sok oda. Cseréld ki 270...330ohm ra legalább.
(#) Hp41C válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Sziasztok!

Egy érdekesség: A dsPIC33FJ128MC802 a DS70291C és a DC70291D ír, a DS70292 a dsPIC33FJ128GP802-ről...

Szia
(#) pajti2 válasza Hp41C hozzászólására (») Jan 10, 2010 /
 
Hp41C:

Én a 70292-t használom, és GP a pic. Mindössze érdekességként, mi az alapvető különbség a GP és az MC között?


watt:

Kicsit parásnak tűnik nekem az az értéktartomány. MHz-nél használnám, nem mélyhang frekinél. Miért csípi annyira a szemedet ?

Amúgy a teszt eredmények szerint bit elcsúszás van, nem jelalak hiba, noha oszcilloszkóppal nem tudtam bevizsgálni.

SPI1->SPI2 programozva 0x34, olvasva 0x1A (lefele csúszott 1 bitet).
SPI2->SPI1 programozva 0x2C, olvasva 0x58 (felfele csúszott 1 bitet).

Itt valami config móka lesz. Még keresem.
(#) watt válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Idézet:
„Kicsit parásnak tűnik nekem az az értéktartomány. MHz-nél használnám, nem mélyhang frekinél. Miért csípi annyira a szemedet ?”

Ebből egy szót se értek, kérlek fejtsd ki mire gondolsz!
(#) icserny válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Idézet:
„mi az alapvető különbség a GP és az MC között?”

A konkrét tulajdonságok az adatlapokból derülnek csak ki.

MAPS szerint itt az MC mindössze enyiben tér el a GP-től: 8-MtrCtrl. PWM, 2 QEI, valamint a maximális hőmérséklet 125 helyett 140 fok. Ha ők hazudnak,úgy én is...

Alapvetően két külön családról van szó: MC = Motor Control, feltételezhetően ezek erőssége a PWM kezelés. GP = General Purpose, azaz általános felhasználásra szánt típus.



(#) pajti2 válasza watt hozzászólására (») Jan 10, 2010 /
 
watt:

Idézet:
„Ebből egy szót se értek, kérlek fejtsd ki mire gondolsz!”


Oké, ezt külön kifejtem.

A pic Schmitt triggerei 1uA-t terhelnek, amit a vonalon ragadt parazita töltés is be tud adni neki egy ideig. Nagyobb sebességnél ha a vonali meghajtás nem szipkázza le a vonalról azt a töltést, akkor szétcsúszik a kiadott órajel, és a túloldalról érzékelhető vett adat az időzítési keretben. Tipikusan az SPI busz egyik átka. De itt most semmi sem megy MHz-eken. 450 Hz-en ketyeg az SPI busz. A pic is 230 KHz-en megy.

És egyébként sincs most kéznél 4 egyforma ellenállásom vágatlan hosszú lábakkal másmilyen érték. Azért 3.3k, mert a 1.5k elfogyott. Ez volt kéznél 1k-tól 10k-ig. Éppen hétvégére esett ez a teszt eset, és már el se megyek bolt felé, mielőtt ennek az egésznek a végére járnék. A végleges kapcsolásban egyébként semmiféle soros ellenállás nem lesz. Egy nem működő kapcsolásnál a bánat tudja mi a rossz, hát nem kockáztatok. 1mA-ből nem tud baj lenni statikus terhelésnél sem, de 10mA-el már nem kínoznék meg egy 1500 huf-os pic-et, amit a katalógus lap szerint nem kellene 2mA fölött terhelni.




icsernyi:

Thx, érdekességként jó ilyet tudni.
(#) icserny válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Régebbi C30-hoz dsPIC33FJ128GP802.h-ben ez is van:

  1. ** _FICD( OPT1_ON & OPT2_OFF & OPT3_PLL )
  2. **
  3. **   Background Debug Enable Bit:
  4. **     BKBUG_OFF            Device will Reset in Debug mode
  5. **     BKBUG_ON             Device will Reset in user mode
  6. **
  7. **   Debugger/Emulator Enable Bit:
  8. **     COE_OFF              Reset in clip-on operational mode
  9. **     COE_ON               Reset in operational mode
  10. #define BKBUG_OFF            0xFF7F
  11. #define BKBUG_ON             0xFFFF
  12.  
  13. #define COE_OFF              0xFFBF
  14. #define COE_ON               0xFFFF


Mivel neked BKBUG=1 és COE=1 kell, ne izgasd magad vele!
(#) pajti2 válasza icserny hozzászólására (») Jan 10, 2010 /
 
Oké, akkor az valami régebbi config beállítás lehetett, amit valószínűleg valami chip revision túlhaladott, de megtartották a felülről kompatibilitás miatt "Reserved"-nek azt a két bitet.

Valami másmiatt viszont aggódom. Megtaláltam az okát, miért csusszan el egy bitet az átvitt adat a két SPI busz között. És nem tetszik a dolog.

Kapcsrajz gyakorlatilag azonos az előzőleg közölttel, kiegészítés benne csak az nSS vezérlésre ráültetett szonda (a PK2 AUX 3.6V-ra van beállítva, ezért csináltam 5V-hoz egy szintillesztő invertert egy BC182-ből).

Forráskód egészben vágatlanul:
  1. /*
  2. Atkotesek 3.3K ellenallasokkal:
  3.   #4,RB0,SPI1.SDO  - #24,RB13,SPI2.SDI
  4.   #7,RB3,SPI1.SDI  - #21,RB10,SPI2.SDO
  5.   #5,RB1,SPI1.SCK  - #23,RB12,SPI2.SCK
  6.  #10,RA3,SPI1.nCS  - #18,RB9,SPI2.nSS
  7.  
  8. Egyeb bekotesek:
  9.  #1,nMCLR 10k-val 3.3V-ra.
  10. #12,RA4-en egy piros led soros 1K-val 3.3-ra kotve.
  11.  #4,PGED1/#5,PGEC1 soros 1.5K-val PK2 ICSP-re kotve.
  12. #10,RA3 soros 18k-val BC182-t hajt meg, open collector
  13.     PK2 AUX-ra kotve, CH3-on invertaltan lathato az nCS.
  14. */
  15.  
  16. #include "p33FJ128GP802.h"
  17.  
  18. _FOSCSEL(FNOSC_FRCDIV16)   // ~0.5 Mhz
  19. _FOSC(OSCIOFNC_ON)     //
  20. _FWDT(FWDTEN_OFF)   // Disable Watchdog timer
  21. _FICD(JTAGEN_OFF)   //JTAG kikapcs
  22.  
  23. void my_nop(void) {return;}
  24.  
  25. int main(void) {
  26.   volatile unsigned char b1, b2, b3;
  27.     //--
  28.   AD1PCFGL= 0xFFFF;  //Analog bemenetek digitbe kapcsolva.
  29.     //--------------SPI1 main port beallitasok--------------------
  30.   RPOR0bits.RP0R= 0x07;   //SDO1 output to RB0
  31.   RPINR20bits.SDI1R= 3; //SDI1 input to RB3
  32.   RPOR0bits.RP1R= 0x08;    //SCK1 output to RB1
  33.   LATAbits.LATA3= 1;
  34.   TRISAbits.TRISA3= 0;   //SPI1 nCS output RA3
  35.   SPI1STAT= 0;
  36.   SPI1CON1= 0;  //SPI freq ~ 450 Hz
  37.   SPI1CON2= 0;
  38.   SPI1CON1bits.CKE= 1;
  39.   SPI1CON1bits.MSTEN= 1;
  40.   SPI1STATbits.SPIEN= 1;
  41.     //--------------SPI2 teszt port beallitasok--------------------
  42.   RPINR22bits.SDI2R= 13;  //SDI2 input to RB13
  43.   RPOR5bits.RP10R= 0x0A;    //SDO2 output to RB10
  44.   RPINR22bits.SCK2R= 12;    //SCK2 input to RB12
  45.   RPINR23bits.SS2R= 9;   //nSS2 input to RB9
  46.   SPI2BUF= 0;
  47.   SPI2STAT= 0;
  48.   SPI2CON1= 0;
  49.   SPI2CON2= 0;
  50.   SPI2CON1bits.CKE= 1;
  51.   SPI2CON1bits.SSEN= 1;
  52.   SPI2STATbits.SPIEN= 1;
  53.   SPI2BUF= 0x2C; //Mindorokkon-orokke ezt fogja "sugarozni".
  54.     //--------------Allapot jelzo led beallitasa--------------------
  55.   LATAbits.LATA4= 1;  //RA4 nem hasznalt: output high
  56.   TRISAbits.TRISA4= 0;  //RA4: debug led off.
  57.     //--------------Fo program
  58.   while(1) {
  59.     for (b3=0; b3< 14; b3++) my_nop();  //<<--Itt 13 es alatta lehal!!
  60.     do {LATAbits.LATA3=0;} while(0);  //nSS "on" ->low
  61.     SPI1BUF= 0x34;
  62.     while ((SPI1STATbits.SPITBF==1) || (SPI1STATbits.SPIRBF==0));
  63.     while (SPI2STATbits.SPIRBF==0);
  64.     do {LATAbits.LATA3=1;} while(0);  //nSS "off" ->high
  65.     b1= SPI1BUF;
  66.     b2= SPI2BUF;
  67.     if (b2!=0x34) while(1); //Leallitas.
  68.     if (b1!=0x2C) while(1); //Leallitas.
  69.     LATAbits.LATA4= ~LATAbits.LATA4;
  70.     continue;}
  71.   return 1;}


Alant fotó beillesztve a logikai analizátor kimenetéről.

Nem tudom másnak is feltűnik-e, de az nSS vezérlésnek nem szabadna visszaváltania addig, amíg a Master ki nem adta az utolsó clock falling edge-et is. Mindezt azért nem, mert a Slave az nSS megszűnés hatására inaktívba kapcsol, és legközelebb ha megkapja az nSS-t, és az órajelet magasban találja, azt egy órajel impulzusnak érzékeli, és beolvassa a bitet, amit az adatvonalon éppen talál. Kezdő órajelnek érzékeli a Master utolsó töredék órajelét! Ha elegendő késleltetés van a főciklusban, hogy lecsenghessen az az órajel, akkor ilyen baj nem történik, de ha nincs, akkor lehal a ciklus (hamis adatot érzékel). Kimértem a szükséges késleltetést is a FOR ciklushoz, forráskódban kommentezve ott van.


Szóval a kérdés. Lehet arról bárhogy gondoskodni, hogy a
  1. while ((SPI1STATbits.SPITBF==1) || (SPI1STATbits.SPIRBF==0));
  2.     while (SPI2STATbits.SPIRBF==0);

ne térjen vissza addig, amíg a falling edge a ciklus végéről még esedékes?

És amúgy ja, ez a kis "semmiség" engem most nagyon megszivatott.
Következő: »»   41 / 1204
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