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   588 / 1210
(#) Hp41C válasza don_peter hozzászólására (») Nov 5, 2014 / 1
 
A kérés a INTCONbits.TMR0IF 1 -re álltja. Ekkor a konttroller áttér a kiszolgáló rutinra.
- Ha a művelet végrhajtási ideje alatt újra bekövetkezik, a INTCONbits.TMR0IF -et újra beállítja 1 -re. Ha ezek után a kiszolgáló törli a INTCONbits.TMR0IF -t és visszatér, egy kérés kiszolgálása kimarad.
- A kiszolgáló törli a INTCONbits.TMR0IF -t a tényleges műveletek előtt. Ha a művelet végrhajtási ideje alatt újra bekövetkezik, a INTCONbits.TMR0IF -et újra beállítja 1 -re. Ha ezek után visszatér, az új kérés miatt újra beindul a fenti folyamat.
(#) don_peter válasza Hp41C hozzászólására (») Nov 5, 2014 /
 
Aham, ha jól értem itt arra próbálsz rávezetni, hogy használjak egy másik timert, mondjuk timer2-őt és azt állítsam be úgy, hogy 1ms-enként okozzon megszakítást.
Tehát itt 1ms-onként történne egy megszakítás melyben vizsgálná egyszer, hogy hány megszakítást végzet már el (másodperc mérése 1000), ha elérte az 1mp-et, akkor további feltételként megjelenne a LED bekapcsolása és természetesen vizsgálni kellene a LED világításának időzítését is ami ez esetben 80ms...
Ebben az esetben több lenne a feltétel, az nem befolyásolná rossz irányba a lefutási, kiértékelési időt?
Vagy itt is képbe kerülne az, hogy a kiszolgálás elején törölnénk a timert, így a kiszolgálás független az újabb megszakítástól párhuzamosan lefutna?
Egyébként ez nem rossz ötlet..

Főleg, hogy eddig a CPU foglaltságával nem is foglalkoztam kellőképpen.
(#) Hp41C válasza don_peter hozzászólására (») Nov 5, 2014 /
 
Egy 48 MHz -es 18F4550 12000 utasítást tud végrehajtani 1ms alatt.
(#) don_peter válasza Hp41C hozzászólására (») Nov 5, 2014 /
 
Köszönöm a segítséget..
Azt hiszem ezt az utóbbi tehát az 1ms-os megszakításos dolgot ki fogom próbálni, hiszen az elvileg gyorsabb, ha nincs kiértékelési kérés és nem foglalja feleslegesen a CPU időt, ha csak arra ténylegesen nincs szükség...

Továbbá észrevettem, hogy az idő növelésénél 1-el többet adok meg így 1*333ms-al többet mér másodpercenként és ezért van ez a komolyabb csúszás.
Viszont szerintem mindenképp érdemes volt erre a témára kitérni..
Sokat lehet tanulni belőle..
A hozzászólás módosítva: Nov 5, 2014
(#) kissi válasza don_peter hozzászólására (») Nov 5, 2014 /
 
Amíg a megszakítást nem fejezed be, addig nem számít, hogy törlöd-e a megszakításjelző bitet, ill. hogy jön-e be újabb, mert amíg a megszakításban van, addig a processzor átállítja az INTCON.GIE bitet ( általános megszakítás engedélyezés ) nullára, azaz nem fogad újabb megszakítást, ezt állítja vissza assemblyben a RETFIE utasítás ( magasszintű nyelven a fordító dolga ezt befordítani! ) ! A HP41C kolléga által jelzett dolog ( a megszakítás elején töröld a bitet ) csak arra való, hogy amennyiben a megszakítás kiszolgálása alatt bejöhet még egy megszakítás kérés, akkor az ne vesszen el ( ilyenkor újra be tud állni a jelzőbit, mivel nem törlöd le a kiszolgálás végén! ) ! Ha ilyen sűrűn jöhetnek a megszakítás kéréseid, akkor az már eléggé kihegyezett feladat, érdemes valami nagyobb sebességre váltani vagy más megoldást / szervezést használni !
Szerk.: közben látom, már rájöttél egy jobb szervezési lehetőségre !
A hozzászólás módosítva: Nov 5, 2014
(#) HA1DUQ hozzászólása Nov 5, 2014 /
 
Sziasztok!

Vettem ezt a programozót


mi kell hozzá, hol találok egy kapcsolást rajzot amire fel tudom a atmel chippeket rakni és beprogramozni.
esetleg ez tud vissza felé is, ki tudom olvasni a chip programját

Kezdésnek mit ajánlanátok
(#) vilmosd válasza HA1DUQ hozzászólására (») Nov 5, 2014 /
 
Nem zavar hogy ez PIC topik?
(#) icserny válasza HA1DUQ hozzászólására (») Nov 5, 2014 /
 
Idézet:
„mi kell hozzá, hol találok egy kapcsolást rajzot?”

Leginkább az AVR - miértek, hogyanok topikban.
(#) zenetom hozzászólása Nov 5, 2014 /
 
Sziasztok!
Egy rémisztően egyszerű problémával futottam össze, de vagy túl este van már nekem, vagy nem tudom, de nem világos teljesen a következő:
Adott egy 10F204-es PIC, adatlapja: Bővebben: Link
A 9.2.2-es résznél (INTERNAL 4 MHz OSCILLATOR) leírja hogyan kell kalibrálni a belső oszcit.
Ezt ugye az alábbi módon lehet egyszerűen:
  1. MOVLW 0x00
  2. MOVWF OSCCAL

Ilyenkor a GP2 rendes portláb lesz, és az oszci freki "középső" értéken van.
Viszont számomra ellentmondásos az adatlap:
Idézet:
„calibration instruction is programmed into
the last address of memory”

utána pedig:
Idézet:
„and is placed at the Reset vector”


Csináltam már ilyet, de az másik családú PIC volt, és ott azthiszem az utolsó helyre kellett egy RETLW utasítást berakni a kívánt OSC értékkel, amit ha meghívtunk a Reset vectornál egy CALL utasítással, akkor ugye az bekerül a WREG-be, amit aztán berakhattunk az OSCCAL-ba.
Viszont itt MOVLW-t ír, és az sem egyértelmű, hogy milyen formában kerül a program végéről a program elejére ez az érték..
Továbbá azt sem értem minek kell így bonyolítani. Miért nem jó simán a reset vectoron a movlw aztán movwf .. ?
Egyszer talán megértettem, de nekem most lehet túl este van már..
Előre is köszönöm!
(#) foxi63 válasza DJozso hozzászólására (») Nov 5, 2014 / 1
 
Szia!
Ha állandó értékű sztringeket akarsz tárolni, akkor azt ne RAM-ban tárold,háttértárnak a flash memóriát használd.
Lehetőleg globális változókat használj, hogy a fordító ne újabb és újabb byte-okat foglaljon le minen függvényhez.

Neked 4x80 byte memóriád van összesen 4 lapon , és plusz 16 byte ami minden lapon közös.
Ha mindenképp sok ram kell, aránylag egyszerűen csatolható soros vagy párhuzamos RAM a kontrollerhez. akár 128kx8 is.
üdv. Foxi
A hozzászólás módosítva: Nov 5, 2014
(#) Pali79 válasza zenetom hozzászólására (») Nov 5, 2014 /
 
Szia!
Simán a MOVLW 0x00, MOVWF OSCCAL rész kell. A reset vektoron való elhelyezés csak annyi, hogy a program 0x00 címére, tehát így:
  1. ORG 0x00
  2.  
  3. MOVLW 0x00
  4. MOVWF OSCCAL

A te általad említett RETLW, CALL dolgot nem értem teljesen értem.

Azt, hogy az utolsó memória helyen van tárolva, ha jól rémlenek Hp41C sorai, azt jelenti, hogy gyárilag a 4 MHz-nek leginkább megfelelő OSCCAL érték el van tárolva a PIC-ben. Ezt felhasználás (törlés, programozás) előtt "illik" kiolvasni és ezt az értéket visszatölteni, persze ez alól kivétel a 0 bit, ami ai I/O portot állítja.
A hozzászólás módosítva: Nov 5, 2014
(#) Hp41C válasza zenetom hozzászólására (») Nov 5, 2014 / 1
 
A 10F20x a Baseline családba tarozik. Náluk a reset vektor a memória utolsó utasítása. Ide kell elhelyezni a movlw OSCCAL_value utasítást. Ha ez végrahajtódik, a 0 címre jut a vezérlés, de a W -ben benne lesz az érték, amit az OSSCAL regiszterbe kell tölteni.
Ld. Adatlap Figure 4-1.
Idézet:
„Note 1: Address 0000h becomes the effective Reset vector. Location 00FFh contains the MOVLW XX internal oscillator calibration value.”
(#) zenetom válasza Hp41C hozzászólására (») Nov 5, 2014 /
 
Köszi a választ, így már érthető!
A proteus szimulációja zagyvaságot ír, de MPLAB SIM-ban valóban az utolsó címről kezdi.
Viszont az még nem egészen világos, hogy ez a módszer miért jobb, mint ha simán a 0x00 címre írnám a MOVLW OSCCAL_value-t (ahogy pl. Pali79 is írta)?
(#) Hp41C válasza zenetom hozzászólására (») Nov 5, 2014 / 1
 
Az utolsó címre a gyári teszteléskor beírják az értéket.
(#) promax hozzászólása Nov 6, 2014 /
 
PIC 18 nál miként lehetne az alábbi keresési algoritmust egyszerűsíteni?

  1. movlw   0x00
  2.         cpfseq  INDF0
  3.         bra             A
  4.         bra             KI_1
  5. A:
  6.         movlw   0x06
  7.         cpfseq  INDF0
  8.         bra             B
  9.         bra             KI_2
  10. B:
  11.         movlw   0x10
  12.         cpfseq  INDF0
  13.         bra             C
  14.         bra             KI_3


Valahogy nekem az hiányzik, hogy a cpfseq akkor ugrik ha egyenlő, de olyan meg nincs ami akkor tenné ha nem egyenlő. Ez esetben nem kellene minden vizsgálati sorban egy "felesleges" bra.
Van alternatív megoldás?
(#) kissi válasza promax hozzászólására (») Nov 6, 2014 /
 
Miért nem XOR-t használsz?
  1. movlw 0x00
  2. xorwf INDF0,w
  3. bz KI_1
  4. A:
  5. movlw 0x06
  6. xorwf INDF0,w
  7. bz KI_2
(#) Hp41C válasza promax hozzászólására (») Nov 6, 2014 /
 
  1. movf INDF,w
  2.     bz KI_1
  3.     xorlw 0x06
  4.     bz KI_2
  5.     xorlw 0x06^0X10
  6.     bz KI_3

...Még az eredeti atat is megmarad...
A hozzászólás módosítva: Nov 6, 2014
(#) DJozso válasza foxi63 hozzászólására (») Nov 6, 2014 /
 
Köszönöm válaszod. Megpróbálom értelmezni amit írtál... Nekem még ez elsőre kínai, most barátkozom a PIC-eccel. Globális változó alatt azt érted, hogy például létrehozunk egy Char tömböt LCD1 néven és ennek adunk egy 16 karakteres tömböt, majd ugyanezt megcsináljuk mondjuk LCD2-vel, feltételezve, hogy 2*16 karakteres Lcd használunk, és csak a két tömböt jelenítjük meg a kijelzőn, úgy, hogy a tömb karaktereit irkáljuk át a éppen megjelenítendőre? Nekem még ez a 4*80 byte 4 lapon ez teljesen magas. Ne haragudj, de én azt gondolom, hogy nem ismerem eléggé a pic lelki világát (felépítését), hogy ezt tudjam értelmezni. Nyilván az a baj, hogy C nyelven programozok, nem assamblyval kezdtem. Ez a külső ram jól hangzik, de egy soros kommunikációt levezényelni számomra még nem egyszerű. Hőmérő IC-ket (ds18b20 vagy DHT 22) sikerült már működésre bírni, de magamtól nem írtam még ilyen (számomra) bonyolult kódot. Ha le van írva a kód, akkor tudom értelmezni, de kitalálni magamtól még nem megy. Még egyszer köszi. Tanulgatok, olvasgatok tovább.
(#) Hp41C válasza foxi63 hozzászólására (») Nov 6, 2014 /
 
Megbújik a 16F88x -ben még kétszer 16 byte a 2. és 3. bankban a 0x110 .. 0x11F és a 0x190.. 0x19F címeken.
(#) don_peter hozzászólása Nov 6, 2014 /
 
Nos követve Hp41C által javasoltakat, 8bit-es timer-el (ez esetben timer2-őt) próbálkozom.
A mostani teszt környezetem egy 18F452-es PIC amit 10MHz + 4*PLL-el használok.
Tehát itt 40MHz-vel kell számoljak.
Ha követem azt az elvet, hogy egy kisebb timerrel próbáljak meg dolgozni és ne használjak késleltetést mert az ügye az jobban terhelné a CPU-t és így kevésbé hatékonyan van kihasználva az erőforrás.
A következőkre jutottam:
1/(4/40MHz) == 100ns.
Ha timer2-őt használok és előtöltöm PR2-őt 255-el, akkor a megszakításom 25,5us-onkénti ciklusba fog pörögni. (0,0000001*255 == 25,5us)
Ha ezt a szisztémát követem, akkor itt 40 ciklusonként fogok 1ms-ot kapni és 40x1000 vagy is 40.000 ciklusonként kapok 1 másodpercet.

Szerintem ez hibás, így kérlek okosítsatok fel..
Köszi..
A hozzászólás módosítva: Nov 6, 2014
(#) matheattila válasza don_peter hozzászólására (») Nov 6, 2014 /
 
Szia, úgy látom te nem igazán értetted meg Hp41C kolléga szavait...
Ő azt mondta, hogy használd a timer2-t KÜLSŐ 32768Hz-es kristállyal, azért a timer2 mert tudtommal csak annak van összeköttetése egy másodlagos oszcillátorral, és az 8 bites is, így az előbb említett kvarc tökéletesen osztható 2^8-al (256) így ezzel másodpercenként 128 megszakításod lesz, ha ezt egy változóban tárolod és minden megszakítás után növeled akkor a 128-ik megszakításnál pontosan 1 másodperc lesz!
Az előbbi hozzászólásodban leírt próbálgatások teljesen fölöslegesek, mert ugyanezt a másik (18f4550-es) PIC-el is el tudtad volna végezni.
A lényeg az volt, hogy ne a proci órajelét használd, hanem egy teljesen más órajelet amit szépen lehet osztani. Egyébként ezeket használják órákban is a pontos 1mp előállítására, nem véletlenül volt ez említve
(#) don_peter válasza matheattila hozzászólására (») Nov 6, 2014 /
 
Nem ezt mondta.. Ezt Pali79 javasolta.
Nem fontos számomra a tökéletes 1mp, de közel annyi kellene azért mivel mérem az időt csak kis intervallumban..
Ő arra mondott példát, hogy ne használjak delayt mert az nagy százalékban használja feleslegesen az erőforrásokat.
Használjak inkább rövidebb megszakításokat és azokat számoljam és elérve a megfelelő időt végezzem el a szükséges beállításokat..
Csak kicsit sokallom a másodpercenkénti 40e megszakítást ezért gondolom, hogy nem jó valami...
Idézet:
„Az előbbi hozzászólásodban leírt próbálgatások teljesen fölöslegesek, mert ugyanezt a másik (18f4550-es) PIC-el is el tudtad volna végezni.”

Nem felesleges mert közben az a PIC beépítésre került...
Természetesen használtam már óra kvarcot, de most ezt kihagynám, főleg azért mert a módosítani kívánt programomnak már le van gyártva az elektronikája..
A hozzászólás módosítva: Nov 6, 2014
(#) Hp41C válasza don_peter hozzászólására (») Nov 6, 2014 / 1
 
Timer2 -nek van elő- és utóosztója is. A timer2 megszakítási ideje
titt2 = 1 / (Fosc / 4 / <T2_prescaler> / (PR2+1) / <T2_postscaler> )
Ha 1ms megszakítási időt szeretnél:
T2_prescaler = 4, T2_postscaler = 10, PR2+1 = 250 azaz
titt2 = 1 / (40E6 / 4 / 4 / 250 / 10 ) = 0.001 s

@matheattila
A timer2 csak a belső órajelről járatható. A megoldásnak van még egy hátránya: A timer2 nem működik alvó állapotban. Érdemes olvasgatni a timer1 errata -t is.
A hozzászólás módosítva: Nov 6, 2014
(#) don_peter válasza Hp41C hozzászólására (») Nov 6, 2014 /
 
A fene
Elő és utóosztókkal nem számoltam (pedig tudtam, hogy van, de valamiért kimaradt...)
Köszi...
A hozzászólás módosítva: Nov 6, 2014
(#) matheattila válasza don_peter hozzászólására (») Nov 6, 2014 /
 
Ha TMR0-val akarod az 1mp-es megszakítást akkor itt egy példa:
  1. T0CON = 0b10000111; // T0ON, 16 bit, 256-os előosztó
  2. // fosc/4 = 12MHz, 12000000/256 = 46875, TMR0 = 65536-46875 = 18661 = 0x48E5
  3. TMR0H = 0x48;
  4. TMR0L = 0xE5;
  5. INTCONbits.TMR0IF = 0;
  6. INTCONbits.TMR0IE = 1;

majd a megszakítás kezelő rutinban ismét:
  1. INTCONbits.TMR0IF = 0;
  2. INTCONbits.TMR0IE = 0;
  3. TMR0H = 0x48;
  4. TMR0L = 0xE5;
  5. INTCONbits.TMR0IE = 1;

és kész is a pontos 1mp-es megszakítás.
Ha kisebbet akarsz akkor az a lényeg, hogy olyan előosztókat használj amivel a lehető legpontosabban el tudod osztani az órajelet úgy, hogy beleférjen a timer-be (8 biten 256, 16 biten 65536).
(#) don_peter válasza matheattila hozzászólására (») Nov 6, 2014 /
 
Pontosan ugyan így csinálom, csak time1-el
A kérdés itt nem ez volt...
De megoldódott... Köszi..
(#) Hp41C válasza matheattila hozzászólására (») Nov 6, 2014 /
 
Így is lehet.. Azonban probléma léphet fel, ha más megszakítás kiszolgálásával van elfoglalva a kontroller. Ekkor a beírás helyett jobb lenne a hozzáadás. A hozzáadással is lehetnek problémák, ha elég nagy a szám, amit az alsó feléhez kell hozzáadni. Ráadásul 16 bites módban a TMR0H egy átmeneti regiszteren keresztül olvasódik ki ill. a TMR0H -t kell előbb beírni, aztán a TMR0L beírásakor töltődik át. Az jócskán megnehezíti a hozzáadást. Innen indultunk. Mégiscsak egyszerűbb a helyzet, ha a timert egyszer felprogramozzuk, aztán elketyeg minden beavatkozás nélkül....
A timer1 -nek is lehetnek bosszantó dolgai: Microchip Timer1 errata.
A hozzászólás módosítva: Nov 6, 2014
(#) Kovabe hozzászólása Nov 6, 2014 /
 
Sziasztok
Pickit2 klon-t használok, a kérdésem az lenne az eeprom data-ban a kettő darab FF milyen értékü illetve mi szerint tudom átszámolni?
(#) foxi63 válasza Kovabe hozzászólására (») Nov 6, 2014 /
 
PC számlógép tudományos (vagy programozói) nézet.
16-os 8-as kettes és tizes számrendszer oda és vissza.
üdv.:Foxi
(#) DJozso hozzászólása Nov 7, 2014 /
 
Tervezem egy redőny-motor vezérlő PIC-es áramkör építését. Van egy dolog, amiben elakadtam. Az asszony szeretné, hogy legyen olyan betanítható pontja a redőnynek, mondjuk 1/3-nál, hogy betanulás után megnyom egy gombot és oda áll a redőny magától. Én ezt úgy gondoltam megoldani, hogy PIC betanulja a teljes út idejét, majd amikor a 1/3 pozícióban betaníttatjuk elmegy valamelyik végállásig, közben méri az időt, majd a kapott időt levonja a teljes menetidőből.
Az egész lelke egy 16f887 vagy 18F4550 lenne. Ötleteket szeretnék, ti hogy oldanátok meg. PIC programozásban sajnos nem vagyok annyira penge, de ha mondjátok mibe ássam bele magam... Jelenlegi tudásom szerint a timer0, 1, 2 lehetne használni (ebből az 1-es az 16 bites, amely nagyobb felbontást eredményezhet.). De nem tudom, hogy melyik regisztert hogy kellene beállítani, a timerhez (ezzel még ismerkednem kellene). Gondoltam, hogy számlálóval is csinálhatnám,de ennek a használatát is példákból el kellene tudnom sajátítani. Ha esetleg valaki tud valami példa áramkört , leírást, e két témakörben MicroC nyelvre, azt nagyon megköszönném.
Következő: »»   588 / 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