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   434 / 1210
(#) Hilo hozzászólása Júl 16, 2013 /
 
Sziasztok, Olyan kérdésem lenni hogy mi a különbség a 16F876/16F886 között illetve 16F877/16F887 között? A 16F886 nagyjából ugyan azt tudja mint a 16F887, csak lábszámban különböznek?
(#) nedudgi válasza Hilo hozzászólására (») Júl 16, 2013 / 1
 
A PIC16F87x és a PIC16F88x között a leglényegesebb különbség, hogy a 88x család már tartalmaz belső oszcillátort.
Az adatlap elején van egy táblázat, ahol feltünteti a család (882..887) eltéréseit memória, lábszám stb.
(#) Hilo válasza nedudgi hozzászólására (») Júl 16, 2013 /
 
Köszönöm, én is ezt szűrtem le, de kellett a megerősítés. Köszönöm az infót!
(#) adamhollos hozzászólása Júl 16, 2013 /
 
Sziasztok,

Hogyan lehet c18-ban egy függvényen belül változót definiálni?
(#) icserny válasza adamhollos hozzászólására (») Júl 16, 2013 /
 
Deklarálni kell, nem definiálni.

Például így:

  1. #include "piccolo_all.h"
  2. #include "delays.h"
  3.  
  4. void delay_ms(unsigned int d) {
  5. unsigned int i;    // <------------ Voilà!
  6.    for(i=0; i<d; i++) {
  7.      Delay1KTCYx(12);           //12 000 TCY késleltetés (~ 1ms)
  8.    }
  9. }
  10.  
  11. //-- A főprogram -------------------------------------------
  12. void main(void) {
  13.    mInitAllLEDs();              //LED-ek inicializálása
  14.    mInitSwitch1();              //SW1 inicializálása
  15.    while (1) {
  16.      while(SW1==1);             //lenyomásra vár
  17.      delay_ms(20);              //pergésmentesítő késleltetés
  18.      while(SW1==0);             //felengedésre vár
  19.      delay_ms(20);              //pergésmentesítő késleltetés
  20.      mLED_1_Toggle();           //LED1 állapotváltás
  21.    }
  22. }
(#) Hp41C válasza Hilo hozzászólására (») Júl 16, 2013 / 1
 
Különbslgek: A 16F88x rugalmasabb az analóg bemenetek kezelésében (a 16F87x(A) csa a RA0 tól kezdve tudja analógra állítani). Enhanced USART és egy Anhanced CCP modul van benne. Timer1 kapuzási lehetőséggel bír. stb.
(#) adamhollos válasza icserny hozzászólására (») Júl 16, 2013 /
 
Hát igen, így kéne mennie de nem. A következő primitív függvényeket írtam és a fordító az mondja, hogy a 15. sorban szintaktikai hiba van de ha kiszedem az i deklarálását és kiteszem a függvényen kívülre akkor jó.
  1. #include <p18f25k80.h>
  2. #include <math.h>
  3.  
  4. #define transiver_reg TXREG2
  5. unsigned long gotT;
  6. char gotTarray[4];
  7. void UART_transmission(char b[],long long ii);
  8. unsigned long getT();
  9.  
  10. void UART_receive(char captured_byte)
  11. {
  12.     if(captured_byte==0x20)
  13.     {
  14.         gotT=getT();
  15.         unsigned int i;
  16.         for(i=0;i<4;i++)
  17.         {
  18.             gotTarray[i]=gotT%256;
  19.             gotT/=256;
  20.         }
  21.         UART_transmission(gotTarray,sizeof(gotTarray));
  22.     }
  23. }
  24. void UART_transmission(char input[],long long a)
  25. {
  26.     int i;
  27.     for(i=a-1;i>-1;i--)
  28.     {
  29.         while(~PIR3bits.TX2IF);
  30.         transiver_reg=input[i];
  31.     }
  32. }
(#) Hp41C válasza adamhollos hozzászólására (») Júl 16, 2013 / 1
 
Ebben a C nyelvjárásban a függvénben a deklarációknak meg kell előzniük az utasításokat.
(#) adamhollos válasza Hp41C hozzászólására (») Júl 16, 2013 /
 
köszi így működik
(#) adamhollos válasza Hp41C hozzászólására (») Júl 16, 2013 /
 
Volna még egy kérdésem, eredetileg azt szerettem volna, hogy az UART_transmission bemeneti paramétere csupán csak egy char tömb legyen, viszont az UART_transmission függvényben a sizeof(input) mindig 2-t ad. Ez mért van?

javított változat:
  1. #include <p18f25k80.h>
  2. #include <math.h>
  3.  
  4. #define transiver_reg TXREG2
  5.  
  6. void UART_transmission(char input[],long long a);
  7. unsigned long getT();
  8.  
  9. void UART_receive(char captured_byte)
  10. {
  11.     if(captured_byte==0x20)
  12.     {
  13.         int i;
  14.         char gotTarray[4];
  15.         unsigned long gotT=getT();
  16.         for(i=0;i<4;i++)
  17.         {
  18.             gotTarray[i]=gotT%256;
  19.             gotT/=256;
  20.         }
  21.         UART_transmission(gotTarray,sizeof(gotTarray));
  22.     }
  23. }
  24. void UART_transmission(char input[],long long a)
  25. {
  26.     int i;
  27.     for(i=a-1;i>-1;i--)
  28.     {
  29.         while(~PIR3bits.TX2IF);
  30.         transiver_reg=input[i];
  31.     }
  32. }
A hozzászólás módosítva: Júl 16, 2013
(#) foxi63 válasza adamhollos hozzászólására (») Júl 16, 2013 /
 
Szia!
Szerintem tömböt nem lehet átadni függvénynek, csak tömbre mutató pointert, vagy egy tömbnek egy adott elemére mutató mutatót.Hiszen az átadott "char input[] " ról magad sem tudod,hogy melyik elemével kellene foglalkozni...

A függvény dekralációja: void UART_transmission(char *pointer,long long a);
a függvényben:
  1. transiver_reg=pointer[i];


meghíváskor: UART_transmission(&input[0] ,3256789);//ekkor adódik át a mutató
A hozzászólás módosítva: Júl 16, 2013
(#) efiscp válasza foxi63 hozzászólására (») Júl 17, 2013 /
 
Idézet:
„UART_transmission(&input[0] ,3256789);//ekkor adódik át a mutató”


Alternatív módon elhagyható a & és [0], ebből is látszik, hogy a C-ben a pointer és a tömb lényegében ugyanaz:

  1. UART_transmission(input ,3256789);


Ezután persze a függvényen belül továbbra is lehet tömbként kezelni.
A hozzászólás módosítva: Júl 17, 2013
(#) Hilo hozzászólása Júl 18, 2013 /
 
Sziasztok, abban kérném a segítségeteket, hogy írtam egy programot egy PIC-es szúnyogriasztóhoz, ami a visszajelzések szerint ~4 perc után elkezd sípolni. (személyesen nem tudtam tesztelni) A program a whalaky által készített kapcsoláshoz készült.
A sípolást a frekvencia ~ 20 kHz alá csúszása okozhatja? Előre is köszönök minden választ!

  1. LIST P=12f683
  2.         #include <p12f683.inc>
  3.         __CONFIG H'3FD4'
  4.  
  5.         CBLOCK  0x20    ;Szabad memória hely
  6.         T1      ;Delay-hez kell
  7.         T2      ;Delay-hez kell
  8.         T3      ;Delay-hez kell
  9.        
  10.         TOL    
  11.         IG     
  12.         FREKI
  13.        
  14.         ENDC
  15.  
  16.         org 0
  17.  
  18. START   ;Alap beállítások
  19.         clrf GPIO       ;GPIO mind 0
  20.         movlw b'111'    ;Comparator OFF bitkódja
  21.         movwf CMCON0    ;Comparator OFF (Bank0)
  22.  
  23.         banksel ANSEL   ;Bank 1
  24.  
  25.         clrf ANSEL      ;minden port digitálisra
  26.  
  27.         movlw b'111001' ;4, 5-ős láb kimenetre PWM+led (0 ki, 1 be)
  28.         movwf TRISIO    ;ki/be menet beállítása;
  29.  
  30.         movlw b'01110000'       ;8 Mhz bitkódja
  31.         movwf OSCCON    ;Belső oszcillátor beállítása
  32.  
  33.         banksel CCP1CON ;Bank 0
  34.  
  35.         movlw b'00001100'       ;PWM mód bittek
  36.         movwf CCP1CON           ;PWM mód aktiválás
  37.  
  38.         clrf TMR2               ;TMR2 nullázás
  39.  
  40. ;változók alap érték adása
  41.         movlw d'32'     ;60606 kHz
  42.         movwf TOL
  43.         movlw d'99'     ;20000 kHz
  44.         movwf IG
  45. ;jumperek vizsgálata (GP0,3,4,5)
  46.         movf GPIO,1     ;jumperek beolvasás
  47.  
  48.         movlw b'110'    ;Timer2 is on, előosztó 16
  49.         btfsc GPIO,0    ;teszt jumper vizsgálata (hallható tartományba)
  50.         movwf T2CON             ;Timer2 16-os előosztóra állítása
  51.        
  52.         clrf FREKI
  53.         movlw d'7'      ;freki tiltás mérték beállítása
  54.         btfsc GPIO,3    ;jumper 1
  55.         addwf FREKI,1           ;+7
  56.  
  57.         btfsc GPIO,4    ;jumper 2
  58.         addwf FREKI,1           ;+7
  59.         btfsc GPIO,4    ;jumper 2
  60.         addwf FREKI,1           ;+7
  61.  
  62.         btfsc GPIO,5    ;jumper 3
  63.         addwf FREKI,1           ;+7
  64.         btfsc GPIO,5    ;jumper 3
  65.         addwf FREKI,1           ;+7
  66.         btfsc GPIO,5    ;jumper 3
  67.         addwf FREKI,1           ;+7
  68.         btfsc GPIO,5    ;jumper 3
  69.         addwf FREKI,1           ;+7
  70.  
  71.         movf FREKI,0    ;FREKI W-be
  72.         subwf IG,1      ;frekvenia alsó határ beállítása
  73.        
  74. PWM
  75.         banksel PR2     ;Bank1
  76.        
  77.         movlw d'32'     ;fervencia beállítása 60606 kHz (8Mhz mellett)
  78.         movwf PR2       ;ferki szabályozás
  79.  
  80. ;50%-os kitöltési tényező beállítása PR2-höz (számolja magától frekiből)
  81.         banksel CCPR1L  ;Bank0
  82.         movwf CCPR1L   
  83.         bcf CCP1CON,5  
  84.         btfsc CCPR1L,0
  85.         bsf CCP1CON,5  
  86.         rrf CCPR1L,1
  87.         bcf CCPR1L,7
  88.  
  89.         bsf T2CON,2     ;Timer2 on
  90.  
  91. MOD1
  92.         call Delay2
  93.         movf IG,0       ;IG betölrése W-be
  94.         banksel PR2     ;Bank 1
  95.  
  96.         xorwf PR2,0     ;PR2 összehasonlítása IG-el
  97.     btfsc STATUS,Z      ;ha elérte IG-et akkor kihagyja a köv sort.
  98.         goto NOVEL      ;frekvencia nő -> PR2 csökken
  99.         goto CSOKKENT   ;frekvencia csökken -> PR2 nő
  100.  
  101. MOD2
  102.         call Delay2
  103.         movf TOL,0      ;TOL betölrése W-be
  104.         banksel PR2     ;Bank 1
  105.        
  106.         xorwf PR2,0     ;PR2 összehasonlítása TOL-al
  107.     btfsc STATUS,Z      ;ha elérte TOL-t akkor kihagyja a köv sort.
  108.         goto CSOKKENT   ;frekvencia csökken -> PR2 nő
  109.         goto NOVEL      ;frekvencia nő -> PR2 csökken
  110.  
  111. CSOKKENT        ;freki csokken PR2 nő
  112.         banksel PIR1    ;Bank 0
  113.         bcf PIR1,1      ;Timer2 tulcsorudló jelző nullázása
  114.         btfss PIR1,1    ;Ha van tulcsorulás továb megy
  115.         goto $-1        ;Ha nincs vár
  116.  
  117.         banksel PR2     ;Bank 1
  118.         incf PR2,1      ;PR2 1-el növelése
  119.         movf PR2,0      ;PR2 W-be
  120. ;50%-os kitöltési tényező beállítása PR2-höz (számolja magától frekiből)
  121.         banksel CCPR1L  ;Bank0
  122.         movwf CCPR1L   
  123.         bcf CCP1CON,5  
  124.         btfsc CCPR1L,0
  125.         bsf CCP1CON,5  
  126.         rrf CCPR1L,1
  127.         bcf CCPR1L,7
  128.  
  129.         goto MOD1
  130.  
  131. NOVEL   ;freki nő PR2 csökken
  132.         banksel PIR1    ;Bank 0
  133.         bcf PIR1,1      ;Timer2 tulcsorudló jelző nullázása
  134.         btfss PIR1,1    ;Ha van tulcsorulás továb megy
  135.         goto $-1        ;Ha nincs vár
  136.  
  137.         banksel PR2     ;Bank 1
  138.         decf PR2,1      ;PR2 1-el csökkentése
  139.         movf PR2,0      ;PR2 W-be
  140. ;50%-os kitöltési tényező beállítása PR2-höz (számolja magától frekiből)
  141.         banksel CCPR1L  ;Bank0
  142.         movwf CCPR1L   
  143.         bcf CCP1CON,5  
  144.         btfsc CCPR1L,0
  145.         bsf CCP1CON,5  
  146.         rrf CCPR1L,1
  147.         bcf CCPR1L,7
  148.        
  149.         goto MOD2
  150.  
  151. ;időzitések
  152. Delay   ;8Mhz 0,3 sec
  153.        
  154.         movlw   0xD1   
  155.         movwf   T1
  156.         movlw   0x4F   
  157.         movwf   T2
  158.         movlw   0x02   
  159.         movwf   T3
  160. Delay_0
  161.         decfsz  T1, f
  162.         goto    $+2
  163.         decfsz  T2, f
  164.         goto    $+2
  165.         decfsz  T3, f
  166.         goto    Delay_0
  167.  
  168.         return
  169.  
  170. Delay2  ;8Mhz 1,7 sec
  171.  
  172.         banksel GPIO    ;Bank 0
  173.         bsf GPIO,1      ;led be
  174.         call Delay
  175.         bcf GPIO,1      ;led ki
  176.  
  177.         movlw   0x51   
  178.         movwf   T1
  179.         movlw   0x6A   
  180.         movwf   T2
  181.         movlw   0x08   
  182.         movwf   T3
  183. Delay_02
  184.         decfsz  T1, f
  185.         goto    $+2
  186.         decfsz  T2, f
  187.         goto    $+2
  188.         decfsz  T3, f
  189.         goto    Delay_02
  190.  
  191.         return
  192.  
  193.  
  194.  
  195.  
  196.         end; Teljes program lezáró
(#) sanya00 hozzászólása Júl 19, 2013 /
 
sziasztok van egy pic18lf2620 le van zárva de nekem fontos ami benne van van valaki aki ki tudja olvasni vagy ismer valakit
köszi
(#) vicsys válasza sanya00 hozzászólására (») Júl 19, 2013 /
 
Sanya!
1. Nem lehet normális keretek közt kiolvasni. Pont ez a kódvédelem lényege. Fogadd el.
2. Tiszteld meg a többi fórumozót azzal, hogy a mondataidat nagy kezdőbetűkkel kezded és használsz írásjeleket.
(#) Hp41C válasza Hilo hozzászólására (») Júl 19, 2013 /
 
A 49. és 50. soroknál látok valami bizonytalanságot, de az nem okozhatja a frekvencia elmászását.
Az addwf FREKI,1 helyett használd inkább az addwf FREKI,f
a movf IG,0 helyett használd inkább a movf IG,w formákat - olvashatóbbak.
A goto $-1 megoldás helyett célszerűbb címkéket használni.
A hozzászólás módosítva: Júl 19, 2013
(#) Hilo válasza Hp41C hozzászólására (») Júl 19, 2013 /
 
Köszönöm, ennek megfelelően átírtam, saját tesztelés alapján nem sípolt. Van ölteled lehetett a gond?
(#) jonatani01 hozzászólása Júl 20, 2013 /
 
Sziasztok!
Írtam egy programot, ami a 8 bites C portot inkrementálja vagy dekrementálja, az értéket egy ledsor mutatja, attól függően, hogy melyikhez tartozó gombot nyomjuk meg. Működik is rendesen, csak az a baj, hogy ha egyszer megnyomom valamelyik gombot, akkor csak nagy ritkán változik a kívánt eggyel való csökkentés/növeléssel az értéke, általában 2-vel vagy 3-mal változik.
Gondolom hogy ezt elektromos zavarok okozhatják, de nem vagyok benne teljesen biztos. Szóval ezt hogyan lehetne megoldani? A/D konverter?
(#) vicsys válasza jonatani01 hozzászólására (») Júl 20, 2013 /
 
Sajnos prellez (prelleg) a nyomógombod. Kell írni egy kis rutint ami lekezeli az érintkezők pattogását.
(#) jonatani01 válasza vicsys hozzászólására (») Júl 20, 2013 /
 
köszi
(#) vicsys válasza jonatani01 hozzászólására (») Júl 20, 2013 /
 
Brutális de járható módszer, hogy a gomb lenyomása után beiktatsz 100-200ms-nyi szünetet, amíg lecseng a pattogás.
(#) Zsora válasza vicsys hozzászólására (») Júl 20, 2013 /
 
Én inkább csak a lenyomás v. felengedés után bizonyos ideig figyelmen kívül hagynám ugyanennek a gombnak az újbóli megváltozását. Tehát más feladatot ill. gombnyomást nem várakoztatnék így meg.
Ja, és ha már magyarok vagyunk; a gomb nem prellez hanem pereg (mint a dob).
A hozzászólás módosítva: Júl 20, 2013
(#) vicsys válasza Zsora hozzászólására (») Júl 20, 2013 /
 
A szép megoldás a többszöri figyelés, adott időn belül. Írtam is, hogy brutális módszer a hosszú várakoztatás, de sokszor pont jó ez is, ha nincs más lekezelni való.
De bizony, ez a szakkifejezés. Az öreg szakik még véletlenül sem mondanának pergést, csakis prellezést.
A hozzászólás módosítva: Júl 20, 2013
(#) Balagemann2031 válasza jonatani01 hozzászólására (») Júl 20, 2013 /
 
Szia! Elvileg, ha párhuzamosan kötsz a nyomógombbal egy 100n es kondit, nem fog prelllegni.
(#) Bell válasza vicsys hozzászólására (») Júl 20, 2013 /
 
Én néhány milliszekundumonként ismétlődő, - nyomógombtól függően - 6-20 egymást követő azonos értéket fogadok el stabil állapotnak.
(#) vicsys válasza Bell hozzászólására (») Júl 20, 2013 /
 
Ez is olyan mint a karika. Sok megoldás van, de vége ugyanaz. Van olyan szitu, hogy elég átbillenteni egy flag-et és a lekezelés végén visszabillenteni. Mindig az adott szituáció határozza meg a legegyszerűbb megoldást.
(#) Bell válasza vicsys hozzászólására (») Júl 20, 2013 /
 
Így van. Az adott szitu az volt, hogy ugyanaz a programrész értékelje ki a nyomógomb mindkét állapotát.
(#) Sicka hozzászólása Júl 21, 2013 /
 
Sziasztok!
nagyon kezdő vagyok tehát remélem jó helyen járok...
arról lenne szó , hogy az alap futófényes programban mivel tudom szabályozni a gyorsaságot? nem potméterre gondolok hanem a programon belül hogy pl kigyullad az első led vár tegyük fel 10-15 másodpercet aztán kigyullad a második led ismét vár 10-15 másodpercet aztán a harmadik és így tovább vagy hogy tudnék ilyen sorrendes témát csinálni???
vagy a közlekedési lámpához hasonlóan...
ilyen sorrend szerű beállítást szeretnék idő beállítással nagyjából ahogy leírtam 10-15 másodperc vagy esetleg több kihagyással világítanak a ledek
(#) nedudgi válasza Sicka hozzászólására (») Júl 21, 2013 /
 
Hol lehet utána nézni annak a programnak, amit említettél? Milyen típusú PIC-et akarsz programozni, milyen programozód van hozzá?
(#) Sicka válasza nedudgi hozzászólására (») Júl 21, 2013 /
 
PICkit 2 starter kit-em van 16F690-es PIC-el
a Program egy sima futófényes mondhatni alap program és azt szeretném, hogy futófényhez hasonlóan csak lassan a panelon 4 led található és balról jobbra mondjuk kivillan az első led vár valamennyi időt ezután kialszik az első led aztán másidok led villanna fel vár ez is valamennyi időt ezután alszik csak ki jön a harmadik led vár valamennyit kialszik negyedik led
és így folyamatosan folytatódna a ciklus....
Ez a program...

  1. #include <p16F690.inc>
  2.      __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
  3.  
  4.      cblock 0x20
  5. Delay1              ; Assign an address to label Delay1
  6. Delay2
  7. Display             ; define a variable to hold the diplay
  8.      endc
  9.      
  10.      org 0
  11. Start:
  12.      bsf       STATUS,RP0          ; select Register Page 1
  13.      clrf      TRISC               ; make IO PortC all output
  14.      bcf       STATUS,RP0          ; back to Register Page 0
  15.      movlw     0x08
  16.      movwf     Display
  17. MainLoop:
  18.      movf      Display,w           ; Copy the display to the LEDs
  19.      movwf     PORTC
  20. OndelayLoop:
  21.      decfsz    Delay1,f            ; Waste time.  
  22.      goto      OndelayLoop         ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
  23.      decfsz    Delay2,f            ; The outer loop takes and additional 3 instructions per lap * 256 loops
  24.      goto      OndelayLoop         ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
  25.                                    ; call it a two-tenths of a second.
  26.      
  27.      bcf       STATUS,C            ; ensure the carry bit is clear
  28.      rrf       Display,f
  29.      btfsc     STATUS,C            ; Did the bit rotate into the carry?
  30.      bsf       Display,3           ; yes, put it into bit 3.
  31.      goto      MainLoop
  32.      end
A hozzászólás módosítva: Júl 21, 2013
Következő: »»   434 / 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