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   910 / 1203
(#) Elektro.on válasza kriszrap hozzászólására (») Márc 17, 2017 /
 
Bizonyára sokat javít majd a helyzeten
(#) kriszrap hozzászólása Márc 18, 2017 /
 
Hát 2 óra alat 1 percet késik.... igy is más ötlet???
kódot csatoltam.
(#) sonajkniz válasza Elektro.on hozzászólására (») Márc 18, 2017 /
 
Idézet:
„A megszakítási rutinod rettentő hosszú.”


Bocs a tájékozatlan kérdésért, de C és egyéb nyelveken mikor nem hosszú egy megszakítási rutin?
Csak azért kérdem, mert assembly-ben egy 2000 soros programon belül nekem 116 sor hosszú a megszakítási rutin, és még a kijelző vezérlő 1-Wire kommunikációját sem zavarja meg.
Több különböző programom tartalmaz órát. Mindegyik a megszakítási rutinon belül végez el minden órához kapcsolódó műveletet, még az ébresztési idők ellenőrzését is.
Viszont minden esetben órakvarc működteti az órát. Nem bohóckodom a proci órajelének leosztásával. Így az mehet akár max. frekvencián is, hogy minden beleférjen.
(#) Elektro.on válasza kriszrap hozzászólására (») Márc 18, 2017 /
 
Kicsit nehezen látom át a kódodat. Én általában MikroPascalt használok.
De a hiba felderítéséhez lenne javaslatom.
Ebben a kódban sokminden benne van. nyomógombok figyelése , ébresztő, hőmérő.Így egyszerre sok a hibakereséshez.
Szerintem csinálj egy olyan kódot amiben csak egy sima óra van. Mást ne csináljon. Ha ez is késik, akkor addig kell masszírozni amég meg nem találod a hibát. Ha ez már pontosan megy raksz hozzá új funkciót, pl az ébresztést.
(#) Elektro.on válasza sonajkniz hozzászólására (») Márc 18, 2017 /
 
Valóban ez nem teljesen kézzelfogható érték.
De az tény, hogy ha a 16 bites számlálódat órakvarcal hajtod, sokkal több időd marad két megszakítás között mint órajelről hajtva akár a legnagyobb osztást hasnálva.
(#) kriszrap hozzászólása Márc 18, 2017 /
 
Kedves Elektro.on
A tesztett gombok nyomogatása nélkül használom elinditom és kész igy tesztelem.
De kiprobálom ugy ahogy mondtad

Fölösleges dolgokat kiszettem és most inditottam el a tesztett
A hozzászólás módosítva: Márc 18, 2017
(#) benjami válasza kriszrap hozzászólására (») Márc 18, 2017 /
 
Én a mellékletben található módon csinálnám, azonkívül a feleslegesen 16 bites változókat 8 bitessé alakítanám.

ora.c
    
(#) ktamas66 válasza kriszrap hozzászólására (») Márc 18, 2017 /
 
Nem vagyok otthon C-ben, de a !count-- kiértékelésekor nem téved egyet a számolás?
(#) benjami válasza ktamas66 hozzászólására (») Márc 18, 2017 /
 
Igen, téved. Pont egy százalékkal fog ez miatt lassabban járni. Át kell írni if(!--count) -ra azt a sort.
(#) kriszrap hozzászólása Márc 18, 2017 /
 
Köszönöm javítottam aztán meg nézem hogy késik e
(#) kriszrap hozzászólása Márc 18, 2017 /
 
Lassan 1 órája megy a teszt és egy másodpercet sem késik MÉG...
if(!--count) és if(!count--) mi a külömbség???
(#) Elektro.on válasza kriszrap hozzászólására (») Márc 18, 2017 /
 
Az egyik a vizsgálat előtt csökkenti az értéket a másik vizsálat után.
(#) kriszrap hozzászólása Márc 19, 2017 /
 
sziasztok ismét én Most éllítottam le a tesztett 17 48-7:30 mentDD és 3 másodpercet siett
  1. void idoszamol(){
  2.     if (mas1 >= 10)
  3.     {
  4.         mas1 -= 10;
  5.         mas2++;
  6.     }


Ez lehet a problémáma???
(#) ktamas66 válasza kriszrap hozzászólására (») Márc 19, 2017 /
 
Ha jól számoltam ez ~60ppm, szerintem belefér a kvarc pontatlanságába. Most kell hosszabb ideig hagyni, és pontosan megmérni a különbséget, és az alapján korrigálni.
(#) c27 hozzászólása Márc 19, 2017 /
 
Sziasztok!

Akadt egy kis problémám az ADC-vel, egy potin olvasom be a feszültséget, de nagyon könnyű úgy beállítani, hogy két érték között ugráljon, ami eléggé zavaró.
A programrészlet:

ADCON0bits.ADON = 1;
Delay10TCYx(3);
ADCON0bits.GODONE = 1;
while(ADCON0bits.GODONE);
POT=ADRESH;
ADCON0bits.ADON = 0;
Delay10TCYx(3);
POT>>=2;

A potit 300ms-ként olvasom be egy alacsony prioritású megszakításban. A felső 8 bitet olvasom, de és a 0-255 közötti értéket még osztom is 4-el, a kapott 0-63 közötti értéket kiíratom az lcd-re, de ahogy említettem, nagyon érzékenyen viselkedik. Maga a léptetés is nagyon érzékeny, de két érték közötti ugrálást is könnyű megvalósítani.
Mit lehet ezzel kezdeni? Van valami jó ötletetek?
(#) nedudgi válasza c27 hozzászólására (») Márc 19, 2017 /
 
Átlagolás. Ne a pillanatnyi értéket, hanem az utolsó x mérés átlagát írd ki.
(#) Bakman válasza c27 hozzászólására (») Márc 19, 2017 /
 
Mennyire stabil az a feszültség, amit mérsz? Mennyire stabil a referencia/táp feszültség? Mennyi zavart szedhet össze a kapcsolás? Valami nagyon nem jó, én 12 bites ADC esetén, mindenféle szűrés nélkül tapasztalok +- 6-8 LSB ugrálást. Igaz, a referencia feszültség nem a tápfeszültség, hanem direkt erre való IC (MCP1541).
(#) benjami válasza c27 hozzászólására (») Márc 19, 2017 /
 
Én így csinálnám:
  1. // poti érzékenység (10bit AD -> 6bit haszn: 16, 12bit AD -> 6bit haszn: 64)
  2. #define ADSENS  16
  3. // poti érték shift (10bit AD -> 6bit haszn: 4, 12bit AD -> 6bit haszn: 6)
  4. #define ADSHIFT  4
  5.  
  6. unsigned short pot;
  7. static unsigned short eventpot = 0xFFFF; // hogy induláskor biztosan beálljon a kezdőérték
  8.  
  9. ADCON0bits.ADON = 1;
  10. Delay10TCYx(3);
  11. ADCON0bits.GODONE = 1;
  12. while(ADCON0bits.GODONE);
  13. pot = ADRESH << 8 + ADRESL; // alulra igazitott A/D eredmény kell!
  14. ADCON0bits.ADON = 0;
  15. Delay10TCYx(3);
  16. if(pot >= eventpot + ADSENS)
  17. {
  18.   AdEvent(pot >> ADSHIFT);
  19.   eventpot = pot;
  20. }
  21. else if(eventpot >= pot + ADSENS)
  22. {
  23.   AdEvent(pot >> ADSHIFT);
  24.   eventpot = pot;
  25. }

Az AdEvent függvényt kellene megírnod, amely paraméterként az aktuális AD értéket kapná meg, de csak abban az esetben kerülne meghívásra, ha a potit eltekerted.
(#) c27 válasza Bakman hozzászólására (») Márc 19, 2017 /
 
A poti ugyan azt a feszültséget használja mint a mikrovezérlő, ami elég stabil 7805 stab. után csak egy schottky dióda van a polaritásvédelem miatt szóval kb. 4,7-4,8V között van fejből már nem tudom, de nem változik. Egyébként is a referencia feszültség a picé, szóval nem itt van a baj.
Zavart is szedhet össze, majd cserélem a kábelt árnyékoltra, de ha kizárok minden zavaró jelet és csak az ADC megy akkor is simán be lehet állítani, hogy ugráljon két érték között, szóval az alapprobléma ez.
Amúgy milyen szűrést érdemes rátenni vagy elég ha árnyékolt kábelt használok?

Az átlagolás ugyan megoldás lehet, az ugrálásra, de a másik érdekesség, hogy néha olyan mintha tömöttebben lennének az értékek. Alig érek hozzá a potihoz és máris ugrik 1-2 értéket.
(#) kriszrap válasza ktamas66 hozzászólására (») Márc 19, 2017 /
 
Idézet:
„Ha jól számoltam ez ~60ppm, szerintem belefér a kvarc pontatlanságába. Most kell hosszabb ideig hagyni, és pontosan megmérni a különbséget, és az alapján korrigálni.”


Ezt hogy kell megcsinálni??
PR2 = 249; ezt kell állítgatnom?
(#) c27 válasza benjami hozzászólására (») Márc 19, 2017 /
 
Valami hasonlót kipróbálok, hátha segít ez a hiszterézis féleség.
A hozzászólás módosítva: Márc 19, 2017
(#) benjami válasza kriszrap hozzászólására (») Márc 19, 2017 /
 
Én a kvarc kondijaival játszanék (ha késik csökkenteném, ha siet növelném az értékét).
(#) ktamas66 válasza kriszrap hozzászólására (») Márc 19, 2017 /
 
Nem. Vegyük a példádat: ha jól számolom futott az órád 13 óra 42 percet, ez 49320 másodperc. Ez alatt sietett 3 másodpercet. Ez azt jelenti, hogy a 100Hz-es megszakításod igazából 99,99391Hz. Hogy ezt a kis különbséget ki tudjam korrigálni felszorzom pl. ezerrel így 99 993,91-et kapok 100 000 helyett. Tehát csinálok egy számlálót (a 100 000 miatt long-ot), 100 000-ről indulva minden IT-ben levonok 6-ot (ugye a 100 000-99 994). Amikor ez a szám negatív lesz (emiatt ugye előjeles kell), újra hozzáadom a 100 000-t, és ki kell hagynom egy növelést az IT-ben.
(#) pajti2 válasza c27 hozzászólására (») Márc 19, 2017 /
 
Egy poti temérdek sok módon tud zavart összeszedni. A szénrétegessel van főleg baj. Ha referencia beállításnak kell a poti, és probléma az ugrálás, huzalpotmétert használj.
(#) Bakman válasza c27 hozzászólására (») Márc 19, 2017 /
 
Oszcilloszkóppal mérd meg, mennyire stabil az az 5 V. A 7805 bemenetére 330 nF, a kimenetére pedig 100 nF dukál. Az se mindegy, honnan veszed a mérendő feszültséget. Ha túl nagy a forrás ellenállása, szintén problémát okoz. ADCON2-ben milyen beállítást használsz és milyen órajelen a kontrollert? Egyáltalán milyen PIC-ről van szó?
(#) ktamas66 válasza c27 hozzászólására (») Márc 19, 2017 /
 
A táp stabilitásában nem érdemes bízni, főleg ha a PIC belső referenciáját használod, mivel az stabilabb lehet mint a táp, főleg ha terheléseket kapcsolgatsz közben. Esetleg megoldás lehet egy kondi a poti csúszkájára.
(#) kriszrap hozzászólása Márc 19, 2017 /
 
  1. Nem. Vegyük a példádat: ha jól számolom futott az órád 13 óra 42 percet, ez 49320 másodperc. Ez alatt sietett 3 másodpercet. Ez azt jelenti, hogy a 100Hz-es megszakításod igazából 99,99391Hz. Hogy ezt a kis különbséget ki tudjam korrigálni felszorzom pl. ezerrel így 99 993,91-et kapok 100 000 helyett. Tehát csinálok egy számlálót (a 100 000 miatt long-ot), 100 000-ről indulva minden IT-ben levonok 6-ot (ugye a 100 000-99 994). Amikor ez a szám negatív lesz (emiatt ugye előjeles kell), újra hozzáadom a 100 000-t, és ki kell hagynom egy növelést az IT-ben.


Huuu.... Ezt megtudnád mutatni kódba vagy folyamat ábrába ??
(#) ktamas66 válasza kriszrap hozzászólására (») Márc 19, 2017 /
 
Valami ilyesmire gondolsz?

  1. Inicializálásba:
  2.         KORREKCIO = 100000;
  3.  
  4. IT rutinba:
  5.  
  6.         KORREKCIO = KORREKCIO - 6;
  7.         if (KORREKCIO < 0)
  8.         {
  9.                 KORREKCIO = KORREKCIO + 100000;
  10.         } else {
  11.                 COUNT = COUNT - 1;
  12.         }
Így minden 16666.-ik IT-nél kimarad a csökkentés, ennyivel lassabban fog járni.
(#) kriszrap válasza ktamas66 hozzászólására (») Márc 19, 2017 /
 
Gondolom az IT rutinba az az interup nem??

Ha igen else után növelem a másodpercet??? így:
  1. Inicializálásba:
  2.         KORREKCIO = 100000;
  3.  
  4. IT rutinba:
  5.  
  6.         KORREKCIO = KORREKCIO - 6;
  7.         if (KORREKCIO < 0)
  8.         {
  9.                 KORREKCIO = KORREKCIO + 100000;
  10.         } else {
  11.                 COUNT = COUNT - 1;
  12. mas1++; //növelem a masodpercet
  13.         }



Interupom igy nézki:
  1. void interrupt(void){
  2.    if(TMR2IF_bit)
  3.    {
  4.      TMR2IF_bit = 0;
  5.      if(!count--)
  6.      {
  7.           count=100;
  8.           kepfrissit=1;
  9.           mas1++;
  10.        }
  11.     }
  12. }
A hozzászólás módosítva: Márc 19, 2017
(#) ktamas66 válasza kriszrap hozzászólására (») Márc 19, 2017 / 1
 
  1. void interrupt(void){
  2.        if(TMR2IF_bit)
  3.        {
  4.          TMR2IF_bit = 0;
  5.          KORREKCIO = KORREKCIO - 6;
  6.          if (KORREKCIO < 0)
  7.         {
  8.                 KORREKCIO = KORREKCIO + 100000;
  9.          } else {
  10.        
  11.                     if(!--count)
  12.                       {
  13.                       count=100;
  14.                       kepfrissit=1;
  15.                       mas1++;
  16.                       }
  17.                    }
  18.         }
  19.     }
Következő: »»   910 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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