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   698 / 1210
(#) ktamas66 válasza Pali79 hozzászólására (») Aug 19, 2015 /
 
Kijelzendő érték legyen mondjuk 22. Ezt 3-mal osztva 7-et kapok (meg a maradék), ez lesz a ciklusváltozóm (7x fut le a 3 vonal kiírása), a ciklusban 3-mal csökkentem a 22 értékét, így a végére 1 lesz a maradék. Ha a kiírandó karakter kódja is 1, csak ezt kell kiírni. Ha a ciklusban csökkentgetek egy karakter számlálót, hogy eddig hány karaktert írtam ki, egy másik ciklus kitörölheti a hátralevőket (amíg le nem nullázódik a számláló), így mindig 14 karaktert fog kiírni.
Tehát kell egy rutin: kijelzendő érték/3=x, ciklus x alkalommal háromvonal + maradék kiíratás+ 14-x-1 alkalom üres kiíratás. Akkor egyszerű ha a 00 karakter üres, 01 egyvonalas 02 kétvonalas.
(#) Hp41C válasza Pali79 hozzászólására (») Aug 19, 2015 /
 
A mért értékből 3 -at kivonni, betenni az eredménybe (előjeles).
Ha az eredmény pozitív, háromvonás karaktert kiírni, eredményből ismét levonni 3 -at, goto e sor eleje.
Az eredményhez 2 -et hozzáadni.
Ha az eredmény nagyobb 0, kétvonás, karaktert kiírni, ha nulla, egyvonás karaktert kiírni.
Ez maximum 14 kivonás és egy összeadás...
Minek ide az osztó rutin, aztán meg egy ciklus, ami az eredménynek megfelelő számú karaktert kiírja?
(#) sonajkniz válasza Hp41C hozzászólására (») Aug 19, 2015 /
 
Ezt nem egészen értem. Ha a mért érték pl.117, és hármakat vonok ki belőle, az már 39. Ennél jóval kevesebb karakterhely van.
(#) Pali79 válasza sonajkniz hozzászólására (») Aug 19, 2015 /
 
Nyilván ez csak eredmény<42 esetén működik, az e feletti értékeket nem kezeli. De ez nem is lenne olyan nagy gond, a nagyobb gondom ezzel van:
Idézet:
„Ha az eredmény nagyobb 0, kétvonás, karaktert kiírni, ha nulla, egyvonás karaktert kiírni.”

tehát nics olyan opció ebben, hogy üres karaktert írjon. Egyébként az ötlet zseniálisan egyszerű csak picit finomítani kell, mert most ha egy nagyobb értékről csökkentem az ADC értékét mindenhol "egyvonás"-t hagy maga után ahogy megy vissza a kijelzés.
(#) benjami válasza sonajkniz hozzászólására (») Aug 19, 2015 /
 
Úgy is megoldható, ha 18-akat vonsz ki mindig az eredeti értékből addig amíg el nem fogy (előtte azért 0..251 közé be kellene korlátozni a mért értéket mert 18*14 = 252). Ha a maradvány >14 akkor három vonalat, ha 9..13 közé esik akkor két vonalat, ha 4..8 között van egy vonalat, ha 4 alatt van akkor egy szóközt rajzolsz ki. Így nem kellene sem szorozni, sem osztani, csak kivonogatni.
A hozzászólás módosítva: Aug 19, 2015
(#) benjami válasza benjami hozzászólására (») Aug 19, 2015 /
 
Pali79-nek kellett volna címeznem.
(#) sonajkniz válasza Pali79 hozzászólására (») Aug 19, 2015 /
 
Idézet:
„.ha egy nagyobb értékről csökkentem az ADC értékét mindenhol "egyvonás"-t hagy maga után ahogy megy vissza a kijelzés.”

Ezért kell ciklusban végezni a feladatot, hogy ki tudd számolni, mennyi üres karaktert kell még kiírni. Minden esetben meg kell legyen a 16 karakter. Bár, mivel nem időkritikus a feladat, az egy sorban elhelyezhető karakterek száma pedig 40, így csinálhatod azt is, hogy a végére kiírsz 13 üres mezőt.
A hozzászólás módosítva: Aug 19, 2015
(#) Pali79 válasza sonajkniz hozzászólására (») Aug 20, 2015 /
 
Igen, ezen már túl vagyok azóta, de sehogy sem jó. Valami mindig bekavar. Most épp az a baj, hogy ha fokozatosan növelem az ADC értékét, akkor amikor 3-mal osztható lesz az érték összekavarodik a kijelzés, mert ahogy Hp41C javasolta, kivonom a 3-at, ha pozitív az eredmény akkor 3 vonás. Igen ám, de 3-3=0 is pozitív és ezen nem tudok túljutni. Elkezdem növelni az értéket akkor így jönnek egymás után 1, 2, 0, 4....
(#) sonajkniz válasza Pali79 hozzászólására (») Aug 20, 2015 /
 
Ne csak a carry, hanem a zéró bitet is vizsgáld.
Bár így a végére lehet, hogy hosszabb lesz a programod, mintha egy rutinba tett osztást használnál.
Ezt persze a leírt részre értem, nem órajelre.
(#) Pali79 válasza sonajkniz hozzászólására (») Aug 20, 2015 /
 
Igen ezzel tisztában vagyok csak nem mindegy, hogy mikor vizsgálom, de úgy tűnik jó lesz, legalábbis a szimulátor szerint, aztán majd kiderül.
(#) Pali79 hozzászólása Aug 20, 2015 /
 
Még olyan kérdésem lenne, hogy az analóg bemenetet hogyan illesszem az audio jelhez? Találtam EZT a rajzot, de nem vagyok tökéletesen meggyőződve az alkalmassága felől.
A hozzászólás módosítva: Aug 20, 2015
(#) killbill válasza ktamas66 hozzászólására (») Aug 20, 2015 /
 
Te majdnem ugyanazt csinalod, mint en. En szorzom 42-vel, majd osztom 256-tal. Te szorzod 21-gyel es osztod 128-cal. Fele, fele. Az eredmeny ugyanaz, csak te 21 muvelettel (osszeadassal) gondolod megoldani, en ottel (harom shift, ket osszeadas). Ezen felul a 128 osztoas egy shiftelessel tobb, mint a 256-tal valo osztas. Mitol jobb ez? Persze, ha te ugy gondolod, hogy 21 egymas utani mintat adsz ossze, akkor az mar egy kicsit tovabb bonyolitja, hogy szamolni kell az osszeadott mintakat. Bar egyet meg kell jegyezni: a 21 minta osszeadasaval egy atlagolast is beviszel a dologba, ami az adott feladatnal meg jo is.
(#) Hp41C válasza Hp41C hozzászólására (») Aug 20, 2015 /
 
Valóban 0..41 értékere működik. Annyit kellene még hozzátenni, hogy egy ciklus számolja, hogy hány karaktert írt már ki, ha nem érte el a 14 -et, üres karaktereket ír még ki.
Idézet:
„... kivonom a 3-at, ha pozitív az eredmény akkor 3 vonás. Igen ám, de 3-3=0 is pozitív és ezen nem tudok túljutni.”

Ha a 3 -ból kivonod a 3 -at, az eredmény valóban 0, az is pozitív. Ekkor ki kell írni egy háromvonalast és vissza kell menni e sor elejére. Azaz a 0 - ból is ki kell vonni a 3 -at, ez -3, azaz negatív. Tehát nem kell több "vonást" kiírni. A fentiek figyelembe vételével 13 üres karaktert kell még kiírni.
Ha elég a 0..39 tartomány, akkor 10 db 10 bites A/D mérés eredményét kell összadni 16 bitesen, és venni a felső byte-jét.
A hozzászólás módosítva: Aug 20, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») Aug 20, 2015 / 1
 
Pazar vita alakult itt ki. Mindenki védi a saját megoldását. Javaslom, készítssen mindenki egy kis mintaprogramot. Pali79 kipróbálja őket, és eredményt hirdet.
(#) mark.budai hozzászólása Aug 20, 2015 /
 
Sziasztok! Megint én.
Megírtam az RFM12b demo kódját, amit a gyártó egy PDF fájlban leközölt.
Egy olyan bajom van vele, hogy a main függvény while ciklusában, az első WriteFSKbyte sor után lefagy a program. Elé beírtam, hogy az egyik kimeneten levő ledet felvillantsa, de ki már nem alszik, addig világít, míg el nem veszem a tápfeszt. Mi lehet a gond?
  1. while(1)
  2.    {
  3.       ChkSum=0;
  4.       //if(SW == 0)
  5.       WriteCMD(0x8228);     //OPEN PA
  6.      DelayUs( 4 );
  7.      WriteCMD(0x8238);
  8.      NOP();
  9.      NOP();
  10.      LED=1;
  11.      WriteFSKbyte( 0xAA );
  12.      LED=0;
  13.      WriteFSKbyte( 0xAA );
  14.      WriteFSKbyte( 0xAA );
  15.      WriteFSKbyte( 0x2D );
  16.      WriteFSKbyte( 0xD4 );
  17.      WriteFSKbyte( 0x30 );//DATA0


Ez pedig a WriteFSKbyte függvény.
  1. void WriteFSKbyte( uchar DATA )
  2. {
  3.   uchar RGIT=0;
  4.   uint temp=0xB800;
  5.   temp|=DATA;
  6.   Loop: SCK=0;
  7.   nSEL=0;
  8.   SDI=0;
  9.   SCK=1;
  10.   if(SDO)               //Polling SDO
  11.    {
  12.     RGIT=1;
  13.    }
  14.   else
  15.    {
  16.     RGIT=0;
  17.    }
  18.   SCK=0;
  19.   SDI=1;
  20.   nSEL=1;
  21.   if(RGIT==0)
  22.    {
  23.     goto Loop;
  24.    }
  25.   else
  26.   {
  27.    RGIT=0;
  28.    WriteCMD(temp);
  29.   }
  30. }
(#) mark.budai válasza mark.budai hozzászólására (») Aug 20, 2015 /
 
Kicsit tovább vizsgáltam, az SDO nem lép magas szintre, az RGIT változó nem megy át egybe, ezért visszatér a Loop elejére, tulajdonképpen nem lefagy, hanem az SDO hiánya miatt újra és újra próbálná beletuszkolni a bájtot az RFM modulba. Az adatlapban nem találom, hogy miért nem húzza fel az SDO-t a modul. Valahonnan hiányzik valami?
(#) benjami válasza sonajkniz hozzászólására (») Aug 20, 2015 / 1
 
Mivel pont van itthon kész áramköröm amivel ki tudtam próbálni, össze is dobtam gyorsan a programot (lásd melléklet). A hardver PIC18F4550 (HID bootloaderrel 48MHz-en járatva), a két poti az AN0 és AN1-re csatlakozik (AN2..AN7-re is poti megy, de a program ezeket nem használja), a kijelző pedig a charlcd.h-ban beállított lábakra.

Kiv-jelzo.zip
    
(#) foxi63 válasza mark.budai hozzászólására (») Aug 20, 2015 /
 
Szia!
Az SDO lábat sima TTL bemenetre kell tenni, mert az ST bemenet 0,8 tápfesznél lesz 1 értékű.
(#) Balagemann2031 hozzászólása Aug 21, 2015 /
 
Sziasztok! PIC24H-nak OC moduljával bajlódok. Sikerült kicsiholnom már PWM jelet, viszont nem értem a folyamatát. (a sima 16F és 18F-es sorozat PWM CCP moduljaival nem volt gondolm, és a PWM mód is egyszerű volt) Ami a kérdésem lenne, hogy OCxRS regiszternek mi a szerepe? És a másik kérdés, hogy 40MIPS-en lehet-e 400Hz alatti PWM frekvenciát előállítani legalább 10 bites felbontással? Adatlapokat fejtegetem de az angol csak alapszinten mozog nálam...
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Aug 21, 2015 /
 
A 400Hz alatti PWM et elő tudom állítani TMRx előosztójával, ez sikerült, de a kitöltési értéket a 2 regiszter alapján kéne elvileg belőni (OCxR és OCxRS) logikailag nem világos mi a szerepe OCxRS nek.
(#) mark.budai válasza foxi63 hozzászólására (») Aug 21, 2015 /
 
Szia!
A TTL nem tudom, mennyire jó megoldás, a PIC is 3,3V-ról megy, és a modul is. Elméletileg a PIC-nek nem probléma ez a kisebb tápfesz, de emiatt a TTL nem használható.
(#) Zsolt2 válasza Balagemann2031 hozzászólására (») Aug 21, 2015 /
 
Melyik uzemmodot hasznalod? (OCxCON regiszter OCM bit erteke mennyi?)
(#) Balagemann2031 válasza Zsolt2 hozzászólására (») Aug 21, 2015 /
 
OCM bit értéke 101. Ezzel ha OCxR regiszter értékét változtatom, akkor változik a kitöltés, viszont ami még probléma, hogy a jel nem megy le sosem teljesen 0-ra így analizátorral nem is tudom figyelni.. (lehet hogy hardveres a hiba, bár nem jöttem még rá)
A hozzászólás módosítva: Aug 21, 2015
(#) Zsolt2 válasza Balagemann2031 hozzászólására (») Aug 21, 2015 /
 
OCxR maradjon nullan es az OCxRS regiszter allitja a kitoltest ebben az uzemmodban. Pic kimenete le kell menjen kozel nullaban, ha nem akkor meghibasodott a port vagy zarlatos egy masik labbal (esetleg pozitiv tappal).
(#) Balagemann2031 válasza Zsolt2 hozzászólására (») Aug 21, 2015 /
 
A jelenlegi beállításaim: PR2: 0FFF OCxRS: 0FFF OCxR:0---0FFF-ig kitöltés, ledeken nézem a változást, az erősen világítóról le tudom venni majdnem teljesen sötétre... (analizátor nem mutat semmit. Megpróbálom úgy ahogy ajánlottad!
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Aug 21, 2015 /
 
Az általad javasolt módon, ha PR2: 0FFF OCxR :0000 és OCxRS értékét változtatom, kb a leden látható változás 60-80% os kitöltés így szemre, ezeken a határokon belül mozog csak... Valami nem kerek.
(#) kameleon2 hozzászólása Aug 21, 2015 /
 
Sziasztok! Nem PIC de mégis az: Egy kedves fórumtársunk felajánlásának hála hozzájutottam egy ilyen Basic Stamp boardhoz Mivel a basic stamp tulajdonképpen PIC így érdekelne, hogy esetleg más PIC-ek programozásához is használható lenne szerintetek? Esetleg milyen szoftver kellhet hozzá? Másik kérdés. Van-e valaki közületek, aki ismeri ezt a boardot és a basic stampet? A potméter leolvasása ugyanis nagyon nem akar működni. Arra már rájöttem, hogy igen "érdekesen" van bekötve a boardon az ajánlásokhoz képest, mert nem párhuzamosan van a potin a kondi, hanem meglepő módon - sorban. Lehet, hogy emiatt nem akar működni? Amúgy nagyon jópofa kis board. Propeller után igazán gyorsan sikerült megbarátkoznom vele. A gyereknek szántam, emiatt keresgélek kész programok után, hogy ne megutáltassam, hanem megszerettessem vele a dolgokat. Előre is köszönöm, ha volna valakinek érdemi válasza.
A hozzászólás módosítva: Aug 21, 2015
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Aug 21, 2015 /
 
Sikerült addig eljutnom, hogy majdnem lineárisan tudom trimmerrel szabályozni a PWM jel kitöltését, viszont 2 problémám van továbbra is: Ha leveszem "nullára" a trimmert akkor a kitöltés 100% körül lehet és kis tekerés után kezdi halványról az erősödést maximumig. A másik problémám, hogy analizátorral nem látom a jelet, 18F67K90-es PIC-en rendesen mutatkozik a jelalak, de 24H-n nem. Egyébként Open drain es meghajtással optokapun keresztül jönne ki a jel.
Csatoltam a környezetet, és a rajzát.
(#) Bakman válasza Balagemann2031 hozzászólására (») Aug 21, 2015 /
 
Ez a fajta optokapu elrendezés stabilabban működik igaz, ez egyben negálja is a jelet. AMi a rajzodon van, az nem Open Drain -es meghajtás.
A hozzászólás módosítva: Aug 21, 2015

optokapu.jpg
    
(#) Balagemann2031 válasza Bakman hozzászólására (») Aug 21, 2015 /
 
Szia lehet elírtam, de a lényeg hogy a PIC nyelőként kapcsolja az optóra a feszt
Következő: »»   698 / 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