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   536 / 1210
(#) usane válasza Pali79 hozzászólására (») Jún 10, 2014 /
 
Pedig az X-nek vannak nyűgjei.
Mindenesetre a hiba okai azok lehetnek amiket nedudgi fórumtárs is felsorolt.
Alapból rácsatlakozik a PIC-re csak programozákor veszti el, vagy alapból is azonosítási hibát ír ki? Dashboardon látszik a PIC?
(#) Birs Alma hozzászólása Jún 10, 2014 /
 
Sziasztok,

Segítene valaki a következő probléma megoldásában?

Ha PORTA 0-ra és 1-re egy-egy LED-et kötök egy-egy 330ohm ellenálláson keresztül. A led-ek másik lába GND-re van kötve. Akkor:

  1. LIST R=DEC
  2. #include <p16F690.inc>
  3.  
  4.             __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF)
  5.  
  6. ORG 0x0000
  7.             nop        
  8.             banksel PORTA
  9.             clrf    PORTA
  10.             banksel TRISA
  11.             clrf    TRISA
  12.             banksel ANSEL
  13.             clrf    ANSEL
  14.             clrf    ANSELH
  15.            
  16.             movlw   0x03        
  17.             movwf   PORTA   ; mindkét led világít
  18.             bsf     PORTA,0 ; CSAK a 0-ás led világít ?!?!?
  19.             bsf     PORTA,1 ; CSAK az 1-es led világít ?!?!?
  20.             goto    $
  21.            
  22.             end


Miért alszik ki a másik led, ha az egyiket bekapcsolom????

Kösz,
L.
A hozzászólás módosítva: Jún 10, 2014
(#) Pali79 válasza Birs Alma hozzászólására (») Jún 10, 2014 /
 
Pontosan mit értesz azon, hogy kapcsolod a ledet? Ez a kód szerintem csak bekapcsolja mindkettőt és úgy marad.
(#) Birs Alma válasza Birs Alma hozzászólására (») Jún 10, 2014 /
 
Hülye vagyok.
Rájöttem a hibára.
Az MPLAB-ban más device volt kiválasztva.
(#) nedudgi válasza Birs Alma hozzászólására (») Jún 10, 2014 /
 
Forrásszöveg beillesztéséhez a kód gomb ajánlott.
A bsf utasítás beolvassa a portot, beállítja a bitet, és visszaírja a portra az új tartalmat. Így előfordulhat, hogy bizony kialszik a LED.
(#) Birs Alma válasza Pali79 hozzászólására (») Jún 10, 2014 /
 
Na igen! PONT EZ AZ! Csak bekapcsoltam, de amint egy BSF kiment a másik led kikapcsolt, és csak az az egy maradt bekapcsolva. Pedig egyáltalán nem kapcsoltam ki, mint az látható. Csak be! Na de megvan a hiba. PIC12F675 volt beállítva a device-nak. Mikor azt rendesen beállítottam, a hiba megszűnt. (Mondjuk nem értem, de lényeg, hogy most rendben van.)
(#) Pali79 válasza Birs Alma hozzászólására (») Jún 10, 2014 /
 
Ezt valami szimulátoron nézed? Mert egyébként nem sokat látni ebből.
(#) Hp41C válasza Birs Alma hozzászólására (») Jún 10, 2014 /
 
Szia!
  1. banksel ANSEL
  2.             clrf    ANSEL
  3.             clrf    ANSELH
  4.            ;;; Innen valami hiányzik!
  5.             movlw   0x03      
  6.             movwf   PORTA   ; mindkét led világít

A kontrolleren nem állítottad vissza a Bank kiválasztást a PORT regiszterekre.
16F690 -en az ANSEL és ANSELH a 2. Bank -ban van, a PORTA is elérhető ebben a Bank -ban. Tehát a hiba nem jelentkezik.
12F673 -on az ANSEL a 1. Bank -ban van, de ebben a Bank -ban a TRISIO regiszter érhető el. Ha az 1. Bank kiválasztása mellett végrehajtod a bsf PORTA,0 utasítást, akkor tulajdonképen a bsf TRISIO,0 -t hajtja végre...
Ráadásul a 12F675 -nek sen PORTA sem ANSELH regisztere nincs, nem is fordulhatott le a program rá...
A hozzászólás módosítva: Jún 10, 2014
(#) Birs Alma válasza Hp41C hozzászólására (») Jún 10, 2014 /
 
Á, nem.
Korábban írtam egy programot 12f675-re. Akkor az MPLAB-ban a device-t átállítottam erre a típusú PIC-re. Az egy másik kicsike program volt, és teljesen jó is lett, remekül működik. Most viszont egy 16f690-et programoztam volna, de elfelejtettem visszaállítani az MPLAB-ban a DEVICE-t. Amint ezt megtettem, már minden rendben működött. A program azért fordult le a hibás DEVICE mellett is, mert a 16f690 definícióit tartalmazó include fájl az be volt emelve. Abban benne van a PORTA, az ANSELH, stb.

Valahogy azt gondolom, hogy a téves DEVICE beállítás miatt a MPLAB más kódot állított elő, mint a 16f690-hez kellett volna. 12f675-re fordított 16f690 helyett. Hogy ez miért okozott ilyen hibát, azt egyáltalán nem tudom, de mégis ez történt.
(#) HerrTopi hozzászólása Jún 11, 2014 /
 
Sziasztok!

Pár napja kérdeztem ezzel kapcsolaban és bár azóta ezen töröm a fejem, probléma továbbra is adott: egy pic18f14k50-es ketyerén szeretném belőni a külső megszakítást (int0). Ez az RC0 lábhoz van rendelve. Írtam egy apró kódot, ami azt csinálná, hogy ha '1'-et adok RC0-ra, akkor ő meg '1'-et ad RC4-re. Persze nem tesz semmi ilyesmit. Próbáltam a kódban látható módon, közvetlenül az INTCON írásával és nem ilyen direkt módon is, a C18 library beépített fgv-eivel, hasonló eredménnyel. Ha a timer0 megszakítását használom, akkor ott szépen végrehajtódik a megszakítás, szóval nem értem mi lehet a baj.
(konfig bitjeim nincsenek a kódan, mert az mplabban lehet kódon kívül állítani öket, de természetesen állítva vannak, a megszakításon kívül minden (pwm, timer, timeres megszakítás, stb működik.))
Remélem tudtok segíteni, mert már teljesen tanácstalan vagyok.
Előre is köszönöm a válaszokat!

Kódot mellékelek:
  1. #include <xc.h>
  2.  
  3. void main(int argc, char** argv) {
  4.     ANSEL = 0x00; //analóg bemenetet kikapcsolom, tuti ami fix
  5.         ANSELH = 0x00; //analóg bemenetet kikapcsolom, tuti ami fix
  6.     TRISCbits.RC4 = 0; //RC4 kimenet. Ezt akarom változtatni az interrupttal
  7.     TRISCbits.RC0 = 1; //RC0 (INT1) bemenet
  8.         INTCON = 0b00001011; //Interrupt konfigurálása
  9.  
  10.     while(1)
  11.     {
  12.      
  13.     }
  14.  
  15. }
  16.  
  17. void interrupt CheckButtonPressed()
  18. {
  19.       PORTCbits.RC4 = 1;
  20. }
A hozzászólás módosítva: Jún 11, 2014
(#) icserny válasza HerrTopi hozzászólására (») Jún 11, 2014 /
 
Az XC8-hoz nem értek. C18-ra a honlapomon a PICCOLO projektben találsz mintapéldát.

Az inicializálásban nálam ezek vannak:
  1. INTCON2bits.INTEDG0=0;         //INT0 negatív élre legyen érzékeny
  2. INTCONbits.INT0IF=0;           //az INT0 interrupt jelzőbitjének törlése
  3. INTCONbits.INT0IE=1;           //az INT0 interrupt engedélyezése


A megszakításban pedig törölni kell a megszakításjelző bitet:
  1. INTCONbits.INT0IF=0;           //töröljük az interrupt jelzőbitet
(#) foxi63 válasza HerrTopi hozzászólására (») Jún 11, 2014 /
 
Szia!
Nem állítottad be a globális megszakítás engedélyezését, addig nincs is megszakítás.
Az ANSEL regiszter valószínűleg csak kiválasztja melyik bit legyen az AD bemenete, a valós tiltást valamelyik ADCON regiszter végzi.
(#) icserny válasza foxi63 hozzászólására (») Jún 11, 2014 /
 
Idézet:
„Nem állítottad be a globális megszakítás engedélyezését, addig nincs is megszakítás.”
Valóban, kell egy engedélyezés is:
  1. INTCONbits.GIE = 1;


Az előző hozzászólásomban viszont direkt le van tiltva a megszakítási rendszer, mert abban csak az alvásból történő felébresztésre használom az INT0 bemenetet.

Idézet:
„Az ANSEL regiszter valószínűleg csak kiválasztja melyik bit legyen az AD bemenete”
Nem, az ANSEL bitjei az analóg/digitális mód választására valók. Az ADCON1 regiszterrel az előző generációs mikrovezérlőknél lehetett beállítani, hogy hány analóg bemenet legyen, de azoknál nincs ANSEL regiszter, s az engedélyezés csak kötött sorrendben (AN0-tól kezdve) mehetett. A PIC18F14K50 mikrovezérlő esetén viszont az ANSEL, illetve az ANSELH regiszterek megfelelő bitjének beállításával, bitenként függetlenül történhet (tehát bármelyik analóg bemenetként is funkcionáló lábat beállíthatjuk digitális üzemmódba, a többi kivezetés üzemmódjától függetlenül) az analóg/digitális mód beállítása.
(#) Gergolein hozzászólása Jún 11, 2014 /
 
Üdv!

Létezik olyan fordító+program páros, amivel a 12F, és a 16F-es MCU-k jól programozhatók C-ben?

Válaszokat előre is köszönöm!
(#) icserny válasza Gergolein hozzászólására (») Jún 11, 2014 / 1
 
Idézet:
„Létezik olyan fordító+program páros, amivel a 12F, és a 16F-es MCU-k jól programozhatók C-ben?”

Ha nem írtad volna, hogy "jól", akkor könnyebb lenne a válaszadás...
Az XC8 elvileg erre való (sőt, a fentiek mellett PIC18-at is programozhatsz vele).
(#) matheattila válasza Gergolein hozzászólására (») Jún 11, 2014 / 1
 
Szia, MPLAB 8 + Hi-Tech C, vagy MikroC.
(#) HerrTopi válasza icserny hozzászólására (») Jún 11, 2014 /
 
Igen, a PICCOLO-t olvastam és sok hasznosat sikerült tanulnom belőle, amit ezúton is köszönök!
Sikerült azóta megcsinálni a megszakítást és mivel mérgemben mindent újraírtam, ezért nem is igazán tudom, hogy mi volt a hiba .
A következő lépésben azonban egy újabb problémába futottam: definiálok egy globális változót:
volatile long int high = 0; és ezt szeretném módosítani a megszakítás fgv-én belül, viszont úgy tűnik, hogy erre nem hajlandó. Látja a fgv a változót, mert lefordul és lefut a program, de valamiért nem módosítja. Ennek mi lehet az oka?
(#) Pali79 hozzászólása Jún 11, 2014 /
 
Sziasztok! Próbáltam Hp41C tanácsára szorzást csinálni egy 16F628A-val. Az alábbi kódot próbáltam:
  1. LIST p=16F628A           ; a processzor típusát közli az assemblerrel
  2. #include <P16F628A.inc>       ; alapértelmezett beállítások a chip-hez
  3.      ERRORLEVEL 0,-302        ; elnyomja a bank-váltás üzeneteit
  4.      __config 0x3D18          ; konfigurációs értékek (oszcillátor,stb.)
  5.      org 0x0000               ; beállítja a 16F628-as kezdeti címét
  6.                               ; (itt indul a program)
  7.  
  8. mulcnd  equ     09      ; 8 bit multiplicand
  9. mulplr  equ     10      ; 8 bit multiplier
  10. H_byte  equ     12      ; High byte of the 16 bit result
  11. L_byte  equ     13      ; Low byte of the 16 bit result
  12.  
  13. Same    equ     1
  14.  
  15. Start
  16.      movlw   0x07             ; kikapcsoljuk a komparátort
  17.      movwf   CMCON            ; (így a 16F84-re hasonlít)
  18.      bsf     STATUS,RP0       ; kiválasztjuk a Register Page 1-et
  19.      movlw   b'00000000'      ; kimenetként állítjuk be az összes lábat
  20.      movwf   TRISA            ; (mindkét porton)
  21.      movwf   TRISB
  22.      bcf     STATUS,RP0       ; vissza a Register Page 0-ra
  23.  
  24. ;****   Define a macro for adding & right shifting  **
  25. ;
  26. mult    MACRO   bit             ; Begin macro
  27.         btfsc   mulplr,bit
  28.         addwf   H_byte,Same
  29.         rrf     H_byte,Same
  30.         rrf     L_byte,Same
  31.         ENDM                    ; End of macro
  32. ;;
  33. ; *****************************         Begin Multiplier Routine
  34. mpy_F   clrf    H_byte
  35.         clrf    L_byte
  36.         movf    mulcnd,W        ; move the multiplicand to W reg.
  37.         bcf     STATUS,C    ; Clear the carry bit in the status Reg.
  38.         mult    0
  39.         mult    1
  40.         mult    2
  41.         mult    3
  42.         mult    4
  43.         mult    5
  44.         mult    6
  45.         mult    7
  46. ;
  47.         retlw   0
  48.  
  49. ;********************************************************************
  50. ;               Test Program
  51. ;*********************************************************************
  52. main    movlw   0x2
  53.         movwf   mulplr          ; multiplier (in mulplr)     = 0FF
  54.         movlw   0x2
  55.         movwf   mulcnd          ; multiplicand(in mulcnd )   = 0FF
  56. ;
  57.         call    mpy_F           ; The result 0FF*0FF = FE01 is in locations
  58. ;                               ; H_byte & L_byte
  59.         MOVF    H_byte,w
  60.         MOVWF   PORTB
  61. self    goto    self
  62. ;
  63.         org     01FF
  64.         goto    main
  65. ;
  66.         END


Ez alapján

A gond az, hogy egyszer beprogramozom a pic-be, akkor nem csinál semmit, de nem is működik a kontroller. A PICKIT2 programja felismeri, de bármit próbálok vele csinálni mindig sárgára vált és kiírja, hogy No device. Lehet ezekkel valamit kezdeni? Már két pic-el jártam így.
(#) Hp41C válasza Pali79 hozzászólására (») Jún 11, 2014 /
 
A MCLR letiltva, belső oszcilátor, PWRTE letiltva, a PGD és/vagy PGC lábat kimenetnek állítva rögtön a program elején. Próbáld a Vpp first programming entry módszert. Esetleg a kimenetté állítás elé tegyél néhány ms várakozást, vagy a MCLR funkciót nem tilstd el.
(#) Pali79 válasza Hp41C hozzászólására (») Jún 11, 2014 /
 
Köszi! A Vpp first programming entry módszer bejött! A config beállításokkal tisztában vagyok, de ezekkel használtam már különböző tanulóprogramok kipróbálására és eddig nem volt gond vele.
(#) Gergolein válasza matheattila hozzászólására (») Jún 12, 2014 /
 
Köszönöm a segítséget!
(#) HerrTopi hozzászólása Jún 13, 2014 /
 
Sziasztok!

Van egy kódom, ami a következőt hivatott tenni: az egyik lábára a pic kap egy távirányító vevőjéből érkező jelet, aminek minden változására létrejön egy megszakítás és attól függően, hogy éppen magas, vagy alacsony azon a lábon a jel, amikor létrejön az interrupt, a timer aktuális értékét kimenti egy low, vagy high változóba. Ezzel az a célom, hogy majd a low és high arányából következtethessek a jel kitöltöttségére. Emellé még beírtam a megszakításba egy ellenőrző részt is, ahol is, ha felfutó élre ütött be a megszakítás (RB4 éppen magas), akkor egy másik lábat magasra állítok, ha pedig leszállóra, akkor alacsonyra. Így egy az egyben lemásolom a bejövő jelet. Ezt ellenőrzésként tettem be, azért, hogy lássam, hogy minden jól működik-e. Hát igen, jól. Azt leszámítva, hogy a pwm változóm értéke konstans 0, ami azt jelenti, hogy a high változóm 0. Mindig. Ez azért nem világos számomra, mert, ha csak a high változót vizsgálom, akkor nem 0 lesz, hanem 80 körüli érték általában. (kitöltöttségtől függően +-10) Nem értem, hogy miért a high=0 értéket használja folyamatosan a programom.
Remélem érthető voltam, 8 órája fel sem álltam a cucc mellől, kicsit fáradt vagyok

Előre is köszi a segítséget!

Íme a kód (a config bitek nem kódból, hanem az mplab beépített fonkciójából vannak állítva):
  1. #include <xc.h>
  2. #include <p18f14k50.h>
  3.  
  4. #pragma config WDTEN = OFF
  5.  
  6. volatile long int low = 0;
  7. volatile long int high = 0;
  8. volatile double pwm = 0;
  9. void initOnChangePORTAB(void) {
  10.         ANSEL = 0x00;                                   //Minden láb digitális kimenet
  11.                 ANSELH = 0x00;                                  //Minden láb digitális kimenet
  12.         INTCONbits.RABIE=1;           //A és B port onChange interrupt bekapcsolva
  13.                 INTCON2bits.RABIP=1;                    //onChange interrupts high priority
  14.                 IOCBbits.IOCB4 = 1;                     //A B port RB4 lábán engedélyezve az intOnChange
  15.         INTCONbits.RABIF=0;           //Interrupt jelzőbit
  16.                 RCONbits.IPEN=1;                                //Kétszintű megszakítási mód beállítása        
  17.                 ei();                                                   //minden megszakítás engedélyezése
  18.  
  19. }
  20. void main (void)
  21. {
  22.         TRISCbits.RC7 = 0;
  23.         TRISCbits.RC5 = 0;
  24.         TRISCbits.RC4 = 0;
  25.         initOnChangePORTAB();
  26.         OpenTimer0
  27.         (
  28.                 TIMER_INT_OFF   &
  29.                 T0_16BIT                &
  30.                 T0_SOURCE_INT   &
  31.                 T0_PS_1_1
  32.         );
  33.         while (1)
  34.         {      
  35.                 pwm=(high/(high+low+1)*100);
  36.                 if(pwm==0)
  37.                 {
  38.                         PORTCbits.RC5=0;
  39.                 }
  40.                 else {
  41.                         PORTCbits.RC5=1;
  42.                 }
  43.         }
  44. }
  45.  
  46. void interrupt high_priority cucc(void)
  47. {
  48.         if(PORTBbits.RB4)
  49.         {
  50.                 PORTCbits.RC7=1;
  51.                 low=ReadTimer0();
  52.                 WriteTimer0(0);
  53.                
  54.         }
  55.         if(!PORTBbits.RB4)
  56.         {
  57.                 PORTCbits.RC7=0;
  58.                 high=ReadTimer0();
  59.                 WriteTimer0(0);
  60.        
  61.         }
  62.  
  63.         INTCONbits.RABIF=0;  
  64. }
(#) icserny válasza HerrTopi hozzászólására (») Jún 13, 2014 /
 
Az egész típusú változókkal egy kicsit óvatosabban kell számolni!
  1. pwm=(high/(high+low+1)*100);


Az osztásod eredménye mindig 1-nél kisebb szám, azaz nulla lesz, azt már szorozhatod...
Javaslat: előbb szorozd meg 100-zal, utána végezd el az osztást!
A hozzászólás módosítva: Jún 13, 2014
(#) jwaldha válasza HerrTopi hozzászólására (») Jún 13, 2014 /
 
Szia !
  1. pwm=(high/(high+low+1)*100);

Ez így egész számokkal dolgozik és a kiszámított egész értéket konvertálja lebegőpontossá mielőtt "pwm"-be tárolja.

Valami ehhez hasonló történik a háttérben:
  1. {
  2. long int tmp;
  3. tmp=(high/(high+low+1)*100);
  4. pwm=tmp;
  5. }


A konkrét esetben így utasíthatod a fordítót arra, hogy a számolást is lebegőpontos adatokkal végezze el:
  1. pwm=((double)high/(high+low+1)*100);
(#) HerrTopi válasza icserny hozzászólására (») Jún 13, 2014 /
 
És jwaldha válaszához is:

Köszönöm szépen, C++ban ez kicsit azt hiszem okosabban megy már és bár sejtettem, hogy valami ilyesmi dolgozik háttérben, nem jöttem rá, hogy mi is pontosan. Most viszont tökéletesen működik, köszönöm mégegyszer
(#) Zadam009 hozzászólása Jún 13, 2014 /
 
Sziasztok!

Azt szeretném kérdezni, hogy elvileg lehetséges lenne pic-et programozni egy USB-UART átalakítóval, vagy csak pickit 2/jdm stb-vel?

Előre is köszönöm a segítséget!
(#) eSDi válasza Zadam009 hozzászólására (») Jún 13, 2014 /
 
Üdv!

Általában az ilyen átalakítók nem megfelelőek, mert nem tartják be pontosan az időzítéseket.
Ha jól működőt akarsz, akkor PICkit2 vagy 3, PICkit2 klón, esetleg kezdésnek az Oshonsoft.com oldalon található égetőt tudom ajánlani. A JDM-et semmiképpen sem ajánlom.
A hozzászólás módosítva: Jún 13, 2014
(#) usane válasza Zadam009 hozzászólására (») Jún 13, 2014 /
 
Nem lehetséges.
A PIC-et meghatározott lábakon kell programozni, adott programozó feszültséggel, és időzítéssel.
Maximum olyan megoldást tudok elképzelni, hogy ha UART-os bootloader van a PIC-be előre beégetve, de nem tudom ez mennyire kivitelezhető. És mi van ha nincs UART a PIC-en?
A hozzászólás módosítva: Jún 13, 2014
(#) Zadam009 válasza usane hozzászólására (») Jún 13, 2014 /
 
Értem, köszi a segítséget!
(#) nagzso hozzászólása Jún 13, 2014 /
 
Sziasztok!
Segítséget szeretnék kérni, hogy hogyan tudok PIC-kel winchestert vezérelni(írni, olvasni, esetleg formázni). A fájlrendszereket néztem, lehetőleg UDF kéne, vagy hasonló, amit támogat minimum a windows és a linux, és 4Gb-nál nagyobb fájlt is tudjak rá írni.
Következő: »»   536 / 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