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   541 / 1209
(#) don_peter válasza Buvarruha hozzászólására (») Jún 26, 2014 /
 
Sajnos nem, hanem halványan világít.

nedudgi: A sorok kapnak magas szintet az oszlopok a testet kapcsolgatják.
  1. flag = SOROK;

A fentebb beillesztett sor a sorok kikapcsolásáért felel elvileg.
Úgy tudom, ha szimplán kiolvassuk az előre definiált változót akkor alapértelmezett állapotba tér vissza és ilyenkor a sorok alacsony szintre kerülnek vagy nem?
(#) don_peter válasza nedudgi hozzászólására (») Jún 26, 2014 /
 
Köszönöm, nálad a pont.
Nem kapcsolta ki a sorok szintjét és ezért volt gond.
  1. SOROK = 0;

Így már jól működik.
(#) Beles hozzászólása Jún 26, 2014 /
 
Sziasztok!
Van egy NTK típusú hőmérő ellenállásom. Kétütemű motor gyertya hőmérsékletét szeretném vele mérni. Hogyan lehetne PIC-el megoldani? Én arra gondoltam, hogy áramgenerátorral hajtom, és AD konverterrel mérem a rajta eső feszültséget. Van más megoldás is?
(#) kissi válasza Beles hozzászólására (») Jún 26, 2014 /
 
Ez jó megoldás. Ha valamiért bonyolítani akarod, akkor pl. lehet vele oszcillátor freki meghatározó elemét készíteni és akkor frekvenciát kell mérned... !
(#) Beles válasza kissi hozzászólására (») Jún 26, 2014 /
 
Maradok az áramnál
(#) progee hozzászólása Jún 27, 2014 /
 
16F886-os pic-nél szeretnék egyszerre használni timer2 időzítőt és Dallas18B20 digitális hőmérőt.
Olyan problémába ütköztem, hogy ha a timer2 inicializálásakor az INTCON.PEIE := 1; értéket kap, akkor a hőmérő csak -1 fokot mér RA1 lábon.
Meg lehet oldani valahogyan, hogy timer2 mellett működjön a hőmérő is?
(#) don_peter válasza progee hozzászólására (») Jún 27, 2014 /
 
A "GIE" globális megszakításokat is engedélyezted?
Esetleg még az analóg lábakat digitálisra állítani...

Vagy a megszakítások megvannak, csak a hőmérő adatait nem olvassa?
Esetleg próbáld ki kettős pont nélkül is:
  1. INTCON.PEIE = 1;
A hozzászólás módosítva: Jún 27, 2014
(#) progee válasza don_peter hozzászólására (») Jún 27, 2014 /
 
Mikropascalban programozok. Abban kell az értékátadáshoz a kettőspont.
Külön külön jól működik az időzítő és a ds1820 is.
Ha viszont a PEIE megkapja az 1-es értéket, akkor -1 fokot számol a program.
Ahogyan keresgetek a neten, úgy látom nem csak én botlottam ebbe a problémába, de még mindig nem értem pontosan mi áll a hátterében.
Most annyival tudtam orvosolni, hogy a ds1820 olvasása előtt kikapcsolom a PEIE-t, aztán meg vissza. Ez persze pocsék megoldás, mert a timer2, így teljesen pontatlan lesz.
Sajnos a programban már használom a timer0 és timer1 időzítőket is, így nem egyszerű kiváltani a timer2 szerepét, ill. a ds1820-at sem cserélném le szívesen.
  1. INTCON.PEIE    := 0;
  2.   Ow_Reset(Port_, Bit_);         // onewire reset signal
  3.   Ow_Write(Port_, Bit_, $CC);    // issue SKIP ROM command to DS1820
  4.   Ow_Write(Port_, Bit_, $44);    // issue CONVERT T command to DS1820
  5.   Delay_ms(120);                 // Wait for conversion completed if asked for
  6.   Ow_Reset(Port_, Bit_);         // onewire reset signal
  7.   Ow_Write(Port_, Bit_, $CC);    // issue SKIP ROM command to DS1820
  8.   Ow_Write(Port_, Bit_, $BE);    // issue READ SCRATCHPAD command to DS1820
  9.  
  10.   for I := 0 to 8 do
  11.     result[I] := Ow_Read(Port_, Bit_); // get DS1820 result (9 bytes)
  12.   INTCON.PEIE    := 1;
A hozzászólás módosítva: Jún 27, 2014
(#) don_peter válasza progee hozzászólására (») Jún 27, 2014 /
 
Pff akkor passz.
C-ben próbálkozom szóval ehhez kicsit sem konyítok.
Az, hogy ennyi timer-t használsz nagyon megbonyolítja a dolgot...

Más:
Ha portbővítő IC-t használok (74HC595) 7 szegmenses kijelző meghajtására, akkor is kell vagy érdemes a lábak elé egy 270Ohm-os ellenállást betenni vagy ilyen meghajtó IC-knél nem kell?
(#) mrobi válasza don_peter hozzászólására (») Jún 28, 2014 /
 
Igen kell. Gondolom nem 5V-os kijelző használsz.
(#) icserny válasza don_peter hozzászólására (») Jún 28, 2014 /
 
Igen, kell. A 74HC595 IC egyébként nem meghajtó IC. Nem is terhelhető (eléggé) a kimenete, és nem áramgenerátoros a kimenet. A MAX7219, vagy a TLC5940 viszont meghajtó IC, azoknál nem kell soros ellenállás, mert beállítható a LED árama.
(#) icserny válasza progee hozzászólására (») Jún 28, 2014 /
 
Idézet:
„Most annyival tudtam orvosolni, hogy a ds1820 olvasása előtt kikapcsolom a PEIE-t, aztán meg vissza.”
Nyilvánvalóan az a probléma, hogy szoftveres időzítéssel olvasod ki a hőmérőt. Abba viszont belerondít az, ha közben beüt egy megszakítás. Ezt megérteni nem nehéz, megnyugtató megoldást találni már nehezebb... Muszáj neked ilyen hőmérőt használni? Van annyi analóg, I2C, vagy SPI kimenetű is, amivel egyszerűbb volna az élet.
(#) Pali79 válasza kissi hozzászólására (») Jún 28, 2014 /
 
Mivel a mechanikai résszel egyenlőre nem tudok foglalkozni, ezért elméletbe maradok az első felállásnál, miszerint fordulatonként egy impulzus jön be a CCP-re. Számításaim szerint 1 km/h sebességnél kb 4,2 s-enként jön be egy impulzus. Ha maradok a 4 MHz-es kvancnál akkor 1 us léptetéssel számolva ez idő alatt kb 64-szer csordul túl a Timer1. A túlcsordulások számát tárolom egy változóban (T). Az időt ez esetben így gondolnám kiszámolni: (T×65535)+ <CCPR2H:CCPR2L>
Jó ez így?
(#) ktamas66 válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
Nem pontosan. Csinálj egy 3-4 byte-os változót, ami simán csak számol, a felső byte-ban a túlcsordulásokat. Ezt a változót mented a capture-ban Túj néven, mikor bejön a következő impulzus kiszámolod a különbséget (Túj-Telőző), ez lesz az eltelt idő, az új értéket mented a Telőző-be. A számlálód szabadon futhat, nem kell nullázgatni.
(#) don_peter válasza mrobi hozzászólására (») Jún 28, 2014 /
 
icserny-nek is válasz:
Ilyet vettem: Bővebben: Link
Akkor ide érdemes talán még meghajtó tranzisztorokat is betennem?
Vagy, ha multiplexelem akkor az nem kellene?
Gondolom a PIC és a 74HC595 közé nem kell semmi csak simán rákötöm ott nem keletkezik terhelés.?
(#) Pali79 válasza ktamas66 hozzászólására (») Jún 28, 2014 /
 
Ezt a szabadon futhat dolgot nem értem egészen. Mi van akkor ha a változó túlcsordul? Akkor előfordulhat, hogy a Túj értéke kisebb lesz mint a Telőző. Nem jól gondolom?
(#) kissi válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
De, jól gondolod, csak 4 byte-on ritkábban fog bekövetkezni, de "befog" !
(#) Pali79 válasza kissi hozzászólására (») Jún 28, 2014 /
 
Akkor ezzel nem sokat nyerek csak elbonyolítom a későbbi számítást, így is 24 bites lesz végeredmény ha jól értem, azzal is fogok küzdeni.
Szerinted jó az előzőekben felvázolt képlet?
(#) icserny válasza don_peter hozzászólására (») Jún 28, 2014 /
 
Idézet:
„Akkor ide érdemes talán még meghajtó tranzisztorokat is betennem?”
Próbáld ki dugaszolós próbapanelon, hogy elegendő-e a fénye, ha csak a 74HC595 hajtja megy egy ellenálláson keresztül.
Idézet:
„Gondolom a PIC és a 74HC595 közé nem kell semmi.”
Nem kell.
(#) kissi válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
Szerintem jó! De miért nem használsz még előosztót a TIMER1-hez? Ha pl. 64-es előosztót használnál, akkor 64 us pontosan tudod mérni az időt! Nem tudom, milyen sebesség intervallumban akarsz mérni, de pl. a 4,2 s-hoz képest nagyon elhanyagolható, ha 64 us pontosan mérem meg ( a konkrét feladat ismeretében esetleg továbbgondolva, lehet, hogy még tovább lehet egyszerűsíteni a feladatot! Írd fel magadnak a hozzátartozó képleteket és nézd meg, mivel tudnád egyszerűsíteni ! ) !
(#) Hp41C válasza kissi hozzászólására (») Jún 28, 2014 /
 
Idézet:
„De miért nem használsz még előosztót a TIMER1-hez?”
... Mert a 16F877A -ban nincs, csak 1/1, 1/2, 1/4, 1/8. Egy külső átkötéssel a Timer1 órajelét lehetne a Timer2 és egy CCP felhasználásával a CCP kimenetéről vezérelni.
(#) matheattila válasza Hp41C hozzászólására (») Jún 28, 2014 /
 
Idézet:
„Egy külső átkötéssel a Timer1 órajelét lehetne a Timer2 és egy CCP felhasználásával a CCP kimenetéről vezérelni.”

Ennyi erővel akkor már lehetne egyenesen a Timer2 megszakításában növelni egy változó értékét (mint ahogy azt a Timer1 tenné a TMR1H és TMR1L regiszterekkel) és ha még az sem elég akkor annak egy bizonyos értékénél lehet egy másik változót növelni, majd az első változót nullázni (mintha a Timer1 túlcsordult volna)
(#) Pali79 hozzászólása Jún 28, 2014 /
 
Amikor a megszakítási területen vagyunk, lehet olyan szubrutint meghívni ami egyéb memóriaterületen van? Vagy ez problémás?
(#) Hp41C válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
Mindent lehet, csak a futási időkkel számolni kell. Lehetőleg a megszakítás kezelő rutin legye rövid.
(#) Hp41C válasza matheattila hozzászólására (») Jún 28, 2014 /
 
Nem a feladat megoldásához fűztem megjegyzést, hanem az ajánlathoz.
(#) Pali79 válasza Hp41C hozzászólására (») Jún 28, 2014 /
 
Van erre valami megkötés, hogy mennyi utasítást lehet a megszakításba tenni?
(#) Hp41C válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
Elvi megkötés nincs.
Ha egy kérés kiszolgálása alatt egy másik kérés is érkezik, akkor az első kiszolgálása alatt a második kérés várakozik, a feldolgozása az első kérés teljes kiszolgálása után kezdődik. Előfordulhat, hogy a további kérések kiszolgálása annyi időt vesz igénybe, hogy egyes kérések már többször is befuthatnak. Ez a szituáció vezethet hibás működéshez.
Pl. időzítő megszakítás kiszolgálása viszonylag hosszú, annyira, hogy közben az UART egység kérésének kiszolgálása nem tud lefutni, mire a következő karakter vétele befejeződik.
(#) ktamas66 válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
Azért írtam 3-4 byte-ot, mert nem tudom miben programozol, ha C-ben akkor a long 4 byte-os ( a 24 bites gondolom macerás ). A túlcsordulást mindenképpen figyelned kell ( vagy valami korlátot), hiszen ha áll a traktor (vagy nem traktor ), számolhatsz az idők végezetéig. A 24 bites változó kb. 16s alatt csordul túl ( a 32 bites kb. 70 perc ). A szabadon futón az értem, hogy folyamatosan növeled, ha elérte 0xFF-et 0-ra ugrik (mint normálisan). A kivonásnál a kettes számrendszerben helyes eredményt kapsz ha maximum csak egy "átfordulás" történt, akkor is ha Túj kisebb mint Telőző.
Ezt az új-előző játékot úgyis játszanod kell, hiszen mikor bejön az impulzus mented a CCPRxL-H értékét, a következőnél is, és így számolod a különbséget (hiszen, mondjuk 100km/h-nál 42ms-onként jönnek az impulzusok, tehát csak a CCPRx regiszterek különbsége adja az eltelt időt).
(#) kissi válasza Hp41C hozzászólására (») Jún 28, 2014 /
 
Jogos, de 8-as osztásnál is javul a "megszakítások sűrűsége" !
(#) ktamas66 válasza Pali79 hozzászólására (») Jún 28, 2014 /
 
Még egy ötlet (bár nem tudom milyen funkciókat használsz még más feladatokra):
Az egyik CCP modullal előállítasz egy 11904,76Hz-ez órajelet, ez pont az 1/4,2s 50 000 szerese. Ezt az órajelet számolod a másik CCP modullal capture üzemmódban. Így a kapott 16 bites értékkel kell tovább számolni, minimum mérhető sebesség (ahol túlcsordul) 0,76km/h. Az 1km/h-hoz ugye az 50 000 tartozik, 100km/h-nál a pontosság még mindig 0,2km/h.
A számítás: 50000/(Túj-Telőző)

Remélem érthető voltam .

PWM2.JPG
    
Következő: »»   541 / 1209
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