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   463 / 1211
(#) foxi63 válasza Balagemann2031 hozzászólására (») Nov 17, 2013 / 1
 
Szia!
Amikor elindul a számlálás(felfutó él) utána állítsd át lefutó élre amikor beérkezik a lefutó él, elmentődik a számláló értéke,az igaz, hogy a timer elölről kezdi a számolást, de a pontos érték már el van mentve.
(#) Balagemann2031 válasza foxi63 hozzászólására (») Nov 17, 2013 /
 
Köszönöm, Kipróbálom!
(#) ktamas66 válasza Balagemann2031 hozzászólására (») Nov 17, 2013 / 1
 
Ezt ajánlom mindenkinek:
A keresőbe beírod:
microchip compiled tips and tricks
egy pdf-et kell találnia, ebben sok egyéb ötlet mellett van LED vezérlés és periódus idő mérés is (több mint 4Mb ezért nem tudom feltölteni).

simpi: Igen van sok olyan kapcsolás, de ilyet és is építettem, nem is egyet és bár biztosan specifikáción kívül van de működik (habár a portok dinamikus terheléséről az adatlap nem igazán bőbeszédű).
(#) Balagemann2031 válasza ktamas66 hozzászólására (») Nov 17, 2013 /
 
Hűha, ez nagyon értékes dokumentum Köszönöm!
(#) Buvarruha válasza Balagemann2031 hozzászólására (») Nov 19, 2013 /
 
Hahó.

Van egy programom ami eddig 16F877-ben volt, most átkerült egy 16F887-be és az interrupton kívül működik is minden, viszont a forgóenkóderre nem reagál. Hardveres hiba kizárva a program át lett írva 887-hez, de az interrupt nem működik. Mi a különbség a két PIC között ami miatt nem megy az interrupt?
(#) kissi válasza Buvarruha hozzászólására (») Nov 19, 2013 /
 
Nem használom a 887-et, de nézd meg az adatlapot: az encoderhez használt lábon nincs véletlenül AD átalakító ?!
(#) Buvarruha válasza kissi hozzászólására (») Nov 19, 2013 /
 
De van, AN11-13. Én arra gondoltam, hogy amiatt szivatja, de hiába tiltok minden A/D-t akkor sem működik.

Így néz ki a kód.

  1. void  RB_isr(void)
  2.     {
  3.     new=input_b();
  4.     value=new^old;
  5.    //'value', now has the bit set, which has changed
  6.    if (value & 0b00010000) {
  7.       //Here the low bit has changed
  8.       if (new & 0b00010000) {
  9.          //Here a rising edge on A
  10.          if (new & 0b00100000) {if(matek>0) {--current_position; matek=matek-1; data=1; } ; }
  11.          else ++current_position;
  12.          
  13.       }
  14.       else {
  15.          //Here a falling edge on A
  16.          if (new & 0b00100000) {if(matek<255) {++current_position; matek=matek+1; data=1; }; }
  17.          else --current_position;
  18.          
  19.       }
  20.    }
  21.    else {
  22.       //Here the high bit (B) must have changed
  23.       if (new & 0b00100000) {
  24.          //Here a rising edge on B
  25.          if (new & 0b00010000) {++current_position;}
  26.          else --current_position;
  27.          
  28.       }
  29.       else {
  30.          //Here a falling edge on B
  31.          if (new & 0b00010000) {--current_position;}
  32.          else ++current_position;
  33.           }
  34.        }
  35.        old=new;
  36.     }
A hozzászólás módosítva: Nov 19, 2013
(#) Hp41C válasza Buvarruha hozzászólására (») Nov 19, 2013 /
 
ANSEL = 0; ANSELH = 0; kell a 16F88x -nek. Ilyen regiszterei a 16F87x -nek nem voltak.
(#) Prendick válasza Buvarruha hozzászólására (») Nov 19, 2013 /
 
Az ANSELH-t nulláztad? A felhúzás lábanként kell: WPUB+RBPU, az RBIF csak akkor működik, ha az IOCB-ben is kijelölöd, hol jön a jel.
(#) Buvarruha válasza Hp41C hozzászólására (») Nov 19, 2013 /
 
És ezt hogyan, merre, mert a CCS nem tud ezzel mit kezdeni.

Prendick.

Ne káromkodj, ez a kezdő topik. A rotary kódját netről nyúltam és igazítottam az enyémhez. 877-ben működik, mindennapi használatban van, én ennyit tudok csak róla. az ADC-ket peróbáltam kikapcsolni, de nem segített.
A hozzászólás módosítva: Nov 19, 2013
(#) Hp41C válasza Buvarruha hozzászólására (») Nov 19, 2013 /
 
ANSEL a Bank 3 0x08 -as címen (0x188), ANSELH a Bank 3 0x09 címen (0x189) van. CCS -t nem ismerem.. Ld. adatlap Figure 2-4 a 23. oldalon.
Pedig igazat ír Prendick... Adatlap 3.3 fejezet.
A hozzászólás módosítva: Nov 19, 2013
(#) Prendick válasza Buvarruha hozzászólására (») Nov 19, 2013 /
 
Ezek regiszterek, amiknek értéket kell adni. Olyanok, mint mondjuk a PORTB. Gondolom a CCS-ben is be lehet állítani a pic típusát és akkor tudja értelmezni. Ha 877-nek van beállítva, akkor a konfigurációs bitek sem lesznek jók.
Sajnos a programodban pont nem látszik az inicializáló rész (ahol ugye a többi regiszternek adod az értékeket). Az se világos, hogy használsz-e külső felhúzó ellenállásokat.

Ha mondjuk az RB1-en jön az encodered, akkor az IOCB értéke 0b00000010
Úgy kell beállítani, mint a TRISB-t, csak itt az az 1, amelyik lábon interruptot akarsz. A WPUB hasonló. A 877-nél elég volt az RBPU bitet beállítani a belső felhúzó ellenálláshoz, de a 887-nél már van plusz regiszter erre.
Az ANSELH-nak meg muszáj 0-át adni, mert alapértelmezett állapotban mindent analógnak állít be.
(#) Buvarruha válasza Hp41C hozzászólására (») Nov 19, 2013 /
 
Elhiszem, hogy iagazat ír, de egy szavát nem értem és neked sem.

így néz ki az egész program CCS-ben. Hogy mit milyen regiszterre kell álítani azt elképzelni sem tudom.

Földre húzó ellenállások vannak, és az ekóder közös lába van tápon. Így működik stabilan.

  1. #include<16F887.H>                     //Using the PIC 16F877
  2.                            //Set ADC to 10 bit
  3.     #fuses HS,NOWDT,NOPROTECT,BROWNOUT,NOPUT   //Configuration Fuses
  4.     #use delay(clock=20000000)               //20Mhz Clock
  5.    
  6.     #define egy (0b10011111);
  7.     #define ketto (0b00100101);
  8.     #define harom (0b00001101);
  9.     #define negy (0b10011001);
  10.     #define ot (0b01001001);
  11.     #define hat (0b01000001);
  12.     #define het (0b00011111);
  13.     #define nyoc (0b00000001);
  14.     #define kilenc (0b00001001);
  15.     #define null (0b00000011);
  16.     #define egyt (0b10011110);
  17.     #define kettot (0b00100100);
  18.     #define haromt (0b00001100);
  19.     #define negyt (0b10011000);
  20.     #define ott (0b01001000);
  21.     #define hatt (0b01000000);
  22.     #define hett (0b00011110);
  23.     #define nyoct (0b00000000);
  24.     #define kilenct (0b00001000);
  25.     #define nullt (0b00000010);
  26.      
  27.     signed int16 current_position;
  28.      
  29.      
  30.        static int old;
  31.        static int new;
  32.        static int value;
  33.               int mate,matekk,data;
  34.             int16 seg,egyes,tizes,szazas,ezres;
  35.             float outlcd,szam;
  36.            
  37.     #include <math.h>          
  38.    
  39. #int_RB
  40. void  RB_isr(void)  
  41.     {
  42.     new=input_b();
  43.     value=new^old;
  44.    //'value', now has the bit set, which has changed
  45.    if (value & 0b00010000) {
  46.       //Here the low bit has changed
  47.       if (new & 0b00010000) {
  48.          //Here a rising edge on A
  49.          if (new & 0b00100000) {if(mate>0) {--current_position; mate=mate-1; data=1; } ; }
  50.          else ++current_position;
  51.          
  52.       }
  53.       else {
  54.          //Here a falling edge on A
  55.          if (new & 0b00100000) {if(mate<255) {++current_position; mate=mate+1; data=1; }; }
  56.          else --current_position;
  57.          
  58.       }
  59.    }
  60.    else {
  61.       //Here the high bit (B) must have changed
  62.       if (new & 0b00100000) {
  63.          //Here a rising edge on B
  64.          if (new & 0b00010000) {++current_position;}
  65.          else --current_position;
  66.          
  67.       }
  68.       else {
  69.          //Here a falling edge on B
  70.          if (new & 0b00010000) {--current_position;}
  71.          else ++current_position;
  72.           }
  73.        }
  74.        old=new;
  75.     }
  76.      
  77.    
  78.     void main()
  79.     {
  80.    
  81.     ADC_OFF;
  82.     PORT_B_PULLUPS(false);
  83.     enable_interrupts(int_rb);
  84.     enable_interrupts(global);
  85.     old=input_b();
  86.     setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_64);
  87.     output_low(PIN_c0);
  88.     spi_write(00000000);
  89.     spi_write(00000000);
  90.     output_high(PIN_c0);
  91.     output_low(PIN_a0);
  92.     output_low(PIN_c4);
  93.     output_low(PIN_c6);
  94.     output_low(PIN_c2);
  95.     output_d (0b11111101);
  96.     delay_ms(1000);
  97.     output_high(PIN_a0);
  98.     delay_ms(500);
  99.     mate=107;
  100.     data=1;
  101.    
  102.  
  103.    
  104.     for(;;)
  105.     {
  106.        
  107.        matekk=255-mate;
  108.        outlcd=matekk/2.0;
  109.        outlcd=outlcd-31.5;
  110.        szam=fabs(outlcd);
  111.        seg=szam*10.0;
  112.        ezres=seg/1000;
  113.        szazas=(seg-(1000*ezres))/100;
  114.        tizes=((seg-(1000*ezres))-((szazas*100)))/10;
  115.        egyes=seg%10;
  116.        
  117.        output_low(PIN_c7);
  118.        
  119.        if (mate==0)
  120.           {
  121.           output_low(PIN_a0);
  122.           output_low(PIN_c7);
  123.           output_d (0b11111111);
  124.           delay_us(500);
  125.           output_high(PIN_c7);
  126.           output_d(0b11111111);
  127.           output_low(PIN_c4);
  128.           output_d (0b11111101);
  129.           delay_us(500);
  130.           output_high(PIN_c4);
  131.           output_d(0b11111111);
  132.           output_low(PIN_c6);
  133.           output_d (0b11111100);
  134.           delay_us(500);
  135.           output_high(PIN_c6);
  136.           output_d(0b11111111);
  137.           output_low(PIN_c2);
  138.           output_d (0b11111101);
  139.           delay_us(500);
  140.           output_high(PIN_c2);
  141.           output_d(0b11111111);
  142.           }
  143.          
  144.           else
  145.           {
  146.        
  147.           output_high(PIN_a0);
  148.          
  149.        if (mate<192)
  150.           {
  151.            output_d (0b11111101);
  152.           }
  153.        if (mate>191)
  154.           {
  155.            output_d (0b11111111);
  156.           }
  157.                  
  158.        delay_us(500);
  159.        output_high(PIN_c7);
  160.        output_d(0b11111111);
  161.    
  162.        output_low(PIN_c4);
  163.        
  164.        if (szazas==0)
  165.           {
  166.            output_d null
  167.           }
  168.        if (szazas==1)
  169.           {
  170.            output_d egy
  171.           }
  172.        if (szazas==2)
  173.           {
  174.            output_d ketto
  175.           }
  176.        if (szazas==3)
  177.           {
  178.            output_d harom
  179.           }
  180.        
  181.        if (szazas==4)
  182.           {
  183.            output_d negy
  184.           }
  185.        
  186.        if (szazas==5)
  187.           {
  188.            output_d ot
  189.           }
  190.        
  191.        if (szazas==6)
  192.           {
  193.            output_d hat
  194.           }
  195.        
  196.        if (szazas==7)
  197.           {
  198.            output_d het
  199.           }
  200.        
  201.        if (szazas==8)
  202.           {
  203.            output_d nyoc
  204.           }
  205.        
  206.        if (szazas==9)
  207.           {
  208.            output_d kilenc
  209.           }
  210.          
  211.        delay_us(500);
  212.        output_high(PIN_c4);
  213.        output_d(0b11111111);
  214.    
  215.        output_low(PIN_c6);
  216.        
  217.        if (tizes==0)
  218.           {
  219.            output_d nullt
  220.           }
  221.        if (tizes==1)
  222.           {
  223.            output_d egyt
  224.           }
  225.        if (tizes==2)
  226.           {
  227.            output_d kettot
  228.           }
  229.        if (tizes==3)
  230.           {
  231.            output_d haromt
  232.           }
  233.        
  234.        if (tizes==4)
  235.           {
  236.            output_d negyt
  237.           }
  238.        
  239.        if (tizes==5)
  240.           {
  241.            output_d ott
  242.           }
  243.        
  244.        if (tizes==6)
  245.           {
  246.            output_d hatt
  247.           }
  248.        
  249.        if (tizes==7)
  250.           {
  251.            output_d hett
  252.           }
  253.        
  254.        if (tizes==8)
  255.           {
  256.            output_d nyoct
  257.           }
  258.        
  259.        if (tizes==9)
  260.           {
  261.            output_d kilenct
  262.           }
  263.          
  264.        delay_us(500);
  265.        output_high(PIN_c6);
  266.        output_d(0b11111111);
  267.        
  268.        output_low(PIN_c2);
  269.        
  270.        if (egyes==0)
  271.           {
  272.            output_d null
  273.           }
  274.        if (egyes==1)
  275.           {
  276.            output_d egy
  277.           }
  278.        if (egyes==2)
  279.           {
  280.            output_d ketto
  281.           }
  282.        if (egyes==3)
  283.           {
  284.            output_d harom
  285.           }
  286.        
  287.        if (egyes==4)
  288.           {
  289.            output_d negy
  290.           }
  291.        
  292.        if (egyes==5)
  293.           {
  294.            output_d ot
  295.           }
  296.        
  297.        if (egyes==6)
  298.           {
  299.            output_d hat
  300.           }
  301.        
  302.        if (egyes==7)
  303.           {
  304.            output_d het
  305.           }
  306.        
  307.        if (egyes==8)
  308.           {
  309.            output_d nyoc
  310.           }
  311.        
  312.        if (egyes==9)
  313.           {
  314.            output_d kilenc
  315.           }
  316.          
  317.        delay_us(500);
  318.        output_high(PIN_c2);
  319.        output_d(0b11111111);
  320.        /*
  321.        mate=mate+1;
  322.        if (mate==255)
  323.           {
  324.            mate=1;
  325.           }
  326.        data=1;
  327.        */
  328.        
  329.        }
  330.      
  331.        
  332.        
  333.        while(data==1)
  334.        {
  335.        disable_interrupts(int_rb);
  336.        output_low(PIN_c0);
  337.        spi_write(mate);
  338.        spi_write(mate);
  339.        output_high(PIN_c0);
  340.        enable_interrupts(int_rb);
  341.        data=0;        
  342.        
  343.      
  344.        }
  345.    }
  346. }
A hozzászólás módosítva: Nov 19, 2013
(#) icserny válasza Buvarruha hozzászólására (») Nov 19, 2013 /
 
Az adatlap leírja, hogy az analóg bemenetek letiltása hogyan történik. El kell olvasni!
A regiszterek definiálása CCS C-ben:
  1. #byte ANSEL = 0xF7E
  2. #byte ANSELH = 0xF7F


A regiszterek törlése:
  1. ANSEL = 0;
  2. ANSELH = 0;
(#) Hp41C válasza icserny hozzászólására (») Nov 19, 2013 /
 
Még az
  1. IOCB = (0b00110000);

is kell.
(#) Buvarruha válasza Hp41C hozzászólására (») Nov 19, 2013 /
 
Ezzel megintcsak nem tudok mit kezdeni, az ansel-t megkapta, de továbbra sem működik.
(#) Prendick válasza Buvarruha hozzászólására (») Nov 19, 2013 / 1
 
Aha, értem a problémát. Szóval a CCS nem szereti, ha a regiszterekbe irkálunk, ellátja magát.
Ez esetben mindössze két sort kell beszúrni a 82. sor után (a hozzászólásban lévő sorszámozás alapján) a main() függvénybe:
PORT_B_PULLUPS(false);
enable_interrupts( INT_RB4 );
enable_interrupts( INT_RB5 );
enable_interrupts(int_rb);
enable_interrupts(global);


Ha minden igaz, ez a háttérben elintézi az ANSEL-eket, egyéb regisztereket. Kissé szokatlan logikája van a fordítónak. De biztos van akinek tetszik.
A hozzászólás módosítva: Nov 19, 2013
(#) Buvarruha válasza Prendick hozzászólására (») Nov 19, 2013 /
 
Be...ás és mukodik. Köszönöm mindenkinek a segítséget.

No igen, így külön az ansel sem kell neki, gondolom ez a fordító a pistikéknek van, mint én.
A hozzászólás módosítva: Nov 19, 2013
(#) Beles hozzászólása Nov 19, 2013 /
 
Sziasztok!
5V-os tápegységről megy a PIC-em, és szeretnék rákötni egy bluetooth modult (RN-42). Hogyan lehetne megoldani a bluetooth tápellátását? Valamint a logikai jelszintek illesztését a PIC-hez? UART-on keresztül kommunikálna.
(#) Hp41C válasza Beles hozzászólására (») Nov 19, 2013 /
 
Egy külön topik foglalkozik vele.
(#) lionsec hozzászólása Nov 19, 2013 /
 
Üdvözlet mindenkinek.

Lenne egy kis problémám egy LTP portra épített kapcsolással amit most fejeztem be és a táp ráadása után a zöld és melette a piros LED világít folyamatosan miközben a C1 kondenzátor és a 7805 IC eléggé melegszik.A tápom üresen 20 v ot ad le az lehet esetleg gond?
Köszönet előre is!
(#) eSDi válasza lionsec hozzászólására (») Nov 19, 2013 /
 
Üdv!

Ha C1 melegszik, akkor azt bizony fordítva ültetted be! A stabilizátor ekkora bemenő fesz miatt természetesen melegedni fog, de túlzottan nem szabad neki. Meleg, de nem égeti oda az ember ujját. A zöld az világítani is fog, mert az a táp meglétét jelzi, a piros pedig az égetőfesz bekapcsolását jelzi és valószínűleg azért világít, mert nem indítottad el és nem állítottad be az égetőprogramot. Először a programot indítsd el, majd állítsd be és csak ezután adj rá tápfeszt. Ha megvan, akkor multiméterrel teszteld le a program segítségével, hogy jól kapcsol e. Csak ezek után próbáld ki élesben, mert ha valami nem jó, akkor könnyen tönkre is mehet a PIC.
(#) lionsec válasza eSDi hozzászólására (») Nov 19, 2013 /
 
Tehát először a programot nyissam meg állítsam be a lábak bemeneteit és ha ez megvan akkor adjam rá a táp feszt a panelra?De a panelt összedughatom a géppel nem? Melyik program jó kezdésnek? Most ismerkedem az égetéssel és mivel hobbi szinten foglalkozom gyengeárammal ezért van mikor megakadok sajna. A kondit néztem jól van beültetve hacsak nem azért melegedhet mert 25 v-os a kondi és 20 v megy be.
(#) lionsec válasza lionsec hozzászólására (») Nov 19, 2013 /
 
Lehet h butaságot mondok de nem lehet az a probléma,hogy a 7805 melegszik ,hogy 12v megy rá a bemenetére?Én kicsit sokallom és jelentősen melegszik lehet h máshogy kéne a táprészt megoldani esetleg LM317?
(#) Pali79 válasza lionsec hozzászólására (») Nov 19, 2013 /
 
12V-től nem melegszik egy 7805-ös, épp most barkácsoltam és is ilyen stabkockával, valamivel több mint 28V megy rá és semmi baja. Valami túlterheli, alkatrész polaritás vagy zárlat lesz szerintem.
(#) Barkacs27 hozzászólása Nov 20, 2013 /
 
Sziasztok!
Van egy Pic projekt amit megszeretnék csinálni.
Pic16c54-vel lett megcsinálva.
Pickit2-m van. Azzal fel tudnám programozni?
(Ez lenne az első, tehát még nem értek hozzá. Ezért kérdezem.)
Köszike
(#) icserny válasza Barkacs27 hozzászólására (») Nov 20, 2013 /
 
Idézet:
„Azzal fel tudnám programozni?”
Erre már válaszoltam: nem. Nincs benne a támogatott eszközök listájában.
(#) eSDi válasza lionsec hozzászólására (») Nov 20, 2013 /
 
Igen, rá kell dugni a gépre. A 25V-os kondi nem melegedhet 20V-ról, de még 25V-ról sem. Milyen tápegységet kötötél rá? Amúgy szerintem ez egy feleslegesen túlbonyolított kapcsolás. Én inkább erre szavaznék, ez biztos, hogy működik: Bővebben: Link, megépítettem.
Én ezt a programot ajánlanám hozzá: Bővebben: Link az "PIC égető program letöltése" résznél találod.
(#) Prendick válasza Barkacs27 hozzászólására (») Nov 20, 2013 /
 
Használhatsz helyette 16F54-et. Viszont ha csak hex-ed van, a Pickit programjában kapcsold ki a Code protect-et. (Tools menü legfelső sora, vagy a konfigurációs biteknél az utolsó három kivételével mindent állíts 1-re, a maradékot hagyd úgy, ahogy van).
(#) Prendick válasza lionsec hozzászólására (») Nov 20, 2013 /
 
Ugye az a 18VAC a kapcsolási rajzon csak elírás?
Következő: »»   463 / 1211
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