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   355 / 1210
(#) kissi válasza tirisztortetróda hozzászólására (») Jan 21, 2013 / 1
 
Szia!
Elosztod a regisztered tartalmát 100-al, az egészrész adja a 100-asok számát, a maradékot 10-el, ez adja a 10-esek számát, a maradék az egyesek számát ( ha ASCII kód kell, akkor a kapott számokhoz hozzá kell adni a '0' ASCII kódját, azaz 30H=48-at!)!
Ha az eszközöd nem tud osztani, akkor ugyanezt kell/lehet játszani kivonásokkal!
Remélem tudtam segíteni!?
Steve
(#) tirisztortetróda válasza kissi hozzászólására (») Jan 21, 2013 /
 
Szia!

Köszönöm a válaszodat, megpróbálom megvalósítani. Közben készítettem egy lehetséges verziót, de ez a mód is érdekel!
Köszönöm még egyszer !!!
(#) 1soproni hozzászólása Jan 21, 2013 /
 
Sziasztok!

Van egy régi tárcsás telefonom, amit szeretnék átalakítani. Találtam egy holland weboldalt, ahol valaki megoldotta. Ott a kapcsolási rajz is, de a pic programja nem publikus. Gondoltam az nem lehet olyan nehéz a többi infó alapján.
Nagyjából készen is vagyok a programmal. Próbapanelen már működőnek tűnik. Most jönne az a lépés, hogy összekössem a telefonnal is. Eddig egyelőre csak egy fülhallgatóval hallgattam a DTMF hangokat.
A kapcsolási rajz szerint egy 20MHz-es órajel generátort kell használni. Ennek a beállítása érdekelne. Hogyan kell ezt összekonfigurálnom egy PIC12F629-cel picbasicben? Elég annyi, hogy
  1. OSC 20
?
Gondolom kevés. Milyen paranccsal kell beállítani, hogy a 2-es, 3-as lábra órajel generátort kötök? Mit kell beállítanom az option registerben és a timer regiszterekben?
Honnan fogom tudni, hogy tényleg használja a külső órajel generátort?

Bocsánat, ha nagy hülyeségeket kérdezek, de ez az első projektem. Ezelőtt még nem nagyon foglalkoztam elektronikával.
Az eredeti projekt weboldala ITT található.
(#) nagzso hozzászólása Jan 22, 2013 /
 
Sziasztok!
Az EEPROM-nak, hogy tudok kezdőértéket megadni? Értem: amikor beleégetem a programot, akkor kap egy alap értéket. Viszont, ha újraindítom, a PIC-et, akkor már ne ezzel az alapértékkel induljon, hanem azzal, amit legutóbb beállítottam neki.
(#) bbalazs_ válasza nagzso hozzászólására (») Jan 22, 2013 /
 
Tudsz irni programbol is az eepromba. Az adatlapban pontosan le van irva, hogyan.
Igy indulas utan mar veheted az erteket onnan.
(#) nagzso válasza bbalazs_ hozzászólására (») Jan 22, 2013 /
 
Nem értem mire gondolsz. Az meg van, hogy hogy tudok írni az EEPROM-ba és olvasni. Változók értékeit tároltam el benne, amiket a PIC indulásakor átadom másik változóknak, amiket aztán a progi felhasznál futás közben. Az is meg van, hogy futás közben, hogy módosítsam az értékét. A gondom az, hogy minden egyes égetéskor "FF" érték kerül az EEPROM-ba, amit aztán átállíthatok a futó környezetben.
Olyan megoldás kell, ami az égetésnél alapértéket ad az EEPROM-nak, amit aztán én kedvem szerint állíthatok és elmenthetem az EEPROM-ba, majd ha kikapcsolom/újraindítom a PIC-et, az általam utoljára beállított értékekkel induljon.
Találtam rá megoldást, az égető programba minden egyes égetéskor manuálisan beírom, hogy melyik memória címen milyen érték legyen, de reménykedem, hogy van egyszerűbb megoldása is.
(#) kistee válasza nagzso hozzászólására (») Jan 22, 2013 /
 
Csak egy ötlet: ha a beégetendő hex fájlt módosítanád?

Vagy ha a PIC programban az első dolog lenne, hogy a megfelelő helyekre a megfelelő értékeket beírja.
A hozzászólás módosítva: Jan 22, 2013
(#) bbalazs_ válasza nagzso hozzászólására (») Jan 22, 2013 /
 
En nem ertem, mire gondolsz.
A file-ban NEKED KELL megadni az eeprom ertekeit. Ha nem adod meg, nem eget oda semmit.
Valtozatlanul hagyja a regieket.
Ha esetleg ugy van, hogy te nem is irsz programot, hanem egy kesz .hex file-t egetsz be, akkor meg abban is megtalalhatoak az ertekek valahol. Altalaban vagy az elejen vagy a vegen. A PIC tipusatol fugg, hogy hol van az eeprom kezdocime, en ugy emlexem, hogy kb 0xf000-nal. Ha kitorlod, az egesz sort ki kell torolnod a vegeeig.
(#) nagzso válasza bbalazs_ hozzászólására (») Jan 22, 2013 /
 
Na pont ez az amit mondasz. Nem égetek bele semmilyen konstans értéket, mert minek?? alapon, amikor épp arra van szükségem, hogy a legutóbb állított értékkel dolgozzon. Nekem azt az értéket kell tárolnom EEPROM-ban, amit a felhasználó állít be. Tehát: felhasználó beállítja: a = 220, akkor ha újraindítom/kikapcsolom/akármit csinálok a PIC-cel, a = 220 marad (persze amíg nem állítja át másik értékre). És egy alap feltöltött értéket csak azért akarok adni, hogy ne kelljen nekem manuálisan a nyomógombbal 255-ről 50-re lepörgetnem az értéket minden égetés után. De megpróbálom pszeudokód szerűséggel leírni:
  1. main () {
  2.     a := EEPROM(0x01); //(EEPROM(cím))
  3.     if(módosít) {
  4.         EEPROM(0x01) := b;
  5.     }
  6. }
Ilyen megoldásra hasonlít most a kódom.
Ami jó lenne:
  1. if(égetés) {     // magyarul, csak az első futtatásig kell ez az érték, mert úgyis átállítom
  2.     EEPROM(0x01) := 30;    //(EEPROM(cím))
  3. }
  4.  
  5. main () {
  6.     a := EEPROM(0x01);    // ha első futtatás akkor az értéke 30, ha nem, akkor b
  7.     if(módosít) {
  8.         EEPROM(0x01) := b;
  9.     }
  10. }
(#) bbalazs_ válasza nagzso hozzászólására (») Jan 22, 2013 /
 
Szoval az egyik egetesnel egessen eepromot is, a masiknal mar ne?
Az egetoprogidnal ezt nem lehet megadni?

Vajar, vajar, elolvastam meg egyszer az elso hozzaszolast.
Szoval nalad az eeprom TORLODIK minden irasnal?

Azt nagyon nehez megcsinalni, hogy az altalad a PIC-ben atallitott ertekek belekeruljenek a forrasfile-ba. Ennel sokkal egyszerubb, ha at sem irod, mivel nem a programteruleten van.

Szoval a megoldas az, hogy valahogyan letiltod az egetoprogramodban az eeprom irasat, vagy pedig megkeresed a forrasfile-ban az eeprom tablat definialo es feltolto sort (ha van ilyen).

(#) nagzso válasza bbalazs_ hozzászólására (») Jan 22, 2013 /
 
Ha kikapcsolom az EEPROM írást az égetőbe, akkor hibát dobott égetéskor...
Megfogtad a lényeget: nekem égetéskor semmilyen értékre nincs szükségem az EEPROM-ba, mivel futás közben kerül bele, a helyes érték. Csak azért lenne lényeges, hogy mégis csak legyen valami kezdőérték, mert alapból "FF"-et éget bele, azaz 255-öt, amit én minden íráskor egyesével lepörgethetek.
De mondom, PICKit 2 v2.61-gyel égetek, ott manuálisan megadhatom alul, hogy mivel töltse fel azt a memória címet(ez az én megírt programomat semmilyen mértékben nem befolyásolja).
Úgy néz ki marad, ez a megoldás, szerencsére csak 11 értéket kell beállítani , csak ugye lusta az ember fia, ezért próbáltam volna valami gyorsabb megoldást találni.
Köszi szépen.
(#) nagzso válasza (Felhasználó 15355) hozzászólására (») Jan 22, 2013 /
 
Valami ilyesmit keresek, csak ugye még nem csináltam, aztán nem tudom, hogy lehet, ahogy keresgéltem sem találtam egyelőre semmit. Ezt ki is próbálom.
(#) brato hozzászólása Jan 22, 2013 /
 
Üdv!
Egy asm nyelvű program több includfájlból áll, és több helyen van CBLOCK definíció.
Van arra egyszerű módszer, hogy programkóddal vagy utasítással meghatározható legyen az utolsó változó memóriacíme?
A hozzászólás módosítva: Jan 22, 2013
(#) bbalazs_ válasza nagzso hozzászólására (») Jan 22, 2013 /
 
Assemblyben meg igy nez ki:
ORG 0xf000
db 1,2,3,4,6,7,8,9,0,0
db 10,11,12....stb

A db utan paros szamu byte-nak kell kovetkeznie, legalabbis a 18F-es sorozatnal.

En a progi elejen szoktam, utana viszont kell egy masik ORG, ami a rendes programvektor es IRQ vektor cime.

Ha a progi vegere rakod, nem kell.

Milyen egetoprogi az, ami hibat dob, ha nem engeded irni az eepromot????
Szerintem valts valami masikra, de tustent.
(#) Hp41C válasza nagzso hozzászólására (») Jan 22, 2013 /
 
Szia!
Az első programozáskor a forrásból fordított értékeket programozd be. A forrásbeli megadást a többiek már részletezték. Ha a programot szeretnéd frissíteni, de az EEProm adatait meg szeretnéd tartani, vedd ki a pipát az EEProm Data Enabled felirata elől.
(#) kissi válasza brato hozzászólására (») Jan 22, 2013 /
 
  1. pl.
  2. CBLOCK 20
  3. valt1
  4. valt2
  5. vege
  6. endc
  7.  
  8. movlw vege


Így az aksiban van a következő szabad hely címe ( jelen esetben 22, ha a tizes számrendszer az alapértelmezett! )!
Steve
A hozzászólás módosítva: Jan 22, 2013
(#) nagzso válasza bbalazs_ hozzászólására (») Jan 22, 2013 /
 
Azt a progit használom, amit Hp41C linkelt.
Fordítónak meg XC8-at használok.
Amit simpi írt, az meg XC8-ba csak az első 16 helyet címzi meg:
  1. #pragma __EEPROM_DATA(a,b,c,...,f)

Szóval ez se, amit keresek, de már közelít.
(#) nagzso válasza Hp41C hozzászólására (») Jan 22, 2013 /
 
Próbáltam ezt a megoldást, de hibát dobott égetéskor, többszöri próbálkozásra is. Itt az EEPROM résznél simán átírtam a megfelelő címeknél az értékeket, amik nekem kellenek. Nem olyan sok az a 11-13 átírás, még kivitelezhető elég gyorsan.
(#) ha191 hozzászólása Jan 23, 2013 /
 
Üdvözletem!
Segítséget kérnék 16f873a ügyben, problémám a következő:
Az AN0 éa AN1 portokról feszt szeretnék mérni, de pontatlan a mért érték, pascalban csinálom annak az ADC_read függvényével.
Nem túlságosan jó ez szerintem, pontatlan és néha akkor is mér ha 0 volt van a porton. Mintha azt olvastam volna, hogy ki kell kapcsolni a megszakítások, a komparátort és egyebeket...
Szeretném ezt megcsinálni az ADCON0 és ADCON1 és a többi ehhez szükséges regiszterekkel.
Tudnátok segíteni, hogy a regisztereket hogy állítsam be, hogy tökéletesen mérjen?
Előre is kösz!
(#) Hp41C válasza ha191 hozzászólására (») Jan 23, 2013 / 1
 
Szia!
Az aktuális csatorna kiválasztása és az A/D indítása között várj ki 2*Tad időt. Ld. Adatlap A/D fejezete. Az analóg bemeneteket tápláló áramkör kimeneti impadanciája lehetőleg ne haladja meg az 5k -t. Használj szűrőkondenzátorokat a bemeneteken. A mérőkör és egyéb digitális áramkörök föld vezetéke legyen elválasztva - a gyorsan változó, jelentős áramok, amit a digitális egységek jelváltáskor keltenek ne folyjon át az analóg földvezetékeken. A tápegyszég csillagpontja a kontroller Vss kivezetése (közelében) legyen. Ha ezek betartásával is nagy lenne a zaj, akkor több mérés eredményétt átlagold.
A hozzászólás módosítva: Jan 23, 2013
(#) ha191 válasza Hp41C hozzászólására (») Jan 23, 2013 /
 
Rendben ezeket át fogom nézni. Mondjuk a panellal már sokat nem tudok csinálni csak, hogy telepakolom a tápot és a portot is kondikkal.

Tehát azt mondod, hogy nyugodtan használhatom a kész adc_read függvényt?
Egyébként csak ezt csinálom és semmi mást:
delay_us(10);
vf:=adc_read(0);
vr:=adc_read(1);

Ez nem elég így, a függvény használata mellett is állítgatni kell a regisztereket is?
Különben megcsináltam "rendesen" is regiszterekkel az ADRESH és L-ből kiolvasva az adatot, a szimulátorban működni látszik, kipróbálni csak este tudom.
De korántsem biztos, hogy jól csináltam
Ha esetleg le tudnád írni, hogy melyik regisztert hova állítsam, hogy biztos jól működjön azt megköszönném.
(#) Hp41C válasza ha191 hozzászólására (») Jan 23, 2013 /
 
Szia!
Az a baj, hogy tudni kellene, mit csinál a Pascal adc_read(channel) eljárása.
A csatorna kiválasztása és az A/D indítása a ADCON0 regiszter bitjeivel történik:
(Már felejtem a Pascal -t...)
  1. adc_select_channel(channel)
  2. begin
  3.  ADCON0 := ADCON0 and 0xC1 or (channel shl 3);
  4. end;
  5. adc_go()
  6. begin
  7.  ADCON0 := ADCON0 or 1;
  8. end;
  9.  
  10. adc_select_channel(0);
  11. delay_us(2 * Tad);
  12. adc_go();
  13.  
  14. adc_select_channel(1);
  15. delay_us(2 * Tad);
  16. adc_go();
(#) ha191 válasza Hp41C hozzászólására (») Jan 23, 2013 /
 
Köszi próbálok ezzel valamit. Egyébként adc_go eljárás nincs, hacsaknem az ADCON0 GO bitjére gondolsz.
Viszont szimulátorban ez működik, legalábbis látom, hogy a portokat a fesz függvényében beállítja:
  1. trisb:=0;
  2. trisc:=0;
  3.  trisa:=%11111111;
  4. ADCON0:=%00000001;
  5. ADCON1:=%10000000;
  6. ADIE_bit:=0;
  7. ADIF_bit:=0;
  8. GO_bit:=1;
  9.  
  10. GO_DONE_bit:=1;
  11. [Delay_us(10);
  12. portb:=ADRESh;
  13. portc:=ADRESl;
  14. GO_DONE_bit:=0;

Ezt a pic pdf-je alapján okoskodtam ki részben Az ADIE és ADIF-eket a neten találtam, nem tudom azok milyen bitek.
Ha esetleg leírnád az ADCON0 értékadást így: ADCON0:=00000001; akkor azt jobban tudnám értelmezni
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Sziasztok!
Hogyan kell c-ben carry kersztül forgatni?
  1. rrf x,f
  2.         rlf y,f ( ez kellene ..)
  3.  
  4.         ezzel próbáltam..
  5.  
  6.  
  7.         x = ( x >> 1);
  8.         y = ( Y << 1);  de így carry nélkül megy
  9.         y = ((STATUS & 0) << 1); így is próbáltam
A hozzászólás módosítva: Jan 23, 2013
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Jó estét!
Azóta sem sikerült a carry-n kersztül forgatnom. Bonyolultabb megoldással sikerül elérnem. Igazából nem is a carry-vel dolgozom. Ez még mindig érdekelne. Ugyanakkor az is érdekelne, hogy anyagi okokból van ilyen szinten teli zsúfolva felesleges sorokkal az assembly forrása a hi-tech.c-nek? Egy kis program is tetemes helyet foglal, arról nem is beszélve hogy jelentősen lassabb.
  1. 85:                             if (Flag & 1) goto Adress;
  2.   00EC    1C79     BTFSS my_isr@Flag, 0
  3.   00ED    28EF     GOTO 0xef
  4.   00EE    28F0     GOTO 0xf0
  5.   00EF    28F2     GOTO 0xf2
  6.   00F0    2904     GOTO 0x104
  7.   00F1    2904     GOTO 0x104
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Jan 23, 2013 /
 
  1. asm rlf _y, 1 endasm;

avagy C18 -on
  1. x >>=1;
  2.  if (STATUSbits.C) y = (y << 1) | 1; else y <<= 1;
A hozzászólás módosítva: Jan 23, 2013
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Jan 23, 2013 /
 
Hát igen....
Egy full optimalizált XC8 program háromszor akkora, mint az assemby, egy standard pedig hatszor, a free móddal fordított pedig tizenkétszer. Ráadásul a fordításkor még működésképtelen kódot is előállíthat még a full mód is.
pl. Legyen x egy olyan változó, amit a főprogram ír meg, és a megszakítás kiszolgálója kezeli (többértékű szemafor).
A feladat az lett volna, hogy a z alsó 4 bitjét írjuk be az x be. A felső 4 biten lehetnek nem 0 bitek. Több helyen fordította a kövekkező kódot az XC:
  1. movf  z,w
  2. movwf x
  3. movlw 0x0F
  4. andwf z,f

Mi történik, ha a megszakítás a movwf x utasítás után csap be?

Lemondtam az XC8 használatáról. Amennyit kínlódni kellett, hogy az nyúlfarknyi C program beleférjen a kontrollerbe, azalatt az assembly megírható ilyen hibáktól mentesen, sokkal kevesebb ram felhasználásával. A full optimalizálás pofátlanul drága.
A hozzászólás módosítva: Jan 23, 2013
(#) Hp41C válasza Hp41C hozzászólására (») Jan 23, 2013 /
 
De na csak a Hitech ill. XC8 -ról legyen szó:
Kiragadott példák a C30 által forított kódból:
  1. 3140  01886   604061         and.b w0,#1,w0
  2.   3141  01888   FB8000         ze w0,w0
  3.   3142  0188A   600061         and.w w0,#1,w0

Ha a W0 -ban a második utasítás csak a 0. bitet hagyja meg, minek az első két utasítás?
  1. //      _SPI1IP = (config &0x0007);
  2.   5283  02944   78001E         mov.w [w14],w0
  3.   5284  02946   604067         and.b w0,#7,w0
  4.   5285  02948   604067         and.b w0,#7,w0
  5.   5286  0294A   604067         and.b w0,#7,w0
  6.   5287  0294C   604167         and.b w0,#7,w2

  1. 21239  0A5EC   A20400         btg w0,#0
  2.  21240  0A5EE   604061         and.b w0,#1,w0
  3.  21241  0A5F0   604061         and.b w0,#1,w0
  4.  21242  0A5F2   604061         and.b w0,#1,w0
  5.  21243  0A5F4   604061         and.b w0,#1,w0
  6.  21244  0A5F6   404100         add.b w0,w0,w2

Miért kell négyszer elvégezni az and műveletet?
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Hozzászólásaid elismerve nagyon elgondolkodtató a pic további programozási nyelve. Valószínűleg a c. csak a szélesebb látókör miatt lesz gyakorlott számomra. És talán egyszer olyan programot írok amit assemby-ben már tényleg lehetetlenség átlátni. A c. nyelv tetszetősége az elegancia és a tömörség. De ha ez azzal járhat, hogy működésképtelen akkor az tényleg kiábrándító egy bonyolultabb programnál, míg kikeresed a fordító által szerkesztett asm-ben a hibát.
Gondolom az XC8-as fordító ráadásul méregdrága? Melyik az az inegyenes fordító amit tapasztalatból tudtok ajánlani? Kritériumként persze nyilván a: leghatékonyabb és leghibamentesebb?
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Jan 23, 2013 /
 
Mindenesetre elgondolkodtató a kérdés:
XC8 (alias Hitech C): A legnagyobb Advanced Midrange kontroller 16k program memóriával rendelkezik. Ha az ingyenes fordítót használjuk, akkor kb. 16k / 12 = 1.33k assembly programot tudunk beletenni a kontrollerbe. Ez kevesebb, mint ami belefér a 16F628 -ba (2k).
Az Advanced Midrange -re mondják, hogy C frendly... Már értem, a Midrange max. 8k memóriájába csak 0.66k program férne - ez a 16C83 szintje. Tragédia. Kicsit jobb a helyzet a hajdani C18 és a hajdani C30 fordítókkal, ott az arány jobb...
A hozzászólás módosítva: Jan 23, 2013
Következő: »»   355 / 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