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   287 / 1210
(#) Balagemann2031 hozzászólása Júl 24, 2012 /
 
Helló! Lenne egy olyan bugyuta kérdésem, hogy 18F4550 en bootloader mellett hogyan kell a megszakítást definiálni assemblyben? Mert többféle képpen próbáltam, de nem sikerült próbáltam pl úgy hogy
#define int hi_isr de így nem megy. Címnek 0x1008 at használtam. Üdv! Balage
(#) zenetom válasza Balagemann2031 hozzászólására (») Júl 24, 2012 /
 
Szia!
A magas priorítású megszakítás címe: 0x000008 (elég csak ennyit írni: 0x08).
Vagyis ha magas prioritású megszakítás történik, a program ezen a címen folytatódik, amíg nem találkozik a RETFIE utasítással.
Szerk.: bár azt nem tudom, hogy a bootload mennyire szól bele a megszakításba, ezért is vizsgálni kell mi hozta létre a megszakítást.
(#) icserny válasza Balagemann2031 hozzászólására (») Júl 24, 2012 /
 
Idézet:
„18F4550 en bootloader mellett hogyan kell a megszakítást definiálni assemblyben?”
Nézd meg a PICCOLO projekt include/p18_all.inc állományában!
  1. RST     CODE
  2.         goto   main      ; RESET vektor: ugrás a főprogramhoz
  3.         fill   0,4
  4.         extern hi_isr    ; Magas prioritású interrupt vektor:
  5.         goto   hi_isr ; ugrás az interrupt kiszolgáló eljáráshoz
  6.         fill 0,0xc
  7.         extern lo_isr    ; Alacsony prioritású interrupt vektor:
  8.         goto lo_isr      ; ugrás az interrupt kiszolgáló eljáráshoz

A "fill" makrók ahhoz hellenek, hogy a megszakítási vektorok a megfelelő (HID bootloader esetén 0x1008 és 0x1018) címre kerüljenek.

Az RST szekció címét a common/PIC18f4550.lkr linker állomány definiálja.

Az extern kezdetű sorok csak akkor kellenek, ha a kiszolgáló eljárások külön fájlban vannak!
(#) zenetom hozzászólása Júl 24, 2012 /
 
Elhatároztam, hogy belekezdek a C18-ba, viszont már az alapoknál vakarom a fejem. Elvileg lennie kéne a telepítési mappában (C:\MCC18) egy "lkr" mappának, amiben vannak a linker fájlok. Viszont nekem a "C:\MCC18\LKR" mappában vannak linker fájlok, ráadásul ezeknek a fájloknak a végén szerepel egy "g" betű (pl.: 18f1320_g.lkr).
Ez jelent valamit, vagy használhatom ezeket a linker fájlokat?
(#) Balagemann2031 válasza icserny hozzászólására (») Júl 24, 2012 /
 
Köszönöm! Ezzel már boldogulok! Üdv! Balage
(#) icserny válasza zenetom hozzászólására (») Júl 24, 2012 /
 
újabban valamiért az "MCC18\bin\LKR" mappában vannak a linker állományok.

Az állományok nevében a "g" betű az általános (general) felhasználhatóságra utal. Ezeket kell használni. Korábban külön volt a debugoláshoz, most feltétes direktívákkal kezelik a DEBUG vagy RELEASE változat kezelését. A hibavadász módban ugyanis a debugoláshoz a memóriából le kell csípni egy kicsit.
(#) zenetom válasza icserny hozzászólására (») Júl 24, 2012 /
 
Értem, köszönöm a választ!
(#) Net_Boy_debr hozzászólása Júl 24, 2012 /
 
Sziasztok!

Kezdő vagyok PIC terén és elakadtam már az elején a programozásnak. PIC24FJ128GA010-es családot szeretnék programozni, mely nekem egy PIC16-os próbapanelben van. Ez egy tesztáramkör.
Mivel a 16 bites PIC-ek portjai 16 bitesek, ezért 16 bitesként kell címezni őket.
A kérdésem az lenne, hogy a TRISx regiszter esetén a portokat 0xFF00 formában kell megadni, hogy a port alsó nyolc bitje kimenet legyen. Ez gondolom azt jelenti, hogy az A0-A7-ig kimenetnek programozom az iránybitet. De viszont láttam egy példában, hogy a port visszaolvasására használt LATx regiszter úgy van megadva, hogy 0x00FF. Ez mit jelent? Binárisan értem (0000 0000 1111 1111), de a visszaolvasást a portra vonatkozóan a jobb oldalról kell elindítani a TRISx-nél pedig balról? Nem értem.
A másik kérdésem viszont az lenne, hogy eltudná-e magyarázni nekem valaki mint jelent az, hogy alsó meg felső bit?

Köszönöm a választ!
Üdv.
(#) El_Pinyo válasza Net_Boy_debr hozzászólására (») Júl 24, 2012 /
 
A LATx regisztereket írásra használják, míg a PORTx regisztereket olvasásra.
Nem véletlenül alsó- és felső byte (annak még értelme is lenne)? Az alsó az alacsonyabb címen levő byte, míg a felső a magasabb címen levő byte. A 16 bites kontrollerek adatbusza 16 bites, így egyszerre 2 byte-ot tud kezelni. Valahogyan ezeket pedig meg kell különböztetni (pl.: alsó és felső).
Vagy esetleg MSB, LSB-re gondolsz? Előbbi a legmagasabb helyértékű bit, a másik meg a legalacsonyabb.
(#) icserny válasza Net_Boy_debr hozzászólására (») Júl 24, 2012 /
 
Javaslom, hogy nézz szét a honlapomon a PICkwik projektben! Bár én kis lábszámú PIC24HJ típust használok, te meg nagy lábszámó PIC24FJ típust, olyan egetverő különbség nincs az alapokban. Nálad több port van, az órajel frekvenciáját pedig csak négyszerezni lehet (8 MHz-ből 32 MHz lesz, az utasításciklusok frekvenciája ennek az utóbbinak a fele lesz: 16 MHz.

Milyen kártyát használsz? Ha Explorer16-ot, akkor a letölthető mintaprogramok között egy külön könyvtárban van néhány erre az áramkörre átdolgozott példa is.
(#) norbigal hozzászólása Júl 25, 2012 /
 
PIC16F887-es processzort programozok MPLAB-ban, HTC compilert használva. Amíg csak assemblyben programoztam könnyen metn minden, de most hogy rátértem a C-re nem tudom miként kell beállítani a progmramot úgy, hogy működjkön is amit letöltök a chip-be:
Az alábbi problémám van:
  1. #include <htc.h>
  2.  
  3. void main()
  4. {
  5.  
  6. for(;;)
  7. {
  8. TRISD  = 0x00;
  9. PORTD=0x33;
  10. }
  11.  
  12. }


Ezen programot HEX fájllá alakítva, majd letöltve a chip-be csupán a programozás idejére villannak fel az említett LED-ek - PORTD LED-jei. De csupán addig világítanak a LED-ek amíg a PICKit2 Busy jelzése villog, magyarán amíg programoz.
A Konfigurációs biteket az MPLAB-->COnfigure-->COnfiguration Bits.... menüben állítom be, INTOSCIO oszcillátor beállításon, és Watch-dog timer kikapcsolt állapotban van, Power-up Timer engedélyezve van. GOndoltam arra, hogy a WDT kavar be, de mint említettem azzal nem lehet gond. Mi lehet a probléma, vagy mit kellene beállítanom, hogy működjön a program a felprogramozás után is?!?! Még az életben nem programoztam C-ben PIC-et szóval kicsit elveszve érzem magam...
Köszi a segítséget előre is!
(#) Hp41C válasza norbigal hozzászólására (») Júl 25, 2012 /
 
Szia!

- Az MpLab ablakában fent, középen a Debug opciót állítsd át Release -re.
- Ellenőrizd le, hogy a konfigurációs biteket valóban a kézi beállítás szerint programozta be. Indítsd el az MpLab -ot, a config meüben állítsd be a kontroller típusát. A programozóvan olvasd be a kontroller tartalmát. Nézd meg a beolvasott konfigurációs bitek állapotát.
(#) norbigal válasza Hp41C hozzászólására (») Júl 25, 2012 /
 
A chip az be van állítva, viszont visszaolvasáskor a konfig bitek 3FE4 0700
AZ MPLAB-ban viszint a Configuration Bits... menüben: 3FE4 7FFF, amit már eleve sem értek, mert a Config2 regiszter hogy a viharba lehet 7FFF ha annak csupán a 8-9-10. bitje állítható.
De ettől eltekintve kiolvasáskor azokat az értékeket kaptam amiket MPLAB-ban szövegesen kiírva állítgattam, majd adatlapban visszaellenőriztem.

Nem értem mi lehet a gond :| Ha egyszer feltehetőleg beleírta a progit, hiszen egy pillanatig felvillant aminek kell... Egyéb ötlet esetleg?!?!
(#) Hp41C válasza norbigal hozzászólására (») Júl 25, 2012 /
 
Szia!

A config2 visszaolvasott értéke biztosan hibás, ugyanis a program memória 14 bites, a maximális érték 0x3FFF lehet. Vagy a RB6 és RB7 vonalakon van valami probléma, vagy ezeket a lábakat kimenetre állítja a program igen rövid időn belül... Próbáltad már Use Vpp first programming entry móddal is kiolvasni a pic -et?
(#) norbigal válasza Hp41C hozzászólására (») Júl 25, 2012 /
 
Köszi a segítséget, de már megoldódott a probléma.
AZ MCLR config beállítással volt a probléma, szerencsére megoldódott, és megy minden már. Meg is írtam az első programom, de ott meg ugyanaz az AD konvertáló programom ami assemblyben hibátlanul fut, C-ben megírva, ugyanazon regiszter beállításokkal semmit nem csinál.... szóval most megint valami más marhaságra kell rájönnöm.....
(#) Net_Boy_debr válasza icserny hozzászólására (») Júl 25, 2012 /
 
Köszönöm a választ! Az oldalon már jártam és nagyon hasznosnak találom.
Az Explorer 16-os Demo Board-ot használom, melyet ICD2-vel és ICD3-mal programozom, ugyanis megvan mind a két programozó hozzá. Most kezdtem el ismerkedni ezzel a témával és eléggé komolyan gondolom. Tehát haladni szeretnék vele, csak külön tanfolyamot erre nem találtam eddig, főleg hogy debreceni vagyok. Esetleg ha lenne valami lehetőség Debrecen környékén szívesen részt vennék rajta.
A forrásprogramokat már nézegetem, de eddig még elég magas nekem!

Üdv.
(#) icserny válasza Net_Boy_debr hozzászólására (») Júl 25, 2012 /
 
Idézet:
„A forrásprogramokat már nézegetem, de eddig még elég magas nekem!”
Az elején kell kezdeni (mármint a PICkwik projekt nyitóoldalán. Aztán csak szépen, fokozatosan. Az ICD2/3-at egyelőre tedd félre, a demókártyával együtt! Az első 5 fejezethez csak az MPLAB szimulátora kell.
(#) wagnerur hozzászólása Júl 25, 2012 /
 
Kedves Fórumozók

Azzal a kérdéssel fordulok hozzátok, lehet máshol
már feltették ezt a kérdést, de ha egy pic-et szeretnék
üzembe helyezni, ahhoz nekem feltétlenül szükségem van valamilyen kristályra? Vagy ilyen már van a pic-be integrálva? (elnézést, ha hülyeség, amit kérdezek)
(#) Zsora válasza wagnerur hozzászólására (») Júl 25, 2012 /
 
Nem kell feltétlenül külső kristály ill. oszcillátor. Az IC-n belül van RC oszcillátor, amit használhatsz, ha nem szükséges a nagyon pontos frekvencia. A PIC adatlapjában van erről leírás.
(#) vicsys válasza Zsora hozzászólására (») Júl 25, 2012 /
 
Már amelyikben van.
(#) imi84 válasza Hp41C hozzászólására (») Júl 25, 2012 /
 
Idézet:
„Az a 25 ugye decimális. Jobb lenne .25 -öt írni.”

Namost én ezidáig nem láttam programozási nyelvet, melyben 25 alatt ne decimális huszonötöt (=0x19=19h) értettünk volna, és ezidáig nem láttam olyan programozási nyelvet sem, melyben .25 alatt ne 0.25-öt (=1/4) értettünk volna, vagy lebegőpontos aritmetika hiányában ne szintaktikus hiba lett volna az eredmény, úgyhogy erre speciel hiába van ott a disassembly listing, magamtól nem biztos hogy rájöttem volna... ma mindenesetre eljutottam odáig, hogy .25-tel fordul a kód... majd egyszer meg is nézem mi az eredmény Addig is köszönöm a segítséget.
(#) Zsora válasza vicsys hozzászólására (») Júl 26, 2012 /
 
Na igen... Van néhány, amiben nincs.
A többségükben van.
(#) Hp41C válasza imi84 hozzászólására (») Júl 26, 2012 /
 
Idézet:
„Namost én ezidáig nem láttam programozási nyelvet, melyben 25 alatt ne decimális huszonötöt (=0x19=19h) értettünk volna, és ezidáig nem láttam olyan programozási nyelvet sem, melyben .25 alatt ne 0.25-öt (=1/4) értettünk volna, vagy lebegőpontos aritmetika hiányában ne szintaktikus hiba lett volna az eredmény,”

A magas szintű nyelveken a default számredszer mindig a 10 -es számrendszer. Az MpLab Assembly -nél (és még rengetegnél) a default számrendszer a hexadecimális. A Radix direktívával lehet módosítani.
(radix - Specify Default Radix : ld. MpLab MPASM help.) Mivel egy program több állományból is állhat, ha nem adod meg a számrendszert, az utoljára végrehajtott radix beállítás szerintit használja. Mi van, ha mások írták a programod egy-két részét.

Két választás lehetséges:
- Minden állomány elején és minden include (stb.) után beállítod a radix -ot, és emlékezel, arra, hogy mi az utolsó beállított érték.
- Minden többjegyű szám előtt megadod.
Szerintem a második átláthatóbb, bár egy kicsit többet kell írni. A syntax highlight más színnel jelzi a számrendszert: default - fekete, decimális - zöld alapesetben.

Továbbá, mivel a PIC -eknél még mincs assembly támogatás a lebegőpontos műveletekre, a tizedespontot a 10 -es számrendszer egyszerűsített megadásra használják. (a neve alapján - Decimal point).
0x64 = D'100' = .100 Melyiket gyorsabb írni?

Radix.JPG
    
(#) norbigal hozzászólása Júl 26, 2012 /
 
Az alábbi két programban kérném segítségeteket.
Az RB1 láb analóg bemenetként egy hőszenzort érzékel és alakít át, majd teszi ki az eredményt - balra igazítva - a LED-sorra.
Mindkettő ugyanazt csinálja (ná) csak egyik assemblyben a másik C-ben. A különbség az, hogy assemblyben gyönyörűen műklödik a progi, C-ben viszont nem.
C-ben megírva és letöltve egy adott értéket tesz ki a LED sorra, de nem a konvertálás értékét. Olyan mintha lefagyna, de az nem lehet, mert ha pl villogót írok ugyanabba a programba akkor az működik. Ergó az adc_convert függvénybe is belép és ki is lép, de mégsem konvertál...


Íme a asm-progi:

  1. #include <p16F887.inc>
  2. __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
  3. __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
  4.  
  5.      cblock 0x20
  6. Delay1           ; Assign an address to label Delay1
  7. Delay2
  8. Display          ; define a variable to hold the diplay
  9.      endc
  10.          
  11.      org 0
  12. Start:
  13.      bsf       STATUS,RP0     ; select Register Bank 1
  14.      movlw     0xFF
  15.      movwf     TRISB          ; Make PortB all input
  16.      clrf      TRISD          ; Make PortD all output
  17.      movlw     0x00           ; Left Justified, Vdd-Vss referenced
  18.      movwf     ADCON1
  19.      bsf       STATUS,RP1     ; select Register Bank 3
  20.      movlw     0x04           ; PORTB.1 is input
  21.      movwf     ANSELH
  22.      bcf       STATUS,RP0     ; back to Register Bank 0
  23.      bcf       STATUS,RP1
  24.      
  25.      movlw     0x69
  26.      movwf     ADCON0         ; configure A2D for Fosc/8, RB1, ADON, Channel10
  27. MainLoop:
  28.      nop                      ; wait 5uS for A2D amp to settle and capacitor to charge.
  29.      nop                      ; wait 1uS
  30.      nop                      ; wait 1uS
  31.      nop                      ; wait 1uS
  32.      nop                      ; wait 1uS
  33.      bsf       ADCON0,GO_DONE ; start conversion
  34.      btfss     ADCON0,GO_DONE ; this bit will change to zero when the conversion is complete
  35.      goto      $-1
  36.  
  37.      movf      ADRESH,w       ; Copy the display to the LEDs
  38.      movwf     PORTD
  39.      goto      MainLoop
  40.  
  41.      end


És a C-progi:


  1. //PIC16 F887 project
  2.  
  3. #include <htc.h>
  4.  
  5.  
  6. __CONFIG(FOSC_INTRC_NOCLKOUT & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
  7.  
  8. int adc_result;
  9.  
  10. void _delay_time(int time)
  11. {
  12. for(;;)
  13. {
  14. time--;
  15. if(time==0) break;
  16. }
  17. }
  18.  
  19. void adc_convert()
  20. {
  21. _delay_time(2000);
  22.  
  23. ADCON0|=GO_nDONE;//start conversion
  24. for(;;) {if((ADCON0&GO_nDONE)==0) break;}
  25. adc_result=ADRESH;
  26. }
  27.  
  28.  
  29.  
  30.  main()
  31. {
  32. TRISD=0x00; //full D port is output - LEDs
  33. TRISB=0x02; //RB1 is input
  34. ANSELH|=(1<<ANS10); //RB1 is analog
  35. ADCON0|=(1<<ADCS0)|(1<<CHS1)|(1<<CHS3)|(1<<ADON); //    FOSC/8   RB1 analog channel    AD coverter ON
  36. _delay_time(300);
  37.  
  38. while(1)
  39. {
  40. adc_convert();
  41. PORTD=adc_result;
  42. }
  43.  
  44. }


Tudom hosszú elolvasgatni, de ha valaki megteszi és segít annak előre is hálás vagyok.
(#) Wabe hozzászólása Júl 26, 2012 /
 
Sziasztok!
Én is egy A/D átalakítóval küzdök, de elakadtam. Valahol ott lehet a hiba, hogy egy idő után megáll szerintem az átalakítás. Elmentettem miden átalakítás eredményét az eepromba, de mindig csak 0-kat kapok, és a beállított 10 helyett csak 2-4-et találok meg az adatmemóriában. Nem tudom mi lehet a gond. Segítségeteket szeretném kérni.
Itt a kód:
  1. program adalakit;
  2.      
  3.     Processor 12F675;
  4.      
  5.     cfgword   cp_off,pwrte_on,INTRC_OSC_NOCLKOUT,bod_off;
  6.      
  7.     uses EEPROM, delay4M, math;
  8.      
  9.     var i,j,mehet,eleje,vege;
  10.      
  11.     begin
  12.     delay(250);
  13.     //01000001
  14.     ADCON0:=0;
  15.     TRISIO:=255;
  16.     OSCCAL:=63;
  17.     ANSEL:=49;
  18.     delay(250);
  19.     ADCON0:=64;
  20.     for i:=1 to 10 do begin
  21.         MEHET:=0;
  22.         for j:=1 to 4 do delay(200);
  23.         asm
  24.     BTFSCPIR1,6
  25.     BSFMEHET,0
  26.         end;
  27.         if MEHET=1 then begin
  28.            eleje:=ADRESH;
  29.            vege:=ADRESL;
  30.            EEPROM_Write(i+i,eleje);
  31.            EEPROM_Write(i+i+1,vege);
  32.            Bitset(ADCON0,1); //Elindítja a GO/DONE bit 1 re állításával az A/D konverziót
  33.         end;
  34.         ADCON0:=0;
  35.         DELAY(20);
  36.         ADCON0:=64;
  37.     end;
  38.     TRISIO:=0;
  39.     GPIO:=32;
  40.     Sleep;
  41.      
  42.     end.

Pas2PIC-kel fordítottam le mindig.

Átellenőriztem (többször is), szerintem mindent a jó helyre kötöttem, tehát ez szerintem nem lehet probléma.
Előre is köszönöm válaszotokat!

Wabe
(#) trudnai válasza Wabe hozzászólására (») Júl 26, 2012 /
 
Watchdog timert is kapcsold ki a cfgword-ben!
(#) imi84 válasza Hp41C hozzászólására (») Júl 26, 2012 /
 
Sziasztok, és szia Hp41C!

Köszönöm a segítséget, ma be tudtam írni a módosított programot, és működött.
(#) Wabe válasza trudnai hozzászólására (») Júl 27, 2012 /
 
Köszönöm a gyors választ, be fogom írni programba ezt a
módosítást!
(#) Kovabe hozzászólása Júl 27, 2012 /
 
Sziasztok egy olyan kérdésem lenne hogy van egy RC távom+vevöm és szeretnék hozzá épiteni egy motorszabályzót (kétmotorost), idáig sikerült egy kész projektet megépiteni és a hozzá lévö programot is beégetni, ez igy müködik is de az én problémám hogy nem találok olyan kapcsolást és programot ami müködne biztosra. Na az én problémám amivel hozzátok fordulok hogy a fenében értelmezi a pic a servojelet? Felteszem a progit hátha ti ki tudjátok bogozni mert nem értem hogy a fenébe lesz egy bejövö frekiböl kimenö feldolgozott freki. Ha valaki segitene azt megöszönném.
Üdv Kovács G
(#) kicseee hozzászólása Júl 27, 2012 /
 
Sziasztok!

PIC18F2520-at PICKIT2-n keresztül C-ben programozgatok alap szinten. A bemenetek kezelésével bajlódok, lekérdezni már tudok lábat, de interrupt-ot is szeretnék használni. Tudna valaki segíteni, hogy egyáltalán melyik lábon lehet, és miként működik?

köszi
Következő: »»   287 / 1210
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