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   484 / 1210
(#) janimester válasza Hp41C hozzászólására (») Jan 25, 2014 /
 
Köszönöm szépen kipróbálom.
(#) silent15 hozzászólása Jan 25, 2014 /
 
Sziasztok, ma kezdtem el írni egy programot, ami kishiftel pár adatot.
A lényeg az, hogy az adatokat egy tömben tárolom.
  1. int1 adat[]={0, 0, 0, 0, 0, 0, 0, 0};

Azt szeretném megcsinálni, hogy a shiftelős fügvény meghívása elött tudjam megadni a tömb értékeit, pl így ;

  1. adat[]={1, 0, 1, 0, 0, 1, 0, 1};

De ez így nem jó, sajnos nem tudom hogy kéne ezt megadni. CCS fordítót használok. Tudnátok segíteni.?
Köszönöm!
(#) zenetom válasza silent15 hozzászólására (») Jan 26, 2014 /
 
Szia, szerintem így semmilyen C-ben nem lehet valós időben tömböt feltölteni.
Próbáld meg egyesével.
Tehát:
  1. int adat[8];
  2. ...
  3. adat[0]=1;
  4. adat[1]=0;
  5. adat[2]=1;
  6. adat[3]=0;
  7. adat[4]=0;
  8. adat[5]=1;
  9. adat[6]=0;
  10. adat[7]=1;


Attól függ, honnan akarod feltölteni, vannak egyszerűbb módok is rá.
Apropó, milyen típus az "int1" ?
A hozzászólás módosítva: Jan 26, 2014
(#) vicsys válasza zenetom hozzászólására (») Jan 26, 2014 /
 
Dehogy is nem lehet! Már a tömb létrehozásakor definiálhatod a tömb elemeit:
  1. int adat[6]={0x00,0x00,0x00,0x00,0x00,0x00};

Ki van próbálva CCS-ben, működik.
(#) icserny válasza vicsys hozzászólására (») Jan 26, 2014 /
 
Idézet:
„Már a tömb létrehozásakor ...”
Tehát nem valós időben, hanem fordításkor. Már csak az a kérdés, hogy a kérdező mit is akar valójában...
(#) vicsys válasza icserny hozzászólására (») Jan 26, 2014 /
 
Gondolom azt, hogy a program futásakor a tömb elemei a tömbben legyenek.
(#) Kovabe válasza zenetom hozzászólására (») Jan 26, 2014 /
 
Sziasztok
Azt meg csinálhatom hogy feltételese elágazásban adom meg data értékét?
  1. int adat[8];
  2. ...
  3. adat[0]=1;
  4. adat[1]=0;
  5. adat[2]=1;
  6. adat[3]=0;
  7. adat[4]=0;
  8. adat[5]=1;
  9. adat[6]=0;
  10. adat[7]=1;

Arra gondolok hogy ezt a feltöltést széttenném a programban és csak a végén használnám.
A hozzászólás módosítva: Jan 26, 2014
(#) silent15 válasza vicsys hozzászólására (») Jan 26, 2014 /
 
A lényeg az , hogy van egy globális változóm(tömböm), amit a program indulásakor hozok létre. Van a main és a shiftelős fügvényem. A main fügvényben mielött meghívnám a shiftelős fügvényt, meg szeretném változtatni a tömb értékeit, amit zenetom írt, az sem lenne rossz, de kevés a programmemóra, és minnél takarékosabban kéne.
A hozzászólás módosítva: Jan 26, 2014
(#) vicsys válasza silent15 hozzászólására (») Jan 26, 2014 /
 
Alapvetően a lefoglalt tömb használja a helyet. Próbáld ki, amit írtam.
(#) silent15 válasza vicsys hozzászólására (») Jan 26, 2014 /
 
De a baj az , hogy a tied újrainicializálja, ami még nem is lenne rossz, de a tömb értékét két fügvény között kell mozgatnom.
Ha pedig simán ezt;
  1. adat[6]={0x00,0x00,0x00,0x00,0x00,0x00};

írom be neki, ez nem jó neki.
Tehát amit én szeretnék, az valahogy így néz ki;

  1. int1 adat[]={0, 0, 0, 0, 0, 0, 0, 0};
  2.  
  3. void shiftout()
  4. {
  5.  
  6. }
  7. void main()
  8. {
  9.       while(1) {
  10.     adat[6]={0x00,0x00,0x00,0x00,0x00,0x00};
  11.     shiftout();
  12.     }
  13. }

Tehát a main fügvényben a shift fügvény minden meghívása elött meg szeretném változtatni a globális adat változó értékeit.
(#) Prome hozzászólása Jan 26, 2014 /
 
Sziasztok!
A következőt kell megoldanom, Piccel, vagy ha nélküle javasoljátok, kérlek irányítsatok abba a topicba.
Van egy tekercs ami feszültséget kap s áramot vesz fel, különböző ritmusban és mértékben.
Ha túl sokáig folyik át rajta magas áram, felmelegszik s károsítja önmagát.
Azonban amikor felmelegszik, változik az ellenállása.
Az hogy a ráadott feszültségnél mennyi áramot vesz fel, ép az ellenállását mutatja.
Vagyis ha a feszültség és áram szorzata kisebb egy bizonyos értéknél, akkor túl van melegedve.
Olyan PIC létezik, amiben van feszültség és áram mérő funkció is és képes a mért értékeket összeszorozni és az eredmény függvényében x db ledet kigyújtani?
Vagy ha nem PIC, akkor ezt a kérdést hogyan oldanátok meg?
Köszönöm
(#) Tas84 válasza silent15 hozzászólására (») Jan 26, 2014 /
 
Csinálsz egy függvényt, ami majd bepakolja a megfelelő biteket:
  1. int adat[] = {0, 0, 0, 0, 0, 0, 0, 0};
  2.  
  3.  
  4. void beallit(int * tomb) {
  5.    
  6.    int i;
  7.    for(i = 0; i < 6; i++) {    
  8.       if(i % 2 == 0) {
  9.          tomb[i] = 1;
  10.       }
  11.    }
  12. }
  13.  
  14. void shiftout() {
  15.    printf("Beallitas utan\n\r--------------------\n\r");
  16.    int i;
  17.    for(i = 0; i < 6; i++) {
  18.       printf("adat[%u] = %u\n\r", i, adat[i]);
  19.    }
  20.    printf("\n\r\n\r");
  21. }
  22.  
  23. void main() {
  24.    printf("Beallitas elott\n\r--------------------\n\r");
  25.    int i;
  26.    for(i = 0; i < 6; i++) {
  27.       printf("adat[%u] = %u\n\r", i, adat[i]);
  28.    }
  29.    printf("\n\r\n\r");
  30.      
  31.    beallit(&adat);
  32.    shiftout();
  33.      
  34.    while(1);
  35.  
  36. }
(#) kissi válasza Prome hozzászólására (») Jan 26, 2014 /
 
Mi ez, hogy különböző értékű feszültségeket/áramokat kap üzemszerűen, miközben túlmelegedik ?! Feszültség/áramgenerátor miért nem jöhet szóba ? PIC-el egyébként megoldható, mert tud feszültséget mérni (az árammérés is visszavezethető fesz.mérésre!), szorozni megint tud és programból még dönteni is !
(#) zenetom válasza silent15 hozzászólására (») Jan 26, 2014 /
 
Az a kérdés, hogy az elemek, amikkel fel akarod tölteni a tömböt, mi alapján jönnek létre? Mert az alapján lehet csak a legjobb megoldást leírni, addig csak találgatunk.
  1. adat[6]={0x00,0x00,0x00,0x00,0x00,0x00};

Ez azért nem jó, mert ezt a fordító nem tudja értelmezni, mert csak 1 elemnek lehet értéket adni.
A hozzászólás módosítva: Jan 26, 2014
(#) vicsys válasza zenetom hozzászólására (») Jan 26, 2014 /
 
CCS-ben? Na ne már. Mondom, hogy kipróbáltam.
(#) zenetom válasza vicsys hozzászólására (») Jan 26, 2014 /
 
Programfutás közben?
Szerk.: tehát nem deklaráláskor.
A hozzászólás módosítva: Jan 26, 2014
(#) Prome válasza kissi hozzászólására (») Jan 26, 2014 /
 
Az a háttere, hogy motor különböző fordulatokkal megy. És PWM.el van vezérelve. Mondjuk ez még gond lehet, de ennek van egy nagy előnye is. Rosszul írtam a különböző feszültség és áram értékeket. Helyesen fogalmazva egy kézi multiméter integrálja az adatokat s mikor a magasfrekis PWM-nél kicsi a kitöltési tényező akkor alacsonyabb fesz értéket és alacsonyabb áramfelvételt mutat.
Valójában ugyanannyi a feszültség, amit kap, de változó kitöltési tényezővel.
Az áram is ugyanaz, de ahogy elmászik a hőmérséklet, egyre nagyobb áramokat vesz fel. de időben PWM által megszaggatva.
Szóval elég lenne egy sima áram mérés, és a feszültség érték meg egy fix adat - feltéve, hogy a PIC képes ezt a PWM frekvenciájának a tempójában mérni. De lehet egyszerűbb, mint integrálni s utána abból szorozni. Sőt!!! Még csak nem is kell megszorozni a feszültséggel, hisz fix feszültség esetén az áramfelvétel értéke is maga a hőmérsékleti értéke, s felesleges ellenállás értékre, celsiusra stb. átszámítani, ennek az áram érték számértéknek megfelelően eldönthető mely ledek égjenek.. További gond, hogy merülés esetén csökken a feszültség (akkuról van táplálva) úgyhogy vagy azt is mérjük és mégis számolunk vagy olyankor hamis értéket kapunk.
Lehet hogy szóba jöhet feszültség/áramgenerátor, az a baj nem értek hozzá, ezért kérdezek. Ez alatt tulajdonképpen mit értesz?
Döntenie nem neki kell hanem annak aki a ledeket látva megtudja, hogy túl van melegedve. Max. azt kell eldöntenie mely ledeket gyújtja ki. Esetleg bizonyos érték fölött nem csak kigyújtja hanem villog is. Vagy ép többszínű ledet variál, de ez már programozás. Az első az érzékelés.
Szerintem jó ötlet a motor hőmérsékletét egy hőmérővel való mérése helyett (aminek úgy adja át a hőt a motor) közvetlenül a motort használni hőmérőnek, annak is a tekercsét, úgy hogy az abban keletkező megnövekedett hő általi fizikai változásokat érzékeljük. Vélemény?
(#) zenetom válasza (Felhasználó 15355) hozzászólására (») Jan 26, 2014 /
 
Persze, mert itt hozod létre a tömböt, értékadással.
Na majd utánanézek mik a lehetőségek, mert meg lehet adni, hogy program, vagy adatmemóriába kerüljön a tömb ..stb.
Hjajj, csak gyakorolnom kéne ezt a cét..
(#) vicsys válasza zenetom hozzászólására (») Jan 26, 2014 /
 
Ha futás közben módosul bármely tag, természetesen arra kell hivatkozni/módosítani. Más a tömb létrehozása és más a (az új adatokkal való) feltöltése. Kezdem érteni, hogy mit kérdezett Icserny kolléga...
(#) Hp41C válasza silent15 hozzászólására (») Jan 26, 2014 /
 
A memcpy eljárással lehet megoldani.
memcpy(forrás_tömb, cél_tömb, byteok_száma);
Nem tudom, hogy CCS -ben van-e.
(#) janimester hozzászólása Jan 26, 2014 /
 
Üdvözlet. Azt szeretném megtudni hogy a 18f4550-em tudnám-e 48mhz-es kristályról járatni és akkor azzal a sebességgel dolgozna a pic avagy az csak az usb részére szól? Jelenleg 20mhz-es külső oszcillátorral megy de szeretném kihasználni a pic maximális sebességét.
(#) Prome hozzászólása Jan 26, 2014 /
 
Tudtok mutatni olyan topicra, cikkre mutató linket ahol PIC-el áramerősséget, feszültséget mértek?
Köszi
(#) vicsys válasza Prome hozzászólására (») Jan 26, 2014 /
 
(#) Hp41C válasza janimester hozzászólására (») Jan 26, 2014 /
 
Csak a PLL szorzóját és az utóoszót kell állítanod:
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2 // CONFIG1L
(#) CHrissDock hozzászólása Jan 26, 2014 /
 
Sziasztok!

Még eléggé új vagyok és szeretnék egy kis segítséget kérni tőletek!
Itt a fórumon találtam egy fordulatszámmérő programozást PIC16f84-hez amit kimásoltam egy PIC simulator-ba kijavítottam benne 1 hibát amit írtak is benne hogy nem jó...
de még is hibát ír ki és elég sokat ... mellékelnék egy képet hogy miről is van szó...
hogy érthetőbb legyen ez egy dc56 11ewa kijelzőhöz kellene nekem ami egy opto kapcsolón keresztül mérné nekem egy tengely aktuális fordulatszámát ami percenként minimum 30-40et forog maximum meg végtelen az opto kapcsolót egy egérből szedtem...az opto kapcsoló vezérlőjén 35 lyuk van és az átmérője 18mm....

mellékelem a képet a programról (ha esetleg kell az egész akkor bemásolom)

Előre is köszönöm válaszotok!
(#) Prendick válasza CHrissDock hozzászólására (») Jan 26, 2014 /
 
A regisztereket nem kell definiálni, mert a szimulátor már definiálta egy include fájlban, amikor kiválasztottad a pic típusát. Vagyis TMR0-tól EECON2-ig minden sort nyugodtan törölj ki a programból, nem kellenek.
(#) CHrissDock válasza Prendick hozzászólására (») Jan 26, 2014 /
 
töröltem 110 hibáról már csak 97 van

bemásolom a forrást és megtudod esetleg nézni nekem hogy mi az ami nem jó?
(#) Prendick válasza CHrissDock hozzászólására (») Jan 26, 2014 /
 
Nézzük.
(#) CHrissDock válasza Prendick hozzászólására (») Jan 26, 2014 /
 
  1. ;
  2. ;
  3. RB EQU H'0006'
  4. RA EQU H'0005'
  5. ;---- USER DEFINE ------
  6. TCNT0 EQU H'C' ;= (0.6SEC /INT* PRESCAL*CLOCK)
  7. INTR0 EQU H'D' ;AFTER INT, SAVE W VALUE
  8. INTR1 EQU H'E' ;AFTER INT, SAVE STATUS
  9. DD1 EQU H'F' ;DATA FOR INPUT RPM
  10. DD2 EQU H'10'
  11. DD3 EQU H'11'
  12. DS1 EQU H'12' ;DTAT FOR DISPLAY
  13. DS2 EQU H'13'
  14. DS3 EQU H'14'
  15. ;
  16. ;
  17. ; DEINE VARIABLES
  18. ;
  19. TMR EQU H'B5' ;(PRESCALE 64*1uS) * 75 = 4800 uS
  20. TCNT EQU H'7D' ;(256-125),4.8mS*125=600mS
  21. ;
  22. ; DEFINE BIT
  23. ;
  24. W EQU 0 ;d VALUE FOR INCF......
  25. F EQU 1 ;d VALUE
  26. OFF EQU 0 ;FLAG BIT 0,
  27. RP0 EQU 5 ;STATUS BIT 5 & 6 =REGISTER BANK SELECT
  28. RP1 EQU 6
  29. INPUT EQU 7 ;RB7 AS INPUT PORT
  30. TOIF EQU 2 ;INTCON TMR0 OVERLOW INT FLAG
  31. TOIE EQU 5 ;INTCON TOIF ENABLE
  32. GIE EQU 7 ;INTCON GLOBAL INT ENABLE
  33. ;
  34. ;
  35. ;========== MAIN PROGRAM =========
  36. ;
  37. ;
  38. ORG 0
  39. GOTO START
  40. ;
  41. ;----------------------------------------
  42. ;
  43. ORG 4 ;INTERRUPT BEGIN
  44. INTB MOVWF INTR0 ; SAVE W
  45. MOVF STATUS,W ; SAVE STATUS
  46. MOVWF INTR1
  47. BCF STATUS,RP0 ; MAKE SURE SELECT BANK0
  48. MOVLW TMR ; RESTORE TIMER0
  49. MOVWF TMR0 ;
  50. DECFSZ TCNT0,F ;SKIP IF ZERO
  51. GOTO SWEEP
  52. RELOAD MOVLW TCNT ;RELOAD TCNT0
  53. MOVWF TCNT0
  54. MOVF DD3,W ;MOVE COUNTER DATA TO DISPLAY
  55. MOVWF DS3
  56. MOVF DD2,W
  57. MOVWF DS2
  58. MOVF DD1,W
  59. MOVWF DS1
  60. CLRF DD1
  61. CLRF DD2
  62. CLRF DD3
  63. ;---------------------------------------------------
  64. SWEEP MOVLW H'FF'
  65. MOVWF RB ;OFF ALL DIGITALS
  66. BTFSS RA,1 ;IS RA1 LIGHT ON?
  67. GOTO RA1 ;IF YES GOTO RA1
  68. BTFSS RA,2
  69. GOTO RA2
  70. RA3 BSF RA,3 ;RA,1 & 2 ARE OFF, MUST BE RA,3
  71. BCF RA,2 ;NEXT TIME SHOULD BE RA,2
  72. MOVF DS2,W
  73. CALL TABLE ;HEX TO BCD CODE
  74. GOTO DISP ;PISPLAY DS3
  75. RA2 BSF RA,2
  76. BCF RA,1 ;NEXT TIME SHOULD BE RA,1
  77. MOVF DS1,W
  78. CALL TABLE
  79. GOTO DISP
  80. RA1 BSF RA,1
  81. BCF RA,3 ;NEXT TIME SHOULD BE RA,3
  82. MOVF DS3,W
  83. CALL TABLE
  84. DISP MOVWF RB
  85. ;-------------------------------------
  86. INTE MOVF INTR1,W ; RESTORE STATUS
  87. MOVWF STATUS
  88. MOVF INTR0,W ; RESTORE W
  89. BCF INTCON,TOIF ; RESET FLAG OF INT T0
  90. RETFIE
  91. ;
  92. ;
  93. ;-------------------------------------------------
  94. ;
  95. TABLE ADDWF PC,F ; REMEBER PCH=00000B
  96. RETLW H'C0' ; 0
  97. RETLW H'F9' ; 1
  98. RETLW H'A4' ; 2
  99. RETLW H'B0' ; 3
  100. RETLW H'99' ; 4
  101. RETLW H'92' ; 5
  102. RETLW H'82' ; 6
  103. RETLW H'F8' ; 7
  104. RETLW H'80' ; 8
  105. RETLW H'90' ; 9
  106. ;
  107. ;
  108. ;=======================================
  109. ;---------- PROGRAM BEGIN -----------
  110. ;----------------------------------------
  111. ;
  112. START BSF STATUS,RP0 ;SET 3,5 ENABLE BANK1
  113. MOVLW H'80'
  114. MOVWF TRISB ;SET PORTB 0-6 OUTPUT, 7 INPUT
  115. MOVLW 0
  116. MOVWF TRISA ;SET RA0-RA4 TO BE OUTPUT
  117. MOVLW B'10000101'
  118. MOVWF OPTION,F ;INTERNAT CLOCK,TRM0,1:64
  119. BCF STATUS,RP0 ;ENABLE BANK0
  120. MOVLW H'F7'
  121. MOVWF RA ;RA,3=0, OTHERS=1
  122. MOVLW H'7F'
  123. MOVWF RB ;SET DISPLAY 000
  124. CLRF DD1 ;DISPLAY DATA
  125. CLRF DD2
  126. CLRF DD3
  127. MOVLW TMR ;75
  128. MOVWF TMR0
  129. MOVLW TCNT ;128
  130. MOVWF TCNT0
  131. BCF INTCON,TOIF
  132. BSF INTCON,TOIE
  133. BSF INTCON,GIE ;ENABLE INT
  134. ;----------
  135. MOVLW 1
  136. MOVWF DS1
  137. MOVLW 2
  138. MOVWF DS2
  139. MOVLW 3
  140. MOVWF DS3
  141.  
  142. ;----------------------------------
  143. MAIN1 BTFSC RB,7 ;IF INPUT=0, SKIP
  144. GOTO MAIN1
  145. MAIN2 BTFSS RB,7 ;IF INPUT=1, SKIP
  146. GOTO MAIN2
  147. MAIN3 INCF DD3,F
  148. MOVLW H'0A'
  149. SUBWF DD3,W
  150. SKPZ ;DIGITAL 1 =A, MUST AJUST
  151. GOTO MAIN1
  152. CLRF DD3
  153. INCF DD2,F
  154. MOVLW H'0A'
  155. SUBWF DD2,W
  156. SKPZ ;DIGITAL 1 =A, MUST AJUST
  157. GOTO MAIN1
  158. CLRF DD2
  159. INCF DD1,F ;DIGITAL 3 WILL NOT >9, SO NO CHECK
  160. GOTO MAIN1
  161. END
  162. ;==============================================

Használd kód gombot.
-moderátor-
A hozzászólás módosítva: Jan 26, 2014
Következő: »»   484 / 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