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   744 / 1210
(#) _BiG_ válasza mrobi hozzászólására (») Jan 26, 2016 /
 
Az elvet rég feltalálták, ezt nevezik indikátoros mérésnek Így működik pl. egy varázsszemes feszültségmérő, amikor a varázsszem csak az egyenlőséget mutatja, de hogy mennyi is az az egyenlő, azt egy feszültségre kalibrált potenciométerről olvashatjuk le.
Régi RádióTechnikában, a háború előtt is jelent meg ilyen készülékről szóló cikk.
A hozzászólás módosítva: Jan 26, 2016
(#) kissi válasza mrobi hozzászólására (») Jan 26, 2016 /
 
Persze, ismert ez az elv, de használható !
Szorult helyzetben pl. azt is lehet használni, hogy egy kondenzátor feltöltése adott ideig tart egy állandó feszültségről egy adott értékre --> TIMER kiváltható a komparátor segítségével, ha elfogytak az erőforrások !
(#) mrobi válasza _BiG_ hozzászólására (») Jan 26, 2016 /
 
Akkor ezek szerint nem én találtam fel a spanyol viaszt. Mondjuk nem is az volt a cél. De akkor ezek szerint járható az út. Nem tudom mekkora pontosságot lehetne elérni ezzel a módszerrel.

kissi: A kondenzátoros alkalmazást ismerem. De ez most csak úgy ötletként jött fel. Lehet hétvégén kipróbálom. Csak úgy kíváncsiságból.
(#) jocka0012 hozzászólása Jan 26, 2016 /
 
Üdv!Az lenne a kérdésem , hogy miért nem változtatja az alábbi kód részletben a digit változó értékét , a megszakításon belül?
  1. void main(void)
  2. {
  3.     TRISC = 0x00;
  4.     TRISB = 0x00;
  5.    
  6.     PORTB = 0x00;
  7.    
  8.     RC4 = 0;
  9.    
  10.     init_timer0();
  11.    
  12.     while(1)
  13.     {
  14.        
  15.     shift_full(1 , digit);    
  16.        
  17.     }
  18.    
  19.     return;
  20. }
  21.  
  22. void interrupt ISR ()
  23. {
  24.  
  25.         digit++;
  26.         if(digit == 2)digit = 0;
  27.      
  28.    
  29. }

A shift_full() függvény egy shift regisztert tölt fel.A digit változó a multiplexeléshez kell , hogy éppen melyik számjegy világítson a kijelzőn.
A hozzászólás módosítva: Jan 26, 2016
(#) benjami válasza jocka0012 hozzászólására (») Jan 26, 2016 /
 
A digit változód legyen volatile, hogy ne optimalizálja ki a fordító.
(#) gyurma888 hozzászólása Jan 26, 2016 /
 
Sziasztok!
Egy számomra furcsa helyzet állt elő. Készìtettem egy infrás kütyüt, PIC12F629-cel. Tettem a nyákra egy tüskesort is, hogy később tudjam programozni. Ez működött is. Egy darabig. Aztán ma megpróbáltam egy másik programot rátenni. (PICKit3-at használok, gyári.) A probléma ott kezdődik, hogy nem írja a picet és nem is törli le a programozó. Amikor befejeződik az írás, ellenőriztetem és már az első memóriacímen megbukik a dolog. Törléssel ugyanez a helyzet, olvasás viszont látszólag rendben. Az összeköttetést a programozó és a mikrokontroller között ellenőriztem. A picet elsőre automatikusan felismeri a Pickit. Kód védelem kikapcsolva, LVP szintén. A Pickit más picet rendesen ír, töröl. Az előzőleg a picbe égetett program szépen, rendesen fut. Nem tudok dűlőre jutni az üggyel sajnos. Esetleg a pic a rossz?
Köszönöm szépen, ha valaki tud segíteni a probléma megoldásában!
(#) matheattila válasza jocka0012 hozzászólására (») Jan 26, 2016 /
 
Szia, minden szép és jó csak pont a lényeget nem másoltad be ide, vagyis a digit változó deklarálását...
Ha egy globális változót megszakításban is használsz akkor feltétlen volatile-ként kell definiálni, pl:
volatile unsigned char digit = 0;
(#) Buvarruha válasza gyurma888 hozzászólására (») Jan 26, 2016 /
 
Lehet, hogy a PIC döglött meg, pláne ha menet közben volt dugdosva rá a programozó (PC földelt a PIC meg kitudja milyen tápon van).
(#) nedudgi válasza gyurma888 hozzászólására (») Jan 26, 2016 /
 
A programod elején van egy késleltetés, ami lehetőséget ad a programozónak, hogy programozás módba állítsa a kontrollert?
(#) jocka0012 válasza matheattila hozzászólására (») Jan 26, 2016 /
 
A volatile-t már próbáltam de valamiért úgy se akar működni.
(#) kissi válasza jocka0012 hozzászólására (») Jan 27, 2016 /
 
A TIMER megfelelően van inicializálva? A megszakítást engedélyezted ? Ezek nem látszanak a csatolt programból!) Mivel csak a változóddal foglalkozol a megszakításban, lehet, hogy be se megy oda, mert másból nem veszed észre ( szimuláció mit mond ?! ) !
(#) Hp41C válasza gyurma888 hozzászólására (») Jan 27, 2016 /
 
A kis lábszám miatt gondolom belső oszcillátorról jár, a MCLR és a PWRTE le van tiltva valamint a PGC és / vagy a PGD kimenetnek programozva a lehető leghamarabb. Ekkor a program azonnal elindul, amikor a Vdd megjelenik. PICKit2 -n a "Use Vpp First Programming Entry" módszer lehet a megoldás.

Nagyon érdekes ez a típus. A programozási leírása csak a "Vpp first" módszert (Figure 2-2) tartalmazza, mégis a programozók a "Vdd first" módszerrel kínlódnak.
(#) Pali79 válasza Hp41C hozzászólására (») Jan 27, 2016 /
 
Ezt is kiírhatnánk a fenti sárga részbe, mert kb. két naponként felmerül egy ilyen probléma.
(#) jocka0012 válasza kissi hozzászólására (») Jan 27, 2016 /
 
  1. // PIC16F877A Configuration Bit Settings
  2.  
  3. // 'C' source line config statements
  4.  
  5. #include <htc.h>
  6.  
  7. __CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CP_OFF);
  8.  
  9. #define _XTAL_FREQ 4000000
  10. #define DIN RC6
  11. #define LOAD RC5
  12. #define CLK RC4
  13.  
  14. int segment[] = {0b11101101,0b00000101,0b11011100,0b10011101,0b00110101,0b10111001,0b11111001,0b00001101,0b11111101,0b10111101};
  15. int digits[] = {0x01,0x02}; //01,10
  16. volatile int digit = 0;
  17.  
  18. void shift_full(int num,int digit)
  19. {
  20.     int number = segment[num];
  21.     digit = digits[digit];
  22.     digit = digit << 8;
  23.    
  24.     number = number | digit;
  25.    
  26.     for(char i = 0 ; i<20 ; i++)
  27.     {
  28.         DIN = number & 0x01;
  29.         number = number >> 1;
  30.        
  31.          
  32.         CLK = 1;
  33.         CLK = 0;
  34.     }
  35.    
  36.     LOAD = 1;
  37.     LOAD = 0;
  38.    
  39. }
  40.  
  41. void init_timer0()
  42. {
  43.     T0IE = 1;
  44.     GIE = 1;
  45.     PEIE = 1;
  46.     OPTION_REG = 0xC3;
  47.  
  48. }
  49.  
  50. void main(void)
  51. {
  52.     TRISC = 0x00;
  53.     TRISB = 0x00;
  54.    
  55.     PORTB = 0x00;
  56.    
  57.     RC4 = 0;
  58.    
  59.     init_timer0();
  60.    
  61.     while(1)
  62.     {
  63.         shift_full(1 , digit);
  64.        
  65.     }
  66.    
  67.     return;
  68. }
  69.  
  70. void interrupt ISR ()
  71. {
  72.    
  73.         digit++;
  74.         if(digit == 2)digit = 0;
  75.      
  76. }


Itt van az egész kód.Már rájöttem mi volt a baj.Elfelejtettem a TMR0IF-et nullázni amikor vége volt a megszakításnak.Így már működik.
(#) kissi válasza jocka0012 hozzászólására (») Jan 27, 2016 /
 
(#) jocka0012 válasza kissi hozzászólására (») Jan 27, 2016 /
 
Megint felmerült egy probléma.Eddig egyszerre tudtam kijelezni számot a két kijelzőn.Most azt akarom megcsinálni , hogy külön számokat is lehessen.A kódot így módosítottam:
  1. // PIC16F877A Configuration Bit Settings
  2.  
  3. // 'C' source line config statements
  4.  
  5. #include <htc.h>
  6.  
  7. __CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CP_OFF);
  8.  
  9. #define _XTAL_FREQ 4000000
  10. #define DIN RC6
  11. #define LOAD RC5
  12. #define CLK RC4
  13.  
  14. int segment[] = {0b11101101,0b00000101,0b11011100,0b10011101,0b00110101,0b10111001,0b11111001,0b00001101,0b11111101,0b10111101};
  15. int digits[] = {0x01,0x02}; //01,10
  16. volatile int digit = 0;
  17.  
  18. void shift_full(int num1,int num2,int digit)
  19. {
  20.     int number1 = segment[num1];
  21.     int number2 = segment[num2];
  22.    
  23.     digit = digits[digit];
  24.     digit = digit << 8;
  25.    
  26.     number1 = number1 | digit;
  27.     number2 = number2 | digit;
  28.    
  29.     if(digit == 0)
  30.     {
  31.         for(char i = 0 ; i<20 ; i++)
  32.         {
  33.             DIN = number1 & 0x01;
  34.             number1 = number1 >> 1;
  35.             CLK = 1;
  36.             CLK = 0;
  37.         }
  38.     }
  39.    
  40.     if(digit == 1)
  41.     {
  42.         for(char i = 0 ; i<20 ; i++)
  43.         {
  44.             DIN = number2 & 0x01;
  45.             number2 = number2 >> 1;
  46.             CLK = 1;
  47.             CLK = 0;
  48.         }
  49.            
  50.     }
  51.    
  52.     LOAD = 1;
  53.     LOAD = 0;
  54.    
  55. }
  56.  
  57. void init_timer0()
  58. {
  59.     T0IE = 1;
  60.     GIE = 1;
  61.     PEIE = 1;
  62.     OPTION_REG = 0xC3; //1:16 prescale
  63.  
  64. }
  65.  
  66. void main(void)
  67. {
  68.     TRISC = 0x00;
  69.     TRISB = 0x00;
  70.    
  71.     PORTB = 0x00;
  72.    
  73.     RC4 = 0;
  74.    
  75.     init_timer0();
  76.    
  77.     while(1)
  78.     {
  79.         shift_full(2 , 1 , 1);
  80.        
  81.     }
  82.    
  83.     return;
  84. }
  85.  
  86. void interrupt ISR ()
  87. {
  88.     if(TMR0IF == 1)
  89.     {
  90.        
  91.        
  92.             digit++;
  93.             if(digit == 2)digit = 0;
  94.        
  95.         TMR0IF = 0;
  96.     }
  97. }

Valamiért a shift full függvényben nem akar belépni a digit == 0 és digit ==1 elágazásokba.
A hozzászólás módosítva: Jan 27, 2016
(#) Hp41C válasza jocka0012 hozzászólására (») Jan 27, 2016 /
 
A függvény digit bementő paraméterét a 23 .. 24 sorokban felülírja a program.
A hozzászólás módosítva: Jan 27, 2016
(#) jocka0012 válasza Hp41C hozzászólására (») Jan 27, 2016 /
 
Köszönöm a segítséget így már működik.
(#) Johnny0004 hozzászólása Jan 27, 2016 /
 
Üdv! Szeretnék segítséget kérni, 16F1827-es PIC-et szeretnék belső referenciával (2,048V) használni, de sehogy sem sikerül beállítani, ha kiszámolom VDD a referencia. Így van beállítva:
adcon1=%01010011
fvrcon=%11000010.
Nem jövök rá mit kellene még beállítani, ilyet még nem használtam.
(#) Pali79 válasza Johnny0004 hozzászólására (») Jan 27, 2016 /
 
Én legalább ötször elolvastam az írásod, de nem értem mit szeretnél. Se füle, se farka...
(#) Johnny0004 válasza Pali79 hozzászólására (») Jan 27, 2016 /
 
Szóval ADC-t szeretnék használni belső referenciával (2,048V), de hiába állítom bárhogy is az adatlap alapján VDD marad a referencia, nem tudom mit rontok el?
A hozzászólás módosítva: Jan 27, 2016
(#) Pali79 válasza Johnny0004 hozzászólására (») Jan 27, 2016 /
 
Na látod! Tudsz te ha akarsz! Az ADCON0 hogy áll?
A hozzászólás módosítva: Jan 27, 2016
(#) Johnny0004 válasza Pali79 hozzászólására (») Jan 27, 2016 /
 
Nekem az elsőből is érthető volt.
adcon0=%00000011,
így is próbáltam:
adcon0=%01111111.
(#) gyurma888 válasza nedudgi hozzászólására (») Jan 27, 2016 /
 
Szia!
Sajnos nincsen, ezt elfelejtettem, rögtön az első művelet a "TRISIO = 0;" (ha jól értettem a késleltetés fogalmát).
Próbáltam a PICkitet VPP first... üzemmódban is, de sajnos a probléma nem változott.
Van még esély, vagy más mód a pic újraprogramozására?
(#) Johnny0004 válasza Johnny0004 hozzászólására (») Jan 28, 2016 /
 
Érdekes, hogy 1,024V belső referencia sem működik. Van aki használt már ilyet, mit kell még beállítani ADCON1- és FVRCON-on kívül? Köszönöm előre is!
A hozzászólás módosítva: Jan 28, 2016
(#) icserny válasza Johnny0004 hozzászólására (») Jan 28, 2016 /
 
Az adatlap szerint ADC FVR referencia esetén csak 2,048 V vagy 4,096 V választható.

Ennek beállítása szintén az adatlap szerint:
FVRCON = 0x82 vagy 0x83
ADCON1<1:0> = 3

Te is így csináltad (bár az FVRCON regiszter FVRRDY bitjét is 1-be akartad állítani, de annak nincs jelentősége, mert nem írható bit), így nem tudom, mi lehet a probléma.
(#) Johnny0004 válasza icserny hozzászólására (») Jan 28, 2016 /
 
Tehát elvileg jól csinálom. Köszönöm, hogy ránéztél! Pali79-nek is.
Még az is érdekes ha külső referenciára állítom akkor is VDD marad a referencia.
Tehát pont amire vettem, arra nem tudom rábírni.
A hozzászólás módosítva: Jan 28, 2016
(#) ktamas66 válasza Johnny0004 hozzászólására (») Jan 28, 2016 /
 
Az adatlapban van példaprogram is az ADC beállításra, ott ellenőrizheted minden helyes-e, az FVR beállítása csak az az egy sor.
(#) Droot hozzászólása Jan 29, 2016 /
 
Sziasztok!

A PIC32 SQI interfészre szeretnék rakni egy micro SD kártyát és egy Windbond 25Q64 8Mbyte-os Flash-t.
Az SD kártyán a 4 adatlábból 3-at egy 10K-s ellenállással fel kell húzni Vcc-re.
A Winbond IC-t simán összeköthetem a 4 adatlábbal és a CLK-val? Nem fog bezavarni? Az nem baj, hogy a 3-as adatláb nincs Vcc-re húzva? Mert az sd kártya ajánlása szerint nem kell.
Ha jól tudom úgyis csak chip select-re aktiválódik. Tehát szerintem nem.

Szerk:
Ahogy látom command láb hiányában úgy látom CLK leeső élre kiolvasni tudunk, felugró élre pedig írni. Ezt a PIC32mz SQI tudja kezelni?
A hozzászólás módosítva: Jan 29, 2016
(#) Melphi hozzászólása Jan 29, 2016 /
 
Sziasztok!
Programozni akartam egy PIC16f886-ot, de nem találom a PICKit2 listában, talán nem ismeri azt a típust?
Következő: »»   744 / 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