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   242 / 1210
(#) maestro hozzászólása Ápr 21, 2012 /
 
Belső Timer modulokkal lehet olyan megszakítást kérni, hogy ha túlcsordul, akkor automatikusan ugorjon egy szubrutinra bárhol is tart a fő program futása?
Tehát ne nekem kelljen lekérdezni a túlcsordulást jelző bit állapotát.
(#) Hp41C válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Szia!

Igen tudsz... A megszakítás pont erre való. A kérések bekövetkezésekor a megszakítás kiszolgáló rutinra kerül a vezérlés. A megszakítás okát programból kell megállapítani és kiszolgálás közben törölni.
(#) maestro válasza Hp41C hozzászólására (») Ápr 21, 2012 /
 
Helló!
És azt hogy kell? Mert eddig úgy csináltam, hogy a főciklus elején vizsgáltam pl. az INTCON regiszter T0IF bitjét pl. BTFSS utasítással és ha az 1-en volt akkor hívtam meg a szubrutint egy CALL utasítással. Csak ezzel az a baj, hogy előbb le kell futnia a ciklusnak, hogy újra megvizsgálhassa, hogy történt-e megszakítás. De nekem azonnal kellene, hogy megszakítsa. Erre való az az ORG 4?
(#) acoustic hozzászólása Ápr 21, 2012 /
 
Sziasztok!

Szeretném kérdezni, a nagyon hozzá értő fórum társaimtól hogy:

A Digitális forrasztó állomás2 építgetem, és saját hibámból(elbénáztam) sikerült tönkre tennem a pic16f88 ast. A kérdésem a következő lenne:
Ki tudom cserélni a pic16f88 ast egy pic18f2550 re ha a megfelelő lábait a megfelelő helyre kötöm? Ugyanis másik pic16f88 asom nincs ithon de 18f2550 esem van. A programban is kellene modositanom?,
És rendelni 1 pic et nem szeretnék.

Segítségeteket elöre is nagyon köszönöm

Hp41C forumtárs, az elözöekben leirt segítségedet köszönöm ((#1211017) Hp41C válasza acoustic hozzászólására (#1210970) ) sajnos a LVP beállitásokkal sem sikerült felprogramozni a 16f88 ast és most jutottam el a fojtatáshoz,, de nagyot hibáztam és elfüstölt..
(#) maestro válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Azt hiszem túl hamar kérdeztem, egy kis keresgélés és gondolkodás után azt hiszem meg van a válasz.
De leírom, szóljatok ha nem jól gondolom (akkor is ha jól)
Szóval ha bármelyik bemeneten érzékel megszakítást a PIC (pl. Timer0, Timer1, vagy RB4:RB7 lábak), akkor automatikusan átugrik az ORG 4 lapra és ott kell nekem megvizsgálnom az INTCON regisztert, hogy mi váltotta ki a megszakítást. De előtte el kell mentenem a WORK és STATUS regisztereket, majd ha lekezelte a megszakítást a szubrutinom, akkor vissza töltöm őket a W-be és a STATUS-ba, majd RETFIE utasítással vissza lépek ORG 0-ra.
Csak én eddig nem tudtam mire jó az az ORG 4 ezért bele sem tettem, így nem vettem észre, hogy használható is valamire.
Jól gondolom?
(#) Zsora válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Majdnem teljesen jó, kivéve az ORG szerepét.
Az ORG parancs azt adja meg a fordítónak hogy az aztkövető programot/utasításokat/adatokat melyik memóriacímre tegye.
(#) maestro válasza Zsora hozzászólására (») Ápr 21, 2012 /
 
De ha megszakítás van, akkor az ORG 4-re ugrik mindenféleképpen, nem? Tehát nem kell beállítanom semmit.
(#) Zsora válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Nem teljesen így van.
Megszakítás bekövetkeztekor a proci még befejezi az éppen feldolgozott utasítást, majd a programszámláló értékét a verembe menti, ill. törli a megszakítások engedélyezése bitet. Ezután a 4-es memóriacímen lévő értéket a programszámlálóba tölti. Ezzel a megszakításkezelő rutin kezd el futni. Mikor ez a rutin elér a RETFI utasításhoz, a veremből visszatöltődik a programszámláló megszakítás előtti értéke, majd újra engedélyeződnek a megszakítások. Tehát folytatódik tovább a főprogram.
Az ORG utasítás csak a fordítónak szól, hogy a megszakításvektor címét a 4-es memóriacímre kell tenni.
(#) maestro válasza Zsora hozzászólására (») Ápr 21, 2012 /
 
Azért azt én is gondoltam, hogy nem hagy félbe egy utasítást.
De ha mondjuk olyan van, hogy egy BTFSS utasítás végrehajtása alatt jön a megszakítás és a BTFSS olyan eredményt ad, hogy egy GOTO paranccsal egy címkére kell ugorjon, akkor gondolom csak a megszakítás után fog ugrani a GOTO által megjelölt címkére. Nem?
Az meg, hogy ő még mit csinál megszakítás előtt és után, milyen biteket töröl, programozási szempontból annyira nem fontos ha utána egyedül tudja folytatni a programot ott ahol abbahagyta mindenféle beavatkozó parancs nélkül.
(#) Zsora válasza Zsora hozzászólására (») Ápr 21, 2012 /
 
A reset miatt a 0-ás címen egy GOTO utasításnak kell lenni. Ennek elhelyezéséhez kell az ORG 0 parancs.
A megszakításvektor címére történő íráskor pedig az ORG 4 parancsot használjuk. Mégegyszer: ezek nem a proci számára végrehajtandó utasítások, hanem a fordítónak kellenek csak.
(#) Zsora válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Persze.
De ezt a kis körítést csak a korábbi mondatod miatt írtam:
"...majd RETFIE utasítással vissza lépek ORG 0-ra."

Nem! Nem ugrik vissza ORG 0-ra. (Max. a 0-ás memóriacímre.) Oda ugrik vissza (arra a memóriacímre), ahol a végrehajtást megszakította.
(#) maestro válasza Zsora hozzászólására (») Ápr 21, 2012 /
 
Az ORG 0 meg a 0-ás memória címet jelöli/jelenti.
De mindegy, annyira most nem akarok belemélyedni a proci belső lelki világába, elég ha tudok neki parancsolni.
De köszi a válaszokat.
(#) speed008 hozzászólása Ápr 21, 2012 /
 
Üdvözletem!

Most kezdtem el a PIC-el foglalkozni. A kapcsolások között található dobókockát szeretném megvalósítani.
A PIC égetésére:

http://plc.mechatronika.hu/egeto/eget.htm

ezt az elektronikát szeretném megalkotni.
A pic ellenőrzésére halottam ellenőrző áramkörökről, de jól átláthatót még nem találtam.

Ez micsodára jó?
A linken említett kapcsolás működhet?
Nem tudnátok egy jó ellenőrző áramkör kapcsolást adni? esetleg nyák tervel?

Előre köszönet mindenkinek!
(#) vilmosd válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Lesd meg ezt. Az utolso oldalon szepen bemutatja a Stack es az IT kezelest.
(#) SKY válasza Hp41C hozzászólására (») Ápr 21, 2012 /
 
Hello!
Bemásolok egy programrészletet amivel az AD-t akartam kipróbálni:
while(1)
{
adcon0=0b10010001; //ADC csatorna beállítása, stb
adcon0=0b10010100; //ADC átalakítás elindítva
if(adcon0==0b10010100) //amíg nem végez az ADC addig ne haladjon tovább a program
{
delay_us(1);
}
fesz1=adresh;
fesz1= fesz1 << 8;
fesz1=fesz1+adresl;
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // kurzor kikapcs
lcd_out(1,1,"U=");
lcd_chr_cp(fesz1*4/10000);
lcd_chr_cp((fesz1*4/1000)%10);
lcd_chr_cp((fesz1*4/100)%10);
lcd_chr_cp((fesz1*4/10)%10);
lcd_chr_cp(fesz1*4%10);
lcd_out(1,9,"mV");
delay_ms(100);
}
Az AD eredményét így jól tettem egy változóban? A számok kiírásának így jónak kellene lennie?>>
(#) Zsora válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Ez így nem jó. A következő lépcsőknek (kisebb helyiértékek) mindig a maradékot kellene feldolgozni!
(#) Zsora válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Példaként egy háromjegyű szám kiírása:

Általam használt jelek:
X - az eredeti szám (max. 999)
\ - egész osztás
mod - osztás maradéka

A programrészlet:

lcd_chr_cp(X\100)
X = X mod 100
lcd_chr_cp(X\10)
X = X mod 10
lcd_chr_cp(X)
(#) vilmosd válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Mondjuk ez igy sohasem fog dolgozni. Az elso sorban berugod az AD-t:
  1. adcon0=0b10010001; //ADC csatorna beállítása, stb
Majd a kovetkezo sorban rogton le is allitod.
  1. adcon0=0b10010100; //ADC átalakítás elindítva
Ugye az ADCON0 regiszter 0 bitje az ADON bit. Amikor az ADGO bitet 1-be allitod, akkor az ADON-t 0-ba. igy mar az AD nem fog dolgozni. Szerencsesebb lenne ha pl definialnal biteket (vagy a header tartalmazza gyarilag) es azt billegtetned, es figyelned. Pl
  1. #define  ad_on ADCON0.0
  2. #define  ad_go ADCON0.2
A kodban igy lehetne hasznalni:
  1. ad_on=1;
  2. ad_go=1;
  3. while(ad_go)
Igy szemleletesebb a kodod is, es nem kell allandoan az adatlapot lesni.
Ja es a hsz is szebb ha hasznalod a "Kod" gombot.
(#) Hp41C válasza speed008 hozzászólására (») Ápr 21, 2012 /
 
Szia!

Ha nem szeretnél sok problémával küzdeni, ne építs JDM programozót. Ld. a topik elején:
Idézet:
„Kerülendő a JDM (soros porti) programozó.”
(#) Hp41C válasza maestro hozzászólására (») Ápr 21, 2012 /
 
Szia!

Olvastad?
(#) SKY válasza Zsora hozzászólására (») Ápr 21, 2012 /
 
Pontosan ilyenre gondoltam. De a "mod" parancsot nem ismeri a mikroC, mi az ottani megfelelője, esetleg írjak hosszabb képletet a maradék képzésére?
(#) vilmosd válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Eleg sok "C" hasznal "%" Modulus operatort. Ez az osztas maradekat adja vissza. Lsd "Reference Guide for mikroC"
(#) SKY válasza vilmosd hozzászólására (») Ápr 21, 2012 /
 
Értem, majd kipróbálom. Most ezt találtam ki, szerintem működik, csak az A/D-val vannak még gondjaim.
  1. lcd_out(1,1,"U=");
  2. i=fesz1;
  3. lcd_chr_cp(48+i/10000);
  4. i=i-(i/10000)*10000;
  5. lcd_chr_cp(48+i/1000);
  6. i=i-(i/1000)*1000;
  7. lcd_chr_cp(48+i/100);
  8. i=i-(i/100)*100;
  9. lcd_chr_cp(48+i/10);
  10. i=i-(i/10)*10;
  11. lcd_chr_cp(48+i);
  12. lcd_out(1,8,"mV");

Végül is melyikkel végez gyorsabban a PIC? Melyik megoldáshoz tartozik több elvégzendő művelet? Ha a fentebbi sorokat használom, vagy ha %-jellel írom meg?
(#) trudnai válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Biztos lehetsz abban, hogy amit Te csinalsz hazilag, az hosszabb es lassabb lesz, mint a gyari fuggvenyek -- ez alol csak az a kivetel, ha egy altalanos celu fuggvenyt hasonlitasz ossze egy specialissal ami csak neked kell es csak az adott feladathoz lenne jo. Tehat ahol csak lehet a beepitett fuggvenyeket hasznaldd (ezert nem ertem miert nem hasznalod az itoa-t...)

Na mindegy, amit leirtal matematikailag jo, csak eszre kell venned az egyes polinomok osszefuggeseit, es altalanosabban megfogalmazni mit is csinalsz ott. Pl a 48 helyett irhatsz '0' -t is, majd a fordito fogja tudni mi az es hogyan kell ertelmezni, neked azonban konyebbseg, hogy tudod ASCII 0-t adsz hozza. A masik a 10-el csokkeno oszto. A harmadik, hogy az elosztott szamot kiirod, majd ujra elvegzed az osztast, hogy aztan beszorozd. Szoval jo sok felesleg van ott es nem is jol kovetheto, hogy mi zajlik le. Ehelyett csinalhatnal akkor mar egy fuggvenyt, ami tulajdonkepp ugyanazt csinalja, csak epp latni is lehet mi zajlik le:


  1. SzamKiiras2( int szam )
  2. {
  3.     int  oszto;
  4.  
  5.     for ( oszto = 10000; oszto > 0; oszto /= 10) {
  6.         lcd_chr_cp( szam / oszto + '0' );
  7.         szam %= oszto;
  8.     }
  9.    
  10. }
(#) SKY válasza trudnai hozzászólására (») Ápr 21, 2012 /
 
Talán azért, mert nem tudom mi az az "itoa". Ez magát a függvényt jelenti, amit bárhol meghívhatsz?
Ha én akarok csinálni egyet, mint pl az adc_read, ahol megadhatod a csatornát is, akkor hogyan készíthetem el, hogy tudja a mögé beírt szám a csatornát fogja jelenteni? Mert aztán a függvényben bitenként be lehet állítani a megadott változó szerinti biteket, csak nem tudom elképzelni hogyan is kell megadni vagy hozzárendelni... Például:
  1. adcminta (i)
  2. {
  3. adcon0.4=i.0;
  4. adcon0.5=i.1;
  5. adcon0.5=i.2;
  6. stb...
  7. }
  8.  
  9. Ez esetben elég meghívni az adcminta-t és megadni a változóértékét? Vagy hogyan lehet csak számot írni, úgy hogy az i-nek nem kellett előtte értéket adnunk?
(#) trudnai válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Erdemes lenne C konyvet olvasgatni, barmilyet! Pl itt is le van irva mi az itoa:

Bővebben: Link

De akar igy is utana nezhetsz:

Google a baratod!
(#) matheattila válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Szia,
erre van több féle füffvény is a mikroC-ben pl:
ByteToStr(), IntToStr(), LongToStr(), FloatToStr() és még legalább 10 féle, a helpben keress utána, ott minden függvényt megtalálsz csak keresni kell

itt egy példa:
  1. int j = -4220;
  2. char txt[7];
  3. ...
  4. IntToStr(j, txt);  // txt = " -4220"
  5. LCD_Init();
  6. LCD_OUT(1,5,txt); //1. sor 5. oszloptól kezdődik

Remélem segítettem, jó munkát
(#) szaffo555 hozzászólása Ápr 21, 2012 /
 
Az alábbi kódrészletet próbálom lefordítani. Miért van az, hogy csak relocalható módban megy hiba nélkül?
  1. grup1  udata_acs                          
  2. group1_var1  res  1    
  3. group1_var2   res  1
  4.  
  5. group2       udata                            
  6. group2_var1  res  1    
  7. group2_var2   res  1    
  8. RST  CODE   0x0

Másik kérdés, hogy miért adja a "207 Found label after column 1" figyelmeztetéseket?
(#) gyengus hozzászólása Ápr 22, 2012 /
 
Sziasztok!

PIC16F1938-at használok és MPLAB XC8 fordítót.
Adatlap alapján beállítottam a Timer0-t, de valamit nagyon elnéztem/elszámltam, ugyanis a vártnál sokkal lassabban jönnek a megszakítások.

A PIC órajele 32MHz.
TMR0CS = 0, tehát a timer órajele a belső órajel/4 = 8MHz
Előosztónak 256-ot állítottam: PSA = 0 és PS = 111
A megszakításban még van egy változó, hogy csak minden másodikat vegyen figyelembe.
Tehát szerintem 15 625 Hz-el kellene, hogy jöjjenek a megszakítások.

Ha próbából lejjebb vettem az előosztót, vagy kikapcsoltam, még akkor is túl lassú volt.

Mellékelem a kódot. Valaki lenne szíves ránézni, hol rontottam el?

main.c
    
(#) kissi válasza szaffo555 hozzászólására (») Ápr 22, 2012 /
 
Szia!
Azért megy csak relokálható kódban, mert ezek a változó megadások csak úgy működnek ! A hibakód meg abból adódik, hogy mivel abszolút kódnál nem adhatod meg így a változóidat, ezért címkének veszi és azt az 1.oszlopban várja alapértelmezetten!

Steve
Következő: »»   242 / 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