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   679 / 1210
(#) Lamboo hozzászólása Jún 14, 2015 /
 
Köszönöm a válaszokat, akkor marad a nagyobb PIC + kvarc.
(#) kissi válasza Pali79 hozzászólására (») Jún 14, 2015 /
 
Ez csak a gyári kalibrálásra vonatkozik, azaz "ezen belül húzzák be"! Nem lenne ezzel gond, ha stabil lenne, mert akkor tudná korrigálni! Itt a gond a bizonytalanságból ered, aminek legfőbb okozója a hőmérséklet változás lehet / a táp szerintem elég stabil!/ Az a baj, hogy a közölt karakterisztika elnagyolt és nemlineáris, így nem lehet pontosan megmondani, hogy 20 C hőmérséklet változás milyen frekvenciaváltozást okoz, én úgy tippeltem, hogy akár az 1 ezreléknél is több lehet !
(#) Taki33 válasza matheattila hozzászólására (») Jún 15, 2015 /
 
Megfelelne, de oda nem lehet szerintem zip fájlt feltölteni!
(#) usane hozzászólása Jún 15, 2015 /
 
Üdv!

A gyári bootloaderekben (hex) van boot gomb konfigurálva, vagy csak akkor ha magam konfigolok egyet a forráskódból? PIC18F14K50-hez lenne.
(#) kissi válasza usane hozzászólására (») Jún 15, 2015 /
 
Persze, hogy van , azt azért nem olyan egyszerű a hex-ben megadni !
(#) mark.budai hozzászólása Jún 15, 2015 /
 
Sziasztok!
Próbált már valaki CCS C-ben FVR-t használni az ADC-hez feszültség referenciának? Hogy lenne érdemes? A PIC tápfeszültségét szeretném mérni, az FVR-hez képest.
(#) vicsys válasza Lamboo hozzászólására (») Jún 15, 2015 / 1
 
100%, hogy RTC-t használnék. Ott nagyon pontosan betudod állítani a kívánt időpontokat és csupán 2 láb kell a kommunikációhoz.
(#) usane válasza kissi hozzászólására (») Jún 15, 2015 /
 
Szerintem félre értettél. Van egy Gyári bootloaderem. Az egyik fejlesztő csomaggal töltöttem le. (HEX)
A kérdés az volt, hogy ez tartalmaz-e. Megnéztem egy gyári forrásfájlt, abban RB4-re van beállítva, de a gyári hex, nem reagál az RB4-re. Mondjuk a MCLR ki van kapcsolva. megnézem mit alkot ha bekapcsolom és resetelem.
A hozzászólás módosítva: Jún 15, 2015
(#) kissi válasza usane hozzászólására (») Jún 15, 2015 /
 
Szia!
Idézet:
„A gyári bootloaderekben (hex) van boot gomb konfigurálva, vagy csak akkor ha magam konfigolok egyet a forráskódból?”

Ha nem lenne benne és neked kellene "konfigolni" egyet a forráskódból, akkor minek terjesztenék ?!
Inkább az a veszély áll fenn, hogy nem tudod milyen kapcsoláshoz készült a boot és hol van a hozzátartozó nyomógomb !
A boot gombnak az az értelme, hogy a kontroller induláskor megnézi, hogy nyomják-e a gombot. Ha igen, akkor boot mód, ha nem, akkor normál futás! Ha RESET nem volt aktív, akkor hiába nyomkodod a boot gombot ! Etz úgy tudtad volna kipróbálni a konfig bitek állítása nélkül, hogy a táp ráadása előtt már nyomod a boot gombot !
(#) usane válasza kissi hozzászólására (») Jún 15, 2015 /
 
Megvolt, nem működött. Gondoltam csak béna vagyok mert vezetékkel próbáltam (gomb nincs rajta, az fölösleges eszköz ) Amihez letöltöttem azon nincs reset gomb, feltöltés után I2C to USB hídként működött. Viszont gondoltam, hogy nem csináltak hozzá külön bootloadert, hanem a kontrollerhez a simát adták amihez van forráskód is, de ezek szerint nem. Na mindegy, csinálok hozzá egyet.
(#) icserny válasza usane hozzászólására (») Jún 15, 2015 /
 
"Van egy Gyári bootloaderem." Melyik gyár melyik bootloadere? A Low Pin Count USB Dev kitnél a Microchip az RA3 bemenetet (MCLR funkció letiltása mellett) használja. Azt vettem át én is a PICCOLO projekthez.
(#) usane válasza icserny hozzászólására (») Jún 16, 2015 /
 
Mivel PIC-ről beszélünk természetesen a microchip-é, onnan töltöttem le, ha nem fogalmaztam érthetően elnézést, de aki akarja megérti. És low pin count, mert 18f14k50. Én viszont az MLA forrásan RB4-et láttam, azt néztem meg, de kipróbáltam a reset lábon is (RA3) azon sem működött, ha nyomva tartva csatlakoztattam. Lehet, hogy csak béna voltam, de azért kipróbálom a piccolo-s bootloadert is és akkor kiderül, hogy ugyanezt töltöttem-e le.
(#) usane válasza usane hozzászólására (») Jún 16, 2015 /
 
És láss csodát, a 2013.06.15-ös ben valóban az RA3-on van, tehát ehhez a fejlesztői csomaghoz kreáltak egy sajátot amiben nincs boot gomb. Viszont belenéztem ujra a forrásba, valóban RA3-ra van definiálva, a 4550-en van RB4-en.
A hozzászólás módosítva: Jún 16, 2015
(#) progee hozzászólása Jún 18, 2015 /
 
Sziasztok!
Mikropascalban programoznék egy PIC16F886-ot.
A feladat egyszerű, de nem boldogulok vele.

Egy ledet folyamatosan villogtatnia kellene a pic-nek, egy másikat pedig csak akkor, ha az RB0/INT lábon kap egy impulzust. Ennek vizsgálatához Timer0-t szeretnék használni.
A jelenség, hogy ha a Timer0-t engedélyezem, akkor az RB0/INt láb impulzusaira villog a megfelelő led, viszont a főprogramban megadott másik led nem vált állapotot, ha viszont kikapcsolom a Timer0-t, akkor a főprogramban villogtatott led működik, értelemszerűen a másik nem.

A program lényegi része:

  1. procedure Interrupt;
  2.   begin
  3.     if INTCON.INTF = 1 then    
  4.     begin
  5.       portb.4 := not portb.4;  
  6.       INTCON.INTF := 0;
  7.     end;
  8.   end;
  9.  
  10.   TMR0               := 255;        
  11.  
  12.   OPTION_REG.NOT_RBPU := 0;        
  13.   OPTION_REG.INTEDG   := 1;      
  14.   OPTION_REG.T0CS     := 0;  
  15.   OPTION_REG.T0SE     := 1;        
  16.   OPTION_REG.PSA      := 1;    
  17.   OPTION_REG.PS2      := 0;    
  18.   OPTION_REG.PS1      := 0;
  19.   OPTION_REG.PS0      := 0;
  20.  
  21.   INTCON.GIE          := 1;      
  22.   INTCON.PEIE         := 1;      
  23.   INTCON.T0IE         := 1;      
  24.   INTCON.INTE         := 0;      
  25.   INTCON.RBIE         := 0;      
  26.   INTCON.T0IF         := 0;      
  27.   INTCON.INTF         := 0;      
  28.   INTCON.RBIF         := 0;  
  29.  
  30.   ANSEL  := 0;      
  31.   ANSELH := 0;
  32.  
  33.   trisb.4 := 0;     //led
  34.   portb.4 := 0;
  35.   trisb.2 := 0;     //led
  36.   portb.2 := 0;
  37.  
  38.   while true do
  39.   begin
  40.       portb.2 := not portb.2; //led
  41.       delay_ms(500);
  42.   end;


Tudja valaki miért van ez?
A hozzászólás módosítva: Jún 18, 2015
(#) Pali79 válasza progee hozzászólására (») Jún 18, 2015 /
 
Az ördög mindig a részletekben lakozik!
(#) progee válasza Pali79 hozzászólására (») Jún 18, 2015 /
 
Fontos még hozzátennem, hogy a PIC belső óráját szeretném használni.
Ha a OPTION_REG.T0CS értékét változtatom, akkor szintén hol az egyik, hol a másik led működik.
Fordításnál INTOSC oscillatort állítottam be.
(#) progee válasza Pali79 hozzászólására (») Jún 18, 2015 /
 
No lehet sikerült megoldanom, de nem tudom miért is így működik.
Ha a TMR0 értékét 255 helyett 1-re állítom, és minden megszakításnál ismét, akkor működik.
Jól gondolom, hogy a Timer0 megszakítás hamarabb lefutott mint maga a fő program és ez gátolta a főprogram működését, folyamatosan újraindítva azt?

  1. procedure Interrupt;
  2.   begin
  3.     if INTCON.INTF = 1 then  
  4.     begin
  5.       portb.4 := not portb.4;  
  6.       INTCON.INTF := 0;
  7.       TMR0 := 1;
  8.     end;
  9.   end;
(#) Hp41C válasza progee hozzászólására (») Jún 18, 2015 /
 
Szia!
1 - A Figure 14-7 szerint a PEIE nem kell, ha csak a RB és a TMR0 megszakítást használod.
2 - A TIMER0 felfelé számol, ha 255 -öt írsz bele, akkor azonnal (náhány utasítás ideje alatt) túlcsordul és T0IF 1 -re vált.
3 - Az RB megszakítás használatához a INTCON.RBIE = 1; beállítás kell.
4 - Ha a TMR0 megszakítást is használod, a procedure Interrupt -ban meg kell írni a TMR0 megszakítás kezelését is. Miután nem használod ki ezt a megszakítást elegendő az INTCON.T0IE = 0;
(#) progee válasza Hp41C hozzászólására (») Jún 18, 2015 /
 
Köszi az infot!
Az utolsót nem értettem.
Leállításkor ki kell kapcsolni a timer0-t? Azt hogyan?
(#) usane válasza progee hozzászólására (») Jún 18, 2015 /
 
Hello!
Megint értetlenkedem egy kicsit. Minek a vizsgálatához kell a TMR0?
Csak azt látom, hogy elindítod és slussz. Megy a végtelen ciklus a B2 alternálásáva, és figyeli az INT-et, de mihez kell a TMR0. Másik, nem néztem az adatlapot, de ha T0IF bebillen akkor végtelen megszakításba megy, mert sehol sem törlöd csak indításkor.
(#) Hp41C válasza progee hozzászólására (») Jún 18, 2015 /
 
Valahogy így:
  1. procedure Interrupt;
  2.       begin
  3.         if INTCON.INTF = 1 then  
  4.         begin
  5.           portb.4 := not portb.4;  
  6.           INTCON.INTF := 0;
  7.           TMR0 := 1;
  8.         end;
  9.         if INTCON.T0IF = 1 then  
  10.         begin
  11.  
  12.           INTCON.T0IF := 0;
  13.         end;
  14.       end;
(#) progee válasza usane hozzászólására (») Jún 18, 2015 /
 
Fordulatszámláláshoz kell a timer. A leddel csak teszteltem, hogy működik-e.
A másik led pedig csupán a főprogram futását jelzi.
Az INTCON.T0IF tudtommal a TOCKI (RA4) lábon érkező impulzusra vált, azt pedig nem használom csak az említett INT (RB0) lábat, ami az INTCON.INTF -et billenti át.
(#) usane válasza progee hozzászólására (») Jún 18, 2015 /
 
Idézet:
„Az INTCON.T0IF tudtommal a TOCKI (RA4) lábon érkező impulzusra vált”

Téves!
Olvasd el a TMR0 leírását. A timer flag-ek mindíg a timerek túlcsordulását, vagy a TMR2 esetén a PR2 és postscaler által beállított érték elérését jelzik.

Szerk: Csak kiegészítésként, a T0CKI-ra érkező impulzus a timer értékét növeli. A jelzőbithez nem sok köze van.
A hozzászólás módosítva: Jún 18, 2015
(#) progee válasza usane hozzászólására (») Jún 18, 2015 /
 
Tehát a INT lábon érkező impulzus csak elindítja a timer0 számlálóját, és amikor az eléri a 255-öt, akkor vált a INTCON.INTF? Mert akkor az 1-től történő számítás téves adatot fog adni fordulatszámnál. Ezek szerint nem véletlenül volt 255-től indítva a számlálás, hiszen így szinte azonnal átbillen.
A valódi megoldást pedig nem az 1-től indított számláló, hanem a INTCON.T0IF := 0; értéke adja.
A hozzászólás módosítva: Jún 18, 2015
(#) usane válasza progee hozzászólására (») Jún 18, 2015 /
 
Na akkor tegyük tisztába.
Az INT lábon érkező impulzus megszakítást generál amit le is kezeltél az interrupt procedurában. Az INT lábnak semmi köze a TMR0-hoz.
A TMR0 mindíg fut, csak engedélyezni és tiltani lehet a hozzá tartozó megszakítást.
A TMR0 órajele lehet a T0CKI lábon érkező impulzus, vagy mint nálad, az FOSC/4.
A TMR0 a beít értéktől számol felfelé, és 0xFF-ről 0x00-ra billenéskor(túlcsordulás) bebillenti a T0IF bitet. Ha engedélyezve van a T0IE megszakítás akkor ez megszakítást generál amit szintén le kell kezelni. Ez nálad nincs megcsinálva. Mivel a PIC16-on csak egy szintű megszakítás van, ugyanabban a megszakítás rutinban kell lekezelni ezt is mint az INT lábon érkezőt, mégpedig úgy ahogy Hp41c kolléga mutatta, IF-el megnézed mi okozta a megszakítást.
Értelemszerűen mivel felfelé számol, minél nagyobb számot írsz a TMR0 regiszterbe annál gyorsabban lefut, tehát 255 azaz 0xFF esetén a következő órajelre.
Továbbá, ha számolásra, időmérésre akarod használni azt is meg kell oldani. Fordulatszám számlálás esetén uygebár számolni kell a két INT megszakítés között.
Elsőre ezeket emészd meg.

Egy kis magyarnyelvű magyarázat: Bővebben: Link Időzítők, számlálók, timer0 menüt keresd.
A hozzászólás módosítva: Jún 18, 2015
(#) progee válasza usane hozzászólására (») Jún 18, 2015 /
 
Köszönöm!
Közben rájöttem én is, hogy hülyeséget írtam!
Pár havonta előszedem az elektronika hobbimat, és olyankor le kell porolnom a tudást. Néha sikerül belegabalyodni
(#) Hp41C válasza Hp41C hozzászólására (») Jún 18, 2015 /
 
Van még egy dolog, ami meg tudja zavarni az embert...
Ebben a példában a TMR0 megszakítás nincs lekezelve, de (legalább) egyszer keletkezik kérés. Mivel nincs lekezelve a megszakítás rutinban, a visszatéréskor a T0IF bit értéke 1 marad. A következő utasítás végrehajtása után megint elfogadja a kérést a kontroller és lefuttaja a megszakítási rutint. A T0IF továbbra is 1 marad. Ez így zajlik a továbbiakban. A főprogram csiga lassúsággal "halad" a delay_ms(500) utasításban, a várakozási idő sokszorosára nő.
(#) patrik81 hozzászólása Jún 19, 2015 /
 
Sziasztok!

Nem kommunikál a programom. Az RC0-át csak kijelzésként tettem bele, de az sem működik. Külső tápról viszont villog a LED, de persze az nem elég.
  1. #include "config.h" //belso orajel 4 MHz
  2.  
  3. int main()
  4. {
  5.     TRISC0 = ANSEL = ANSELH = 0;             //RC0 LED infra jelzo,digitalis
  6.     TRISB4 = 1;      
  7.     INTCONbits.GIE = 1;
  8.     INTCONbits.RABIE = 1;
  9.     IOCBbits.IOCB4 = 1;
  10.     TXSTAbits.TXEN = 1;//enable transmitter
  11.     TXSTAbits.BRGH = 1;//high baud rate mode
  12.    
  13.     TRISBbits.TRISB7 = 1;//TX pin is input (automatic)
  14.    
  15.     SPBRG = 25;//set baud rate to 9600 baud
  16.    
  17.     PIE1bits.RCIE = 1;//enable USART receive interrupt
  18.     RCSTAbits.SPEN = 1;//enable USART
  19.     while(1);
  20. }
  21. void interrupt infra()
  22. {
  23.     if(RABIE && RABIF)
  24.     {
  25.         if (RB4)
  26.         {
  27.             while(!TXSTAbits.TRMT);//wait until transmit register is empty
  28.             TXREG = 'k';
  29.             RC0 = !RC0;
  30.         }
  31.         RABIF = 0;
  32.     }
  33. }
(#) Lamboo válasza vicsys hozzászólására (») Jún 19, 2015 /
 
Köszönöm az ötletet, utánanézek. Még egy problémám van a kvarcokkal kapcsolatban. Olvastam, hogy kell vele sorosan egy ellenállást kötni, ami a kvarcra jutó teljesítményt korlátozza és az adatlapja alapján határozható meg, viszont nekem régi kiforrasztott kristályaim vannak, amikhez nem találok adatlapot mert csak az értéküket tudom. Mennyire problémás az ellenállás hiánya a PIC-ek esetében?
(#) nyekk hozzászólása Jún 19, 2015 /
 
Sziasztok.
Gondoltam ismerkedek kicsit a program írással C nyelven.Bele is futottam mindjárt az első megoldandó problémába. PICkit2 -est használok,és próbaként egy 16F628 PIC-et. RB-portot adtam meg kimenetnek,ezzel nincs is semmi gond ,villágít a nyolc led,vagy kialszik,ha változtatom a portot,viszont írtam már több próba programot ,de egyik sem akar lefutni.16F628 -as kíván valami egyéb beállítást,vagy hol hibázom?
Kösz!



  1. TRISB = 0;
  2.  PORTB = 0;
  3.  while(1)
  4.   {
  5.  PORTB = 0b00000001;
  6.  Delay_ms (250) ;
  7.  PORTB = PORTB << 1;
  8.  Delay_ms (250) ;
  9.  PORTB = PORTB >> 1;
Következő: »»   679 / 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