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   316 / 1207
(#) rammeradrian válasza Hp41C hozzászólására (») Okt 12, 2012 /
 
Mindig, ha elindítom a PICKIT2 programot akkor is rögtön, meg ha MPLAB-ba csatlakozni akarok akkor is kidobja. De megvan a VPP
(#) Hp41C válasza rammeradrian hozzászólására (») Okt 12, 2012 /
 
Tegyél fel egy képet az MpLab PICKit2 ablakáról.
(#) rammeradrian válasza Hp41C hozzászólására (») Okt 12, 2012 /
 
Csináltam képet mindenről:
(#) Hp41C válasza rammeradrian hozzászólására (») Okt 12, 2012 /
 
Kábel, programozandó kontroller nélkül is a hibaüzenetet kapod?
(#) rammeradrian válasza Hp41C hozzászólására (») Okt 12, 2012 /
 
Igen.
(#) Hp41C válasza rammeradrian hozzászólására (») Okt 12, 2012 /
 
C4 helyén 47µF / 25V van?
(#) rammeradrian válasza Hp41C hozzászólására (») Okt 12, 2012 /
 
47µF 100V
(#) adamhollos hozzászólása Okt 12, 2012 /
 
Sziasztok!

Köszönöm mindenkinek aki segített.

Most, hogy működik a pic szeretnék elkanyarodni, kicsit bensőségesebb irányba a C18-on belül.

Tehát: Van valamilyen függvény amit ha meghívok egy ideig áll a program? pl
  1. delay_ms(10);
és akkor áll 10 ms-ot.
(#) nedudgi válasza adamhollos hozzászólására (») Okt 12, 2012 /
 
Nem, hanem 10ms ideig egy helyben pörög. Megszakítás előfordulhat, annak a lekezelése megnöveli ezt az időt. Úgy kell értelmezni, hogy legalább 10ms ideig vár valamire.
A hozzászólás módosítva: Okt 12, 2012
(#) adamhollos válasza nedudgi hozzászólására (») Okt 12, 2012 /
 
Jó, úgy értettem, bocsi.

De, hogy hívom meg? Amúgy meg a timerjei nem állnak le ha megszakítás történik, mért növekszik mégis az idő, ha csak a megszakítás lekezelése ki nem lóg az időkeretből? Amúgy el tudom küldeni aludni és ha tulcsordul a timer vagy egyéb megszakítás történik felébred.
A hozzászólás módosítva: Okt 12, 2012
(#) nedudgi válasza adamhollos hozzászólására (») Okt 12, 2012 /
 
Mert a 10ms időt nem timer alapján, hanem az órajelből számított számolással végzi. Egy üres ciklusnak kell felfogni, ami körülbelül annyi ideig tart.
(#) adamhollos válasza nedudgi hozzászólására (») Okt 12, 2012 /
 
És azt HOGY HíVOM meg???
(#) nedudgi válasza adamhollos hozzászólására (») Okt 12, 2012 /
 
  1. delay_ms(10);
(#) adamhollos válasza nedudgi hozzászólására (») Okt 12, 2012 /
 
Ja itt is, köszi

Mit kell hozzá include-olni?
A hozzászólás módosítva: Okt 12, 2012
(#) El_Pinyo válasza nedudgi hozzászólására (») Okt 12, 2012 /
 
C18 alatt is van ilyen beépített késleltető függvény?
Csak mert DelayxxxTCYx( ) függvényekről tudok, amelyek bizonyos mennyiségű utasításciklust kivárnak, de konkrétan delay_ms() -el nem találkoztam.
adamhollos:
Az általam ismert késleltető függvények használatához a delays.h filet kell include-olni.
Egyébként a fordító dokumentációja megtalálható a C18 telepítési könyvtárában a \doc mappában.
(#) adamhollos válasza El_Pinyo hozzászólására (») Okt 13, 2012 /
 
Igen én is erre az eredményre jutottam, azért köszi!

Megszakításokat szeretnék használni, első körben timer0 és RB változás megszakításokat.

Ezt én úgy gondoltam, hogy ha valamelyik interrupot csinál, a program átugrik egy másik szálra, ahol kinullázom a flegbitet csinálok valamit, majd a progi tovább fut az elugrás helyétől. Hogyan tudom ezt megvalósítani? Tudom, hogy user guide meg minden, de nem igazán értettem meg belőle és az rb-s megszakítással nem is foglalkozik.

A kódom, most itt tart:
  1. #include <p18f25k80.h>
  2. #pragma config XINST = OFF, FOSC=INTIO2, IESO= ON, PWRTEN=ON, WDTEN=OFF, MCLRE=OFF
  3.  
  4.  
  5. void con(void)
  6. {
  7.         TRISA=0xFE;
  8.         TRISB=0x20;
  9.         RCONbits.7=1;
  10.         INTCON=0xE8;
  11.         INTCON2=0x04;
  12.  
  13.         INTCONbits.5=0;
  14.        
  15. }
  16. void delay (void)
  17. {
  18.   int i;
  19.  
  20.   for (i = 0; i < 10000; i++)
  21.     ;
  22. }
  23.  
  24. void main (void)
  25. {
  26.         con();
  27.         while (1)
  28.         {
  29.                 PORTAbits.RA0=1;
  30.                 delay();
  31.                 PORTAbits.RA0=0;
  32.                 delay();
  33.         }
  34. }


A timer0-át direkt kapcsolom be aztán ki, mert most csak a rb-s interrupot akarom megvalósítani (egyenlőre)
A hozzászólás módosítva: Okt 13, 2012
(#) adamhollos válasza adamhollos hozzászólására (») Okt 13, 2012 /
 
Közben rájöttem, hogy pl a RCONbits.7 nem helyes, úgyhogy cseréltem RCONbits.IPEN=1; -re
(#) icserny válasza El_Pinyo hozzászólására (») Okt 13, 2012 /
 
Idézet:
„C18 alatt is van ilyen beépített késleltető függvény?”

Ilyen késleltető függvényt te is írhatsz magadnak. A Delay100TCYx paramétere (ami csak konstans lehet, változó nem!) az utasítsáfrekvencia (FCPU/4) legyen, 100 kHz-es egységekben megadva. Például: 10 MHz-es kvarc és PLL esetén FOSC=40 MHz, az FCY ennek a negyede, azaz FCY = 10 MHz. Ez 100 kHz-es egységekben 100. Amíg 100 x 100 utasításciklus lemegy (lásd Delay100TCYx(100); ), addig 1 ms idő telik el. ebből leszámolunk annyit, amennyit a Delay_MS() függvény d paramétere előír.

Ha más a frekvencia, pl. USB miatt 48 MHz, akkor FCY = 12 MHz, a Delay100TCYx() paramétere 120 legyen.


  1. //-- Késleltető eljárás FCY = 10 MHz utasításciklus frekvenciához
  2.  
  3. void Delay_MS(unsigned int d) {
  4.     unsigned int i;
  5.     for (i=0; i<d; i++) {
  6.             Delay100TCYx(100);
  7.     }
  8. }
A hozzászólás módosítva: Okt 13, 2012
(#) adamhollos válasza icserny hozzászólására (») Okt 13, 2012 /
 
Értem, köszi!
(#) diablo hozzászólása Okt 13, 2012 /
 
Üdv!

A microchip PIC-es táblázatában a Single Supply Voltage az mit takar?
(#) benjami válasza adamhollos hozzászólására (») Okt 13, 2012 /
 
Ha nincs szükség extrém nagy pontosságra (pl. Lcd inicializálásnál és hasonló helyeken), kiindulhatsz az alábbiból:
  1. #define  CpuClock   48000000
  2. #define  CpuMips    (CpuClock/4)
  3.  
  4. void delayms(unsigned char ms)
  5. {
  6.   #define DELAYNUM (CpuMips/1000/13)
  7.   volatile unsigned int dl;
  8.   while(ms--)
  9.   {
  10.     dl = DELAYNUM;
  11.     while(dl--);
  12.   }
  13. }

Ekkor nem kell külön számolgatni hogy milyen órajelhez mekkora értékkel kell meghívni a függvényt, hanem elég a felhasznált órajelet megadnod.
(#) icserny válasza diablo hozzászólására (») Okt 13, 2012 /
 
Idézet:
„A microchip PIC-es táblázatában a Single Supply Voltage az mit takar?”

Az AN910 Application Note írja le. VIHL-lel jelölik azt a feszültséget, amelyet a MCLR és PGM lábakra adva egytápfeszültségű programozási módba lép a mikrovezérlő (ha ezt korábbna nem tiltottuk le...). Az egytápfeszültségű programozás pedig azt jelenti, hogy nem kell a VDD-nél magasabb (VPP = 9 - 13 V-ot) adni az MCLR lábra, hanem belső töltéspumpa áramkör állítja elő a FLASH írásához szükséges magasabb feszültséget.

Idézet:
„SINGLE-SUPPLY PROGRAMMING
An additional advantage of many devices with Flash program memory is that they are capable of in-system programming without the regulated 13V source. This method is known as single-supply programming, since only VDD is required. Historically, Microchip has referred to this mode as low-voltage programming to contrast it with standard ICSP operation and its “high-voltage” VPP requirement. Using this method does involve some trade-offs, however. Single-supply ICSP programming uses an additional programming pin, labeled PGM, with the other pins required by the normal (High-Voltage) mode. The programming voltage for the memory array is generated
by an internal charge pump when normal operating voltage (VDD) is placed on the pin. When the PGC and PGD pins are held to logic low at the same time as VDD is applied to both PGM and MCLR,”
A hozzászólás módosítva: Okt 13, 2012
(#) adamhollos válasza icserny hozzászólására (») Okt 13, 2012 /
 
Szia!

Rémlem, hogy nem haragszol meg amiért folyton berakom neked a nemműködő programom, de előre haladtam az interrupokkal, viszont a következő program, valamiért nem működik:
  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.  
  11. void main (void)
  12. {
  13.         con();
  14.         while (1)
  15.         {
  16.                 while(cv==1)
  17.                 {                      
  18.                         LATAbits.LATA1=1;
  19.                         delay();
  20.                         LATAbits.LATA1=0;
  21.                         delay();
  22.                 }
  23.  
  24.                 while(cv==0)
  25.                 {
  26.                         LATAbits.LATA0=1;
  27.                         delay();
  28.                         LATAbits.LATA0=0;
  29.                         delay();
  30.                 }
  31.         }
  32. }
  33.  
  34. void con(void)
  35. {      
  36.         TRISA=0xFC;
  37.         TRISB=0x20;
  38.         IOCB=0x20;
  39.         RCONbits.IPEN=1;
  40.         INTCON2=0x04;  
  41.         INTCON=0xE8;
  42.  
  43.         INTCONbits .TMR0IE=0;
  44.        
  45. }
  46. void delay (void)
  47. {
  48.   int i;
  49.  
  50.   for (i = 0; i < 10000; i++)
  51.     ;
  52. }
  53.  
  54. #pragma code high_vector_addr=0x08
  55. void high_vector(void) {
  56.   _asm GOTO hi_isr _endasm
  57. }
  58.  
  59. #pragma code low_vector_addr=0x18
  60. void low_vector(void) {
  61.   _asm GOTO lo_isr _endasm
  62. }
  63.  
  64. #pragma code
  65. #pragma interrupt hi_isr
  66. void hi_isr (void)
  67. {
  68.  
  69. }
  70.  
  71. #pragma interruptlow lo_isr
  72. void lo_isr (void)
  73. {
  74.         int a = PORTB;
  75.         INTCONbits.RBIF=0;
  76.         if(LATBbits.LATB5==1)
  77.         {
  78.                 cv=1;
  79.         }else
  80.         {
  81.                 cv=0;
  82.         }
  83. }


a cv váltózó valamiért sosem lesz 1, mit rontottam el?
(#) icserny válasza adamhollos hozzászólására (») Okt 13, 2012 /
 
Idézet:
„valamiért nem működik:”
Azt sem tudom, hogy mit szeretnél, hogy csináljon. Írj kommenteket, és használd a C18 mellé kapott fejléc állományokban definiált szimbolikus neveket, hogy érthető legyen a program!

Példa 18f4550-hez (neked nem biztos, hogy ez jó, mert van más felépítésű PIC18 is!
  1. TRISB=0xFF;             //legyen a B port minden lába digitális bemenet
  2. INTCON2bits.RBPU=0;     //legyen B port minden lába felhúzva (ne lebegjen)
  3. dummy = PORTB;          //PORTB olvasása törli a korábbi beállást
  4. INTCONbits.RBIF=0;      //az IOCB interrupt jelzőbit törlése
  5. INTCON2bits.RBIP=0;     //RBIF legyen alacsony prioritású
  6. INTCONbits.RBIE=1;      //a változásjelző interrupt engedélyezése


Ezt se felejtsük ki:
  1. RCONbits.IPEN=1;         //Kétszintű interrupt mód beállítása
  2. INTCONbits.GIEL=1;       //Alacsony prioritású interrupt engedélyezése


Bővebben: Link
A hozzászólás módosítva: Okt 13, 2012
(#) diablo válasza icserny hozzászólására (») Okt 13, 2012 /
 
Na most akkor ez a PGM sem világos nekem. Most kinéztem egy 18F-es PIC-et amihez ilyen egytápfeszültség kell a táblázat szerint. Az adatlapján rákerestem a PGM-re és 0 találatot ad, tehát nincs. OshonSoft-os égetőm van. Akkor most ezzel ugyanúgy feltudom programozni ezt a 18F-es PIC-et is? Az MCLR-re ugyanúgy mehet a 12V? Eddig PGM-mel rendelkező 16F-eset programoztam úgy, hogy a PGM-et nem használtam semmire.
És most megnéztem a 18F-es "társát" ami nem tud ilyen egytápfeszültségű programozást és ennek sincs PGM-je.
Át kell alakítanom a programozót vagy sem?
Homályosíts már fel kérlek ez ügyben.
(#) 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.  
  11. void main (void)
  12. {
  13.         con();
  14.         while (1)
  15.         {
  16.                 while(cv==1)
  17.                 {                      
  18.                         LATAbits.LATA1=1;       //RA1-en levő LED villogtatás
  19.                         delay();
  20.                         LATAbits.LATA1=0;
  21.                         delay();
  22.                 }
  23.  
  24.                 while(cv==0)
  25.                 {
  26.                         LATAbits.LATA0=1;       //RA0-on levő LED villogtatás
  27.                         delay();
  28.                         LATAbits.LATA0=0;
  29.                         delay();
  30.                 }
  31.         }
  32. }
  33.  
  34. void con(void)
  35. {      
  36.         TRISA=0xFC;                             //RA0 és RA1 legyen digitális kimenet
  37.         TRISB=0x20;                             //RB5 legyen digitális bemenet
  38.         IOCB=0x20;                              //Ha RB5 változik legyen interrup
  39.         RCONbits.IPEN=1;                //Kétszintű interrupt mód beállítása
  40.         INTCON2=0x04;                   //RBPU=0 RBIP=0 TMR0IP=1
  41.         INTCON=0xE8;                    //High pri. interrupt disabled, Low  pri. interrupt enabled, timer0 int. enabled, változásjelző interrupt engedélyezése
  42.  
  43.  
  44.         INTCONbits .TMR0IE=0;   //timer0 int. disabled
  45.        
  46. }
  47. void delay (void)
  48. {
  49.   int i;
  50.  
  51.   for (i = 0; i < 10000; i++)
  52.     ;
  53. }
  54.  
  55. #pragma code high_vector_addr=0x08
  56. void high_vector(void) {
  57.   _asm GOTO hi_isr _endasm
  58. }
  59.  
  60. #pragma code low_vector_addr=0x18
  61. void low_vector(void) {
  62.   _asm GOTO lo_isr _endasm
  63. }
  64.  
  65. #pragma code
  66. #pragma interrupt hi_isr
  67. void hi_isr (void)
  68. {
  69.  
  70. }
  71.  
  72. #pragma interruptlow lo_isr
  73. void lo_isr (void)
  74. {
  75.         int a = PORTB;                  //PORTB olvasása törli a korábbi beállást
  76.         INTCONbits.RBIF=0;              //az IOCB interrupt jelzőbit törlése
  77.         if(LATBbits.LATB5==1)   //RB5 állapotának olvasása
  78.         {
  79.                 cv=1;
  80.         }else
  81.         {
  82.                 cv=0;
  83.         }
  84. }


18f25k80-at használok
A hozzászólás módosítva: Okt 13, 2012
(#) icserny válasza diablo hozzászólására (») Okt 13, 2012 /
 
Idézet:
„Most kinéztem egy 18F-es PIC-et amihez ilyen egytápfeszültség kell a táblázat szerint.”
Nem kell, ez csak lehetőség.
Idézet:
„Át kell alakítanom a programozót vagy sem?”
Meg kell nézni, hogy konkrátan melyik típust nézted ki, s meg kell nézni, hogy az szerepel-e a programozód támogatói listáján. Ha a "magasfeszültségű" programozási módot használod, akkor célszerű az "alacsonyfeszültségű" programozást (LVP) letiltani a konfigurációs biteknél.

(#) icserny válasza adamhollos hozzászólására (») Okt 13, 2012 / 1
 
  1. #pragma interruptlow lo_isr
  2. void lo_isr (void)
  3. {
  4.         int a = PORTB;      //PORTB olvasása törli a korábbi beállást
  5.         INTCONbits.RBIF=0;            //az IOCB interrupt jelzőbit törlése
  6.         if(LATBbits.LATB5==1)   //RB5 állapotának olvasása
  7.         {
  8.                 cv=1;
  9.         }else
  10.         {
  11.                 cv=0;
  12.         }
  13. }

1. Az INTCONbits.RBIF=0; utasítást tedd hátrább (a megszakytási rutin végére), hogy a bemenetnek legyen ideje "konszolidálódni". Legalább egy NOP kell, de mivel úgyis van feladat, elég a sorrendet megváltoztatni.

2. A LATB regiszter nem a bemenet, hanem a kimenti adatregiszter állapotát tükrözi. Olvasd a PORTB regisztert, vagy jelen esetben vizsgáld azt az "a" változót, amibe már beolvastad a vizsgálandó regisztert! Például: if(a & 0x20) {stb...}
Ha jól számolom, 0x20 a BIT5 helyiértéke. Itt bitenként ÉS művelet (&) kell, nem pedig a logikai változók közötti ÉS művelet (&&), erre vigyázz!
(#) adamhollos válasza icserny hozzászólására (») Okt 13, 2012 /
 
Király, működik
(#) diablo válasza icserny hozzászólására (») Okt 13, 2012 /
 
Most például kinéztem a 18F26K22-t, elég jó és gyors PIC-nek tűnik és még kompatibilis lenne a 16F-es panelommal is. Ha jól nézem a PIC18(L)F2XK22/4XK22 Flash Memory Programming dokumentumban az MCLR-re maximum 9V kapcsolható, de azt is írja hogy Vdd+4.5V a minimum feszültség, amit nem értek mert ha a Vdd = 5V akkor már 9.5V jön ki.
Akkor elég csak letiltalni az LVP-t és ugyanúgy lehet programozni, mint a 16F-eseket csak a 12V Vpp helyett 9V-ot adhatok neki maximum? A szoftver is támogatná ezt a PIC típust. A hardver meg OshonSoft-os lenne.
Következő: »»   316 / 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