Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   76 / 118
(#) szuperman hozzászólása Máj 27, 2012 /
 
Egyébként most ez van benne:

  1. #include <16f628a.h>
  2. #use delay(crystal=12Mhz)
  3. #fuses NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP, NOMCLR, HS
  4.  
  5. main(){
  6.  
  7.    while(TRUE){
  8.       output_toggle(PIN_B3);
  9.       delay_ms(1000);
  10.    }
  11. }


Amolyan debug ként. Nem tudom ezen van e valamit debuggolni. Egyszerűen felviszi magas szintre a B3 as lábat és ott is hagyja.
(#) capaizee válasza szuperman hozzászólására (») Máj 27, 2012 /
 
Microchip-nek van egy fejlesztőkörnyzete (nem tudom hirtelen más támogatja e pickit-et)
MPLAB illetve MPLABX az ujnak a neve.
Ha ebben fejlesztesz akkor pickit ki lehet választani debuggerként és a programot debug módban fordítottad lehet akár lépésenként végrehajta menet közben nézegetni a változókat .

De jobban megnézve általad használt típus de bugolását közvetlenül nem támogatja ...

ugyhogy lehet vedd semmisnek előző üzenetet
(#) szuperman válasza capaizee hozzászólására (») Máj 27, 2012 /
 
Azon gondolkozom ,hogy nem e a kvarcommal van valami gond. A kvarc lábait egy-egy 22p -os kerámia kondenzátor köti össze a földel. Ennek így jónak kell lenni nem?
(#) Saggitarius válasza szuperman hozzászólására (») Máj 27, 2012 /
 
En csak most kezdtem bele PIC programozasba, -megeshet hogy hulyeseg de talan megfontolando-. Ugy emlekszem nem igazan celszeru bizonyos esetekben a delay-t hasznalni idozitesre, mert akkor semmi mas nem muxik. Esetleg a millis() nem lenne jo?
Is it make any sense?
(#) szuperman válasza Saggitarius hozzászólására (») Máj 27, 2012 /
 
A fordító nem ismer ilyen fv. -t. De az teljesen mind1, hogy meg áll e minden mert egyszerűen lefagy az egész.
(#) sysy válasza capaizee hozzászólására (») Máj 27, 2012 /
 
Természetesen ez így nem jó.

A #use a preprocesszornak szól, hogy hogyan számítsa ki a delay utasításokat.
A #Fuses pedig a PIC configurációs bitjein keresztül a vasat állítja be, hogy milyen erősítése legyen az oszcillátor áramkörnek, hogy be bírjon rezegni.
(#) sysy válasza szuperman hozzászólására (») Máj 28, 2012 /
 
Sajnos megint nem jó PIC-et választottál.
Drága is, kicsit butácska is és sajna nem is lehet debugolni.
Tudom, ez volt a fiókban. De tanulni és vért pisálni az öt soros programokkal nem ez a legjobb választás.

Egyébként szinte biztos, hogy nem megy a külső órajeled. Erre utal az, hogy felhúzza magasra a portot (tehát fut a program) és utána látszólag megáll. Szerintem nem áll meg, csak nagyon lassan fut. A delaynak meg az van mondva, hogy 12MHz az órajel és nagyon sokat számlál, hogy leteljen neki az 1000msec. A PIC a környezeti brummot szedi össze nálad mint órajel és arról ketyereg. Uszkve 50Hz sebességgel. Vedd ki a delay_ms(1000) utasítást és helyette használj delay_cycles (10) utasítást, vagy #use delay(clock=50Hz)
Ezek után tessék jelenteni, hogy mi történt.
(#) szuperman válasza sysy hozzászólására (») Máj 28, 2012 /
 
Beraktam #use delay(clock=50Hz) -et.

Most folyamatosan 2.4V ot mutat a multiméter.

Ez meg hogy lehet?
(#) szuperman válasza sysy hozzászólására (») Máj 28, 2012 /
 
delay_cycles (10) -el pedig 2V van folyamatosan a kérdéses lábon.
(#) szuperman válasza sysy hozzászólására (») Máj 28, 2012 /
 
Újra méricskéltem kicsit:

1. PIC kap áramot
2. A kristály bal illetve jobb lába be van kötve a megfelelő helyekre. (15-16 láb)
3. A kristály egy-egy lábán van egy-egy 22p kerámia kondi amiknek a másik lábuk a földre van kötve.

Mindenhol van összeköttetés és megfelelő jelszint. Egyszerűen nem értem. Működnie kéne.
(#) sysy válasza szuperman hozzászólására (») Máj 28, 2012 /
 
Már majdnem jó.

Akkor mégiscsak megy az órajel valahol, mert ha 2.4V-ot mérsz, az azt jelenti, hogy 50% kitöltési tényezővel villog nagyon gyorsan a LED. Most kellene megmérni, a kijövő frekit, amiből meg lehet tudni, hogy milyen frekin megy a kristály.

Ha játszol a use delay és az delay_ms utasításokkal, akkor egyszercsak a látható tartományba esik a LED villogása és kiderülnek a kvarc paraméterei. Lehet, hogy 1.2MHz és lekopott a tizedespont róla? Vagy tegyél bele egy tuti biztos kvarcot.
(#) capaizee válasza szuperman hozzászólására (») Máj 28, 2012 /
 
ameddig ~2.5 V körül mérsz a pic-en addig azt jelenti hogy müködik.
multiméter átlagol tehát a pic szorgosan váltogatja 5V és a 0 V ot
(#) vicsys válasza szuperman hozzászólására (») Máj 28, 2012 /
 
Az nem lehet, hogy 4MHz-es a PIC-ed és te 12MHz-es kaviccsal akarod hajtani?
(#) sysy válasza vicsys hozzászólására (») Máj 28, 2012 /
 
A 16F628 adatlap szerint bírja 20MHz-ig.
(#) Hp41C válasza sysy hozzászólására (») Máj 28, 2012 /
 
A 16F628A és a 16F628-20 bírja 20MHz -ig, a 16F628-04 csak 4MHz -ig megy.
(#) vilmosd válasza szuperman hozzászólására (») Máj 28, 2012 /
 
Probald meg belso oszcival. A 16F628A rendelkezik belso 4 MHz oszcival, es akkor ki tudod zarni a kvarc koruli hibakat.
  1. #fuses INTRC_IO,NOWDT,PROTECT,NOLVP, NOMCLR
  2. #use delay(clock=4000000)
Ezzel 4 MHz belso oszcit allitasz be a programnak, es szimulatorban szepen lehet szimulalni a PIC mukodeset. Van logikai analizator, amiben beallitod a RB3-at es teszel egy Break-ot a 8. sorra. Majd RUN es a logikai analizator ablakaban lathatod a valtozasokat. A StopWatch segitsegevel merni is tudod a kimenet valtozasai kozott eltelt idot. Ja ha nem 16F628A, hanem 16F628-xx a PIC akkor a XX helyen levo szam adja a PIC max mukodesi frekvenciajat.
(#) sysy válasza Hp41C hozzászólására (») Máj 28, 2012 /
 
Tényleg! Igazad van.
(#) sysy válasza vilmosd hozzászólására (») Máj 28, 2012 /
 
Na, végre!

Vilmosd rátalált a tuti megoldásra. Már régen túl lennénk a problémán, ha nem bonyolítottuk volna ennyire el.

Köszönjük...
(#) vilmosd válasza sysy hozzászólására (») Máj 28, 2012 /
 
Mondjuk nem tudjuk hogy a kedves ujhus kollega milyen HW-t kotott. Lattunk mar itt 1-2 hetes kinlodast is es a vegen kiderlt hogy rossz volt egy forrasztas. Talan Inkabb ilyen tanacsokkal kellene segiteni a kedves kezdo kollegakat, nem talalgatni, es szurkalodni a masik segitokesz fele. Vegulis nem fontos nekem hozzaszolni.
(#) szuperman válasza vilmosd hozzászólására (») Máj 28, 2012 /
 
Belső órajelel működik, ezt írtam is. A külsővel nem működik csak, de nem értem miért. Zárlatot és szakadást nem találok a külső kristály körül.
(#) szuperman válasza sysy hozzászólására (») Máj 28, 2012 /
 
A hardverrel volt probléma. Kiszedtem a kondenzátorokat a kristálytól. Így működik. Nem tudom mi a gond vele. 22p kondik. Esetleg valakinek van ötlete mi lehetett a gond elárulhatná. Kíváncsi lennék. Aztán az is lehet ,hogy a boltos mellé nyúlt és nem jót adott, mert nincs rájuk írva semmi.

Köszönöm mindenkinek a segítséget!
(#) icserny válasza szuperman hozzászólására (») Máj 28, 2012 /
 
Esetleg túl nagy kapacitásúak (pl. 22 pF helyett 22 nF).
(#) sysy válasza vilmosd hozzászólására (») Máj 28, 2012 /
 
Te engem itt, most félreértettél!
Igazándiból örülök, hogy a sok gyógyegér (köztük én is) egyre kacifántosabb megoldásokban gondolkoztunk, hogy mi is lehet a probléma, mikor te hoztad az igazán elegáns és senki által nem ajánlott ötletet, hogy miért nem a belső oscillátorral próbálkozik a superman.

Ez volt eddig az egyetlen és tényleg frappáns megoldás.

Sajnos nekem van egy ilyen nagyon sz@r stílusom, amit, ha megfeszülök sem tudok megváltoztatni, pedig én is utálom magam ezért. Alapvetően nem vagyok egy destruktív elem csak sajnos mindenki azt hiszi rólam.
Mindenkitől bocsánatot kérek, aki úgy véli, hogy megbántottam. Pedig nem akartam.
(#) vilmosd válasza sysy hozzászólására (») Máj 28, 2012 /
 
Ja meg annyit kell tudni hogy en 8 ora faziskesessel vagyok a HE orajahoz. Nalam most 10:00 AM.
(#) Master_of_the_web hozzászólása Jún 5, 2012 /
 
Üdv!

Két PIC között közötti I2C kommunikációval bajlódok pár napja. Az egyik egy PIC18f2550 (48MHz PLL) ez a master. AZ SPI használata miatt nem lehetséges a hardveres i2c így szoftveresen lett megoldva. A másik egy 16f690 (8MHz belső osc) ez a slave. Ez hardveres i2c-t használ.

A problémám az, hogy a slave-ről való olvasás néha stabilan fennmarad egy darabig, néha fals értékeket ad vissza de egy idő után mindig leragad a master-ben a program az i2c_read() utasításnál.
Az írás rendesen működik. A felhúzó ellenállások 1,8k-sak.

Az ide vonatkozó kódrészleteket bemásolom:

Master:

  1. #use i2c(MASTER, SLOW, SCL=PIN_A2, SDA=PIN_A1, FORCE_SW)
  2.  
  3. BOOLEAN device_ready() {
  4.    int1 ack;
  5.    i2c_start();            // If the write command is acknowledged,
  6.    ack = i2c_write(0x40);  // then the device is ready.
  7.    i2c_stop();
  8.    return !ack;
  9. }
  10.  
  11. void write_i2c_device(BYTE device_adress, BYTE adress, BYTE data) {
  12.    if(device_ready()){
  13.    i2c_start();
  14.    i2c_write(device_adress);
  15.    i2c_write(adress);
  16.    i2c_write(data);
  17.    i2c_stop();
  18.    }
  19. }
  20.  
  21. unsigned int read_i2c_device(BYTE device_adress, BYTE adress) {
  22.    int data=0;
  23.    if(device_ready()){
  24.    i2c_start();
  25.    i2c_write(0x40);
  26.    i2c_write(adress);
  27.    i2c_start();
  28.    if(!i2c_write(0x41)){
  29.    delay_us(100);
  30.    data=i2c_read(0);
  31.    }
  32.    i2c_stop();
  33.    }
  34.    return(data);
  35. }
  36.  
  37.  
  38. write_i2c_device(0x40,1,abs(ch[1])/2);
  39. printf(" Aram: ");
  40. t0ints=read_i2c_device(0x40,2);
  41. printf("%u \n\r",t0ints);



Slave:

  1. #use i2c(SLAVE, I2C1, address=0x40, FORCE_HW, NO_STRETCH)
  2.  
  3. #INT_SSP
  4. void ssp_interupt ()
  5. {
  6.    BYTE incoming, state;
  7.    disable_interrupts(INT_TIMER2);
  8.    state = i2c_isr_state();
  9.    
  10.    if(state <= 0x80)                     //Master is sending data
  11.    {
  12.       incoming = i2c_read();
  13.       if(state == 1)                     //First received byte is address
  14.          address = incoming;
  15.       if(state == 2)                     //Second received byte is data
  16.          buffer[address] = incoming;
  17.    }
  18.    if(state == 0x80)                     //Master is requesting data
  19.    {
  20.       i2c_write(buffer[address]);
  21.    }
  22.    enable_interrupts(INT_TIMER2);
  23. }


Bármi használható ötlet jól jönne.
(#) Master_of_the_web válasza Master_of_the_web hozzászólására (») Jún 5, 2012 /
 
Közben kipróbáltam, hogy mi történik, ha folyamatosan olvasom ki ugyanazt az értéket, ezért csináltam egy hurkot, ami nem csinál mást, mint folyamatosan kiolvas egy fixen beállított értéket a slave-ből majd kiírja.

A helyes érték a 222. Érdekes módon a 0-k mindig ugyanabban a mintázatban jelennek meg. És továbbra is kifagy véletlenszerűen. Továbbra sincs ötletem mi okozhatja ezt.

konzol.jpg
    
(#) sysy válasza Master_of_the_web hozzászólására (») Jún 5, 2012 /
 
Ugye le vannak tiltva a megszakítások a kommunikáció alatt?
(#) Master_of_the_web válasza sysy hozzászólására (») Jún 6, 2012 /
 
Igen, nincs más megszakítás közben. Ami viszont feltűnt, hogy ha lejjebb viszem az átviteli frekvenciát, valamelyest javul a helyzet. 30KHz körül még stabil is marad amíg csak egy byte-ot viszek át. Ha jön egy második is, az már néha nulla lesz. De külső zavarok is blokkolásba vihetik a buszt: pl. asztali lámpa felkapcsolása, pákatrafó. A master és a slave-ek közti vezeték kb. 25 cm hosszú.
A fura tényleg az, hogy ezek a problémák csak slave-ről való olvasás közben jelentkeznek, az írás teljesen rendben van.
(#) _vl_ válasza Master_of_the_web hozzászólására (») Jún 6, 2012 /
 
A blokkolás valószínűleg azért van, mert valamelyik hibaesetet nem kezeled le. Az érzékenység meg ott játszik be, hogy akkor lesz bithiba, amit kezelni kéne.
Szkóppal nézted már, hogy mi történik?
(#) Hp41C válasza Master_of_the_web hozzászólására (») Jún 6, 2012 /
 
Szia!

A slave -nek meg kellene állítania a master állapotváltozását addig, amíg ténylegesen be nem tölti az adatot a SSPBUF regiszterbe. A szinkronizációt a SCL jel alacsony szinten tartásával lehet megoldani:
Idézet:
„bit 4 CKP: Clock Polarity Select bit
In I2 C mode:
SCK release control
1 = Enable clock
0 = Holds clock low (clock stretch). (Used to ensure data setup time.)”

Amikor a SSI modul jelzi, hogy a vett adat kész, a CKP=0 -val alacsonyra kell húzni az SCL vezetéket. A master egy fél bitidő múlva magasra engedi az SCL jelet és várja, hogy az SCL magas szintje beálljon. Ez addig nem történik meg, míg a slave alacsony szinten tartja. A program beírja a küldendő adatot az SSPBUF regiszterbe aztán a CKP = 1 értékre állítással jelzi a masternek, hogy mehet a beolvasás...
Következő: »»   76 / 118
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