Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   852 / 1319
(#) icserny válasza levi18 hozzászólására (») Dec 3, 2010 /
 
A linker állományt is módosítani kell, hogy a boot terület PROTECTED legyen. Ha megnézed a honlapomon a PICula projektet és letöltöd a szoftver segédletét (code_examples.zip), akkor abban meglátod, hogy én hogy csináltam.

  1. //=== If used in conjunction with bootloader leave space for it ====
  2. #IFDEF USE_BOOTLOADER  
  3. CODEPAGE   NAME=bootloader START=0x0000         END=0x07FF          PROTECTED
  4. CODEPAGE   NAME=vectors    START=0x0800         END=0x0829          PROTECTED
  5. #DEFINE _CODESTART 0x082A + 0  
  6. #ELSE  
  7. CODEPAGE   NAME=vectors    START=0x0000         END=0x0029
  8. #DEFINE _CODESTART 0x002A + 0
  9. #FI
  10. //=== This is the main space for application code =============
  11. CODEPAGE   NAME=page       START=_CODESTART        END=_CODEEND
  12. #IFDEF _DEBUGCODESTART
  13. CODEPAGE   NAME=debug      START=_DEBUGCODESTART   END=_CEND        PROTECTED  
  14. #FI



Én is az AN1310 bootloadert használom, de csak 0x800-tól kezdve helyezem el az alkalmazói programokat, mert ekkora a boot blokk mérete, s így tudom azt írásvédetté tenni.
(#) levi18 válasza icserny hozzászólására (») Dec 3, 2010 /
 
Köszönöm szépen, holnap kipróbálom.
(#) levi18 válasza icserny hozzászólására (») Dec 4, 2010 /
 
Működik most már a bootlopaderrel, mégegyszer köszönöm. Viszont akadt még egy problémám. Kipróbáltam ,hogy az interrupt is működik-e megfelelően, de a timer interrupt és az int0 is csak egyszer hajtódik végre. A probléma amiatt van szerintem, mert, ha megszakítás érkezik, elugrik a 0x08-as címre,
onnan átugrik a 0x408-as címre, végrehajtja az interruptot, de csak sima return utasítással tér vissza a főprogramba. Legalábbis ezt láttam a disassembly-listában. Ez azt eredményezi, hogy az INTCON regiszterben a GIE bit nem állítódik vissza 1-be, mert azt a retfie utasítás tenné meg. Most úgy működik rendesen, ha az ISR rutin végén mindig 1-be állítom a GIE bitet.
Azt nem tudom, hogy korrektnek számít-e ez a megoldás? Te nem akadtál ilyen problémába?
(#) szepnorbee hozzászólása Dec 4, 2010 /
 
Üdv mindenki! Segítséget szeretnék kérni! Van nekem egy PIC18F458-as mikrovezérlőm. Sajnos nincs PIC programozóm. Esetleg valaki elvállalné, hogy beleír nekem egy általam mellékelt HEX fájlt ha elküldöm postán a cuccot? Egy OP-COM eszközbe van beleszerelbe az IC. Van egy leírásom miszerint simán lehet PICkit2-vel pl. a helyén is égetni. Nem ingyen kérném, de reális áron. Köszi előre is mindenki! PÜ-t várok! Üdv!
(#) icserny válasza levi18 hozzászólására (») Dec 4, 2010 /
 
1. Az átirányított RESET és interrupt vektorokban egy ugróutasítást kell elhelyezni:
  1. #pragma code REMAPPED_RESET_VECTOR = 0x400
  2. void _reset (void)      {
  3.     _asm goto _startup _endasm
  4. }
  5. #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = 0x408
  6. void Remapped_High_ISR (void) {
  7.     _asm goto hi_isr _endasm
  8. }
  9. #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = 0x418
  10. void Remapped_Low_ISR (void) {
  11.     _asm goto lo_isr _endasm
  12. }


2. A programmegszakítást kiszolgáló eljárásoknál jelezni kell, hogy ezek nem közönséges eljárások (#pragma interrupt, vagy #pragma interruptlow), ekkor nem return, hanem retfie fast vagy retfie kerül az eljárás végére.
  1. #pragma interrupt hi_isr
  2. void hi_isr (void) {
  3.   /* Magas prioritású megszakítás kiszolgálása */
  4. }
  5.  
  6. #pragma interruptlow lo_isr
  7. void lo_isr (void) {
  8.   /* Alacsony prioritású megszakítás  kiszolgálása */
  9. }
  10.  
  11. void main(void) {
  12.  /* Itt helyezkedik el a főprogram */
  13. }
(#) icserny válasza levi18 hozzászólására (») Dec 4, 2010 /
 
Idézet:
„Most úgy működik rendesen, ha az ISR rutin végén mindig 1-be állítom a GIE bitet. Azt nem tudom, hogy korrektnek számít-e ez a megoldás?”
Így semmiképp sem korrekt, mert elmarad a futó program állapotának (a létfontosságú regiszterek tartalmának) mentése és visszaállítása.
(#) levi18 válasza icserny hozzászólására (») Dec 4, 2010 /
 
Köszönöm, ezt az előfordító utasítást hagytam le:
#pragma interrupt. De most már teljesen jó.
(#) kormika hozzászólása Dec 5, 2010 /
 
Sziasztok! Most kezdtem a PIC programozást, és akadt egy kis gondom a megszakításkezelésse, egészpontosan egy PIC 16F819-es PIC-et szeretnék használni egy nyolc LED-es fényeffektben, és itt az lenne a feladat, hogy mikor az RB0-ra jön egy lefutóél a nyomógombról, akkor kérjen egy megszakítást, és váltson effektet. Minden megy frankón, de a megszakítás nem hajlandó működni, nem tudom mit rontottam el, segítsetek légyszíves, ha valaki leírná erre a picre azt, hogy hogyan kezeljem a megszakítást az jó lenne. Előre is köszönöm
(#) vilmosd válasza kormika hozzászólására (») Dec 5, 2010 / 1
 
Hali
Esetleg ha mellekelned a Te altalad irt progit, akkor lehet hogy gyorsabban segithetnenk.
Csa Vili
(#) kormika válasza vilmosd hozzászólására (») Dec 5, 2010 /
 
Köszönöm a segítséget, ez nem a fényeffekt progi, de a megszakításnak itt is mennie kellene. Nem tudom mi lehet a gond, nem vagyok nagy spieler ebben, de szeretnék egszer majd az lenni .

RCStopper.asm
    
(#) Hp41C válasza kormika hozzászólására (») Dec 5, 2010 / 1
 
Szia!

Rögtön, első ránézésre két hiba:
- A megszakítási rutinnak a 0x0004 címen kell kezdődnie,
- A megszakítási rutin elején a W és a STATUS regiszterek értékét menteni kell, a visszatérés előtt pedig visszaállítani. A feladattól függően más regiszterek mentése is szükséges lehet : PCLATH, FSR stb...
(#) kormika válasza Hp41C hozzászólására (») Dec 5, 2010 /
 
Köszönöm, átírom a címet, és mentem a mentendőket, és próbálkozom úgy.
(#) kormika válasza kormika hozzászólására (») Dec 5, 2010 /
 
Nagyon szépen köszönöm működik most már, még 1 x hálás köszönetem.
(#) pixels válasza kormika hozzászólására (») Dec 5, 2010 /
 
Még annyit hozzátennék, hogy néhány helyen láttam hibásan a W és STATUS elmentés MOVF vagy MOVFW utasítással megoldva. Ezek használata elrontja a mentést, mivel felülírhatja a STATUS bitjeit

Itt találsz egy helyes algoritmust

Ahova mentesz, az legyen olyan helyen, ami minden bankból elérhető, pl 16f628-on a 0x70-0x7F címeken.
(#) Hp41C válasza pixels hozzászólására (») Dec 5, 2010 /
 
Ha pedig nincs ilyen hely (16F873), akkor minden bankban fenn kell tartani egy helyet a W mentésére (a címének alsó 7 bitje egyezen meg). A W mentése után STATUS a W -be menthető (swapf), a STATUS regiszter bank kiválasztó bitjei már megváltoztathatók. A többi mentésnek már elég egy bankban foglalni. Visszaállításnál a STATUS visszaállítása a bank kiválasztást is visszaállítja. Ezután kétszeri swapf segítségével a W tartalma visszaállítható, abból a bankból fogja venni az értéket, amiből mentette.

Sok 18F nem jól kezeli a movff, movsf, movss utasítást ha a cél regiszter a WREG, STATUS, BSR. Kerüljük (a sok adatlapban ajánlott) movff utasításokkal történő mentést és visszaállítást. A movff, movsf, movss utasítást ne használjuk a megszakítási regiszterek módosítására sem, ha bármelyik megszakítás engedélyezett.

(A movsf, movss utasításokat ld. Extended Instruction Set leírásában)
(#) messer hozzászólása Dec 6, 2010 /
 
Sziasztok. A kérdés a következő dspic pwm modult boncolgatom sikerült életre keltenem a regiszterek megfelelő beállításaival, (adatlap alapján) Viszont szimulálás közben azt tapasztaltam, hogy folyamatos run módban jól végzi a dolgát a megfelelő regiszterek törlődnek számólnak, de stepinto-nál mikor egyenként léptetem nem történnek meg a megfelelő történetek. Konkrétan:
[/code]
#WORD PTCON = 0x1c0
#WORD PWMCON1 = 0x1c8
#WORD OVDCON = 0x1d4
#WORD PTPER = 0x1c4
#WORD PDC1 = 0x1d6


void main() {

PTCON=0b1000000000000000;
PWMCON1=0b0000111111111111;
OVDCON=0b1111111111111111;
PTPER=100;
PDC1=50;

while(1)
{}
}[code=c]
A ptmr számláló el kezd számólni, mikor eléri a ptper-ben beállított értéket nullázódik a ptmr és újra számol. Step módban nem nullázódik mikor eléri a ptper-ben beállított értéket hanem számol felfelé tovább. Run módban tökéletesen működik. Ez zavar mert jó lenne látnom mikor mi hogyan történik.

Válaszotokat köszönöm.
(#) messer válasza messer hozzászólására (») Dec 6, 2010 /
 
Pfff hiba oka a Ptcon regiszterben Pten bitet később kel setelni, előtte kell feltölteni a számláláshoz a regisztereket.Így már a legelső elején is teszi a dolgát.
(#) Hp41C hozzászólása Dec 7, 2010 /
 
Sziasztok!

20% engedményes év végi akció a ChipC@d -nál a Microchip fejlesztőeszközökre (január 7-ig)...
(#) delmur82 hozzászólása Dec 7, 2010 /
 
Sziasztok!

Eddigiekben már kommunikáltam PIC és PC között soros porton keresztül egy egyszerű terminál progival. Itt karakteres parancsokkal vezéreltem a PIC - et. Kicsit szeretnék megismerkedni a grafikus megoldásokkal is. Tehát például az '1' -es karakter elküldése helyett egy grafikus nyomógombot kellene megnyomni. Milyen programot ajánlotok?
(#) icserny válasza Hp41C hozzászólására (») Dec 7, 2010 /
 
A leértékelt cuccok között "jóárúsították" a DM330013 - Microstick for dsPIC33F and PIC24H kártyát is, ami a 16 bites adatúttal rendelkező mikrovezérlőkkel való ismerkedésre jól használható, s beépített programozót/debuggert is tartalmaz.

Akit érdekel, használhatja hozzá a honlapomon található PIC-kwik projekt c. tananyagot és a mintapéldákat.
(#) chriskross hozzászólása Dec 7, 2010 /
 
Valaki találkozott már azzal a problémával, hogy MPLAB "PKWarn0003: Unexpected device ID"-t ír ki, a Pickit 2.61 meg simán felismeri a PIC-et (16F819). Reggel még az MPLAB is felismerte. Felprogramoztam és utána írta ki, hogy nem ismeri fel a PIC-et. Több PIC-kel is kipróbáltam csak a két darab 819-est nem ismeri fel, de csak azután, hogy felprogramoztam... Pickit 2.61-gyel simán tudom programozni. Természetesen semmi nincs a PIC-re kötve programozás közben. A céláramkörben egy RGB LED van a PIC RB4, RB5, RB7 lábaira kötve három ellenállással és RB6 a katódjára. Működik is a programom rendesen, csak MPLAB-ban nem ismeri már fel a PIC-et... Próbáltam már más USB-ben is és a gépet is újraindítottam, hátha... de nem jött semmilyen csoda
(#) vilmosd válasza chriskross hozzászólására (») Dec 7, 2010 /
 
Halai
Gondolom belso RC osci. Hasznald a PK2 sajat progijat, ne az MPLAB-ot a programozashoz.
Csa Vili
(#) chriskross válasza vilmosd hozzászólására (») Dec 7, 2010 /
 
Igen belső. Igen, de az MPLAB sokkal kényelmesebb... és kb egy éve ezzel programozom a 819eimet és ilyen soha nem történt... Illetve volt, hogy kiírta már, de akkor egy progi újraindítás mindig segített... Már az sem.
(#) Hp41C válasza chriskross hozzászólására (») Dec 7, 2010 /
 
Szia!

A kontrollert belső órajelről járatod, PGC vagy PGD lábat kimenetnek vagy Timer1 oszcillátornak, stb. használod, és a kimenetet elég hamar beállítod.
- A PICKit2 saját programja, Vpp first programming entry módszer - a Vdd -t a PICKit2 -nek kell adnia.
- A program elejéte tegyél be néhány ms késleltetést, mielőtt a portokat kimenetté, oszcillátornak állítod be.
(#) chriskross hozzászólása Dec 7, 2010 /
 
Isten vagy! Na ezt a hozzászólást el is mentettem Látja mindkét progi és írni, olvasni is lehet. Köszi a gyors segítséget!
(#) jury hozzászólása Dec 7, 2010 /
 
Sziaztok !
Most kezdtem Pic-kel foglalkozni.
Azt szeretném kérdezi,hogy a Pic kit 2 tudja-e kezelni a Pic 18f45k20 controllert ami a Picklit 3 debug expresz panelon van?
(#) chriskross válasza jury hozzászólására (») Dec 7, 2010 /
 
Igen kezeli.
(#) accesid hozzászólása Dec 7, 2010 /
 
Sziasztok.
Pic 16f628 RB6-RB7 lábakon egy 62768Hz-es rezonátor a két kondijával és a következő beállitásokkal:
T1CON.T1OSCEN = 1
T1CON.T1CKPS1 = 0
T1CON.T1CKPS0 = 0
T1CON.TMR1CS = 1
T1CON.TMR1ON = 1
INTCON.GIE = 1
PIE1.TMR1IE = 1

Csereltem már a rezonátort, de probléma változatlan megszakitás (PIR1.TMR1IF) kb. 3-4 sec-enként van és a T1CON.T1CKPS1 - T1CKPS0 hiába valtoztatom a megszakitás ugyanúgy "késik". A RB6-RB7 lábakon 32,8KHz-et mértem.
Mit rontottam el?
(#) trudnai válasza accesid hozzászólására (») Dec 7, 2010 /
 
Idézet:
„Pic 16f628 RB6-RB7 lábakon egy 62768Hz-es rezonátor”

...
Idézet:
„A RB6-RB7 lábakon 32,8KHz-et mértem.”


Gondolom 32768Hz-es rezonatort akartal irni? Az amugy biztos, hogy rezonator? Nem kristaly?

A megszakitasban mit csinasz amugy?
(#) Hp41C válasza accesid hozzászólására (») Dec 8, 2010 /
 
Szia!

A timer1 16 bites, 65536 -tal oszt (ha az előosztó 1), tehát 2 s -ként kell megszakítást kérnie. Az egy másodperces megszakításhoz a TMR1H 7. bitjét egybe kell állítani a timer beállításánál és a megszakítási rutinjában. A timer1 írásánál sok kontrollerben probláma van ld.: Timer1 modul errata.
Következő: »»   852 / 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