Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   1 / 11
(#) ndavid87 válasza pajti2 hozzászólására (») Aug 24, 2017
Idézet:
„Kipróbálni sajnos most nem tudom, de szerintem...”

Én kipróbáltam, és azt írtam le amit tapasztaltam.
Ha arra a két lábra volt kötve a programozó, és a pic már átkapcsolta azokat oszcillátor módba sem a programozás, sem a programmemória törlés vagy ellenőrzés nem működött.
Másik PGEC-PGED párokon továbbra is ment minden.

A tesztprogramban a másodlagos oszcillátor timer1-et hajtotta, ami egy másodpercenként generált egy megszakítást. Ilyenkor a pic uarton kiküldött egy karaktert. Amikor lekötöttem a kvarcot, és a helyére kötöttem a programozót, akkor - ahogy a programozó próbálta programozni a mikrovezérlőt - több megszakítás is történt, de maga a programozási folyamat mindig hibára futott.
Én úgy gondolom, hogy ilyenkor a oszcillátor áramkör megzavarja a kommunikációt a pic és a programozó között. Hiába kapcsol át a pic programozás módba, nem fognak szót érteni egymással ha az adatvezetékeket valami más is vezérli.
Természetesen elfogadom, ha van erre más értelmes magyarázat.
(#) adamhollos hozzászólása Jan 26, 2017
Sziasztok!

PIC18f25K80-at programozok épp XC8-ban.

A/D convertelnél hogyan tudom kikapcsolni a Special Event Trigger-elést? Csak úgy, hogy beállítom, hogy olyantól várja, aki tudom, hogy nem fog küldeni?
Mert, adatlapban csak azt találtam, hogy hogyan lehet választani aközött, hogy CCP2-től, timer1-től, CTMU-tól vagy ECCP-től várja, de teljes figyelmen kívül hagyást nem.
(#) BlackStar hozzászólása Máj 4, 2016
Sziasztok!
Szeretném a segítségeteket kérni.
Sajnos nem jövök rá, hogy miért nem lehet beállítani a PIC (24EP512GU810) az elsődleges oszcillátorról (8MHz) üzemeljen és a timer1 pedig a másodlagos oszcillátorról. (32.768KHz).
„OSCCONbits.LPOSCEN = 1” utasítás nem kapcsolja be a másodlagos oszcillátort. A timer1 kizárólag a belső óráról hajlandó működni „T1CONbits.TCS = 0” ha átállítom „T1CONbits.TCS = 1;” akkor nem számol a timer1. Ami érthető mert nem is rezeg a SOSC.(megmértem). Sajnos nem tudom miért nem kacsol be a másodlagos oszcillátor az „OSCCONbits.LPOSCEN = 1” utasításra.

  1. // Configuration Settings
  2. // FGS
  3. #pragma config GWRP = OFF
  4. #pragma config GSS = OFF
  5. #pragma config GSSK = OFF
  6. // FOSCSEL
  7. #pragma config FNOSC = PRIPLL
  8. #pragma config IESO = OFF
  9. // FOSC
  10. #pragma config POSCMD = XT
  11. #pragma config OSCIOFNC = OFF
  12. #pragma config IOL1WAY = OFF
  13. #pragma config FCKSM = CSDCMD
  14. // FWDT
  15. #pragma config WDTPOST = PS32768
  16. #pragma config WDTPRE = PR128
  17. #pragma config PLLKEN = OFF
  18. #pragma config WINDIS = OFF
  19. #pragma config FWDTEN = OFF
  20. // FPOR
  21. #pragma config FPWRT = PWR128
  22. #pragma config BOREN = ON
  23. #pragma config ALTI2C1 = OFF
  24. #pragma config ALTI2C2 = OFF
  25. // FICD
  26. #pragma config ICS = PGD1
  27. #pragma config RSTPRI = PF
  28. #pragma config JTAGEN = OFF
  29. // FAS
  30. #pragma config AWRP = OFF
  31. #pragma config APL = OFF
  32. #pragma config APLK = OFF
  33.  
  34. //OSCILLATOR CONFIGURATION
  35. OSCCONbits.COSC = 3;
  36. CLKDIVbits.PLLPRE = 0;
  37. PLLFBDbits.PLLDIV = 58;
  38. CLKDIVbits.PLLPOST = 0;
  39. OSCCONbits.LPOSCEN = 1;
  40.  
  41.  
  42. //timer1 CONFIGURATION
  43. T1CON = 0x0000;
  44. T1CONbits.TCKPS = 1;
  45. T1CONbits.TCS = 1;
  46. T1CONbits.TSYNC = 0;
  47. IPC0bits.T1IP = 4;
  48. PR1 = 2048;
  49. TMR1 = 0x0000;
  50. IFS0bits.T1IF = 0;
  51. IEC0bits.T1IE = 1;
  52. T1CONbits.TON = 1;
A hozzászólás módosítva: Máj 4, 2016
(#) Wezuv válasza Wezuv hozzászólására (») Aug 11, 2015
A
  1. TimingFlags1.TouchGo=True;
disassembly kódja a következő:
  1. 0x9D0096C8: LW V0, -32724(GP)
  2. 0x9D0096CC: ADDIU V1, ZERO, 1
  3. 0x9D0096D0: INS V0, V1, 2, 1
  4. 0x9D0096D4: SW V0, -32724(GP)


Bevallom nem tudom, hogy a megszakítás mikor léphet életbe, de szerintem bármelyik megkezdett gépi lépést követően. Ha beleszakít egy ilyen szekvenciába, majd a megszakításban ugyanezt lefuttatja, majd visszaadja a vezérlést a félbeszakított lépésre, akkor annak bármilyen következménye lehet.
Nem túl boldog gondolat, de ha olyan változót kell módosítani fő szálakban, amit a megszakításban is módosítunk, és bitenként állítunk, akkor a parancs kiadása előtt le kell tiltani a hozzá tartozó megszakítás engedélyét. Jelen esetben elég lenne a timer1-ét. Kicsit meglepő, ha ez így lenne és abszolut nem mulatságos!

Természetesen várom a cáfolatokat, illetve a jó megoldást, ahogy kéne csinálnom!

Köszönöm!
A hozzászólás módosítva: Aug 11, 2015
(#) Wezuv hozzászólása Aug 11, 2015
Sziasztok!
PIC32MX-re írok egy programot és valami olyan hibát(?) találtam, amit nem tudok megfejteni.
A kód a következő:
A TimingFlags1 típusának deklarációja:
  1. typedef union{  
  2.  unsigned char x;    
  3. struct {
  4.      unsigned RefreshscreenFlag:1;
  5.      unsigned TFTInt1Flag:1;
  6.      unsigned TouchGo:1;
  7.      unsigned ReceptUtemFlag:1;
  8.      unsigned b4:1;
  9.      unsigned B5:1;
  10.      unsigned B6:1;
  11.      unsigned b7:1;
  12. };
  13. }uTimingFlags1;

Flagek példányosítása Ezt Globálisnak tettem!
  1. uTimingFlags1 TimingFlags1;

A ciklus, amiben a gondok vannak:
  1. while(1){
  2.         if(TimingFlags1.ReceptUtemFlag){
  3.             TimingFlags1.ReceptUtemFlag=Clear;
  4.            
  5.             if(LED_Zold_PORT_BIT==1){
  6.                 LED_Zold_PORT_BIT=0;
  7.             }else{
  8.                 LED_Zold_PORT_BIT=1;
  9.             }
  10.            
  11.             PrintUInteger(100, 330, OraTesztCounter, WHITE, BLUE, 24);
  12.         }//
  13.  
  14.         //Ha az alábbi sorok itt vannak, akkor a timer1 intben nem mindig állítódik be a
  15.         //TimingFlags1.ReceptUtemFlag
  16.        
  17.         TimingFlags1.TouchGo=True;
  18.         TimingFlags1.TouchGo=False;
  19.         TimingFlags1.TouchGo=True;
  20.         TimingFlags1.TouchGo=False;
  21. }


timer1 megszakítás kezelése:
  1. // Configure the Timer 1 interrupt handler
  2. void __ISR(_TIMER_1_VECTOR, ipl1) timer1IntKezeles(void){
  3.     // Clear the interrupt flag
  4.     mT1ClearIntFlag();
  5.  
  6.     if(ReceptTimerCounterTmr1<9){ //500ms 9 esetén!!
  7.         ReceptTimerCounterTmr1++;
  8.     }else{
  9.         TimingFlags1.ReceptUtemFlag=True;
  10.         cReceptUtemFlag=True;
  11.         ReceptTimerCounterTmr1=0;      
  12.         OraTesztCounter++;        
  13.     }
  14. }


Tehát minden fél másodpercben be kellene állítódjon a TimingFlags1.ReceptUtemFlag. Ez nem mindig történik meg. Ha kiveszem a ciklusban jelzett négy sort, akkor igen. Ha a cReceptUtemFlag char típusú változót használom Flagnek, de a négy sort bennt hagyom, működik.
Olyan, mint ha a fő ciklusban nagyon gyorsan módosított bitekre szabdalt TimingFlags1 változó megakadályozná a megszakításban a megfelelő TimingFlags1 bit beállását. A megszakítás megtörténik, detektáltam, az OraTesztCounter növekszik stb. csak a jelzőbit nem áll be mindig. Lehet, hogy a Sturtura kezelése nem egy programlépésben zajlik és nem tesz jót, ha a megszakítás beleszakít? Ha igen, lehet használni egyáltalán ezt a bitenkénti módot? A PIC18-aknál ilyet soha nem tapasztaltam...

Nagy segítség lenne, ha valami ötlet felmerülne!
Köszönöm!
(#) potyo válasza Attila86 hozzászólására (») Júl 21, 2015
timer1 sem kell. USART-ot beállítod, hogy alacsony prioritású megszakításokat okozzan (már ami kell, ha csak küldesz, akkor persze csak TX), de nem engedélyezed a TXxIE-t. Timer2-ben növelsz egy számlálót, amikor az elért 200-ra (=10ms/50us), akkor bebillented a TXxIE-t. Ezután amint kiért a Timer2 megszakításból, azonnal belép az alacsony prioritásúba, hogy kiszolgálja az USART TX-et, mert időköben ugye a transmit buffer üres már. Az usart megszakításban pedig amikor betetted az utolsó bájtot is a bufferbe, akkor törlöd a TXxIE bitet, ezzel letiltod az usart megszakítást egészen addig, amíg a Timer2-ben ismét 200-ra nem ér a számláló. Tehát valami ilyesmi:

  1. void high_isr(void)
  2. {
  3.         static unsigned char sz=0;
  4.         if (TMR2IE && TMR2IF)
  5.         {
  6.                 TMR2IF=0;
  7.                 sz++;
  8.                 if (sz==200)
  9.                 {
  10.                         sz=0;
  11.                         hanyadik=0;
  12.                         TX1IE=1;
  13.                 }
  14.                 //adc_kezelese
  15.         }
  16. }
  17.  
  18. void low_isr(void)
  19. {
  20.         if (TX1IE && TX1IF)
  21.         {
  22.                 TXREG=puffer[hanyadik++];
  23.                 if (hanyadik==10)
  24.                 {
  25.                         TX1IE=0;
  26.                 }
  27.         }
  28. }
A hozzászólás módosítva: Júl 21, 2015
(#) cross51 válasza treshold hozzászólására (») Júl 6, 2015
Az OSCCON első két bitje az SCS <1:0>
Idézet:
„1x = Internal oscillator block
01 = timer1 oscillator
00 = Clock determined by FOSC<2:0> in Configuration Word 1.”

ezzel beállíthatod, hogy belső oszcillátorról vagy timer1-ről vagy a config1-el beállított órajelről megy,
kódszinten amit te akarsz az valahogy így valósítható meg :
  1. ;belso orajel
  2. BANKSEL OSCCON
  3. MOVLW b'01111010'
  4. MOVWF OSCCON
  5. ;többi programresz
  6. ;
  7. ;
  8. ;kulso orajel
  9. BANKSEL OSCCON
  10. CLRF OSCCON
A hozzászólás módosítva: Júl 6, 2015
(#) szutsgabor hozzászólása Okt 29, 2014
Lehet nem jó helyen teszem fel ezt a kérdést, ezért ne tépjétek majd le a fejem.
Maga a probléma is elég fura, számomra egyenlőre értelmezhetetlen, de lehet csak én nézek be valamit nagyon csúnyán.
Van egy projektem amiben egy részfeladat egy motor fordulatszám mérése. A motoron egy tárcsa forog, ezen van egy jelölés amit egy résoptó érzékel stb.. CCP capture módját használom a méréshez.
A kód a következő:
  1. int rpm_mes(void)
  2. {
  3.     unsigned long mes_time = 0;
  4.     unsigned int mes_cnt = 0;
  5.     unsigned int mes_cnt1 = 0;
  6.     unsigned int mes_cnt2 = 0;
  7.  
  8.     TMR1H = 0x00; //timer1 fels? bájt nullázása
  9.     TMR1L = 0x00; //timer1 alsó bájt nullázása
  10.  
  11.     T1CONbits.TMR1ON = 1; //timer1 léptetésének indítása
  12.     while(!PIR1bits.CCP1IF) //CCP interrupt flag figyelés
  13.     {}
  14.     mes_cnt1 = (CCPR1H << 8) + CCPR1L;
  15.     PIR1bits.CCP1IF = 0; //IF nullázása
  16.  
  17.     while(!PIR1bits.CCP1IF) //CCP interrupt flag figyelés
  18.     {}
  19.     mes_cnt2 = (CCPR1H << 8) + CCPR1L; //Értékek összeadása
  20.     PIR1bits.CCP1IF = 0; //IF nullázása
  21.  
  22.     if(mes_cnt2 > mes_cnt1)
  23.     {
  24.         mes_cnt = mes_cnt2 - mes_cnt1;
  25.     }
  26.     else if(mes_cnt1 > mes_cnt2)
  27.     {
  28.         mes_cnt = (65535 - mes_cnt1) + mes_cnt2;
  29.     }
  30.  
  31.     mes_time = 37500000 / mes_cnt;
  32.  
  33.     return mes_time;
  34. }


Tudom, lehetne egyszerűbben is megírni és a pollingolás nem túl elegáns.
Amikor először próbáltam a programot teljesen hibás értékeket mért. USART modullal elküldtem PC-re az ebben a függvényben használt változók értékeit. Kiderült, hogy a mes_cnt1 és mes_cnt2 változókba néha negatív számok kerülnek, és ezek okoznak furcsa dolgokat a számolásban.
A nagy kérdés az, hogy mégis egy unsigned int változóba hogyan kerülhet negatív érték, pláne úgy, hogy a CCPR1L és H értékeit rakom bele, amik pedig a timer1 értékét tárolják ami 0-tól 65535-ig számol.
Próbálkoztam, olyannal is, hogy ha valamelyik változó értéke negatív vegye az abszolút értékét és USARTon küldjön egy karaktert. Ennek ellenére továbbra is jöttek negatív értékek és a feltétel teljsülését jelző karakter meg nem jött meg, tehát a program nem érzékelte ezeket az értékeket negatívnak. Azt nem hiszem, hogy usart küldés miatt válnának ezek a számok negatívvá, mert kiszámított fordulatszámot LCD-re is kirakom és ott is ugyan ez látszik.
Én már nagyon abszurdnak érzem ezt a szituációt és nemlátom, hogy min csúszik félre a dolog.
(#) foldvarid hozzászólása Jún 27, 2014
Üdvözlök mindenkit.
Nem vagyok nagy fórumlakó, de végső elkeseredésemben hozzátok fordulok. Már a létező összes angol nyelvű tutorialt átnéztem...
Lenne egy feladat amit meg kellene oldanom. Hőmérséklet adatokat kellene két PIC között küldözgetnem aszinkron soros porton keresztül. Fentről lefelé mennek a vezérlés utasítások, stb, lentről felfelé meg az aktuális környezeti értékek, amiket mérek.
Kérdés tehát: Létezik olyan megoldás amivel megoldható az oda-vissza kommunikáció úgy hogy közben mind a két oldal futtatja a saját programját?
Valaki tudna nekem tippet adni, hogy hogy érdemes kezelni egy ilyen kommunikációt.
(lehetőleg megszakításban, de figyelnem kell arra, hogy a lenti egységben rengeteg periféria megszakítás lesz(CCP, timer1, AD, stb))
Köszönöm.
(#) watt válasza kissi hozzászólására (») Máj 24, 2014
Idézet:
timer1 idejét miért nem szimulátorral méred”

Mert nem áll meg a megszakításba helyezett break pontnál.

Nem értetted félre. Eddig nem néztem, hogy van-e stopwatch a PK2-nél, mert még nem volt ilyen, hogy nem működik a szimulátor, ezért lepődtem meg, hogy nincs a PK3-nál debugg módban. Eddig eszembe se jutott volna PKx debugg módban időket ellenőrizni, talán logikus is, hogy nem nagyon lehet USB-n keresztül ezt megtenni, belső perifériája pedig nincs a PIC-eknek erre. A JTAG az más téma, de 18F-ekben olyan nincs is...
Szóval köszi!
Itt egy kép arról, hogy a TMR0 számlál, a 3 nem. Valóságban működik és debugg módban meg is áll a break-nél...
(#) kissi válasza watt hozzászólására (») Máj 24, 2014
Idézet:
„PICKit3 használata esetében megáll a breakpontál, de nincs StopWatch a Debugger menü alatt.”
Ezt nem értem, tudtommal soha nem is volt StopWatch, ha nem a szimulátorral dolgozol ( talán a RealIce-nál kezdődik az a kategória, ahol már tud időt is mérni debuggolás közben, ha jól emlékszem!) !?
timer1 idejét miért nem szimulátorral méred (MPLAB SIM)?

egy kicsit "összevissza" van most nekem a fórum, remélem nem értek félre valamit !?
A hozzászólás módosítva: Máj 24, 2014
(#) watt hozzászólása Máj 24, 2014
Sziasztok!
MPLAB 8.92, TMR1 szimuláció nem működik.
PICKit3 használata esetében megáll a breakpontál, de nincs StopWatch a Debugger menü alatt.

Ötlet, hogyan lehetne a timer1 idejét mérni? (debuggra gondolok, nem külső eszközökre, mert az elég gáz lenne egy IDE használatához kötni...)
(#) szutsgabor hozzászólása Márc 20, 2014
Halihó

Dolgozok egy motor fordulatszám mérő programon. 1000-3000 RPM-et kéne mérnem. Kicsit elakadtam a szoftverrel (18f874)
  1. CCP1CON = 0x00; //A CCP modul kikapcsolása
  2.     T1CON = 0x30; //A timer1 modul kikapcsolása, el?osztás 1:8, belsö léptetés, szinkronizáció
  3.     INTCON = 0x00; //Megszakítások tiltása
  4.     TRISCbits.TRISC2 = 1; //PORTC RC2/CCP1 lába bemenet
  5.     PIE1 = 0x00; //A perifériás megszakítások tiltása
  6.     PIR1 = 0x00; //A periféria megszakításkér? jelzöbitek nullázása
  7.  
  8.     TMR1H = 0x00; //timer1 fels? bájt nullázása
  9.     TMR1L = 0x00; //timer1 alsó bájt nullázása
  10.  
  11.     CCP1CON = 0x05; //Capture üzemmód indítása, kiolvasás minden fellfutó élre
  12.  
  13.  
  14.     while (1) {
  15.  
  16.         T1CONbits.TMR1ON = 1; //timer1 léptetésének indítása
  17.         if (!PIR1bits.CCP1IF) //CCP interrupt flag figyelés
  18.         {
  19.             //Üres ciklus
  20.         }
  21.         eredmeny1 = (CCPR1H << 8) + CCPR1L;
  22.         PIR1bits.CCP1IF = 0; //IF nullázása
  23.        
  24.         if (!PIR1bits.CCP1IF) //CCP interrupt flag figyelés
  25.         {
  26.             //Üres ciklus
  27.         }
  28.         eredmeny2 = (CCPR1H << 8) + CCPR1L; //Értékek összeadása
  29.         PIR1bits.CCP1IF = 0; //IF nullázása
  30.         eredmeny = eredmeny2 - eredmeny1;

ez a program részlet végzi a mérést. utána még van egy kis számolgatás meg az eredmény rs232 porton küldése, de az most lényegtelen, mert már annál hamarabb vannak gondok.

a problémám az, hogy az eredmeny1 és eredmeny2 értékei megegyeznek, de időben együtt változnak.
lehet én vagyok már vak hozzá és valami tök hülye hiba van benne amit ti messziről kiszúrtok, de kérlek segítsetek megoldani a problémát.
A hozzászólás módosítva: Márc 20, 2014
(#) potyo válasza Attila86 hozzászólására (») Jan 26, 2014
RTC ic, vagy kötsz a timer1 oszcillátorra órakvarcot, az tud futni sleepben is emlékeim szerint.
(#) potyo hozzászólása Dec 26, 2013
Fázishasításra PIC-el van valami bevált módszer? Ugye kell hozzá nullátmenet detektálás, majd meghatározott idő után egy triak vagy SSR irányába gyújtóimpulzus kiadása egy rövid időre. Én eddig ott tartok, hogy pl. INT0 vagy RBIF megszakítás bekövetkeztekor Timer indul, túlcsorduláskor egyesre húzom az egyik lábat, majd némi idő után vissza nullába. Ezt lehet pl. úgy, hogy pl. timer1-et indítom, CCPR1H:CCPR1L regiszterekbe beírom, hogy mennyi idő után kellene a lábat egyesre állítani, CCP1IF megszakításkor pedig visszaváltom a lábat nullába. Persze a gyújtás nyílván nem tud így pontosan nullátmenetkor indulni, de ha pl. 4us késés van, akkor még mindig csak 4V-nál tart a színusz, ha jól számolom, az meg bőven belefér. Vagy van erre van valami jobb/bevált megoldás?
(#) potyo hozzászólása Dec 25, 2013
A CCP modul Capture módjánál nem tiszta egy dolog nekem: amikor egyezés van a CCPR1 és a TMR1 között, akkor a CCP1 lábat csak az egyezés idejére húzza magasba a kontroller, vagy pedig onnan kezdve magasan marad? Ha mondjuk a timer1-et a chip órajelével hajtom előosztó nélkül, akkor csupán egy utasitásciklus idejére marad magasan a CCP1 láb?
(#) tikiss válasza _vl_ hozzászólására (») Okt 26, 2013
Szia!
Az adott portot (PORTC<14>) a programban nem olvasom ki. Amit tudok, hogy ha debug módban megállítom a program futását, akkor soha sem sikerült úgy megállítanom, hogy a 14-es bitnél 1-est lássak a PORTC regiszterben. Ennek a portnak egyébként nincs AD funkciója, csak a következők: PGEC2/SOSCO/C3IN1-/T1CK/RPI62/RC14.
Mivel az adott lábra (48-as TQFP64-es toknál) van kötve a külső 1MHz-es órajel, ezért próbálkoztam a timer1-el, a T1CK-n keresztül, nem működött, s kipróbáltam Timer4-el, úgy hogy az RPI62-re mappoltam a T4CK-t, s így sem ment. Viszont ha kis vezetékkel ezt az órajelet rákötöm a pin13-ra (AN3/C2IN1+/VPIO/RPI35/RB3), s a T4CK-t az RPI35-re mappolom, akkor számol a Timer4.
Amúgy erről a kódszekvenciáról nem olvastam még.
A következző utasítással mappoltam a T4CK-t az RPI35-re:
  1. RPINR4bits.T4CKR = 35;

Viszont az RPI62-re történő mappolás már nem működik.
Tegnap még azt próbáltam ki, hogy az 1-es ICSP port helyett használtam a 2-est, mivel a PortC14, egyik funkciója a PGEC2, s tudtam programozni a procit.
(#) tikiss válasza cncfamester hozzászólására (») Okt 25, 2013
Szia!
Én dsPIC33EP256MU806-al küzdök jelenleg, s én használom a QEI modult, s nekem elsőre elindult, bár én csak egy rotary encodert kezelek vele, de nagyon jól működik, persze nem szimulátorban.
Viszont lenne nekem is egy kérdésem.
Nekem is van periféria hozzáférés problémám, a 48-as láb (TQFP64-es tok esetén) a következő funkciókkal van felvértezve: PGEC2/SOSCO/C3IN1-/T1CK/RPI62/RC14
Nekem ezek közül az RPI62 kellene, hogy a 4-es Timer külső órajellel léptessem (T4CK)
A lábon meg is jelenik az órajel, de sem a timer1-et (T1CK-n keresztül) sem pedig a Timer4-et (T4CK-n keresztül) nem tudom léptetni, belsőről mind a kettő szépen működik.
A programozás a PGEC1, PGED1-en keresztül megy. A proci belső FRC osciról megy, komparátort nem használok, s még sem tudom elérni a T1CK vagy az RPI62-es funkciókat.
Nekem nagyon az a gyanúm, hogy a Secondary oscillator foglalja a lábat, holott az OSCCON regiszterben tiltom ezt az órajel forrást az LPOSCEN bit törlésével.
Van esetleg valami tapasztalat ezzel kapcsolatban?
Már egy csomószor elolvastam az idetartozó fejezetek az adatlapban, de nem találtam semmit, az ERRATA sem ír semmit.
Köszönöm előre is!
(#) svandras0404 hozzászólása Szept 1, 2013
Mégse jó csak azért fordította le mert a megszakított rész az END után volt.
  1. #include <p16F887.inc>
  2.         __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
  3.         __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
  4.  
  5. ADL             EQU     0x119  
  6. ADH             EQU     0X11A
  7. IDO1   EQU 0x24
  8. IDO2   EQU 0x25
  9. VALASZT  EQU 0X3D  
  10. TESZT  EQU 0X121
  11. TIMER0 EQU 0X23
  12. timer1 EQU 0X22
  13.  
  14.  
  15.         ORG     0X000  
  16.  
  17. START
  18.           CALL          WAIT
  19.          ;BANKSEL    OSCCON
  20.          ;MOVLW         B'00001110'  ;ÓRAJEL KIV.
  21.          ;MOVWF     OSCCON
  22.          BANKSEL    PORTC
  23.          CLRF           PORTC
  24.          BANKSEL    TRISC
  25.          MOVLW      B'00000000'
  26.          MOVWF      TRISC
  27.  
  28.  
  29.         BANKSEL         PORTA ;
  30.         CLRF            PORTA ;Init PORTA
  31.         BANKSEL         ANSEL ;
  32.         MOVLW           B'11001111'
  33.         MOVWF           ANSEL ;ANALOG I/O
  34.         BANKSEL         TRISA ;
  35.         MOVLW           B'11001111' ;0-3,6-7 inputs  4-BIT , 5bit OUTPUT
  36.         MOVWF           TRISA ;
  37.  
  38.          BANKSEl    PORTB
  39.          CLRF           PORTB
  40.      BANKSEL    ANSELH
  41.          MOVLW      B'00000000'
  42.          MOVWF      ANSELH
  43.          BANKSEL    TRISB
  44.          MOVLW      B'11000001'  ;3-IK BITET ÁTÍRTAM  VISSZAÍRTAM
  45.          MOVWF          TRISB
  46.  
  47.          BANKSEL    PORTD
  48.          CLRF       PORTD
  49.      BANKSEL    TRISD
  50.          MOVLW      B'00000000'
  51.          MOVWF          TRISD
  52.  
  53.          BANKSEL    PORTE
  54.          CLRF       PORTE
  55.          BANKSEL    ANSEL
  56.          CLRF       ANSEL
  57.      BANKSEL    TRISE
  58.          MOVLW      B'00000000'
  59.          MOVWF      TRISE
  60.          
  61.  
  62.         BANKSEL         OPTION_REG
  63.         BCF                     OPTION_REG,7     ;felhuzó ellenállás bekapcs
  64.  
  65.                 ;BANKSEL                WDTCON
  66.                 ;MOVLW          B'00010111'
  67.                 ;MOVWF          WDTCON
  68.         BANKSEL         PIE2
  69.         BSF                     PIE2,6
  70.         BANKSEL         PIR2
  71.         BCF                     PIR2,6    ;ÁT ÍRTAM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  72.  
  73.         BANKSEL         INTCON
  74.         BSF                     INTCON,7
  75.         BSF                     INTCON,6
  76.  
  77.         BANKSEL         VALASZT
  78.         BSF                     VALASZT,0
  79.  
  80.         BANKSEL         IDO1
  81.         MOVLW           B'00000001'
  82.         MOVWF           IDO1
  83.  
  84.         BANKSEL         CM1CON0
  85.         MOVLW           B'10100001'
  86.         MOVWF           CM1CON0
  87.        
  88.         BANKSEL         CM2CON0
  89.         MOVLW           B'10100000'
  90.         MOVWF           CM2CON0
  91. ;----------------------------------------------INICIALIZALAS VEGE -------------------------------------------------------------------
  92.  
  93. ;---------------------------------------------- FŐ HUROK-----------------------------------------------------------------------------
  94. QW
  95.         BANKSEL         PORTC
  96.         CLRF            PORTC
  97. QQ     
  98.         MOVLW           B'00000011'
  99.         MOVWF           PORTC
  100.         ;NOP                 ; töltődik
  101.         CLRF            PORTC   ;középen
  102.         CALL            WA
  103. KK
  104.         MOVLW           B'00001100'
  105.         MOVWF           PORTC        ;kisül
  106.         CLRF            PORTC
  107.         GOTO            QQ
  108. ;------------------------------------------------FŐ HUROK VÉGE ---------------------------------------------------------------------
  109. ;------------------------------------------------ SZABÁLYZÁS -----------------------------------------------------------------------
  110. NOV
  111.         BSF                     VALASZT,0
  112.         INCFSZ          IDO1      
  113.         GOTO            QZ                                     
  114.         DECF            IDO1
  115.         GOTO            QZ
  116. ;----------------------------------------------------------------------------------------------------------------------------
  117. CSOKK
  118.         BTFSS           VALASZT,0
  119.         GOTO            QZ
  120.         DECFSZ          IDO1
  121.         GOTO            QZ
  122.         CLRF            VALASZT
  123.         GOTO            QZ
  124. ;--------------------------------------------------- SZABÁLYZÁS VÉGE ---------------------------------------------------------------
  125. ;---------------------------------------------------VÁRAKOZÁS SZUBRUTINOK-----------------------------------------------------------
  126. WA
  127.         BTFSS           VALASZT,0
  128.         RETURN
  129.         MOVFW           IDO1
  130.         MOVWF           IDO2
  131.         MOVLW           0X01
  132. WC
  133.         SUBWF           IDO2
  134.         BTFSS           STATUS,2
  135.         GOTO            WB
  136.         RETURN
  137. WB
  138.         BTFSC           STATUS,0
  139.         GOTO            WC
  140.         CLRF            IDO2
  141.         RETURN
  142. ;----------------------------------------------------------------------------------------------------------------
  143. WAIT
  144.         BCF                     STATUS,RP0
  145.         BCF                     STATUS,RP1
  146.         MOVLW   0xFF
  147.         MOVWF   TIMER0
  148.         MOVLW   0x03
  149.         MOVWF   timer1
  150.        
  151. DLY1
  152.         NOP
  153.         DECFSZ  TIMER0,F
  154.         GOTO    DLY1
  155.         DECFSZ  timer1,F
  156.         GOTO    DLY1
  157.         RETURN 
  158.  
  159. ;-----------------------------------------------VÁRAKOZÁS SZUBRUTINOK VÉGE -----------------------------------------
  160.  
  161. ;----------------------------------------------MEGSZAKÍTÁS ---------------------------------------------------------
  162.         ORG      0x04
  163.         ;RETFIE
  164.  
  165.         BTFSS           PORTA,5
  166.         RETFIE
  167. QT
  168.         BANKSEL         PORTC
  169.         CLRF            PORTC
  170. QZ     
  171.         MOVLW           B'00000011'
  172.         MOVWF           PORTC   ;PRIMER
  173.         CLRF            PORTC   ;középen
  174.         CALL            WA
  175.         MOVLW           B'00001100'  ;SZEKUNDER
  176.         MOVWF           PORTC        ;kisül
  177.         CLRF            PORTC        ;KÖZÉPEN
  178.         BTFSS       PORTA,4
  179.         GOTO            NOV
  180.         BTFSS           PORTA,5
  181.         GOTO            CSOKK
  182.         RETFIE
  183.         END



;-------------------------------------------------------------------------------------
Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 112 : Using default destination of 1 (file).
Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 114 : Using default destination of 1 (file).
Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 120 : Using default destination of 1 (file).
Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 133 : Using default destination of 1 (file).
Executing: "C:\Program Files\Microchip\MPASM Suite\mplink.exe" /p16F887 "adc.o" /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /z__MPLAB_DEBUGGER_PICKIT2=1 /z__ICD2RAM=1 /o"adc.asm.cof" /M"adc.asm.map" /W
MPLINK 4.43, Linker
Device Database Version 1.9
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000004, length=0x00000022
Errors : 1

Link step failed.
----------------------------------------------------------------------
Debug build of project `C:\Users\andras\Documents\ASM\repkond2\adc.asm.mcp' failed.
Language tool versions: MPASMWIN.exe v5.46, mplink.exe v4.44, mplib.exe v4.44
Preprocessor symbol `__DEBUG' is defined.
Target debug platform is `__MPLAB_DEBUGGER_PICKIT2=1'.
Debug platform options are: `__ICD2RAM=1'.
Sun Sep 01 10:16:43 2013
----------------------------------------------------------------------
BUILD FAILED
(#) Kisvé válasza watt hozzászólására (») Júl 20, 2013
Egy háttérkép 480x320-ra 480 * 320 *16 bit = 300kB. Ez kb félig van a 512kB program memória. 320x240-en viszont csak 150kB, az simán belefér. Tehát a képek simán a program memóriában vannak. SD kártyáról elég lassan lehet betölteni, főleg egy háttérképet, amit szinte mindig ki kell rajzolni, ha bármint frissíteni kell. De a fő probléma, nem is a képek tárolásával van, mivel látszik, hogy egy háttérkép és meg jó pár ikon elfér a program memóriában. A nagyobb gond a RAM. Ugyanis ha pl egy ikont odébb akarsz húzni kijelzőn az ujjaddal, akkor frissíteni kell az ikon régi helyét, hogy az ikon nélkül látszódjon a kép, és ki kell rajzolni az ikon új helyét, hogy ott látszódjon az ikon. Az eltüntetéshez a legegyszerűbb kirajzolni mindent újra, ugyanis ha az ikon rajt volt egy téglalapon és az is rajt volt egy másik téglalapon, akkor már jó ég sem tudja, hogy mi mit takar el. Ha viszont kirajzolsz mindent újra, akkor, villogni fog az egész és az elég gázul néz ki. Ezt meg lehetne oldani úgy, hogy mindent először a RAM-ba rajzolsz ki, hogy ne kijelzőn íródjanak felül a pixelek, viszont ahhoz 320x240-es kijelzőnél is 150kB RAM kellene, pedig 128kB van max a PIC32-ben. Na ilyenkor jönnek trükközések
DMA-t nem használok. Mivel ahogy utána számoltam a RAM-ból DMA nélkül kirakni egy 480 x 320-as területet kb 10ms. Igazából nem számottevő. DMA-val lenne meg pl 5ms. Viszont jelenleg csak a timer1 et és Timer2-t használja program, így nem lenne túl nehéz áttérni másik kontrollerre.

Ezért lesz jó az új fajta PIC32MZ amiben 512kB RAM van és 2MB flash. 512kB-ba már valahogy dinamikusan lehetne bufferelni is a képeket.
(#) Gyimate hozzászólása Júl 7, 2013
Sziasztok!
Lenne egy olyan jellegű kérdésem, hogy egy PIC16F877 mennyi ideig képes működni egy 1F-os goldcapról úgy hogy sleep állapotba teszem ahogy megszűnik a tápellátás, viszont a timer1-nek mennie kell. Méréseim alapján ha 20MHz-n járatom a PIC-et és egy órakvarc van rákötve még pluszban, akkor 4mA-t eszik meg. Van valaki aki már foglalkozott ezekkel a goldcapokkal hasonló helyzetben? Addig nem szeretném megvenni illetve elkészíteni az áramkört amíg nem vagyok benne biztos, hogy megfelel-e a számomra.
A válaszokat előre is köszönöm.
(#) watt válasza adamhollos hozzászólására (») Feb 5, 2013
Szia!
A programot csak felületesen néztem át és néhány olyan dolgot láttam, amit nem értek.
Azt tudod-e, hogy a lebegőpontos számok használata megszakításban olyan, mint ha egy várakozási ciklust tettél volna bele? Rengeteg program lépés, mire a PIC végigrágja magát a sámításokon.
De ez csak az egyik rész. Ha már CCP modult használsz capture módban, miért nem a timer1 CCP regiszterekbe áttöltött értékéből számolod ki a periódust, ez előző és a mostani érték különbségéből? Mi szükség a segédváltozókra? A Timer megszakításban legfeljebb a túlcsordulásokat számold, amivel a CCP megszakításban kalkulálsz, ha két impulzus között a timer1 túlcsordulna. De motor esetében erről szerintem nem lesz szó, csak amikor áll a motor.
(#) adamhollos hozzászólása Feb 5, 2013
Sziasztok!

Az alábbi kis programot írtam pic18f25k80-ra. Az volna a lényeg, hogy egy motort tartsak állandó fordulatszámon, akkor is, ha változik a terhelés. A bejövő jel egy HALL szenzortól jövő négyszög jel. T: a HALL szenzor jelének elérni kívánt periódus ideje T1 és T2 a mért periódus idő.

Tudom, hogy a periódus idők számolása nem OK, de ezen kívül más gondom is van. Az input capture-ök nem ott vannak a hol lenniük kéne. Lásd a fotót a felső a szenzor jele az alsó pedig akkor vált ha esemény van (lásd a kódot, az osztás az oszcilloszkópon 0,5 ms, az input capture a felfutó élre érzékeny). Nem telhet el ennyi idő a felfutó él és az esemény közt, hisz a timer tulcsordulását is leellenőriztem és ott az eltérés csak 0,01 ms volt a számolt értékhez képest

Az adatlapban egyáltalán nem találom, hogy mi lehet a gond, tudnátok segíteni?

Valaki tudna benne segíteni, hogy hogyan számoljam ki helyesen a periódusidőt?


íme a program kód (C18):
  1. #include <p18f25k80.h>
  2. #pragma config XINST = OFF, FOSC=INTIO2, IESO= ON, PWRTEN=ON, WDTEN=OFF, MCLRE=OFF
  3.  
  4. void con(void);
  5. void con_interupts(void);
  6. void con_PWM(void);
  7. void con_inCap(void);
  8. void lo_isr(void);
  9. void hi_isr(void);
  10.  
  11. #define t_h_inCap       CCPR3H
  12. #define t_l_inCap       CCPR3L
  13.  
  14.  
  15. #define plus            LATBbits.LATB5
  16. #define minus           LATBbits.LATB3
  17.  
  18. #define power           PORTCbits.RC2
  19. #define direction       PORTCbits.RC3
  20.  
  21. #define duty_cycle      CCPR1L
  22.  
  23. #define test            LATAbits.LATA1
  24.  
  25.  
  26. volatile long double T=5;                       //[ms]
  27.  
  28. volatile long double T1=0;
  29. volatile long double T2=0;
  30. volatile int n=0;
  31. volatile int f=1;
  32.  
  33. volatile double in=0;
  34.  
  35.  
  36. void main (void)
  37. {
  38.         OSCCONbits.IRCF0=1;                                     //
  39.         OSCCONbits.IRCF1=1;                                     //belső órajel 16MHz
  40.         OSCCONbits.IRCF2=1;                                     //
  41.         con();
  42.         T2CONbits.TMR2ON=1;
  43.         T1CONbits.TMR1ON=1;                            
  44.         plus=1;
  45.         minus=0;  
  46.         duty_cycle=200;
  47.         while (1)
  48.         {
  49.  
  50.                 if(n==1)
  51.                 {
  52.                
  53.                         if(T1>T&&duty_cycle<255)
  54.                         {
  55.                        
  56.                                 duty_cycle+=1;
  57.                        
  58.                         }
  59.                        
  60.                         if(T1<T&&duty_cycle>0)
  61.                         {
  62.                        
  63.                                 duty_cycle-=1;
  64.                        
  65.                         }
  66.                        
  67.                         //n=0;
  68.                
  69.                 }
  70.  
  71.                 if(n==2)
  72.                 {
  73.  
  74.                         if(T2>T&&duty_cycle<255)
  75.                         {
  76.                        
  77.                                 duty_cycle+=1;
  78.                        
  79.                         }
  80.                        
  81.                         if(T2<T&&duty_cycle>0)
  82.                         {
  83.                        
  84.                                 duty_cycle-=1;
  85.                        
  86.                         }
  87.                        
  88.                         //n=0;
  89.  
  90.                 }
  91.  
  92.         }
  93. }
  94.  
  95. void con(void)
  96. {      
  97.         ANCON0=0;                                                       //
  98.         ANCON1=0;                                                       //Minden digitális
  99.        
  100.         LATA=0;
  101.         LATB=0;
  102.         LATC=0;
  103.         TRISA=0;
  104.         TRISB=0x00;                                                     //RB5, RB4 és RB3 legyen kimenet
  105.         TRISC=0x0C;                                                     //RC3 és RC2 legyen bemenet
  106.  
  107.         con_PWM();
  108.         con_inCap();
  109.         con_interupts();
  110.  
  111. }
  112.  
  113. void con_PWM(void)
  114. {
  115.  
  116.         PSTR1CON=0x11;                                          //Output steering update occurs on the next PWM period & P1A pin has the PWM waveform with polarity control from CCP1M<1:0>
  117.         CCPTMRSbits.C1TSEL=0;                           //ECCP1 is based off of TMR1/TMR2
  118.         PR2=0xFF;                                                       //PWM periodus
  119.         CCP1CON=0x3C;                                           //singel output, PWM mode; P1A and P1C active-high; P1B and P1D active-high
  120.         CCPR1L=0;
  121.         T2CON=0x00;            
  122.  
  123. }
  124.  
  125. void con_inCap(void)
  126. {
  127.        
  128.         TRISCbits.TRISC6=1;
  129.  
  130.         CCP3CON=0x05;                                           //Capture mode: every rising edge
  131.         CCPTMRSbits.C3TSEL=0;                           //forrása a timer1
  132.        
  133.         T1CON=0x40;                                                     //timer1 clock source is instruction clock (FOSC), Enables register read/write of timer1 in two 8-bit operations
  134.         T1GCONbits.TMR1GE=0;                            //nem Gate-ről kapja a jelet
  135.         TMR1H=0;
  136.         TMR1L=0;
  137. }
  138.  
  139. void con_interupts(void)
  140. {
  141.  
  142.         RCONbits.IPEN=1;                                        //Kétszintű interrupt mód beállítása
  143.         INTCON2=0;                                                      //
  144.         INTCON3=0;                                                      //     
  145.      
  146.         PIE1bits.TMR1IE=1;                                      //Enables the TMR1 overflow interrupt
  147.         PIE2=0;                                                         //
  148.         PIE3=0;                                                         //
  149.         PIE4bits.CCP3IE=1;                                      //CCP3 Interrupt enabled
  150.         PIE5=0;                                                         //
  151.  
  152.         IPR1bits.TMR1IP=1;                                      //TMR1 Overflow Interrupt high Priority
  153.         IPR4bits.CCP3IP=1;                                      //CCP3 interrupt low priority
  154.  
  155.         INTCON=0xC0;                                            //High pri. interrupt enabled, Low  pri. interrupt enabled
  156.  
  157. }
  158.  
  159. #pragma code high_vector_addr=0x08
  160. void high_vector(void) {
  161.   _asm GOTO hi_isr _endasm
  162. }
  163.  
  164. #pragma code low_vector_addr=0x18
  165. void low_vector(void) {
  166.   _asm GOTO lo_isr _endasm
  167. }
  168.  
  169. #pragma code
  170. #pragma interrupt hi_isr
  171. void hi_isr (void)
  172. {
  173.         if(PIR1bits.TMR1IF==1)
  174.         {
  175.                 if(f==1)
  176.                 {
  177.                         T1+=65536*0.0000625;
  178.                 }else
  179.                 {
  180.                         T2+=65536*0.0000625;
  181.                 }
  182.                 PIR1bits.TMR1IF=0;
  183.         }
  184.  
  185.         if(PIR4bits.CCP3IF==1)
  186.         {
  187.                 if(test==1){test=0;}else{test=1;}
  188.        
  189.                 if(f==1)
  190.                 {
  191.                
  192.                         in=(t_h_inCap*256+t_l_inCap+1)*0.0000625;
  193.                        
  194.                         T1+=in;
  195.                         n=1;
  196.                        
  197.                         T2=65536*0.0000625-in;
  198.                         f=2;
  199.                
  200.                 }else
  201.                 {
  202.                
  203.                         in=(t_h_inCap*256+t_l_inCap+1)*0.0000625;
  204.                        
  205.                         T2+=in;
  206.                         n=2;
  207.                        
  208.                         T1=65536*0.0000625-in;
  209.                         f=1;
  210.                
  211.                 }
  212.  
  213.                 PIR4bits.CCP3IF=0;
  214.        
  215.         }
  216. }
  217.  
  218. #pragma interruptlow lo_isr
  219. void lo_isr (void)
  220. {
  221. }
A hozzászólás módosítva: Feb 5, 2013

P1050004.JPG
    
(#) beigli767 válasza mateakos hozzászólására (») Okt 9, 2012
Köszönöm. Ami nem értek. A low interruptba mégis belép amit elvileg a timer1 túlcsordulás okozna. Ezek szerint a proteusban beállított órajel szerint működik a timer1 nem?
(#) mateakos válasza beigli767 hozzászólására (») Okt 9, 2012
A program végrehajtási sebességet az alkatrész tulajsonságainál kell megadni, ahol a hex fájlt betöltöd, a proteus nem szimulálja az oszcillátor működését, hogy az működtesse a virtuális PIC-et. Hogy hogyan lehet proteusban timer1-et külső órajelről működtetni, azt meg nem tudom, talán ha számláló üzemmódba teszed és bevezetsz neki egy órajelet, amit valahol a szimulátor primitívek között található impulzusgenerátorral csinálsz, akkor működni fog.
(#) beigli767 válasza icserny hozzászólására (») Okt 8, 2012
Az external oscillator HS üzemmódban megy, a timer1 időzítő pedig ugyancsak külső kvarc alapján számol. De mégse így működik. Hanem a proteus szimulátor default 1 mhz-n működtet mindent. Ez a problémám, de én is proteus hibára gondolok. Ez esetben próbálkozom abban a topicban.
(#) icserny válasza beigli767 hozzászólására (») Okt 8, 2012
Számomra értelmetlennek tűnt a kérdés, mert jelenlegi ismereteim szerint az "external oszcillator", a "HS mód" meg a "timer1" az három különböző dolog.
(#) beigli767 hozzászólása Okt 7, 2012
Hello!

Olyan problémám volna, hogy egy pic18f6722es picel fűtést automatizálok. De szeretnék bele órát is amit majd DCF vevővel szinkronizálok. A lényeg hogy timer1 megszakítással járatnám az órát. A timer1 számolás külső órakvarcról megy. De a processzor órajel pedig vagy belső, vagy egy másik külső kvarcról, ami az OSC1 ill. OSC2 lábakra van kötve. (mellékeltem kapcsolási rajzot)
Proteusban tesztelem, és az a jelenség az, hogy belép a megszakítást kiszolgáló függvénybe, le is fut, de kapok egy hibaüzenetet: "External oscillator mode 'HS' requies clock to be specified on schematic part. Defaulted to 1.00MHz." És 1Mhz-n fut a program. Pedig a timer1 számláló a külső oszcillátorra van állítva.

Mellékelem a main.c-t és a fontosabb header-eket.
(#) Hp41C válasza lajos1969 hozzászólására (») Máj 5, 2012
Szia!

A 16F505 -ben nincs A/D, a 16F506 -ban már lenne, de ezek a Baseline családhoz taroznak. Nincs megszakítási lehetőségük, timer1 időzítőjük, a vermük 2 szintű. Nem való nekik a C... Egyszerűbb megvenni a 16F676 -ot.
(#) sirály12 hozzászólása Dec 30, 2011
Egy kérdéssel fordulnék hozzátok!

Egy régebbi progimat egy új picre fordítom át, és egy dolog egyszerűen nem megy.

Az új picben használni akarom a beépített oszcillátort, de valamiért így a timerek egyszerűen megbolondulnak, vagy csak én nézek el valamit?

  1. inicializálás a main részből:
  2. setup_oscillator(OSC_8MHZ | OSC_INTRC);  
  3. setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);  
  4. enable_interrupts(INT_timer1);
  5.  
  6.  
  7. időzítő rutin:
  8. volatile int16 ido=0;
  9. #INT_timer1
  10. void timer1_isr()
  11. {
  12. output_toggle(LED);
  13. }


Így a led durván másodpercenként 2 alkalommal villan fel, de miért? Elvileg 65,536 ms-nak kellene lennie nem pedig 500 ms-nak! Vagy én számolok rosszul valamit?
A pic egyébként egy pic18f1320-as lenne.

Előre is kösz az ötleteket.
Következő: »»   1 / 11
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