Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
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
Szia!
A hiba nem a programomban volt, hanem az volt a gond hogy nem ismertem eléggé az MPLAB-ot.
É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
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
Ugye RA3-at ezzel tudom bemenetté varázsolni?
És hogyan tudok egy hex-et (a gyárilag a PIC-en lévő programot) visszaírni a PIC-be?
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!
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
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.
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.
Ez így jó lesz?
Bővebben: RAJZ
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
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.
Igen, kell hozzá, de szépen "beépül".
Én külön futtatom a proteust, mert így mellette lehet használni az mplab sim et. Azzal jobb debugolni.
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
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?
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
Á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: }
Ennek:
ugyebár ez lesz az eredménye a PORTC-n: 00010000 (Nálam 00000000 lesz valamiért.)
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.
Ezzel az a probléma, hogy az a=b=0xff nem oda teszi az adatokat, ahol as assembly betét dekrementálni akarja.
Elképzelhető, hogy a valóságban nem 10 MHz-en megy az oszcillátor?
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.
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
Fő szabály, hogy a LAT regiszterekbe írunk és a PORT regiszterekből olvasunk be adatokat...
Keresendő: "Read-Modify-Write"
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.
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.
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; } } |
Bejelentkezés
Hirdetés |