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   630 / 1210
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
Sajna nem megy, így egyik példa kóddal sem jelenik meg semmi a kijelzőn.
(#) killbill válasza zlanczky hozzászólására (») Feb 3, 2015 /
 
A level shifter szo szerint szinteltolot jelent, de amire neked szukseged van az a szintilleszto. A ketto nem ugyanaz. Vagy itt, vagy az AVR miertek hogyanok topikban volt errol szo par napja. Kulonbozo megoldasok felmerultek, bar ott 3.3V-os mikrokontrollerhez kellett illeszteni 5V-os kijelzot.
(#) zenetom válasza zlanczky hozzászólására (») Feb 3, 2015 /
 
Szia!
Ha csak 5V-ról akarsz 3V-ra, akkor a legegyszerűbb megoldás egy feszültségosztó: Bővebben: Link Itt az inputhoz kell kötni az 5V-os jelet, és az outputon már csak 3.3V lesz belőle.

Ha oda-vissza kell, akkor ez a kapcsolás lehet a megoldás, bár én még nem használtam: Bővebben: Link. Illetve az utána következő hozzászólásokban is találsz megoldásokat.
A hozzászólás módosítva: Feb 3, 2015
(#) entorio hozzászólása Feb 3, 2015 /
 
Sziasztok. Teljesen kezdő vagyok. PIC16-ra milyen analóg-digitális átalakítók és mennyi köthető? 3-10 khzes jelek. És ezeket hogyan lehetne feldolgozni programozással? Összehasonlítás, stb.
(#) spgabor válasza spgabor hozzászólására (») Feb 4, 2015 /
 
Volt más hibája is, amit közben észrevettem, mert sokszor nem kapott értéket a digit_display fv.
Héztem killbill által írt példát is és a shift register adatlapja alapján próbáltam állítgatni a vezérlést. Most ott tartok, hogy 16 bit információt küld, de így is értelmezhetetlen karakterek jelennek csak meg.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <htc.h> // Itt automatikusan vállassza ki a kontrollert
  4.  
  5. __CONFIG(WDTE_OFF & FOSC_XT & CP_OFF & LVP_OFF & BOREN_OFF & MCLRE_ON & PWRTE_ON); // eredeti
  6. //__CONFIG(UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & XT); // Ezt kiveheted ha nekem nem megy
  7.  
  8. #define _XTAL_FREQ 4000000
  9. #define DATA RB0
  10. #define CLK RB1
  11. #define ENABLE RB2
  12. #define LED RB3
  13. #define readbit(data,bitno) ((data>>bitno)&0x01) // Digit kijelzés makrója
  14. int szamlalo = 0;
  15. int szam;
  16.  
  17. unsigned char Digit[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
  18.  
  19. void digit_display(int dignum){
  20.     CLK = 0;
  21.     ENABLE = 1;
  22.     for(int i = 0; i < 16; i++){
  23.         CLK = 1;
  24.         DATA = readbit(Digit[dignum], i);
  25.         __delay_us(1);
  26.         CLK = 0;
  27.         __delay_us(1);
  28.     }
  29.     __delay_us(1);
  30.     ENABLE = 0;
  31. }
  32.  
  33. static void interrupt isr(void){
  34.     szamlalo++;
  35.     if(szamlalo == 1000){
  36.         if(LED == 0){
  37.             LED = 1;
  38.         }else{
  39.             LED = 0;
  40.         }
  41.         if(szam > 9){
  42.             szam = 0;
  43.         }
  44.         szam++;
  45.         szamlalo = 0;
  46.     }
  47.     TMR2IF = 0;
  48. }
  49.  
  50. int main() {
  51.     TRISA = 0xFF;  //A lábai bemenet lettek állítva
  52.     PORTA = 0; // Port alacsony szinten
  53.     PORTB = 0x00;
  54.     TRISB = 0x00; // B lábai kimenetek
  55.     CMCON = 7; // Comparator kikapcsolva
  56.     CCP1CON = 0; // Capt/Comp/PWM kikapcsolva
  57.     INTCON = 0; // Összes interrupt láb kikapcsolva
  58.     PR2 = 249; // Timer2 PR2 8bites periódus regiszter
  59.     T2CON = 5; // T2CON regiszter
  60.     TMR2IE = 1; // TMR2IE megszakítást engedélyez? bit (leállítva a Timer2)
  61.     PEIE = 1; // Peripheral interrupt engedélyezése
  62.     GIE = 1; // Globális interrupt engedélyezése
  63.     DATA = 1;
  64.     ENABLE = 0;
  65.     CLK = 0;
  66.     while(1){
  67.         digit_display(szam);
  68.     }
  69. }
(#) Hp41C válasza spgabor hozzászólására (») Feb 4, 2015 / 1
 
Zavart érzek az erőben....
  1. unsigned char Digit[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};

  1. for(int i = 0; i < 16; i++){
  2.         CLK = 1;
  3.         DATA = readbit(Digit[dignum], i);

A kiragadott részek ellentmondásban vannak egymással. A szam bemeneti változó 0..9 ig terjedő érték. A léptető regiszterbe 16 bitet léttetünk be, de a minta csak 8 bites...
Hogy jól működjön, a léptetést két digitre kellene egyszerre végrehajtani. Valamint azt is meg kell mondani, hogy a 4 digit közül melyik kettőre legyen kijelezve.
Továbbá a readbit makró kifejtése egy ciklus lesz, így indokolatlanul lassú lesz a rutin működése. Ráadásul a 16 bites léptetés miatt tovább csökken a sebesség. Mivel minden lépésben egy bitet viszünk ki a dispword változóból, elegendő ciklusonként egy bittel léptetni.
  1. #define RIGHT_DIGIT 0x80
  2. #define LEFT_DIGIT 0x100
  3.  
  4. unsigned char DigitL[10] =
  5. {0x6F,0x05,0x5F,0x1F,0x3D,0x3B,0x7D,0x07,0x7F,0x3F};
  6. unsigned char DigitH[10] =
  7. {0xFC,0xC0,0x7C,0XF4,0xD6,0xB6,0xDE,0xE0,0xFE,0xF6};
  8.  
  9. [code=c]void digit_display(int dignumh, int dignuml, unsigned int pos){
  10.  unsigned int dispword = (DigitH[dignumh] << 10) | (DigitL[dignuml]) | pos;
  11.     CLK = 0;
  12.     ENABLE = 1;
  13.     for(int i = 0; i < 16; i++){
  14.         CLK = 1;
  15.         DATA = (dispword & 0x80);
  16.         dispword <<= 1;
  17.         __delay_us(1);
  18.         CLK = 0;
  19.         __delay_us(1);
  20.     }
  21.     __delay_us(1);
  22.     ENABLE = 0;
  23. }


Hívása kb. 20ms -enként felváltva kell a digiteket frissíteni:
  1. digit_display(0,9,RIGHT_DIGIT);
  2. digit_display(0,9,LEFT_DIGIT);
(#) Pali79 válasza entorio hozzászólására (») Feb 4, 2015 /
 
Szia! Nem tejesen érthető a kérdésed, de pl a PIC16F1526-nak 30 analóg bemenete van, ezekre tudsz TTL szintet küldeni és programmal feldolgozni, de ha teljesen kezdő vagy akkor ez szinte lehetetlen vállalkozás. A pic programozást egy egyszerű led villogtatóval kell kezdeni és fokozatosan haladni, megérteni mi, miért van úgy ahogy van melyik regiszter mit csinál.
(#) spgabor válasza Hp41C hozzászólására (») Feb 4, 2015 /
 
Az általad javasolt változást kipróbáltam, de sajnos nem kapcsolódik be egyik szegmens sem. Azt megkérdezhetem, hogy a RIGHT_DIGIT, LEFT_DIGIT és a két tömb értékei mi alapján adhatóak meg, vagy ez mindig egységes 8 illetve 16 bites regisztereknél?
(#) Hp41C válasza spgabor hozzászólására (») Feb 4, 2015 / 1
 
Ebben a hozzászólásodban feltöltöttél egy kapcsolási rajzot.
Szegmens vezérlések - DigitL[10] és DigitH[10] tömbök:
A rajz szerint az A16..A0 a következő kivezetéseket vezérlik.
  1. A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, A5, A4, A3, A2, A1
  2. ------Left digit ----------------,   ,   , --------Rihgt digit ------
  3.  C ,  B ,  A ,  D ,  E ,  F ,  G , Vl, Vr, E , F , G , D , B , A , C

Ebből és a kapakterek képéből áll össze a két tömb elemeinek értéke. Egy szegmens akkor világít, ha a digitje be van kapcsolva és a hozzá tartozó kimenet 0, azaz a hozzá tartozó beléptetett bit 1. Pl. 1 kijelzése esetén a B és C szegmenseket kell bekapcsolni: DigitL[1] = 0x05 és DigitH[1] = 0x60
Sajnos az előbb a DigitH[] tömb elemeit 1 bittel balra léptetve adtam meg....
Digit vezérlés:
Az A9 vezérli a bal, az A8 a jobb oldali digitek tranzisztorát. Ha a beléptetett minta 8. bitje 1, akkor az A8 kimenet 0, ez bekapcsolja a bal oldali digiteket. Ha a beléptetett minta 9. bitje 1, akkor az A9 kimenet 0, ez bekapcsolja a jobb oldali digiteket.
Még egy progléma lehet: Fordítva kell beléptetni - az adatlap elég homályosan fogalmaz...
  1. void digit_display(int dignumh, int dignuml, unsigned int pos){
  2. unsigned int dispword = (DigitH[dignumh] << 10) | (DigitL[dignuml]) | pos;
  3.     CLK = 0;
  4.     ENABLE = 1;
  5.     for(int i = 0; i < 16; i++){
  6.         CLK = 1;
  7.         DATA = (dispword & 0x01);
  8.         dispword >>= 1;
  9.         __delay_us(1);
  10.         CLK = 0;
  11.         __delay_us(1);
  12.     }
  13.     __delay_us(1);
  14.     ENABLE = 0;
  15. }
A hozzászólás módosítva: Feb 4, 2015
(#) spgabor válasza Hp41C hozzászólására (») Feb 4, 2015 /
 
Ezzel a kóddal most az első két kijelzőn két hatost, a második két kijelzőn pedig az alsó négy szegmens kapcsolja. Viszont amikor

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <htc.h> // Itt automatikusan vállassza ki a kontrollert
  4.  
  5. __CONFIG(WDTE_OFF & FOSC_XT & CP_OFF & LVP_OFF & BOREN_OFF & MCLRE_ON & PWRTE_ON); // eredeti
  6. //__CONFIG(UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & XT); // Ezt kiveheted ha nekem nem megy
  7.  
  8. #define _XTAL_FREQ 4000000
  9. #define DATA RB0
  10. #define CLK RB1
  11. #define ENABLE RB2
  12. #define LED RB3
  13. #define readbit(data,bitno) ((data>>bitno)&0x01) // Digit kijelzés makrója
  14. int szamlalo = 0;
  15. int szam = 0;
  16.  
  17. //unsigned char Digit[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
  18. //unsigned char Digit[10] = {1,2,4,8,16,32,64,128,256};
  19. unsigned char Digit[1] = {8};
  20.  
  21. #define RIGHT_DIGIT 0x80
  22. #define LEFT_DIGIT 0x100
  23.  
  24. unsigned char DigitL[10] =
  25. {0x6F,0x05,0x5F,0x1F,0x3D,0x3B,0x7D,0x07,0x7F,0x3F};
  26. unsigned char DigitH[10] =
  27. {0xFC,0xC0,0x7C,0XF4,0xD6,0xB6,0xDE,0xE0,0xFE,0xF6};
  28.  
  29. void digit_display(int dignumh, int dignuml, unsigned int pos){
  30. unsigned int dispword = (DigitH[dignumh] << 10) | (DigitL[dignuml]) | pos;
  31.     CLK = 0;
  32.     ENABLE = 1;
  33.     for(int i = 0; i < 16; i++){
  34.         CLK = 1;
  35.         DATA = (dispword & 0x01);
  36.         dispword >>= 1;
  37.         __delay_us(1);
  38.         CLK = 0;
  39.         __delay_us(1);
  40.     }
  41.     __delay_us(1);
  42.     ENABLE = 0;
  43. }
  44.  
  45. static void interrupt isr(void){
  46.     szamlalo++;
  47.     if(szamlalo == 1000){
  48.         if(LED == 0){
  49.             LED = 1;
  50.         }else{
  51.             LED = 0;
  52.         }
  53.         if(szam > 9){
  54.             szam = 0;
  55.         }
  56.         szam++;
  57.         szamlalo = 0;
  58.     }
  59.     TMR2IF = 0;
  60. }
  61.  
  62. int main() {
  63.     TRISA = 0xFF;  //A lábai bemenet lettek állítva
  64.     PORTA = 0; // Port alacsony szinten
  65.     PORTB = 0x00;
  66.     TRISB = 0x00; // B lábai kimenetek
  67.     CMCON = 7; // Comparator kikapcsolva
  68.     CCP1CON = 0; // Capt/Comp/PWM kikapcsolva
  69.     INTCON = 0; // Összes interrupt láb kikapcsolva
  70.     PR2 = 249; // Timer2 PR2 8bites periódus regiszter
  71.     T2CON = 5; // T2CON regiszter
  72.     TMR2IE = 1; // TMR2IE megszakítást engedélyez? bit (leállítva a Timer2)
  73.     PEIE = 1; // Peripheral interrupt engedélyezése
  74.     GIE = 1; // Globális interrupt engedélyezése
  75.     DATA = 1;
  76.     ENABLE = 0;
  77.     CLK = 0;
  78.     while(1){
  79.         digit_display(0,9,RIGHT_DIGIT);
  80.          __delay_ms(10);
  81.         digit_display(0,9,LEFT_DIGIT);
  82.          __delay_ms(10);
  83.     }
  84. }


Viszont ha más értékeket szeretnék adni az első és a második paraméterben, vagyis különböző karaktereket, pl 1234, akkor már krixkraxokat ír csak ki a kijelzőre.
  1. digit_display(0,9,RIGHT_DIGIT);
  2.         digit_display(0,9,LEFT_DIGIT);
(#) Hp41C válasza spgabor hozzászólására (») Feb 4, 2015 / 1
 
Egy apró megjegyzést figyelmen kívül hagytál:
Idézet:
„Sajnos az előbb a DigitH[] tömb elemeit 1 bittel balra léptetve adtam meg....”

  1. unsigned char DigitH[10] =
  2. {0x7E,0x60,0x3E,0X7A,0x6B,0x5B,0x6F,0x70,0x7F,0x7B};

Sajnos még valamit elrontottam:
unsigned int dispword = (DigitH[dignumh] << 9) | (DigitL[dignuml]) | pos;
Próbálj meg 0 .. 9 értékeket kiírni a "bal" és a "jobb" oldali digitekre és rajzold le vagy fényképezd le a megjelenő "krixkraxokat" és töltsd fel ide. Látatlanban, csak annyiból, hogy nem jó, nem lehet rájönni a hibára.
(#) spgabor válasza Hp41C hozzászólására (») Feb 4, 2015 /
 
0-tól 7-ig írtam át a számokat a két függvényhívásban:

  1. digit_display(0,0,RIGHT_DIGIT);
  2. digit_display(0,0,LEFT_DIGIT);


Azért csak hétig, mert ennyit engedett feltölteni a hobbielektronika egyszerre.
(#) spgabor válasza spgabor hozzászólására (») Feb 4, 2015 /
 
8 és 9

8.jpg

9.jpg
   
(#) spgabor válasza spgabor hozzászólására (») Feb 4, 2015 /
 
Közben don_peter segítségével csináltam térképet a szegmensekről.
(#) Hp41C válasza spgabor hozzászólására (») Feb 4, 2015 / 1
 
Ezt felhasználva már csak a helyes mintát kell a DigitL és DigitH tömbökbe megadni...
(#) edison14 hozzászólása Feb 5, 2015 /
 
Sziasztok!

Segítséget szeretnék kérni. A megszakításokkal szeretnék foglalkozni, de a program amit megítam az MPLAB szimulátorban működik, de a proteus szimulátorában már nem. Ülök felette már két órája de nem tuom hogy mi lehet a probléma. Néztem éldaprogramokat is, de azok alapján sem megy.

A válaszokat és segítséget előre is köszönöm.

blank.asm
    
(#) Kapagerenda hozzászólása Feb 5, 2015 /
 
Sziasztok,
Készítettem egy elektromos gitár hangolót (frekvenciamérőt) 16F887 kontroller segítségével. Teszt képpen építettem egy frekvencia generátort egy 4060 as ic segítségével. Először ennek a frekvenciáját vizsgáltam és azzal működött is a cuccos ahogy kell. Most megpróbáltam konkrétan az elektromos gitár jelével de nem csinál semmit sem. Ötlet? Talán gyenge a jel ami a gitárból jön? Próbáltam úgy is, hogy a gitár jelét áttküldtem egy multiefekten amiben van előerősítő, de ugyis semmi.
(#) nedudgi válasza Kapagerenda hozzászólására (») Feb 5, 2015 /
 
A gitár hangszedője pár mV nagyságrendű. Az nagyon kevés frekvenciaméréshez, a szükséges voltos nagyságrend helyett.
(#) Kapagerenda válasza nedudgi hozzászólására (») Feb 5, 2015 /
 
Építsek hozzá egy előerősítőt? De mint irtam áttküldtem a jelet egy multieffekten amiben van előerősítő.
(#) nedudgi válasza Kapagerenda hozzászólására (») Feb 5, 2015 /
 
Konkrét adatok, kapcsolások nélkül nem lehet tanácsot adni. A multieffekt milyen jelszintet ad ki? Elég az a frekvenciamérő meghajtásához? A 4060 több voltos jelet ad, az elég a frekvenciamérőnek. Tudsz hangfrekvenciás feszültséget mérni?
(#) cross51 válasza edison14 hozzászólására (») Feb 5, 2015 /
 
Ha jól emlékszem az INTx lábak csak digitális bementként használhatóak és az INT0 az pont egy analog bemenet is. Bár ezt a PIC-et nem ismerem és a doksiában nem igazán láttam ilyen ansel regisztert amivel be lehetne állítani melyik port analog pufferelésű.
(#) edison14 válasza cross51 hozzászólására (») Feb 5, 2015 /
 
Igazad van, az RB0 az AN10. Átállítottam digitális portra, de így sem reagál.
(#) cross51 válasza edison14 hozzászólására (») Feb 5, 2015 /
 
Ezt a részt pontosan mire használod:
  1. movlw     0x01
  2.      movwf     PORTB

meg az INT0IE előtt törölj egy INT0IF-et, még egy dologra tudok gondolni ha ez nem működik a comparator egyik bemenete is ott van bár a doksi szerint ki van kapcsolva de tegyél be egy clrf CM1CON-t, ha ez se akkor nem tudom sajnos.
(#) Kapagerenda válasza nedudgi hozzászólására (») Feb 5, 2015 /
 
Sikerült lemérnem a jel nagyságát. Ha áttküldöm a multieffekt előerősítőjén akkor is csak max 300 mv jön ki belőle. Előerősítő nélkül pedig csak 10 mv. Nekem kéne legalább 700 mv.
A bemeneten van egy komparátor ami 0,6 V-nál billen. Esetleg lehet olyat csinálni, hogy leviszem a referencia feszültséget pár mV- os nagyságrendre? Ez esetben áttbillene a komparátor és meglenne az a 5V - 0v négyszögjelem elvileg. Csak kérdés, hogy olyan kis referenciát be e lehet állitani?
(#) edison14 válasza cross51 hozzászólására (») Feb 5, 2015 /
 
Beleírtam még azokat a részeket amiket írtál, de nem nagyon akar menni. Már nem tudom mi a fene baja lehet.
(#) nedudgi válasza Kapagerenda hozzászólására (») Feb 5, 2015 /
 
Frekvenciamérésnél mindig hasznos, ha alacsonyabb jelszinteket tudsz mérni, ugyanakkor jobb, ha a gitár nagyobb jelszinted ad le. Szerintem nem ártana egy alacsonyfogyasztású előerősítő a gitárba. Legalábbis ötven évvel ezelőtt így csináltuk.
A hozzászólás módosítva: Feb 5, 2015
(#) kissi válasza edison14 hozzászólására (») Feb 6, 2015 /
 
Szia!
Nem ismerem a Proteus-t, de az MPLAB alatt ha megy valami, akkor az jó szokott lenni... Amire az MPLAB nem figyel, azt kell megnézni ( mert a Proteus valószínűleg azt is figyeli !), azaz pl. a konfigurációs bitekkel mi újság ?!
(#) Pali79 válasza edison14 hozzászólására (») Feb 6, 2015 /
 
Semmit sem jelent, hogy a Proteusban nem megy. Nekem van olyan programom ami valóságban működik, de Proteusban semmit sem csinál. Egy breadboard-on rakd össze, úgy próbáld.
(#) Balagemann2031 hozzászólása Feb 6, 2015 /
 
Sziasztok! Azt szeretném kérdezni, hogy ami MPASM fordítóban a #define, az ASM30 fordítóban mi? Olvasgatom az útmutatót, de ezt nem találtam meg
(#) Hp41C válasza Balagemann2031 hozzászólására (») Feb 6, 2015 /
 
.equ symbol, expression
Következő: »»   630 / 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