Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   618 / 1319
(#) aderka válasza Attila86 hozzászólására (») Dec 11, 2009 /
 
Szia!
Nem követtem végig, hogy teljesen miről is van szó, de annyira rájöttem, hogy villogtatni szeretnél. Írtam rögtönözve egy programot, ami az egész PORTB-t villogtatja.
Remélem tudtam vele segíteni!

üdv: Dávid

villog.asm
    
(#) Attila86 válasza aderka hozzászólására (») Dec 11, 2009 /
 
Szia!
A hiba nem a programomban volt, hanem az volt a gond hogy nem ismertem eléggé az MPLAB-ot.
(#) aderka válasza Attila86 hozzászólására (») Dec 11, 2009 /
 
Értem, ez esetben bocs, hogy beleszóltam!
Én asm írásra PIC Simulatort, használok. Azért szeretem, mert írás közben/után egyszerre letudom simulálni grafikusan is, és szövegesen is a program működését!
Üdv. Dávid
(#) Attila86 hozzászólása Dec 12, 2009 /
 
A PIC18f4520-nál miért azt írja a HEStore hogy 36 I/O lába van? Én akárhogy számolom, csak 34-et látok!
Az 1, 11, 12, 13, 31, 32 lábak nem lehetnek I/O lábak a kép szerint:
Kép: Hivatkozás
(#) Attila86 hozzászólása Dec 12, 2009 /
 
Ugye RA3-at ezzel tudom bemenetté varázsolni?
  1. bsf             TRISA,3


És hogyan tudok egy hex-et (a gyárilag a PIC-en lévő programot) visszaírni a PIC-be?
(#) kisszee válasza Attila86 hozzászólására (») Dec 12, 2009 /
 
Hello!

Ez a PIC18F452 rajza, a 4520 -as egy kicsit különbözik:

PIC18F4520
(#) Attila86 válasza kisszee hozzászólására (») Dec 12, 2009 /
 
Valóban, köszönöm!
(#) Attila86 hozzászólása Dec 12, 2009 /
 
A kérdéseim a következők:
1.- Meg lehet-e oldani azt egy PIC-nél (mondjuk 18f4520), hogy belső órajelről menjen, de egy lábán adja ki az órajelet? Ha igen, ez a láb melyik lehet?
2.- Hogyha én az áramkörben szeretném programozni a PIC-et, akkor azokat az I/O lábakról le kell mondanom, amelyek a PGD és a PGC funkciókat is betöltik?
3.- Ha beleírok egy olyan programot a PIC-be, ami a PGD és a PGC lábakat mondjuk digitális kimenetre állítja, akkor onnantól már soha többet nem tudom programozni a PIC-et? És a PICkit2 programozó mit fog szólni hozzá?
4.- Hogyan tudok egy hex-et beleírni a PIC-be?
5.- Ha mondjuk RA3-at szeretném bemenetnek, akkor ugye ez jó? bsf TRISA,3
6.- Ez ugye eddig jó így? Bővebben: Link

+1.- Kinéztem magamnak az LTC1865-ös A/D konvertert a Chipcad-nél: Bővebben: Link
Honnan lehet tudni hogy ez milyen tokozású?

Köszönöm a türelmeteket!
(#) szilva válasza Attila86 hozzászólására (») Dec 12, 2009 / 1
 
1. Általában meg lehet oldani, de nem az órajelet, hanem annak negyedét fogod megkapni a kimeneten. A konkrét PIC adatlapját kell átnézni az oszcillátor és a config bitek körül, hogy melyik oszcillátormód valósítja meg ezt a működést. A 18F4520-nál a korábban belinkelt oldalról az adatlapot elővéve a "2.0 Oscillator configurations" fejezetre bökve rögtön látható: 7. INTIO1 Internal Oscillator with FOSC/4 Output
on RA6 and I/O on RA7. Azaz a configban majd INTIO1 módot kell az oszcillátorhoz beállítani, és így az órajel negyede az RA6-on fog megjelenni. RA7 marad általános I/O.

2. Az ICSP kialakítása nem egy túl nagy ördöngösség, a PIC körüli áramköröket kell úgy kialakítani, hogy ne zavarja őket az, ha a PGD és PGC lábakon valamiféle kommunikáció zajlik. A Microchip is ad útmutatást erre, ha beírod a keresőjébe az ICSP kifejezést, akkor feldob találatokat mindenféle családokra vonatkozóan. Bővebben: Link
Az MCLR lábbal kell kicsit körültekintőbben bánni, ugyanis a programozás során ott megjelenik a tipikusan 12V-os Vpp. Az MCLR-hez csatlakoztatott áramköri részleteknek egyrészt ezt el kell viselniük, másrészt nem szabad leterhelniük a Vpp-t túlságosan, azaz maximum pár mA-t fogyaszthatnak 12V esetén. Emiatt a gyakorlatban legtöbbször az MCLR lábat inkább nem is szoktuk használni, egyébként is csak digitális bemenet tudna lenni. Legvégső megoldásként lehet alkalmazni jumpereket is, amikkel a programozáshoz használt lábaktól az áramkör felé elmenő vezetékek teljesen megszakíthatók a programozás idejére.

3. A PIC nem AVR, nincs olyan, hogy egy véletlenül beleírt hülye config miatt nem férsz hozzá a PIC programozásához. A PDG és PGC lábak azonnal programozáshoz megfelelő állapotúra váltanak, amint megjelenik az MCLR-en a Vpp. Az áramkörbe esetlegesen beépített, kis értékű ellenállásokkal lehet "hülyebiztosra" kialakítani a PGD/PGC környékét, így még az sem tehet kárt sem a programozóban, sem a PIC-ben, ha véletlenül "egymás ellen dolgoznának", mert pl. valamilyen okból az MCLR-re nem jut el a Vpp, és a PIC nem kapcsol át programozási módba.

4. MPLAB-bal is lehet, "import hex" után a programozáskor ezt fogja kiírni a PIC-be. Ilyesmire (meg általában is, ha éppen nem kell hardveresen debugolni valamit) inkább a PICkit2 nevű kezelőprogit szoktam használni, ott egyértelmű, hogy amit betöltesz a pufferébe, azt írja ki a PIC-be.

5. Igen, első lépésnek jó De mindenképpen meg kell győződni róla az adatlapból, hogy a kiszemelt lábon van-e valami más funkció is, pl. analóg bemenet. Ha igen, akkor végig kell nézegetni azokat a modulokat, amik az alternatív funkciókhoz tartoznak, hogy bekapcsolás után milyen állapotba kerülnek, aktív lesz-e automatikusan a lábra valamilyen funkció. Tipikus eset (inkább 16F-eknél), hogy az analóg funkciókkal rendelkező lábak analógként indulnak bekapcsolás után, ezért a digitális kimenetként használni kívánt lábról ezt "kézzel" le kell kapcsolni.

6. Én nem sűríteném ennyire össze a sok funkciót, mivel a gombnyomogatások a LED-eken fals fényeket idézhetnek elő, valamint az LCD EN lábán is jelenhetnek meg fals impulzusok.

+1. Adatlap szerint az LTC1865IS8-nak 8-Lead Plastic SO a tokozása.

Bővebben: Link
(#) szilva válasza szilva hozzászólására (») Dec 12, 2009 / 1
 
Az 5-ös ponthoz érdemes megjegyezni, hogy az adatlapban egy SFR leírásánál megtalálható az is, hogy milyen állapotba kerül a POR (Power-On Reset) után. A mellékelt képen látható, hogy az SFR bitjeit ábrázoló grafikán a legfelső sorban, a kötőjel után adják meg a bekapcsolás utáni állapotot. A rövidítések magyarázata ott van a legend-ben. Emellett szokott még lenni az adatlapokban összesítő táblázat is, ami az SFR-ek különböző forrású RESET-ek utáni állapotát foglalja össze. A korábban is emlegetett 18F4520-as adatlapban a Table 4.4-ben található ez.

rcon.JPG
    
(#) Attila86 válasza szilva hozzászólására (») Dec 12, 2009 /
 
Idézet:
„6. Én nem sűríteném ennyire össze a sok funkciót, mivel a gombnyomogatások a LED-eken fals fényeket idézhetnek elő, valamint az LCD EN lábán is jelenhetnek meg fals impulzusok.”

A nyomogatások miatti fals fények nem zavarnak, legfeljebb kiveszem a jumpert és nem világít egyik sem. Az LCD EN lábat direkt nem kötöttem rá a nyomógomb-mátrixra hogy a gombnyomás ne szóljon bele az LCD-vel való kommunikációba.
(#) Attila86 hozzászólása Dec 12, 2009 /
 
Ez így jó lesz?
Bővebben: RAJZ
(#) MPi-c válasza aderka hozzászólására (») Dec 12, 2009 /
 
Régebben én is azt hittem, hogy az általad említett program a legjobb erre, de azt lassúnak találtam. Egy áramkört pedig csak nagyon korlátozottan lehet vele szimulálni. Kényelmesebb az MPLAB-et kezelni, és a szimuláció is messze jobban megoldható.
Bővebben: Link
Bővebben: Link
Bővebben: Link
Bővebben: Link
(#) gydanee válasza Attila86 hozzászólására (») Dec 12, 2009 /
 
Hali!

Az ICSP-t én mostanában így kötöm be: Bővebben: Link
Így hibátlanul fel ismeri még a laptopom is, dióda, és kondi nélkül hülyeséget csinált nálam a PK2.
(#) MPi-c válasza (Felhasználó 15355) hozzászólására (») Dec 12, 2009 /
 
Igen, kell hozzá, de szépen "beépül".
(#) lidi válasza MPi-c hozzászólására (») Dec 12, 2009 /
 
Én külön futtatom a proteust, mert így mellette lehet használni az mplab sim et. Azzal jobb debugolni.
(#) valaki2 hozzászólása Dec 12, 2009 /
 
Hali!

MPLAB -ban "C nyelv -be" volna egy assembly időzitő rutin beszúrva. De valamiért nem jó. MPLAB SIM -be szimulálóm.

1 s -t szeretnék késleltetni. Így számoltam: 10MHz -s óra, ((254*3+2)*254*3+2)*17 = kb 1 s. A Szimulátorban a stopper 20s körül áll meg.

Ha 17 es tagot kiveszem (csak két FF van) = 20mS

Mi lehet a baj??

Kód:

a=b=0xff;
c=0x17;
_asm
jk2:
DECFSZ a, 1,0
GOTO jk2
DECFSZ b, 1, 0
GOTO jk2
DECFSZ c, 1, 0
GOTO jk2
_endasm

(#) icserny válasza valaki2 hozzászólására (») Dec 12, 2009 /
 
1. Miért nem a "gyári" késleltető függvényt használod?
2. Miért nem nézed/mutatod meg, hogy mire fordult a programod beidézett része?
(#) valaki2 hozzászólása Dec 12, 2009 /
 
140: a=b=0xff;
0CA4 0E01 MOVLW 0x1
0CA6 68DB SETF 0xfdb, ACCESS
0CA8 0EFF MOVLW 0xff
0CAA 6EDF MOVWF 0xfdf, ACCESS
141: c=0x15;
0CAC 0E15 MOVLW 0x15
0CAE 6EF3 MOVWF 0xff3, ACCESS
0CB0 0E02 MOVLW 0x2
0CB2 CFF3 MOVFF 0xff3, 0xfdb
0CB4 FFDB NOP
142: _asm
143: jk2:
144: DECFSZ a, 1,0
0CB6 2E00 DECFSZ 0, F, ACCESS
145: GOTO jk2
0CB8 EF5B GOTO 0xcb6
0CBA F006 NOP
146: DECFSZ b, 1, 0
0CBC 2E01 DECFSZ 0x1, F, ACCESS
147: GOTO jk2
0CBE EF5B GOTO 0xcb6
0CC0 F006 NOP
148: DECFSZ c, 1, 0
0CC2 2E02 DECFSZ 0x2, F, ACCESS
149: GOTO jk2
0CC4 EF5B GOTO 0xcb6
0CC6 F006 NOP
150: _endasm
(#) valaki2 hozzászólása Dec 12, 2009 /
 
Áttértem gyárira.
A szimulátorban a késleltetés 1 s. Ha a progit áttöltőm a pic -be nagyon nem 1s!!! Sokkal több. Segítsen valaki!

void main (void )
{
//unsigned char a,b,c, allapot, eredmeny;

TRISB = 0X04;
TRISA = 0X00;
INTCON2 = 0X00;
/*clearing bit, RBPU (INTCON2<7>). The weak pull-up is automatically turned off when the port pin is configured as an output. The pull-ups are
disabled on a Power-on Reset*/
ADCON1 = 0X0F;

while(1)
{
LATA = 0x00;
//void Delay10KTCYx( unsigned char unit );
Delay10KTCYx(0xFA); //FA =1s

LATA = 0x01;
Delay10KTCYx(0xFA);
}
}


ASM-be:

void main (void )
108: {
109: //unsigned char a,b,c, allapot, eredmeny;
110:
111: TRISB = 0X04;
0C5E 0E04 MOVLW 0x4
0C60 6E93 MOVWF 0xf93, ACCESS
112: TRISA = 0X00;
0C62 6A92 CLRF 0xf92, ACCESS
113: INTCON2 = 0X00;
0C64 6AF1 CLRF 0xff1, ACCESS
114: /*clearing bit, RBPU (INTCON2<7>). The weak pull-up is automatically turned off when the port pin is configured as an output. The pull-ups are
115: disabled on a Power-on Reset*/
116: ADCON1 = 0X0F;
0C66 0E0F MOVLW 0xf
0C68 6EC1 MOVWF 0xfc1, ACCESS
117:
118: while(1)
0C84 D7F2 BRA 0xc6a
119: {
120: LATA = 0x00;
0C6A 6A89 CLRF 0xf89, ACCESS
121: //void Delay10KTCYx( unsigned char unit );
122: Delay10KTCYx(0xFA); //FA =1s
0C6C 0EFA MOVLW 0xfa
0C6E 6EE6 MOVWF 0xfe6, ACCESS
0C70 EC4D CALL 0xe9a, 0
0C72 F007 NOP
0C74 52E5 MOVF 0xfe5, F, ACCESS
123:
124: LATA = 0x01;
0C76 0E01 MOVLW 0x1
0C78 6E89 MOVWF 0xf89, ACCESS
125: Delay10KTCYx(0xFA);
0C7A 0EFA MOVLW 0xfa
0C7C 6EE6 MOVWF 0xfe6, ACCESS
0C7E EC4D CALL 0xe9a, 0
0C80 F007 NOP
0C82 52E5 MOVF 0xfe5, F, ACCESS
126: }
127: }
(#) Attila86 hozzászólása Dec 12, 2009 /
 
Ennek:
  1. movlw     b'00001000'
  2. movwf     PORTC
  3. rlncf         PORTC,f

ugyebár ez lesz az eredménye a PORTC-n:
00010000

(Nálam 00000000 lesz valamiért.)
(#) watt válasza Attila86 hozzászólására (») Dec 12, 2009 /
 
Kicsit lemaradtam, de örülök, hogy milyen sokan tudnak neked segíteni! Jó kis csapat verődött itt össze!

Simpi véleményével egyetértek, áttenném az LCD-t más portra, és az AD-kre osztókat, vagy egy-két potit tennék. Amúgy a rajz alapjában jónak tűnik. Hiányolom a 100n-s kondikat, remélem csak a rajzról hiányzik, a fejedből nem! Érdemes lenne a tápokat is felrajzolni! Az ICSP nem bír el ennyi LED-et! A gombokhoz még annyit, hogy jobb lenne Vdd-re felhúzni a LED-eken keresztül és L szinttel vizsgálni(illetve kigyújtani a LED-eket). Néhány dióda is kellhet(gondold végig, ha több gombot megnyomsz), ha egyenként akarod a gombokat vizsgálni.
(#) icserny válasza valaki2 hozzászólására (») Dec 12, 2009 / 1
 
Ezzel az a probléma, hogy az a=b=0xff nem oda teszi az adatokat, ahol as assembly betét dekrementálni akarja.
(#) icserny válasza valaki2 hozzászólására (») Dec 12, 2009 /
 
Elképzelhető, hogy a valóságban nem 10 MHz-en megy az oszcillátor?
(#) Attila86 válasza watt hozzászólására (») Dec 12, 2009 /
 
Legalább két teljes port kell nekem relék vezérléséhez (PORTA, PORTC), de inkább több (+PORTB). A PORTE négy kivezetett bitjéből az MCLR megmaradna, az RE0, RE1, RE2 lábakkal pedig a külső 16 bites A/D-t vezérelném.
Így marad a PORTD, ennek kell kezelnie a nyomógombokat és az LCD-t.

A PIC saját A/D konverterei nem érdekelnek. Ez a panel nem egy univerzális fejlesztőpanel lesz, hanem szimulálja azt az áramkört amibe majd ezt bele szeretném applikálni. Egy négy és fél digites, automata méréshatár-váltós feszültség/áram/ellenállás-mérő lesz majd ebből. Csak az analóg sallangot egyenlőre lehagyom, arra majd visszatérek hogyha a programomat megírtam. Addig a sok LED a reléket helyettesíti.

Eddig egyébként így néz ki:
Bővebben: RAJZ
A megszakításokat jól gondolom hogy így tudom használni? (Jó lábakra kötöttem a gombokat?)
Kap külső tápot a LED-ek és az LCD háttérvilágítása miatt, illetve a nyomógomb-mátrixot is átrajzolom. Bár ilyenkor már túl fáradt vagyok ahhoz hogy megértsem az okát.
(#) valaki2 válasza icserny hozzászólására (») Dec 12, 2009 /
 
A rezonátorra 10.0 van írva, vagyis 10Mhz. Esetleg beállitásbeli gond??

#pragma config DEBUG = ON
#pragma config XINST = OFF //(ON)
#pragma config STVREN = OFF //(ON)
#pragma config WDTEN = OFF
#pragma config CP0 = OFF
#pragma config FCMEN = OFF // ON
#pragma config IESO = OFF
#pragma config FOSC2 = OFF
#pragma config FOSC = HS
#pragma config CCP2MX = ALTERNATE
(#) MPi-c válasza Attila86 hozzászólására (») Dec 12, 2009 / 1
 
Fő szabály, hogy a LAT regiszterekbe írunk és a PORT regiszterekből olvasunk be adatokat...
Keresendő: "Read-Modify-Write"
(#) Hp41C válasza icserny hozzászólására (») Dec 12, 2009 /
 
Sziasztok!

Ráadásul az első legbelső ciklus első lefutásánál indul csak 255-ről a többi 0-ról. Ugyanez igaz a középső ciklusnál is. A periódust minden lefutás előtt be kellene állítani.

Sziasztok.
(#) watt válasza Attila86 hozzászólására (») Dec 12, 2009 /
 
Nem tudtam, hogy ez egy céláramkör lesz. Akkor maradhat természetesen.
Általában a testhez történő vizsgálatok kevesebb zavarral szoktak járni.
(#) valaki2 hozzászólása Dec 12, 2009 /
 
Egy nagyon zavarós program, de müködik!! A LED villóg! Szerintem a Simulátor beállitása nem jó. A panelon kb 1-s a kitöltési tényező. A simbe stopwatch 875.2uS!!!




void main (void )
{

int k;
unsigned long i,j, alap, szek;


TRISB = 0X04;
TRISA = 0X00;
INTCON2 = 0X00;



/*clearing bit, RBPU (INTCON2<7>). The weak pull-up is automatically turned off when the port pin is configured as an output. The pull-ups are
disabled on a Power-on Reset*/
ADCON1 = 0X0F;

while(1)
{
LATA = 0x00;
//void Delay10KTCYx( unsigned char unit );
//Delay10KTCYx(0xFA); //FA =1s
// Delay10KTCYx(0xFA);

k=40;
szek= 0xfffffffff;
alap = 0xfffffffff;

do
{
for (i=4000000000; i=0; i--)
{
alap = alap - 1;
for (j=4000000000; j=0; j--)
{
szek= szek-1;
}
}
k--;
}
while (k >= 0);

a=0x00;





LATA = 0x01;
//Delay10KTCYx(0xFA);


// 24 bites -> 0 - 16,777,215

k=40;
szek= 0xfffffffff;
alap = 0xfffffffff; // s = hány másodperces legyen a késleltetés

do
{
for (i=40000000000; i=0; i--)
{
alap = alap - 0x01;
for (j=4000000000; j=0; j--)
{
szek= szek-1;
}
}
k--;
}
while (k >= 0);
a=0x00;
}
}
Következő: »»   618 / 1319
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