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   587 / 1210
(#) n_yálastrubadúr hozzászólása Nov 3, 2014 /
 
Sziasztok!
Olyan régen foglalkoztam Pic-cel. Most nem emlékszem az miért van hogy egy A/D átalakítás során a poti teljes hosszában 4x megy fel teljesen.? kb olyan négy voltról megy és minden voltnál maximum és előről a következő voltig??
A hozzászólás módosítva: Nov 3, 2014
(#) nedudgi válasza n_yálastrubadúr hozzászólására (») Nov 3, 2014 /
 
Hány bites ADC? Nem lehet, hogy csak az alsó nyolc bittel foglalkozol?
(#) nedudgi válasza McAdams hozzászólására (») Nov 3, 2014 /
 
Kb. 120 Ft.
Az MCP9700A jól elvan hosszú vezetékekkel.
(#) n_yálastrubadúr válasza nedudgi hozzászólására (») Nov 3, 2014 /
 
10 bites jobbra van igazítva
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Nov 3, 2014 /
 
16F -eken az ADRESH más bankban lehet.
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Nov 3, 2014 /
 
18f25k50,belső oszcillátor. C- ben van írva , nem én bankolok.
A hozzászólás módosítva: Nov 3, 2014
(#) n_yálastrubadúr válasza n_yálastrubadúr hozzászólására (») Nov 3, 2014 /
 
kb ennyi az egész. Egy már létező panelen lévő Pic-et használok. Nem a lábkioszásnak megfelelő helyiértéken vannak a hozzájuk tartozó bitek. Ezért vannak az if-ek.
  1. for(;;){
  2.  
  3.  
  4.         ADCON1= 0b00000000;
  5.         ADCON2= 0b10101111;
  6.         ANSELA = 0b00100000;
  7.  
  8.        
  9.         ADCON0= 0b00010001;    // AN4; chanel left?
  10. //      delay_ms(1);
  11.         ADCON0bits.GO = 1;
  12.         while(!ADCON0bits.GO);
  13.         left = 1;
  14.  
  15.         result = ADRESL;
  16.  
  17.                         if(result&1)led1=1;
  18.                         if(result&2)led2=1;
  19.                         if(result&4)led3=1;
  20.                         if(result&8)led4=1;
  21.                         if(result&16)led5=1;
  22.                         if(result&32)led6=1;
  23.                         if(result&64)led7=1;
  24.                         if(result&128)led8=1;
  25.  
  26.             _asm
  27.                 nop
  28.             _endasm
  29.  
  30.         PORTA=0; PORTB=0; PORTC=0;
  31.  
  32.  
  33. } // for
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Nov 3, 2014 /
 
Ha az A/D 10 bites, akkor 10 LED kell a kijelzéshez. A 25. sorba írd be:
  1. result = ADRESH;
  2.         if(result&1)led9=1;
  3.         if(result&2)led10=1;

A led -eket valakinek ki is kellene kapcsoni:
  1. led9 = ((result & 1) == 1);
  2.   led10 = ((result & 2) == 2);

stb...
A hozzászólás módosítva: Nov 3, 2014
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Nov 3, 2014 /
 
Már kezdtem bepánikolni. De megint teljes figyelmetlenség az oka mindennek. Köszönöm.
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Nov 3, 2014 /
 
Ez csak egy próba. És a Port törlése ezért van benne.
(#) usane válasza Hp41C hozzászólására (») Nov 3, 2014 /
 
Idézet:
„led9 = ((result & 1) == 1);
led10 = ((result & 2) == 2);”

Ritkán használom a C-t. Ezt elmagyaráznátok? Mit csinál az egyenlőségben a dupla egyenlő?
Ez a szintaktika nem rémlik.
(#) Hp41C válasza usane hozzászólására (») Nov 3, 2014 /
 
A C nyelvben minden kifejezésnek értéke van, így a ((result & 2) == 2) -nek is: true vagy false, ami t egy boot típusú változónak értékül lehet adni.
Jól olvasható, de nem javaslom a használatát, mivel a bit beállítása / törlése művelet helyett egy rakás léptetés és xor, and, xor műveletsorra fordul.
Hatása annyi, mint a következő sornak, ami sokkal rövidebb kódra fordul:
if ((result & 2) == 2) led10 = 1; else led10 = 0;
C -ben a dupla egyenlőség jellel jelőlik az egyenlőség vizsgálatát.
A hozzászólás módosítva: Nov 3, 2014
(#) Bakman válasza McAdams hozzászólására (») Nov 3, 2014 /
 
Az NTC ellenállása nagyon nem lineárisa hőmérséklet függvényében, nézz meg egy adatlapot. Komoly matematikai műveletek (és mikrokontroller) nélkül csak nagyon durva eredményeket lehet kinyerni.
(#) McAdams válasza vilmosd hozzászólására (») Nov 3, 2014 /
 
Az MCP9700 Vout-ját fel kell húzni mint a DS18b20-nak? Avagy csak simán beköt a portba?
(#) McAdams válasza Bakman hozzászólására (») Nov 3, 2014 /
 
Értem. Utána nézek. Akkor ha normál hőmérsékleteket akarok mérni akkor mit használjak? Pl -30 tól +200 ig. Kb 5öt 6ot kötnék fel egy PICre
(#) vilmosd válasza McAdams hozzászólására (») Nov 3, 2014 /
 
Nem kell felhuzni sehova Egy analog feszultseget ad ami 0 C-nel 500 mV, 100 C-nel 1500 mV. Viszont kell kozvetlen a tapra 100 nF kondi, es ha hosszabb vezeteket hasznalsz, akkor a kimenettel sorba egy 1 kohm ellenallas, mert kulonben gerjed. A homerseklet tartomanya -40 - +150 C tehat magasabb homersekleten nem lehet hasznalni, de a NTC-t sem. magasabb homersekletre hoelemet, vagy Pt100 (Pt1000) erzekelot ajanlott alkalmazni. Ha rakattintasz a MCP9700A szovegre, letoltheted az adatlapjat.
(#) McAdams válasza vilmosd hozzászólására (») Nov 3, 2014 /
 
Ok! Köszi! Tanakodom....
(#) usane válasza Hp41C hozzászólására (») Nov 4, 2014 /
 
Értem. Én is ifes helyettesítésre gondoltam, csak így nem ismertem.
Köszönöm a magyarázatot.
(#) Kapagerenda hozzászólása Nov 4, 2014 /
 
Hello,

Mik azok a makrók pontosan? Láttam pár programnál, valamint a 7 szegmenses kijelzőknél találkoztam a maszkolással. Ez mit takar pontosan, miért szükséges? THX
(#) Pali79 válasza Kapagerenda hozzászólására (») Nov 4, 2014 / 1
 
A makrókba gyakran ismétlődő kódrészt szokás írni. Pl a bankváltáshoz meghatározott biteket kell, egybe vagy nullába állítani. Pl ha két bit kombinációja kell ami ugye lehet 00 11 01 10 akkor a megfelelő kombinációt berakod egy makróba és azután csak a makró nevét kell a programba beírni.
A hozzászólás módosítva: Nov 4, 2014
(#) foxi63 válasza Kapagerenda hozzászólására (») Nov 4, 2014 / 1
 
Szia!
tudomány
Itt nagyon sok minden megtalálható. A Makró nyelv is.
Talán egy példa: 16 bites adat betöltése regiszterbe:
L16 macro xx, yy ;xx 16 bites szám yy egy regiszter neve
movlw xx ;csak az alsó 8 bitet tölti be
movwf yy
movlw xx>>8 ;csak a felső 8 bitet tölti be
movwf yy+1
endm

a programban csak ezt kell írnod : L16 65535 , reg1
ekkor be is töltődik sz adott szám a reg 1,be
De ez csak egy példa számtalan sok lehetőség van tulajdonképp javítja a program átláthatóságát,
A maszkolás pedig nem más, mint egy adott regiszter 8 bitjéből 1 vagy több bit megváltoztatása anélkül, hogy a többi megváltozna. Bevett szokás, hogy logikai és kapcsolattal kikapcsolod az adott bitet, és a keletkezett feltétel szerint logikai vagy kapcsolattal 1-re állítod.(vagy nem)
(#) don_peter hozzászólása Nov 5, 2014 /
 
Srácok, rázzatok egy kicsit gatyába...
Még mindig PIC18F4550, MPLAB + C18.
És még mindig az időzítés...
1mp-t szeretnék kiszámolni és megadni egy timer-nek..
Ezen elven haladok:
Ciklusidő == 1/(48000000/4) == 8,333333333333333e-8
Ez átfordítva, ha minden igaz így néz ki: 0,0000000833 == 83,3ns
Remélem eddig stimmel minden...
Na most akkor tudjuk, hogy 48MHz-nél 1 ciklus idő 83,3ns-ig tart.
Ha ebből szeretnék egy másodpercet hogyan folytassam a számolást?

Még mindig egy delay-t szeretnék készíteni ami tud minimum 1s-t, 1ms-t...
A gyári beépített időzítések működését nem igazán értem és az elvileg Delay1KTCYx(12) 1ms-a sem állja meg a helyét..
Előre is köszi..
(#) don_peter válasza don_peter hozzászólására (») Nov 5, 2014 /
 
Fenébe már megint elszállt a módosításom...
Szóval, tovább gondolva a dolgot:
83,3ns * 12000-el az már egy nagyon közeli értéket ad.
Pontosan 0,996ms-ot, nyilván ezt már 1000-el szorozva ki is jön az 1 másodperc.
Timer0-át használok egy megszakításhoz.
A megszakításon belül vannak utasítások köztük nagyon rövid 0,1ms alatti késleltetések.
Úgy tudom, hogy ha egy utasítás kiértékelése hosszabb időt is vesz igénybe mint a 2 timer megszakítás közt eltett idő, akkor is független mindentől, megszakít és elkezdi ismét a megszakításon belüli utasítások kiértékelését.
A baj csak az, hogy lemértem és 25mp-nél már 45ms-et mérek.
Tehát valahol elcsúszik a program.., a kérdés az, hogy miért és mitől?
(#) Hp41C válasza don_peter hozzászólására (») Nov 5, 2014 /
 
Idézet:
„Úgy tudom, hogy ha egy utasítás kiértékelése hosszabb időt is vesz igénybe mint a 2 timer megszakítás közt eltett idő, akkor is független mindentől, megszakít és elkezdi ismét a megszakításon belüli utasítások kiértékelését.”

Sajnos ennél a kontrollernél nem így van. Akkor nincs még probléma, ha néha egy kiszolgálás hosszabb, mint egy timer időköz, hiszen amikor vége a kiszolgálásnak, egyből újra belép. Ez csak akkor igaz, ha a kérés okát a kiszolgálás legelején töröljük. Ha a kiszolgálás ideje ennél nagyobb vagy ha a kiszolgálás végén van a törlés, elveszhet kérés.
(#) Pali79 válasza don_peter hozzászólására (») Nov 5, 2014 /
 
Ha pontos 1 másodpercet akarsz akkor inkább léptesd a timert egy 32,768 kHz-e kvarccal, Ezt leosztod 256-tal, majd 128-cal akkor pont 1 másodpercet kapsz.
A hozzászólás módosítva: Nov 5, 2014
(#) don_peter válasza Pali79 hozzászólására (») Nov 5, 2014 /
 
Nem kell túl pontos 1mp, de azért közel annyi kellene, hogy mérhető legyen.
Ezek a mérések is csak egy maximum 1-255mp-ig tartó tartomány szóval nem a folyamatos, napszaki idő mérésre kellene..

Hp41C: tehát ha jól értem amit írsz, akkor ameddig a kiszolgálás (megszakításon belüli utasítások) véget nem ér addig késik, várakozik az újabb megszakítás?
Mert ez akkor megmagyarázná az idő csúszását...

Bár akkor sem értem, vegyünk egy példát:
  1. // van egy megszakításunk amit ha jól számolok másodpercenként 3szor vagy is 333ms-onként hívunk meg
  2. //65536-1/(3*(4/48000000)*256)
  3. //= 49 911  0xC2F7
  4.  
  5.         TMR0H = 0xC2;
  6.         TMR0L = 0xF7;
  7.  
  8. // Az utasítás pedig legyen egy LED villanásának időzítése
  9. if(a==1){
  10.         LED = 1;
  11.         Delay_ms(80);
  12.         LED = 0;
  13. }
  14. if(idomeres>2){
  15. mp++;
  16. idomeres == 0;
  17. }
  18. idomeres++;

Tehát itt a megszakítás 333ms-enként történik és 80ms-ig tartja a LED-et bekapcsolva.
Az mp++-al pedig növeljük a másodperceket, 3 timer lefutása 1mp lesz.
Tehát ez lenne a szisztéma és ez csúszik szét nekem 25mp-nél 45-öt mérek..
(#) usane válasza don_peter hozzászólására (») Nov 5, 2014 /
 
Szerintem úgy érti, hogy a megszakítás bitet törölni kell, és ezt legtöbbször a kiszolgálás végén szoktuk. Ha ezalatt(vagyis a kiszolgálás alatt) ujabb megszakítás jönne az elveszik. viszont ha az elején törlöd és utána szolgálod ki a megszakítást, akkor a kiszolgálás alatt, ha újabb megszakításod érkezik nem fog elveszni. Nem tudom így érthető-e.
A hozzászólás módosítva: Nov 5, 2014
(#) DJozso hozzászólása Nov 5, 2014 /
 
Egy kis segítségre lenne szükségem... Riasztó projektben vagyok, aminek a lelke egy 16f887-es mikrokontroller. A fejlesztő környezetem: MicroC for PIC 8-as verzió (ezzel írom, és fordíttatom a C kódot), MPLab-bal és egy PIC Kit 3 klónnal égetem a Pickbe. Minden tutin működik egészen addig, amíg a programom (Used Ram) nem éri el az 50 % -ot. Utána az írt progi teljesen szétesik ( hülyeségeket csinál), közben hiba üzenet a fordítótól nincs (csak "warning messure"). Warning messure általában egy char tömb nevét jelöli meg, nem tudom, hogy ez számíthat-e? Próbáltam régebbi MicroC for PIC-cel is, a helyzet ugyanaz. Valakinek valami ötlet? Kellene még az a 180 bájt az LCD-hez. Minden segítséget köszönök.
(#) don_peter válasza usane hozzászólására (») Nov 5, 2014 /
 
Nem biztos, hogy jól értem.
Nézzük csak:
Jelenleg a megszakítás végén törlöm timer0-t, így:
  1. INTCONbits.TMR0IF = 0;

Tehát, ha ezt a törlést a megszakítás elejére teszem, akkor azt úgy fogja értelmezni a program, hogy már lefutott és indíthatja akkor is az újabb timer megszakítást, ha az előző még nem ért véget.
Ilyenkor amit még előzőleg nem végzet el az abbamarad és elkezdi újból a kiértékelést és ameddig eljut addig jut...
Így értitek? Vagy inkább pont az ellenkezőjét?
Ha nem végez a kiszolgálás és ismét megszakítás keletkezik akkor párhuzamosan fog futni a kettő és az adatok nem vesznek el..
Ez utóbbival csak akkor van gond, ha túl sok elmaradás van mert akkor elég jól bekeveredhet nem?
A hozzászólás módosítva: Nov 5, 2014
(#) Hp41C válasza don_peter hozzászólására (») Nov 5, 2014 / 1
 
Nem egészen jól gondolod. Ha a megszakítási időköz 333ms, abba belefér 80ms várakozás. Nem fogja késleltetni a következő megszakítás bekövetkezését, nem akkumulálódik. Nem ajánlott így megoldani a problémát, mert 333ms -enként 80 ms CPU idő elvész.
Az akkumulálódást a timer átállítása okozza. A kérés beérkezése és a kiszolgálásban a timer írása között eltelhet egy kis idő, ami alatt a timer lépked előre. Inkább hozzáadással kellene dolgozni, bár a byte -os műveleteknél a 0xF7 hozzáadása okozhat problémát....
Nem így kellene megcsinálni.... A fenti rutin a CPU idejének 24% -t elfecsérli a delay -eben.
Inkább a timer2 (vagy hasonló timer) felhasználásával kellene előállítani egy sokkal kisebb időnként beérkező megszakítást. Mondjuk 1 ms -enként.
Az 1 másodperces időzítéshez 1000 lefutásonként be kell állítani egy bitet. a főprogram időnként (1 sec -en belüli) vizsgálja a bitet, ha 1, akkor törli és elvégzi a hozzá rendel műveleteket.
A LED -et bekapcsolja a kiszolgáló rutin, ha a == 1 és emellett egy változóba beírja, hogy 80 lefutás után kell kikapcsolni. Ezt a változót csökkenti a kiszolgáló rutin, ha >0. Ha a csökkentéssel elérte a 0 -t, kikapcsolja a LED -et.
Igaz, hogy 1 ms -enként egy kicsit több időbe kerül a kiszolgálás, de nem kell a timert állítani, és nem kell kivárni semilyen időzítést sem. A többlet legyen 10us. Ez csak 1% CPU idő veszteség.
Következő: »»   587 / 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