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   317 / 1207
(#) icserny válasza diablo hozzászólására (») Okt 13, 2012 /
 
Ebben a dokumentumban írják le a programozására vonatkozó tudnivalókat. Ennél azért nincs külön PGM láb, mert ez már MCLR-rel vezérelt alacsonyfeszültségű programozásra készült (lásd a fenti leírás 2.6 fejezetét!). Az Oshon programozóval ezt szerintem nem fogod tudni programozni.

Én PIC18F25K22-őt vettem, de bootloaderrel előre programozva, hogy kipróbáljam vele az erre a típusra ingyenes Amcus18 (PROTON BASIC) fejlesztői környezetet. Így csak egy USB-UART (TTL jelkimenetettel!) átalakító kell a programletöltéshez.
A hozzászólás módosítva: Okt 13, 2012
(#) adamhollos válasza icserny hozzászólására (») Okt 13, 2012 /
 
  1. #include <p18f25k80.h>
  2. #pragma config XINST = OFF, FOSC=INTIO2, IESO= ON, PWRTEN=ON, WDTEN=OFF, MCLRE=OFF
  3.  
  4. void con(void);
  5. void delay (void);
  6. void lo_isr(void);
  7. void hi_isr(void);
  8.  
  9. volatile unsigned int cv =0;
  10. volatile int time=1;
  11. volatile int c=1;
  12.  
  13. void main (void)
  14. {
  15.         con();
  16.         T0CONbits.TMR0ON=1;                     //timer0 indtasa
  17.         while (1)
  18.         {
  19.                 while(cv==1)
  20.                 {                      
  21.                         LATAbits.LATA1=1;       //RA1-en levő LED villogtatás
  22.                         delay();
  23.                         LATAbits.LATA1=0;
  24.                         delay();
  25.                 }
  26.  
  27.                 while(cv==0)
  28.                 {
  29.                         LATAbits.LATA0=1;       //RA0-on levő LED villogtatás
  30.                         delay();
  31.                         LATAbits.LATA0=0;
  32.                         delay();
  33.                 }
  34.         }
  35. }
  36.  
  37. void con(void)
  38. {      
  39.         TRISA=0xFC;                             //RA0 és RA1 legyen digitális kimenet
  40.         TRISB=0x20;                             //RB5 legyen digitális bemenet
  41.         IOCB=0x20;                              //Ha RB5 változik legyen interrup
  42.         RCONbits.IPEN=1;                //Kétszintű interrupt mód beállítása
  43.         INTCON2=0x04;                   //RBPU=0 RBIP=0 TMRIP=1
  44.  
  45.         PMD1bits.TMR0MD=1;              //timer0 registerek resetje
  46.         PMD1bits.TMR0MD=0;              //timer0 bekapcs
  47.         T0CON=0X01;                             //16-bit timer, 1:4-es osztas  
  48.        
  49.         INTCON=0xE8;                    //High pri. interrupt disabled, Low  pri. interrupt enabled, timer0 int. enabled, változásjelző interrupt engedélyezése
  50.        
  51. }
  52. void delay (void)
  53. {
  54.         while(c==time)
  55.         {
  56.         }
  57.         c*=-1;
  58. }
  59.  
  60. #pragma code high_vector_addr=0x08
  61. void high_vector(void) {
  62.   _asm GOTO hi_isr _endasm
  63. }
  64.  
  65. #pragma code low_vector_addr=0x18
  66. void low_vector(void) {
  67.   _asm GOTO lo_isr _endasm
  68. }
  69.  
  70. #pragma code
  71. #pragma interrupt hi_isr
  72. void hi_isr (void)
  73. {
  74.         time*=-1;
  75.         INTCONbits.TMR0IF=0;
  76. }
  77.  
  78. #pragma interruptlow lo_isr
  79. void lo_isr (void)
  80. {
  81.         int a = PORTB;                  //PORTB olvasása törli a korábbi beállást
  82.         if(PORTBbits.RB5==1)    //RB5 állapotának olvasása
  83.         {
  84.                 cv=1;
  85.         }else
  86.         {
  87.                 cv=0;
  88.         }
  89.         INTCONbits.RBIF=0;              //az IOCB interrupt jelzőbit törlése
  90. }


Ez lett a végső program, azért másoltam be, hogy mások is megtalálhassák, meg hátha van hozzáfűznivalótok.
(#) adamhollos válasza icserny hozzászólására (») Okt 13, 2012 /
 
Ha U(S)ART-ot szeretnék csinálni azt ide vagy a haladó változatba írjam?
A hozzászólás módosítva: Okt 13, 2012
(#) adamhollos válasza icserny hozzászólására (») Okt 14, 2012 /
 
  1. #include <p18f25k80.h>
  2. #pragma config XINST = OFF, FOSC=INTIO2, IESO= ON, PWRTEN=ON, WDTEN=OFF, MCLRE=OFF
  3. #define A       LATAbits.LATA0
  4. #define B       LATAbits.LATA1
  5. #define C       LATAbits.LATA2
  6. #define D       LATAbits.LATA3
  7. void con(void);
  8. void delay (void);
  9. void lo_isr(void);
  10. void hi_isr(void);
  11.  
  12. volatile int time=1;
  13. volatile int t=1;
  14.  
  15. void main (void)
  16. {
  17.         con();
  18.         int led[] = {A,B,C,D};
  19.         int i;
  20.         T0CONbits.TMR0ON=1;                                             //timer0 indtasa
  21.         while (1)
  22.         {
  23.                 for(i = 0; i < 4;i++)
  24.                 {
  25.                         led[i]=1;
  26.                         delay();
  27.                         led[i]=0;
  28.                         delay();
  29.                 }
  30.         }
  31. }


A 18. sort nem fordítja a fordító, mert szintaktikai hibás, mi a hiba?
A hozzászólás módosítva: Okt 14, 2012
(#) Balagemann2031 hozzászólása Okt 14, 2012 /
 
Jóestét! Ha A/D konverziónál referenciának Vss-t és Vref+ (azaz külső refet szeretnék) akkor lehet a Vdd-ből egy ellenállással bevezetni a Vref+ lábhoz a feszt? És mi alapján számoljak ellenálást? nem ismerem az áramot :O (18F4550)
(#) zenetom válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
Szia!
Bár elvileg nem muszáj elemszámot megadni, de ha megadsz, akkor is kiabál a fordító?
  1. int led[4] = {A,B,C,D};
(#) adamhollos válasza Balagemann2031 hozzászólására (») Okt 14, 2012 /
 
Nem vagyok ugyan profi, de szerintem a picek bemeneti ellenállása végtelennek tekinthető, tehát nem kell ellenállás.

Néz utána a FET-eknek, a piced bemenete tulajdonképp egy FET gate-je.
(#) adamhollos válasza zenetom hozzászólására (») Okt 14, 2012 /
 
szia!

Igen, azért másoltam be a program fő részét, mert ha a hibás sort törlöm, kúszik egyet a szintaktikai hiba is.
(#) zenetom válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
És ha az előtte lévő sort veszed ki "con();" ?
A hozzászólás módosítva: Okt 14, 2012
(#) icserny válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
Idézet:
„int led[] = {A,B,C,D};”
He egy tömbnek értéket akarsz adni, akkor olyan konstans adható meg, ami az adott típusban ábrázolható.

LATAbits.LATA0 és ehhez hasonlók nem ilyenek, sőt, egy értékadás jobboldalán sem szerepelhetnek.
(#) adamhollos válasza zenetom hozzászólására (») Okt 14, 2012 /
 
Akkor jó, de nekem meg kell hívnom azt a függvényt
(#) adamhollos válasza icserny hozzászólására (») Okt 14, 2012 /
 
Akkor, hogyan tudom "átnevezni" a lábakat (HI-TECH C-ben simán OK volt)?
A hozzászólás módosítva: Okt 14, 2012
(#) Balagemann2031 válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
Szia! Akkor adnál egy tippet, hogy miként lehet 5V-ból pl 3V-ot csinálni, hogy azt be tudjam vezetni a Vref+ ba?
(#) vicsys válasza Balagemann2031 hozzászólására (») Okt 14, 2012 / 1
 
Kék led+előtét ellenállás. A közös ponton a led nyitófeszültsége mérhető. Hidegítheted egy 100nF-dal.
(#) Balagemann2031 válasza vicsys hozzászólására (») Okt 14, 2012 /
 
Köszönöm!
(#) adamhollos válasza Balagemann2031 hozzászólására (») Okt 14, 2012 / 1
 
feszültség osztóval pl. 2kohm-3kohm

Az osztás értékén nem fog változtatni a bemenet, mivel arra nem fog áram folyni.
(#) Balagemann2031 válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
Na ez jó lesz, 2 trimmerrel gyors beállítom az értékeket Köszi!
(#) kaqkk válasza Balagemann2031 hozzászólására (») Okt 14, 2012 /
 
Elég egy trimmer ....
(#) adamhollos válasza kaqkk hozzászólására (») Okt 14, 2012 /
 
Ja ja!!!

A lényeg a 2:3-hoz arány
A hozzászólás módosítva: Okt 14, 2012
(#) vilmosd válasza Balagemann2031 hozzászólására (») Okt 14, 2012 / 1
 
Nem jo a sima feszultsegoszto Vrefnek, mert a konverzio alatt kb 150 uA bemenoaram folyik, maskor pedig kb 5 uA. Inkabb egy TL431 plusz egy ellenallas es egy poti kellene. Igy meg a Vref stabilitasa jobb.

TL431.JPG
    
(#) adamhollos válasza vilmosd hozzászólására (») Okt 14, 2012 /
 
Még így is bőven jó a feszültség osztó, ha kisebb ellenállásokat használ.

pl. 20-30 ohm; 150uA Igs -> 2.998 V
20-30 ohm; 5uA Igs -> 2.999 V

Bőven a mérési egységen belül van az ingadozás
A hozzászólás módosítva: Okt 14, 2012
(#) icserny válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
Idézet:
„Akkor, hogyan tudom "átnevezni" a lábakat?”

Az attól függ, hogy mire/hogyan akarod használni az "átnevezéseket".
Baloldalon például állhat a LATAbits.LATA0, vagy a hasonmás név.

Más lehetőség:

  1. #define LEDPORT LATA
  2. #define LED1    BIT0
  3. #define LED2    BIT1
  4. #define LED3    BIT2
  5. #define LED4    BIT3
  6.  
  7. LEDPORT |= LED1 + LED3;     //LED1 és LED3 belakcsolása
  8. LEDPORT &= ~LED1;             //LED1 kikapcsolása
  9. LEDPORT ^= LED2 + LED3;   //LED2 és LED3 átbillentése


Természetesen BIT0, BIT1, BIT2, BIT3 stb. is definiálandó 1, 2, 4, 8 stb. értékkel!

int led[] = {A,B,C,D}; helyett esetleg így írhatod (bár sok értelme nincs):
int led[] = {LED1, LED2. LED3, LED4};
(#) vilmosd válasza adamhollos hozzászólására (») Okt 14, 2012 /
 
Nem tudom mi az a 20-30 ohm. Mert az mar egy 100 mA osztonak felel meg. Amit altalaban nem illik egy PIC melle tenni ami 5 V, 4 MHz eseten eszik 2-3 mA-t. Az oszto meg 100 mA. A TL431 plusz a jarulekos elemek erteke kb 50 kiralyi forint. A stabilitasa nagyon jo. Ugyhogy felesleges az ilyen takarekoskodas, mert utana mikor bekapcsolodik a szivato akkor sokkal tobbe kerul. Idobe es bosszusagba.
(#) adamhollos válasza vilmosd hozzászólására (») Okt 14, 2012 /
 
Igen abszolút igazad van, de magamból kiindulva, mikor a debuggolásnál tarok, nem igen érdekel, hogy menyit fogyaszt a rendszer, az viszont igen, hogy ne kelljen elrohanni a város másik végébe venni egy IC-t, csak azért, hogy pár milliamperrel kevesebb áramot fogyasszak.

Persze, ha már megvan az áramkör akkor úgy kell áttervezni, hogy minél kevesebbet fogyasszon.
(#) kissi válasza adamhollos hozzászólására (») Okt 15, 2012 /
 

Szia!
Akkor a próba nem "éles" környezetben megy ?! Ha utána gond van, akkor mit nézel meg először ? Nem lenne jobb mégis átrohanni a város másik végébe ( ha csak ezen múlik )?!

Steve
A hozzászólás módosítva: Okt 15, 2012
(#) Hp41C válasza icserny hozzászólására (») Okt 15, 2012 /
 
Szia!
Idézet:
„LATAbits.LATA0 és ehhez hasonlók nem ilyenek, sőt, egy értékadás jobboldalán sem szerepelhetnek.”

Már hogyne szerepelhetnének:
  1. LATAbits.LATA0 = !LATAbits.LATA0;

  1. LATAbits.LATA0 = LATAbits.LATA1 & LATAbits.LATA2;

  1. LATAbits.LATA0 = PORTAbits.RA1 | LATAbits.LATA2;

stb.
(#) icserny válasza Hp41C hozzászólására (») Okt 15, 2012 /
 
Ebben igazad van, az értékadást kár volt belekevernem.
(#) aroxol hozzászólása Okt 15, 2012 /
 
Sziasztok!

Az Itt: találhato vevöt szeretném egy programba integrálni. Az lenne a problémám hogy C-ben van és asm-be szeretném illeszteni. Fordito ezt dobta, de sehogy nem tudom beilleszteni. Tudna valaki segiteni benne hogy lehetne megoldani? Még a konfig, sem kellene.
  1. _interrupt:
  2.      
  3.     ;vevo.c,42 :: void interrupt (){
  4.     ;vevo.c,43 :: if (INTCON.TMR0IF){                 // időtúllépés-figyelés
  5.     BTFSS       INTCON+0, 2
  6.     GOTO        L_interrupt0
  7.     ;vevo.c,44 :: key_cnt = 0;
  8.     CLRF        _key_cnt+0
  9.     ;vevo.c,45 :: INTCON.TMR0IF = 0;
  10.     BCF         INTCON+0, 2
  11.     ;vevo.c,46 :: }
  12.     L_interrupt0:
  13.     ;vevo.c,47 :: if (PIR1.RCIF){
  14.     BTFSS       PIR1+0, 5
  15.     GOTO        L_interrupt1
  16.     ;vevo.c,48 :: uart_buffer = RCREG;            // törli az RCIF-et, nem kell PIR1.RCIF=0
  17.     MOVF        RCREG+0, 0
  18.     MOVWF       _uart_buffer+0
  19.     ;vevo.c,49 :: rx_flag = 1;
  20.     MOVLW       1
  21.     MOVWF       _rx_flag+0
  22.     ;vevo.c,50 :: }
  23.     L_interrupt1:
  24.     ;vevo.c,51 :: }
  25.     L_end_interrupt:
  26.     L__interrupt11:
  27.     RETFIE      1
  28.     ; end of _interrupt
  29.      
  30.     _main:
  31.      
  32.     ;vevo.c,53 :: void main (){
  33.     ;vevo.c,54 :: OSCCON = 0x72;                      // pdf 32.
  34.     MOVLW       114
  35.     MOVWF       OSCCON+0
  36.     ;vevo.c,55 :: ADCON1 = 0x0F;                      // pdf 226.
  37.     MOVLW       15
  38.     MOVWF       ADCON1+0
  39.     ;vevo.c,56 :: CMCON = 0x07;                       // pdf 235.
  40.     MOVLW       7
  41.     MOVWF       CMCON+0
  42.     ;vevo.c,57 :: TRISA = 0;
  43.     CLRF        TRISA+0
  44.     ;vevo.c,58 :: LATA = 0;
  45.     CLRF        LATA+0
  46.     ;vevo.c,59 :: TRISB = 0;
  47.     CLRF        TRISB+0
  48.     ;vevo.c,60 :: LATB = 0;
  49.     CLRF        LATB+0
  50.     ;vevo.c,61 :: TRISC = 0b10000000;                 // Rx-Tx
  51.     MOVLW       128
  52.     MOVWF       TRISC+0
  53.     ;vevo.c,62 :: LATC = 0;
  54.     CLRF        LATC+0
  55.     ;vevo.c,63 :: PIE1.RCIE = 1;                      // pdf 100.
  56.     BSF         PIE1+0, 5
  57.     ;vevo.c,64 :: INTCON = 0b11100000;                // pdf 95.
  58.     MOVLW       224
  59.     MOVWF       INTCON+0
  60.     ;vevo.c,65 :: T0CON = 0b10001000;                 // pdf 125.
  61.     MOVLW       136
  62.     MOVWF       T0CON+0
  63.     ;vevo.c,67 :: UART1_Init(2400);
  64.     BSF         BAUDCON+0, 3, 0
  65.     MOVLW       3
  66.     MOVWF       SPBRGH+0
  67.     MOVLW       64
  68.     MOVWF       SPBRG+0
  69.     BSF         TXSTA+0, 2, 0
  70.     CALL        _UART1_Init+0, 0
  71.     ;vevo.c,68 :: delay_ms(100);
  72.     MOVLW       2
  73.     MOVWF       R11, 0
  74.     MOVLW       4
  75.     MOVWF       R12, 0
  76.     MOVLW       186
  77.     MOVWF       R13, 0
  78.     L_main2:
  79.     DECFSZ      R13, 1, 1
  80.     BRA         L_main2
  81.     DECFSZ      R12, 1, 1
  82.     BRA         L_main2
  83.     DECFSZ      R11, 1, 1
  84.     BRA         L_main2
  85.     NOP
  86.     ;vevo.c,70 :: while (1){
  87.     L_main3:
  88.     ;vevo.c,71 :: if (rx_flag == 1){
  89.     MOVF        _rx_flag+0, 0
  90.     XORLW       1
  91.     BTFSS       STATUS+0, 2
  92.     GOTO        L_main5
  93.     ;vevo.c,72 :: rx_flag = 0;
  94.     CLRF        _rx_flag+0
  95.     ;vevo.c,73 :: if (key[key_cnt] == uart_buffer){
  96.     MOVLW       _key+0
  97.     ADDWF       _key_cnt+0, 0
  98.     MOVWF       TBLPTRL
  99.     MOVLW       hi_addr(_key+0)
  100.     MOVWF       TBLPTRH
  101.     MOVLW       0
  102.     ADDWFC      TBLPTRH, 1
  103.     MOVLW       higher_addr(_key+0)
  104.     MOVWF       TBLPTRU
  105.     MOVLW       0
  106.     ADDWFC      TBLPTRU, 1
  107.     TBLRD*+
  108.     MOVFF       TABLAT+0, R1
  109.     MOVF        R1, 0
  110.     XORWF       _uart_buffer+0, 0
  111.     BTFSS       STATUS+0, 2
  112.     GOTO        L_main6
  113.     ;vevo.c,74 :: TMR0H = 0xDE;                     // 65535-8535=57000 (egy bájt plussz az időtúllépése, kb. 90us)
  114.     MOVLW       222
  115.     MOVWF       TMR0H+0
  116.     ;vevo.c,75 :: TMR0L = 0xA8;
  117.     MOVLW       168
  118.     MOVWF       TMR0L+0
  119.     ;vevo.c,76 :: key_cnt++;
  120.     INCF        _key_cnt+0, 1
  121.     ;vevo.c,77 :: }
  122.     GOTO        L_main7
  123.     L_main6:
  124.     ;vevo.c,78 :: else {key_cnt == 0;}
  125.     L_main7:
  126.     ;vevo.c,79 :: if (key_cnt == sizeof(key)-1){        // nyitás
  127.     MOVF        _key_cnt+0, 0
  128.     XORLW       14
  129.     BTFSS       STATUS+0, 2
  130.     GOTO        L_main8
  131.     ;vevo.c,80 :: LATB.B0 = 1;
  132.     BSF         LATB+0, 0
  133.     ;vevo.c,81 :: delay_ms(1000);
  134.     MOVLW       11
  135.     MOVWF       R11, 0
  136.     MOVLW       38
  137.     MOVWF       R12, 0
  138.     MOVLW       93
  139.     MOVWF       R13, 0
  140.     L_main9:
  141.     DECFSZ      R13, 1, 1
  142.     BRA         L_main9
  143.     DECFSZ      R12, 1, 1
  144.     BRA         L_main9
  145.     DECFSZ      R11, 1, 1
  146.     BRA         L_main9
  147.     NOP
  148.     NOP
  149.     ;vevo.c,82 :: LATB.B0 = 0;
  150.     BCF         LATB+0, 0
  151.     ;vevo.c,83 :: key_cnt = 0;
  152.     CLRF        _key_cnt+0
  153.     ;vevo.c,84 :: }
  154.     L_main8:
  155.     ;vevo.c,85 :: }
  156.     L_main5:
  157.     ;vevo.c,92 :: }
  158.     GOTO        L_main3
  159.     ;vevo.c,93 :: }
  160.     L_end_main:
  161.     GOTO        $+0
  162.     ; end of _main
(#) Balagemann2031 válasza vilmosd hozzászólására (») Okt 15, 2012 /
 
Hello! Köszi a segítséget! Megnézem a boltban, hogy van-e náluk ilyen.
(#) vilmosd válasza Balagemann2031 hozzászólására (») Okt 15, 2012 /
 
Kis kapcsolouzemu tapokban az opto kisfesz oldalan szokott lenni.
Következő: »»   317 / 1207
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