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   922 / 1203
(#) kriszrap hozzászólása Ápr 10, 2017 /
 
Idézet:
„if(ora_10==2 & ora_1==4){ // 24:00:00-kor a teljes órát nullázzuk
ora_10 = 0;
ora_1 = 0;
perc_10 = 0;
perc_1 = 0;
mp_10 = 0;
mp_1 = 0;
}”


Érdemes??(Lehet a 2 sec naponta sietés okozhatja ???)
2 seces késést hogy lehetne korrigálni ha felmerült(írtam lapra....)???
A hozzászólás módosítva: Ápr 10, 2017
(#) don_peter válasza kriszrap hozzászólására (») Ápr 10, 2017 /
 
Kötelező, különbem tovább számolná az órát.
Nézd át a kódot, hogy milyen esetek fordulhatnak elő.
Érdemes abból kiindulni, hogy miképpen hibázhat a program.
24 óra a legtöbb amit 24órás időszámításban vehetsz, ha nem nullázod, akkor 24:00 + 1perckor nem 0:01 óra 1 perc lesz, hanem 24:01.
De ezt lehet nagyobb eltéréssel is vizsgálni.
Ha óra átvált 24órára, akkor nulláztuk az összes időmérő változót.

Számít a hőmérséklet, hogy ha nem egyenletes, akkor előfordulhat hogy késik vagy siet egy kicsit. Ha nagyon pontos órát akarsz akkor érdemes külső óra kvarcot vagy külső RTC-t használni. De ez gondolom nem egy atomreaktor lesz, hanem tanuló projekt.
Kezdetben ne bonyolítsd túl a dolgokat, csak szépen okosan tisztán, hogy tanulj belőle.

Ha nagyon késik és jól mérhető akkor a timer nincs jól beállítva, vagy ha minden jó, naponta korrigálod az eltérést.
A hozzászólás módosítva: Ápr 10, 2017
(#) kriszrap válasza don_peter hozzászólására (») Ápr 10, 2017 /
 
Rendben kipróbálom ezt is....
(#) pajti2 válasza kriszrap hozzászólására (») Ápr 10, 2017 /
 
A 2 sec per nap késéssel régi időkben olyasmit csináltak, hogy kvarcot összeforrasztották valami fém kalapos tranzisztorral, amin csak azért hajtották át az áramot, hogy fűtse a kvarcot. Külön hőmérő kellett, hogy a környezeti hőmérsékletet mérje, és annak alapján fűtse a kvarcot plusszban, mert annak hiányában a környezeti hőmérséklet megint csak elhangolt (tél / nyár). Ha nem akarod abba belegyilkolni minden idegszáladat, inkább fogadd el, hogy napi 2 sec nem a világ vége. Esetleg szuper pontos kvarcra cserélni a jelenlegit még meg lehet tenni, de azon túl hagyd a fenébe.

Ha mégis muszáj pontosabbat gyártani, szabad környezetben vagy (van rálátásod hosszúhullámú adókra), és beleférnek derékszögbe állított ferritmagos tekercsek a készülékházba, megpróbálhatsz ráhangolni a DCF77-re, és lesz másodperc pontos időd bármikor.
(#) ha1drp válasza kriszrap hozzászólására (») Ápr 10, 2017 /
 
Ekkora eltérés simán lehet a kvarc gyártási szórásától. (meg a panel kapacitás viszonyaitól, meg a hőmérséklettől, meg a lábak hosszától, stb....). Ha pontos értéket szeretnél legegyszerűbb egy trimmerkondenzátorral megoldani. Pár év múlva meg - ahogy a kvarc is öregszik, - elég újra beállítani, nem kell a programot átírni.
(#) kriszrap hozzászólása Ápr 10, 2017 /
 
Akkor a SIETÉST 2sec szoftveresen vagy hadweresen oldjam meg.??
Másik lehet baj 7805stab icé höje?? kb 1cm re vannak egymástól.
(#) cassis hozzászólása Ápr 10, 2017 /
 
Van különbség a kétfajta írásmód között?

  1. section(".ydata, data, ymemory")

  1. space(ymemory)
(#) don_peter válasza kriszrap hozzászólására (») Ápr 10, 2017 /
 
Ne bonyolítsd túl magadnak ezt az egészet..
Nagyon precíz akarsz lenne.. Nem kell. Elsőnek semmi kép.
Ha zavar minden napforduló előtt vagy után -2mp-et vegyél el és kész..
Szoftveresen nyúlj hozzá, ha annyira zavar..
(#) kriszrap válasza don_peter hozzászólására (») Ápr 10, 2017 /
 
Rendben igazad van ugy lesz )
Más témába szeretnék kérdezni van egy 5x5x5 led kockam.
Egy szinten max 30mA folyik igy nagyon fontos a jó hatásfokú multiplexelés elkeztem "optimalizálni"
De sajnos meghaladja a tudásomat....
A kód:
  1. void sajat_kirajzol(int otodikleded1,int negyedikled1,int harmadikled1,int masodikled1,int elsoled1,
  2. int otodikleded2,int negyedikled2,int harmadikled2,int masodikled2,int elsoled2,
  3. int otodikleded3,int negyedikled3,int harmadikled3,int masodikled3,int elsoled3,
  4. int otodikleded4,int negyedikled4,int harmadikled4,int masodikled4,int elsoled4,
  5. int otodikleded5,int negyedikled5,int harmadikled5,int masodikled5,int elsoled5,int mill,int szint)
  6. {
  7.    int i;
  8.    oszlopok(szint);
  9.    for(i=0;i<mill;i++)
  10.    {
  11.      nyfigy();
  12.      LATA.RA4=elsoled1;
  13.      LATA.RA3=masodikled1;
  14.      LATA.RA2=harmadikled1;
  15.      LATA.RA1=negyedikled1;
  16.      LATA.RA0=otodikleded1;
  17.  
  18.      LATB.RB7=elsoled2;
  19.      LATB.RB6=masodikled2;
  20.      LATB.RB5=harmadikled2;
  21.      LATB.RB4=negyedikled2;
  22.      LATB.RB3=otodikleded2;
  23.  
  24.      LATB.RB2=elsoled3;
  25.      LATB.RB1=masodikled3;
  26.      LATB.RB0=harmadikled3;
  27.      LATD.RD7=negyedikled3;
  28.      LATD.RD6=otodikleded3;
  29.  
  30.      LATD.RD5=elsoled4;
  31.      LATD.RD4=masodikled4;
  32.      LATC.RC7=harmadikled4;
  33.      LATC.RC6=negyedikled4;
  34.      LATC.RC5=otodikleded4;
  35.  
  36.      LATD.RD0=elsoled5;
  37.      LATD.RD1=masodikled5;
  38.      LATD.RD2=harmadikled5;
  39.      LATD.RD3=negyedikled5;
  40.      LATC.RC4=otodikleded5;
  41.      Delay_us(40);
  42.      ureskocka();
  43.  
  44.    }
  45.    
  46.    LATC.RC2=0;
  47.    LATC.RC3=0;
  48.  
  49.    LATA.RA6=0;//lacth nulláz
  50.    LATC.RC1=0; //reset
  51. }
  52. Ez egy multiplexelt kép:
  53. for(j=0;j<1000;j++)
  54.    {
  55.       sajat_kirajzol(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,szin+1);
  56.       sajat_kirajzol(0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,3,szin+2);
  57.       sajat_kirajzol(0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,szin+3);
  58.       sajat_kirajzol(0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,3,szin+4);
  59.       sajat_kirajzol(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,szin+5);
  60.       if(megszakitas==1)break;
  61.     }

Jól csinálom????
(#) don_peter válasza kriszrap hozzászólására (») Ápr 10, 2017 /
 
Miért használsz int típusú változót?
Elég oda az unsigned char is. (8bit)
Ennyi változó esetében érdemes megfontolni, hogy tömböt használj, úgy jobban áttekinthetőbb és rendezettebb lenne.
Bár amúgy, így nincs benne sok felesleges dolog, szóval elég gyorsan fog lefutni..
Van egy disassembler ablak, amiben meg tudod nézni mit és hogy mekkora kódot fordít a fordító.
A hozzászólás módosítva: Ápr 10, 2017
(#) kriszrap válasza don_peter hozzászólására (») Ápr 10, 2017 /
 
igy kéne időmultiplexelnem vagy inkább más modon??
(#) pajti2 válasza cassis hozzászólására (») Ápr 10, 2017 /
 
Miféle környezet az?
(#) nyogo83 hozzászólása Ápr 10, 2017 /
 
Sziasztok!

Lehet, hogy nem pont megfelelo topic, de megis pic-el kapcsolatos es kevesbe vagyok jartas a lelki vilagaban.
Adott egy pic16f872, aminek az eeprom memoria reszerol kellene egy dump. A gond az, hogy csak nullakat tudok kiolvasni, a konfiguracios bit word: 0x0C01.
Ahogy en kitudtam bogozni, a konfig bitekbol az kovetkezik, hogy a CP nem csak a program es flash memoria reszre, hanem az eeprom reszre is engedelyezve vannak?
(#) cassis válasza pajti2 hozzászólására (») Ápr 10, 2017 /
 
dsPIC C nyelve. Lényegében a linker működése lenne itt érdekes.
(#) Bakman válasza nyogo83 hozzászólására (») Ápr 11, 2017 /
 
0x0C1=0b0000 1100 0000 0001
bit 5-4: kódvédelem. Ha mindettő nulla, akkor a program memória és az EEPROM terület is védve van, nem olvasható.
(#) Hp41C válasza kriszrap hozzászólására (») Ápr 11, 2017 /
 
Nem akarlak megszavarni....

Megnézted más mit is fordut ebből a kódból???
27 db 2 byte-os változót kell a software stack -re tenni, ami darabonként a következőkből áll:
- a paramétert be kell tölteni egy átmeneti változóba, onnan indirekten címezve a memóriába írni,
- meg kell hívni a rutint,
- a paraméterek értékéről (16 bitesen) meg kell állapítani, hogy 0-e,
- ha 0 a bites változót 0 -ra, ha 1 a bites változót 1 -re kell állítani.
- visszatérés után (minden meghívás után) a 27 adatot "le kell venni" a stack -ről.

Ez a tevékenység sokkal több időbe fog telni, mint 40us (a delay ideje a kijelző ciklusban).

A byte (unsigned char) kb. fele ennyi művelet lesz, de még az is mérhetetlenül sok...
A hozzászólás módosítva: Ápr 11, 2017
(#) don_peter válasza kriszrap hozzászólására (») Ápr 11, 2017 /
 
Az első kérdés ilyenkor, hogy működik e most a programod?
A második, hogy kielégítően működik e a programod?
Ha igen, akkor jó, ha nem akkor nem jó..
Egyelőre nem törődnék vele, majd ha lenne jobb ötletem, akkor kipróbálnám.

Ami nagyon fontos és jó lenne, ha mindig oda figyelnél, hogy a megfelelő típusú változókat használd. Nem tudom milyen fordítót használsz, de nézd meg nincs e olyan változó típus hogy boolen, ha az nincsen, akkor marad az unsigned char típus.

Itt a lényeg az, hogy a te "int otodikleded1" változód, 2-4byte-os. Vagy is 16-32 szer több mint amire szükséged van. Az unsigned char is 8 szor lesz több mint amire szükséged van, de még is csak fele akkora, és fele annyi időbe kerül a lefutása.
A változó típusokat át kellene nyálaznod kicsit.. Bővebben: Link
A hozzászólás módosítva: Ápr 11, 2017
(#) Pali79 válasza Hp41C hozzászólására (») Ápr 11, 2017 /
 
Biztos, hogy nem nézi meg, mert az ugyebár assembly, azt meg nem érti (ő sem).
A hozzászólás módosítva: Ápr 11, 2017
(#) Hp41C válasza Pali79 hozzászólására (») Ápr 11, 2017 /
 
Pedig nagyon tanulságos a Disassembly Listing ablak... Felváltva láthatók a C és a belőle keletkező assembly utasítás sorok. Csak az assembly rész hoszzát kellene nézni...
(#) kriszrap válasza Hp41C hozzászólására (») Ápr 11, 2017 /
 
A Fényerővel van problémám sajnos amikor egy képet rajzolok mondjuk egy szinten és időmultiplexelve akkor nagyon jó elfogadható a fényerő
De ha 5 szintre terjed ki a "kép" akkor van olyan hogy alsó szint jobban világit mint a közepe peddig az alsó szinten több led villágit mint a közepén.
Ha több szintű az animáció akkor drasztikusan csökken a fényerő.
MikroC és van boolen(igaz.hamis) változó igen van benne akkor inkáb azt használjam?
A hozzászólás módosítva: Ápr 11, 2017
(#) kriszrap hozzászólása Ápr 11, 2017 /
 
ohh....... Ba... Nem tom hogy felejtettem ezt ki a for ciklusnál igy néz ki a dolog:
  1. for(i=0;i<mill*25;i++){
és igy 1ms egy szint
(#) pajti2 válasza cassis hozzászólására (») Ápr 11, 2017 /
 
A dsPIC-ekhez C30 és XC16 fordítók vannak, és linkerje mindegyiknek a sajátja. Melyikkel akasztottál bajszot?
(#) pajti2 válasza kriszrap hozzászólására (») Ápr 11, 2017 /
 
A fényerő szabályozás legvalószínűbben kapcsolástechnika problémája. Ha azonos ideig hajtod meg a ledeket minden alkalommal (impulzus üzemben), és több led esetén gyengül a fényerő, akkor a kapcsolás technikát hibáztad el. Mindegyik áramútnak önálló kapcsoló kell. Ha azt kispórolod, olyankor lesz az a jelenség, hogy több led esetén mindegyik gyengébb.

A másik lehetőség a program hiba. Ha sok szintet hajtasz, és valamelyik nincsen bekapcsolva, akkor is szintenként kell végig menned, és üresjáratban hagyni az alkalmazást arra az időszeletre, amikor nem használt szintet hajtana meg. Ha azt kihagyod, és azonnal ugrasz a következőre, összegubancolódnak miatta a fényességi értékek.
(#) usane válasza Hp41C hozzászólására (») Ápr 11, 2017 /
 
Így is ki lehet fejezni...

Hogy a fenébe keresen az ember bármit is ha még a parametrikus táblázatuk is rossz.
Nem hiszem el, hogy a MC még ezt sem képes rendbe rakni....
Nem tudok megtalálni x számú PWM-el rendelkező uC-t mert van 4 paraméter rá és nincsenek szinkronban. Pl: van 1 pwm kimenet de nincs hozzá ccp, eccp vagy standalone a táblázatban. Vagy épp fordítva. Milliárdos cég és nem tudnak egy embert ezzel foglalkoztatni...
Észbontó.
(#) kriszrap válasza pajti2 hozzászólására (») Ápr 11, 2017 /
 
Minden szintem 30mA folyikvagy is nem aminuszlábak vannak össze kötve ha nem a pluszok.
  1. A másik lehetőség a program hiba. Ha sok szintet hajtasz, és valamelyik nincsen bekapcsolva, akkor is szintenként kell végig menned, és üresjáratban hagyni az alkalmazást arra az időszeletre, amikor nem használt szintet hajtana meg. Ha azt kihagyod, és azonnal ugrasz a következőre, összegubancolódnak miatta a fényességi értékek.

hmm vagy is a szintek idejét is számitásba kell venni még ha üres járat van akkor is jól értem???
(#) pajti2 válasza usane hozzászólására (») Ápr 11, 2017 /
 
MC-ékről az a pletyi, hogy még mindig áll a balhé az Atmel egyesülés miatt. Túl nagy náluk a káosz részleteken dolgozni.
(#) pajti2 válasza kriszrap hozzászólására (») Ápr 11, 2017 /
 
Idézet:
„Minden szintem 30mA folyikvagy is nem aminuszlábak vannak össze kötve ha nem a pluszok.”

Ápoljuk szép újmagyar anyanyelvünket Amennyire emlékszem a led kockádból, sok-sok ledet dellázol megfele. Kell oda a közös hajtás lefele és meg felfele is különválogatva mindegyik irányt áramkorláttal - ja nem is az egyik irányban azt kihagyhatod de csak az áramkorlát ellenállást a közös hajtást muszáj használnod. Úgy csinálod? Szólj, ha sikerült nem megérteni
(#) don_peter válasza kriszrap hozzászólására (») Ápr 11, 2017 /
 
Egy kapcsolási rajzot dobjál már fel.., hátha többet látunk..
(#) Udvari Zsombor hozzászólása Ápr 11, 2017 /
 
Elkezdtem foglalkozni a kóddal is, és a lábakat azt még úgy ahogy értrem, de kérdezem, hogy jó-e ez így? Visszaolvasva megtalálható a kapcsolásom, nem mellékelem újra.
  1. // LCD BEKÖTÉS >>
  2. sbit LCD_RS at RA0_Bit;
  3. sbit LCD_EN at RA1_Bit;
  4. sbit LCD_D4 at RB4_bit;
  5. sbit LCD_D5 at RB5_bit;
  6. sbit LCD_D6 at RB6_bit;
  7. sbit LCD_D7 at RB7 bit;
  8.  
  9. sbit LCD_RS_Direction at TRISA0_Bit;
  10. sbit LCD_EN_Direction at TRISA1_Bit;
  11. sbit LCD_D4_Direction at TRISRB4_Bit;
  12. sbit LCD_D5_Direction at TRISRB5_Bit;
  13. sbit LCD_D6_Direction at TRISRB6_Bit;
  14. sbit LCD_D7_Direction at TRISRB7_Bit;
  15. // LCD BEKÖTÉS <<

Ezen a részen viszont mit módosítsak? Egyáltalán jó-e nekem?
  1. void main()
  2. {
  3. TRISA = 0;
  4. PORTA = 0;
  5. TRISB = 255;
  6. TRISC = 255;
  7. TRISD = 0;
  8. PORTD = 0;
  9. TRISE = 0;
  10. PORTE = 0;
  11.  
  12. C1ON_Bit = 0;
  13. C2ON_Bit = 0;
  14. ANSEL = 0;
  15. ANSELH = 0;
  16. }
A hozzászólás módosítva: Ápr 11, 2017
(#) kriszrap válasza pajti2 hozzászólására (») Ápr 11, 2017 /
 
ugy éppítettem meg a ledkockát hogy a + lábbakkal a szinteket irányitom a - lábbakal az oszlopokoat és azt szeretném elérni hogy igy a legnagyobb fényerőt szeretném kicsikarni időmultiplexel
Következő: »»   922 / 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