Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1199 / 1319
(#) Attila86 hozzászólása Aug 30, 2015 /
 
RFM12B rádiós adóvevő modullal játszom. Megy szuperül vele az adás, a vétel, ezek felváltva, a legnagyobb (115kbps) sebességen, hardveres SPI-al. Tök jó. Viszont!

A küldés úgy működik hogy az nSEL lábát (gyakorlatilag chip select) alacsony szintre tesszük, majd várunk amíg ő az SDO lábát amolyan válaszként H szintre emeli. Ezzel jelzi hogy ráér, lehet vele beszélgetni. Ez után küldünk a modulnak SPI-on egy 0xB8-at, majd az elküldeni kívánt bájtot. Ezt követően az RFM12 elmolyol vele míg kitolja az éterbe a biteket. Addig ő el van foglalva. Ha ismét ráér és lehet vele bármit csinálni (mondjuk a következő bájtot beletolni), akkor azt ismét az SDO lábának H szintre emelésével jelzi. (Már ha előtte L-re kapcsoltuk az nSEL-t.)

Ez jól látszik a gyártó (HopeRF) gyári kódjában: Bővebben: Link
Konkrétan erről a függvényről van szó:
  1. void WriteFSKbyte( uchar DATA )
  2. {
  3.     uchar RGIT=0;
  4.     uint temp=0xB800;
  5.     temp|=DATA;
  6.     Loop: SCK=0;
  7.     nSEL=0;
  8.     SDI=0;
  9.     SCK=1;
  10.     if(SDO) //Polling SDO
  11.     {
  12.         RGIT=1;
  13.     }
  14.     else
  15.     {
  16.         RGIT=0;
  17.     }
  18.     SCK=0;
  19.     SDI=1;
  20.     nSEL=1;
  21.     if(RGIT==0)
  22.     {
  23.         goto Loop;
  24.     }
  25.     else
  26.     {
  27.         RGIT=0;
  28.         WriteCMD(temp);
  29.     }
  30. }


Bár ez a függvény elég kreténül van megoldva és van benne egy pár felesleges dolog, ezért én írtam egy sajátot ami átláthatóbb illetve csak az van benne ami kell:
  1. void WriteFSKbyte( u8 DATA )
  2. {
  3.     nSEL=0;
  4.     while(!SDO) Nop();  //Amíg foglalt az RFM12, addig itt köröz a PIC
  5.     spi1_wr(0xB8);
  6.     spi1_wr(DATA);
  7.     nSEL=1;
  8. }

Mint írtam; az SPI hardveres, a PIC SPI1 perifériája hajtja. Tehát a PIC azon lábaira, melyekre az RFM12 van kötve, azokra az SPI1 van odakapcsolva (PPS). Azonban szeretném átírni az egész adási részt úgy hogy ne egy szimpla függvény legyen amiben pollinggal figyelem az SDO lábat (while(!SDO) Nop();) hiszen így értékes utasításciklusok mennek veszendőbe. Ehelyett megszakításban szeretném figyelni az SDO lábat hogy mikor vált H szintre, hogy aztán csak gyorsan beletegye a PIC a következő küldendő bájtot az SPI1-be.

A baj az, hogy ehhez valamelyik INTx perifériát oda kellene kapcsolnom arra a lábra amelyre az SPI1 periféria SDI-je már oda van kötve.

Nyilván nem lehet két periféria egy lábon... Szóval marad az hogy INTx-et odakapcsolom a lábra, várom míg megszakítás jön majd gyorsan kicserélem az SDI-re? Lehet ilyet csinálni? Nem tart esetleg sok időbe mire az egyik periféria lekapcsolódik a lábról, majd a másik vissza rá? Vagy van esetleg erre másmilyen megoldás?
(#) potyo válasza Attila86 hozzászólására (») Aug 30, 2015 /
 
Az nem tart sokáig, hogy valami lekapcsolódjon a lábról, és egy másik rá, viszont azt próbáltad, hogy egyszerre engedélyezed mindkét perifériát? Mert még az is lehet, hogy akár egyszerre is aktív lehet mindkettő
(#) Attila86 válasza potyo hozzászólására (») Aug 30, 2015 /
 
Most hogy belegondolok elvileg lehetséges két (vagy több) perifériát kapcsolni egy lábra. Hiszen a perifériákhoz kell lábat kapcsolni, nem lábhoz perifériát. Hmm... kipróbálom mit csinál.
(#) Attila86 válasza potyo hozzászólására (») Aug 31, 2015 /
 
Mostanra sikerült kipróbálnom, működik! Szóval lehet egy lábra több perifériát bekapcsolni.
(#) Hp41C hozzászólása Szept 1, 2015 /
 
Megjelent az MpLab X 3.10 verziója. Ez lesz az utolsó, ami támogatja az XP -t.
Idézet:
„NOTICE: Microsoft Windows XP Professional SP3 will no longer be supported after MPLAB X IDE v3.10.”
(#) AZoli hozzászólása Szept 11, 2015 /
 
Sziasztok!
24EP512GU814 kontrollerre az Auxiliary területre bootloadert írtam, amit leteszteltem, minden rendben működik, kiírja a General Segment-be a programot. De mikor bekapcsoltam a kódvédelmet, _FAS(APL_ON) nem indul el a program.
Beszúrtam a 2-3. sorba TRISF = 0b0000000000000000; LATFbits.LATF1 = 1; -t, de eddig se jut el a program.
Tehát ha a lenti kódban APL_OFF -ot APL_ON -ra cserélem, akkor nem jut el a program LATFbits.LATF1 = 1; -ig sem.

  1. #include <p24EP512GU814.h>
  2.  
  3. _FOSCSEL(FNOSC_PRIPLL & IESO_ON); //FNOSC_LPRC debuggRIPLL Start with internal fsc and low-power osc.
  4. _FOSC(POSCMD_HS & OSCIOFNC_OFF & IOL1WAY_OFF & FCKSM_CSECMD); // HS OSC., osc2 clock-out, multiple pps, Clock switching is enabled, Fail-Safe Clock Monitor is disabled
  5. _FWDT(FWDTEN_OFF & WDTPRE_PR32 & WDTPOST_PS1024); //WDT off
  6. _FPOR(FPWRT_PWR128 & ALTI2C1_OFF & ALTI2C2_OFF); //POR Timer Value: 128ms
  7. _FGS(GWRP_OFF & GSS_OFF & GSSK_OFF); //_FGS(GSS_ON & GWRP_OFF & GSSK_OFF);
  8. _FAS( AWRP_OFF & APL_OFF & APLK_OFF); //_FAS(APL_ON & AWRP_OFF & APLK_OFF);
  9. _FICD(RSTPRI_AF); //Alapból AUX, majd ha lesz rajta firmware, akkor átírjuk...
  10. //******************************************************************************
  11. #define SW_version 0x0000
  12.  
  13. #define uInt        unsigned int
  14. #define byte        unsigned char
  15.  
  16. /* változók...
  17. ...
  18. */
  19.  
  20. //********************************* main: **************************************
  21. int main (void)
  22. {
  23.     RCONbits.SWDTEN = 0; //WDT off
  24. TRISF = 0b0000000000000000;
  25. LATFbits.LATF1 = 1;  
  26.  
  27.     // Configure PLL prescaler, PLL postscaler, PLL divisor
  28.     // Fosc = Fin * (M/N1*N2) -> Fosc = 10 * (48/2*2) = 120Mhz
  29.     PLLFBD = 46; // M=48
  30.     CLKDIVbits.PLLPOST = 0; // N1=2
  31.     CLKDIVbits.PLLPRE = 0; // N2=2
  32.     // Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011)
  33.     __builtin_write_OSCCONH(0x03);
  34.     __builtin_write_OSCCONL(0x61);
  35.     //__builtin_write_OSCCONL(OSCCON | 0x01);
  36.     // Wait for Clock switch to occur
  37.     while (OSCCONbits.COSC != 0b011);
  38.     // Wait for PLL to lock:
  39.     while (OSCCONbits.LOCK != 1);
  40.     //***
  41. LATFbits.LATF2 = 1;


Itt már Hp41C fórumtársnak volt gondja a kódvédelemmel, de ha jól értem nem pont ez.
Valamint az is érdekes, hogy az az állapot, amiben nekem rendesen működik, szerintem ellentmond ennek:
Idézet:
„Auxiliary Segment Key bits
These bits must be set to ‘00’ if AWRP = 1 and APL = 1. These bits must
be set to ‘11’ for any other value of the AWRP and APL bits.
Any mismatch between either the AWRP or APL bits and the APLK bits
(as described above), will result in code protection becoming enabled for
the Auxiliary Segment. A Flash bulk erase will be required to unlock the
device.”
(#) killbill válasza AZoli hozzászólására (») Szept 11, 2015 /
 
Errata-t nezted? 1-2 eve mar volt ezzel gond, de akkor meg nem volt benne az errata-ban. Talan mostanra irja....
(#) Hp41C válasza AZoli hozzászólására (») Szept 11, 2015 / 1
 
Nekem annyi volt a gondom vele, hogy a törölt példányban a AWRP = 1 és APL = 1 esethez az APLK1.0 nak 00 -nak kellene lennie. Ha ez igaz, akkor hogyan programozható be más kombináció. Megoldódott.... A konfiguráció szavak írása előtt egy törlés is lezajlik ld. időzítések.
Egy másik apró megjegyzés az adatlapból a FAS regiszterre:
Idézet:
„This register can only be modified when code protection and write protection are disabled for both the General and Auxiliary Segments (APL = 1, AWRP = 1, APLK = 0, GSS = 1, GWRP = 1 and GSSK = 0).”
A hozzászólás módosítva: Szept 11, 2015
(#) AZoli válasza killbill hozzászólására (») Szept 11, 2015 /
 
Csak ennyit találtam:
Idézet:
„If code or write protection is enabled on either the
General Segment or Auxiliary Segment, neither
segment can be read by the programmer. Code or
write protection is enabled for the General Segment
when the GSS (FGS<1>) or GWRP (FGS<0>) bits
are ‘0’. Code or write protection is enabled for the
Auxiliary Segment when the APL (FAS<1>) or
AWRP (FAS<0>) bits are ‘0’.”

De ha jól értem -az egyébként rossz angolommal- ez csak annyi, hogy bármelyik szegmens kódvédelmét bekapcsolom, az a másikra is érvényes.

Amúgy honnan az infó hogy 1-2 éve volt vele gond? Ha tudnál linket, megnézném, hátha van ott valami.
A hozzászólás módosítva: Szept 11, 2015
(#) AZoli válasza Hp41C hozzászólására (») Szept 11, 2015 /
 
Ez logikus nem? Csak akkor módisítható a FAS, ha a kódvédelem mindkét szegmensben ki van kapcsolva. Vagy rosszul értem?

(Amúgy biztos hogy én csinálok valamit rosszul, mert nem valami különleges dolgot várok azzal hogy kódvédett program elinduljon, ha ez nem működne, biztos tele lenne vele a net.)

Most jut eszembe, hogy amikor elkezdtem a bootloadert írni, nehezen tudtam kikényszeríteni a fordítóból, hogy mindent az aux területre fordítson. Ha az MPLABX project properties-ben állítottam át, akkor az inicializáló részt mindig a general segment-re fordította, majd utána adta csak át a vezérlést az aux területre.
Végül .gld -t kellett szerkesztenem:
  1. data  (a!xr)   : ORIGIN = 0x1000,        LENGTH = 0xD000
  2.   /*reset          : ORIGIN = 0x0,           LENGTH = 0x4*/
  3.   reset          : ORIGIN = 0x7FFFFC,           LENGTH = 0x4
  4.   ivt            : ORIGIN = 0x4,           LENGTH = 0x1FC
  5.   /*program (xr)   : ORIGIN = 0x200,         LENGTH = 0x55600*/
  6.   program (xr)   : ORIGIN = 0x7FC000,      LENGTH = 0x3FF8
  7.   /*auxflash (xr)  : ORIGIN = 0x7FC000,      LENGTH = 0x3FFA*/

Ez normális így?
A hozzászólás módosítva: Szept 11, 2015
(#) Hp41C válasza AZoli hozzászólására (») Szept 11, 2015 /
 
Azon meditáltam el, hogyan programozza be a programozó a konfigurációs regisztereket....
Az FS alacsonyabb címen van, mint a FAS. Ezek szerint előbb kell beállítani a FAS regisztert aztán az FS -t????
(#) AZoli válasza Hp41C hozzászólására (») Szept 11, 2015 /
 
FS mint FGS? Arra gondolsz gondolom. Lehet hogy a programozási szekvencia alatt mindegy a sorrend, csak pl. a Vpp megszűnése után él a védelem.
(#) killbill válasza AZoli hozzászólására (») Szept 11, 2015 / 1
 
Idézet:
„Amúgy honnan az infó hogy 1-2 éve volt vele gond? Ha tudnál linket, megnézném, hátha van ott valami.”
Dolgoztam egy cegnel, ahol PIC-eket hasznalnak(tunk). Miutan eljottem toluk, meseltek, hogy (az akkor uj) dsPIC33EP-s PIC-ekkel szivas volt az AUX segmensbe tett bootloaderrel, ha irasvedve volt. De mar nem emlekszem, hogy pontosan mi volt a gond. Megkerdezem a programozo sracot.
(#) AZoli válasza killbill hozzászólására (») Szept 11, 2015 /
 
Idézet:
„Megkerdezem a programozo sracot.”
Hálás köszönet.

Amit a .gld fájllal műveltem, az szerinted normális? Ez a módja annak hogy az aux segmensbe tegyem a programot?
(#) killbill válasza AZoli hozzászólására (») Szept 11, 2015 /
 
Idézet:
„Amit a .gld fájllal műveltem, az szerinted normális? Ez a módja annak hogy az aux segmensbe tegyem a programot?”
Nem tudom, mar 4 eve nem foglalkozom PIC-ekkel, nem vagyok benne napi szinten, es a PIC-nel ez az egesz linkeles egy nagy mágikus , ahhoz kepest, ahogy a gcc magatol linkelne. Legalabbis par eve meg igy volt.
A hozzászólás módosítva: Jan 24, 2016
(#) Hp41C válasza AZoli hozzászólására (») Szept 11, 2015 /
 
Igen, elírtam....
  1. #define FS FGS

Érdekes olvasmány.
(#) AZoli válasza Hp41C hozzászólására (») Szept 11, 2015 /
 
Ezt olvastam, de nem találtam a rám vonatkozó részt. Vagyis hogy mit csinálok rosszul.
Mondjuk az is igaz, hogy néztem vagy fél órán keresztül a 23-1 táblázatot, de még mindig nem értem... hogy mit akartak vele mondani.

Közben kipróbáltam azt, hogy a general segment kódvédelmét kapcsoltam be, és az errata-nak megfelelően nem olvasható ki egyik segment sem. Ekkor végre elindul a bootloaderem (az aux-ban) rendben, viszont nem tudja írni/visszaellenőrizni a kódot a general segment -ben...
(#) AZoli válasza AZoli hozzászólására (») Szept 12, 2015 /
 
Valóban van errata-ban erre vonatkozó rész, de ez még nem oldotta meg.
(#) killbill válasza AZoli hozzászólására (») Szept 14, 2015 /
 
Idézet:
„Megkerdezem a programozo sracot.”
Annyit mondott a srác, hogy ha az AUX területet levédik, akkor nem tudja írni a General flash-t az AUX-ban futó program (a bootloader). Nem találtak rá semmilyen megoldást.
(#) AZoli válasza killbill hozzászólására (») Szept 14, 2015 /
 
Köszönöm hogy megkérdezted!
Én eddig két lehetőséget találtam:
1: AUX write protected -et kell csak bekapcsolni, ekkor errata alapján (és a valóságban is) külső programozóval nem olvasható egyik segment sem, viszont így szépen fut a bootloader aux -ban, és tudja írni generalt.
2: General segment code protect bekapcsolva, ekkor kívülről szintén nem olvasható egyik sem, és aux -ban lévő bootloader úgy tudja írni general-t, hogy kitörli az egészet, megírja, és utána vissza kapcsolja general segment code protect-et.

Idézet:
„Nem találtak rá semmilyen megoldást.”

És ilyenkor mi van? Áttérnek más mc -re?

Amúgy tényleg bekerült errata-ba, hogy aux code protect esetén egy reset után nem indul el a program aux területen.
(#) Attila86 hozzászólása Szept 15, 2015 /
 
Muszáj most sajnos egy kicsit assembly-ben programoznom és belefutottam egy hibába:
Lefoglaltam a memóriában 12db bájtot:
  1. csoport10 UDATA 0x800
  2.         TUCHEL_tabla                    res     .12

És van egy ilyen rész a programban:
  1. btfsc   INDF0,0
  2.         bsf             TUCHEL_tabla+5, 1
  3.         btfsc   INDF0,1
  4.         bsf             TUCHEL_tabla+4, 1
  5.         btfsc   INDF0,2
  6.         bsf             TUCHEL_tabla+3, 1
  7.         btfsc   INDF0,3
  8.         bsf             TUCHEL_tabla+2, 1
  9.         btfsc   INDF0,4
  10.         bsf             TUCHEL_tabla+1, 1
  11.         btfsc   INDF0,5
  12.         bsf             TUCHEL_tabla+0, 1
  13.         btfsc   INDF0,6
  14.         bsf             TUCHEL_tabla+11, 1
  15.         btfsc   INDF0,7
  16.         bsf             TUCHEL_tabla+10, 1

Ha az FSR0 mutató által mutatott bájt 0b11111111, akkor szépen rámegy mindegyik bsf-es sorra a PIC, és 1-be is állítja a megfelelő biteket. Kivéve az utolsó kettőt, azaz a TUCHEL_tabla+10 és a TUCHEL_tabla+11 regiszterek megmaradnak úgy ahogyan voltak.
Az első ötletem az volt hogy lehet hogy ez a legfelső két regiszter már egy másik bankban van ezért beraktam elé egy bankváltást és átírtam azt is hogy ne 0x800-tól kezdődjenek hanem 0x750-től. De nem változott a helyzet.
Arra tudok csak gondolni hogy esetleg a fordító nem tudja értelmezni a "+10"-et és a "+11"-et, talán mert két számjegyűek. Hiszen "+9"-ig működik. Vagy talán nem decimálisan értelmezi hanem hexadecimálisan? De akkor hibát jelezne a fordító! Mindenesetre kipróbáltam hogy átírtam őket "+1A"-ra és "+1B"-re. Érdekes módon lefordította így is, de nem működött így sem a program.

Megoldottam úgy hogy adtam mind a 12 regiszternek külön nevet:
  1. csoport10 UDATA 0x750
  2.         TUCHEL_tabla                    res     .1
  3.         TUCHEL_tabla2                   res     .1
  4.         TUCHEL_tabla3                   res     .1
  5.         TUCHEL_tabla4                   res     .1
  6.         TUCHEL_tabla5                   res     .1
  7.         TUCHEL_tabla6                   res     .1
  8.         TUCHEL_tabla7                   res     .1
  9.         TUCHEL_tabla8                   res     .1
  10.         TUCHEL_tabla9                   res     .1
  11.         TUCHEL_tabla10                  res     .1
  12.         TUCHEL_tabla11                  res     .1
  13.         TUCHEL_tabla12                  res     .1

De azért kíváncsi lennék miért nem jó a fordítónak úgy.
A hozzászólás módosítva: Szept 15, 2015
(#) Hp41C válasza Attila86 hozzászólására (») Szept 15, 2015 /
 
  1. movlb   TUCHEL_tabla

a btfsc INDF0,0 elé.

  1. btfsc   INDF0,6
  2.         bsf          TUCHEL_tabla+11, 1
  3.         btfsc   INDF0,7
  4.         bsf          TUCHEL_tabla+10, 1

helyett, ha nem akarod, higy a radix -tól függjön:
  1. btfsc   INDF0,6
  2.         bsf          TUCHEL_tabla+.11, 1
  3.         btfsc   INDF0,7
  4.         bsf          TUCHEL_tabla+.10, 1
A hozzászólás módosítva: Szept 15, 2015
(#) AZoli hozzászólása Szept 19, 2015 /
 
Sziasztok, újra elakadtam!
Van 3 egyforma áramkörön PIC24EP256MU806 -al, ebből 1 már hetek óta felprogramozva működik, kettőt most élesztettem volna föl, de Pickit3 mindkettőre azt mondja hogy:
Idézet:
„Target Device ID (0x2100000) does not match expected Device ID (0x18610000).”

Természetesem bekötés, PGC,PGD,MCLR tápok rendben, 100n-k, 10u tank.

Kipróbáltam, hogy rátettem Pickit3-at a már működő darabra, és indítottam egy read memory-t. És erre is azt mondja hogy 0x2100000 az ID -je. Pedig ezt hetekkel ezelőtt többször felprogramoztam, debuggoltam, akkor simán ment, nem nyúltam hozzá azóta.

Ekkor gondoltam hogy a Pickit3 -al lesz valami, rátettem egy másik áramkörre, amiben PIC24EP512GU814 van, de azt simán felismerte... na innentől nem tudom mit csináljak.
Honnan veszi ezt a 0x2100000 ID-t? Ha valami nincs rendben mindig 0x0000 -t szokott kiolvasni.
Próbáltam MPLABX, IPE, és IDE v8.92 -alól is. Mind azt mondja hogy neki 21... Megőrülök!
(#) Hp41C válasza AZoli hozzászólására (») Szept 19, 2015 /
 
PIC24EP256MU806 ??? Nem dsPIC33EP256MU806 (DeviceId = 0x0x185A)? PIC24EP256MU806 nincs, csak PIC24EP256MU810 és PIC24EP256MU814.
(#) AZoli válasza Hp41C hozzászólására (») Szept 19, 2015 /
 
De igen, dsPIC33EP256MU806, elírtam, bocsánat. Utoljára a PIC24EP512GU814 -et próbáltam, és az sikerült, azzal kevertem.
De DeviceId = 0x0x185A -t én nem látok a családban.
dsPIC33EP256MU806 = 0x1861
A hozzászólás módosítva: Szept 19, 2015
(#) PDM válasza AZoli hozzászólására (») Szept 19, 2015 /
 
f883-akkal volt hasonló jelenségem. ICD3, PCKIT2 ill.3 bizonytalanul ismerte fel, hol égette, hol nem,hol debugolta, hol nem. RB3 10k-val a földre megoldotta. (Be akart low voltage programming mode-ba ugrani.)
(#) AZoli válasza PDM hozzászólására (») Szept 20, 2015 /
 
Sajnos ez itt nem fordulhat elő, mert ezeken a 16 biteseken nincs ilyen opció.

Azóta kipróbáltam, hogy áttértem másik programozó lábakra, PGD1-PGD3, de mindenhol ugyan az a helyzet, ID 0x2100000.
(#) usane válasza AZoli hozzászólására (») Szept 21, 2015 /
 
Azt írtad minden rendben van a lábakkal de nem részletezted. MCLR pullup 10k?
Ez gyakran szokott gondot okozni.
(#) AZoli válasza usane hozzászólására (») Szept 21, 2015 /
 
Igen, az ellenállás megvolt.
Most lerövidítettem a Pickit3 - PCB közötti kábelt, és jó felismeri. Persze eddig is ezt használtam, ugyan ezen a PIC-en, tökéletesen működött egy héttel ezelőttig. Illetve a 24EP512GU814-et még most is stabilan felismerte, programozta. A 33EP256MU806- ot meg már nem.. De legalább jól megszívattam magam.
Így, ismerve a megoldást, az amatőr kérdések között kellett volna feltennem a kérdést.
A hozzászólás módosítva: Szept 21, 2015
(#) Wezuv válasza AZoli hozzászólására (») Szept 21, 2015 /
 
Milyen hosszú volt előtte, és most milyen lett, ami jó lett?
Következő: »»   1199 / 1319
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