Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Hát most végignéztem a T3-at kiírkáltam az órajelciklusokat. Nekem az előkészítő utasításokkal együtt 22-lett.
Kezdem nem látni a fától az erdőt
Összeollóztam egy programot lm75-ös hőszenzor 16f628-as pic és két hétszegmenses kijelző meghajtására.Az áramkör működik is csak meghatározatlan időnként lefagy a kijelzés (ilyenkor a hőfok helyett 10-et ír ki) és csak resetre működik megint.Kérdésem hogy a megszakításban a w-n kívül mit kellene elmenteni illetve érdemes lenne wdt-beleírni a progiba.Az eredeti áramkör:Bővebben: Link
Illetve az átírt program:
A STATUS regisztert is el kell menteni. Az adatlapban Context saving during interrupts részben találsz rá mintakódot és a szövegben pedig leírást, hogy hová kell a mentésre használt regisztereknek a helyet lefoglalni. Kövesd pontosan azt a kódot, amit ott ír.
30 mp alatt kb. 8-szor világít, ami 2 mp hiszen 7-8 szor nem 7+8 az 15*2 az a 30mp.
Rövid a kód berakom ide: Idézet: „ #include _CONFIG1(JTAGEN_OFF & FWDTEN_OFF) _CONFIG2(FNOSC_FRCPLL & POSCMOD_NONE) int dSec = 0; int Sec = 0; int Min = 0; int Led = 0; // 1. Timer1 interrupt service routine void _ISR _T1Interrupt( void) { // 1.1 your code here dSec++; // increment the tens of a second counter if ( dSec > 9) // 10 tens in a second { dSec = 0; Sec++; // increment the seconds counter if (Led == 0) { Led = 1; } else { Led = 0; } if ( Sec > 59) // 60 seconds make a minute { Min++; // increment the minute counter if ( Min > 59)// 59 minutes in an hour Min = 0; } // minutes } // seconds // 1.2 clear the interrupt flag _T1IF = 0; } //T1Interrupt int main() { TRISD=0xFFFE; // PORTD 0-ás lába kimenet // 2. init Timer 1, T1ON, 1:1 prescaler, internal clock source _T1IP = 4; // this is the default value anyway TMR1 = 0; // clear the timer PR1 = 25000; // set the period register // 2.1 configure Timer1 module T1CON = 0x8020; // enabled, prescaler 1:64, internal clock // 2.2 init the Timer 1 Interrupt, clear the flag, enable the source _T1IF = 0; _T1IE = 1; // 2.3 init the processor priority level _IPL = 0; // this is the default value anyway // 3. main loop while( 1) { // your main code here PORTDbits.RD0 = Led; } // main loop } ”
Sziasztok!
Nincs véletlen valakinek egy egyszerű led villogtató asm-je ki kommentezve? Olvastam, olvastam, és azt hittem értek valamit, míg neki nem fogtam. Hálám örökké üldözni fogja.
Már elnézést, de nem igaz, hogy ennyi idő alatt nem tanultad meg, hogy hogyan kell kódot beilleszteni, nem beszélve arról, hogy milyen hossz az, amit már nem illik, mert széttöröd a topicot! Ide a fájlt kellett volna becsatolnod, neked is egyszerűbb és nekünk is!
Mintha nemrég tett volna fel valaki ide egyet. De én is tettem már fel régebben, nézd végig a csatolásaimat a témában. Hogy mennyire volt kommentezve, arra nem emlékszem...
Nem akartam semmit írni rá, de úgy tűnik, hogy ő is csak akkor jön ide, amikor kérdése van, és más hozzászólásokat el sem olvas... Csak tudnám, hogy mi miért segítünk itt...
Idézet: „Nekem az előkészítő utasításokkal együtt 22-lett.” Már majdnem jó, csak ott tévedtél, hogy a legvégén nincs GOTO (átugorjuk!), a DECFSZ utasítás pedig nem 1, hanem 2 ciklus, amikor teljesül a feltétele. Tehát 21 az, ahogy délelőtt írtam. Na, a középső ciklusban mindez a 21 utasításciklus is benne van minden iterációban, továbbá az a néhány utasítás, ami a középső ciklus szervezésével jár. És így tovább...
Én úgy tanultam, hogy TxCON-ban csak a legvégén szabad 1-be billenteni a TON bitet (bár az adatlapban épp az ellenkezőjét olvasom).
Próbáld meg tehát így:
Bővebben: Link
Jó kódot kellet volna nyomni nem idézetet, szedd le fejem ezért. Legközelebb majd belinkelem.
A nyákos fórumban meg az eagle-sben ha tudok segítek, itt csak segítséget tudok kérni. Egy fórum általában erről szól valaki kérdez, és ha valaki tudja a választ segít. Én sem azért járok az előbb említett két fórumra, hogy kérdezzek, hanem hogy segítsek ha tudok.
Ha neked ez terhes akkor ne segíts, bár eddig is segítettél. Ezért nem akartam a kódot betenni, mert feleslegesnek éreztem, az meg hogy rosszul raktam be csak azt jelzi, hogy azért annyi kódot mégsem raktam még be hogy jaj segítsetek már mert ez vagy az nem megy. Most kezdtem a cnc-mhez motorok vezérlését megcsinálni, eddig az elektronikával kínlódtam, most az kész van tudom őket léptetni előre hátra, mikrosteppre váltani gombokkal gyorsítani lassítani, de ehhez elég volt egy 18f452-es ami egy saját demó boardon csücsült. 3 motor van mindegyik 5 vezérlőjelet vár (enable, reset, dir, step, mikro/full step), ez 15 jel+ mindegyikhez kéne végállás kapcsoló az még 6, plusz kommunikáció a pc-vel +4, kezdtem kifutni a szabad lábakból, és ez még csak legminimálisabb ami kell. Ezért gondoltam, hogy egy 24fj128ga008 elég lesz, a fene se hitte, hogy két napja nem jövök rá mitől 2mp az ami a leírások szerint 1 lenne. Megtaláltam a hibát a panelon (nem hiba volt, csak a pickit2-es tüskesora valahogy vékonyabb kivitel lett mint eddig volt, és az nem érintkezett rendesen) Minden kondit felraktam amit javasoltatok, most már tudom mi kell a 24-es sorozathoz, a következő kártyára rátervezem. És igen olyan hozzászólásokat nem olvasok el, amiben assemblyben számolják az utasításhosszokat, mert tudom hogy nem szereted ugyan de ezt a 24-est nem akarom assemblyben programozni, mert ez elég nagy és gyors a c-hez is, és a konfig biteknek nem sok közük van egyébként sem a c hez, a timer interruptnak is menni kéne, ha a roszul belinkelt kódban valaki rájön miért 2mp-enként villog a led, mikor a 8MHz-es belső oszcillátor pll-el négyszerezve van, és képlet alapján 1mp-nek kéne lenni, akkor annak örülök és megköszönöm, de ha belegondolsz, eddig csak icserny foglalkozott az én problémámmal, tőletek csak a hardverre kaptam tanácsot (amit megköszönök), de most nem a hardverrel van gondom. Legközelebb majd linkelek és nem beszúrok egy 70 soros forrást.
Nincs változás 2mp ég a led, 2 mp-ig nem ég. Ha ezzel a nyomorult alap interruptal nem tudok zöldágra vergődni gáz lesz a soros kommunikációnál.
Egyet még megpróbálhatnál, a CLKDIV regiszter FRCDIV<2:0> (Internal Fast RC Oscillator Postscaler bits) biteket állítsd nullába, bár az adatlap szerint ez alapból 1 -es osztóra áll be, de ki tudja.. Tényleg mást már nem tudok elképzelni. Keress rá a headerben, hogy ezekre a szimbólumokra pontosan hogy kell hivatkozni. (Lehet csak RCDIV)
Én ráakasztanék próbára egy kvarcot, hogy azzal mit mutat. Annál nincs olyan sok állítási lehetőség. Aztán lehet tovább találgatni, hogy valami a timernél van rosszul beállítva, vagy a belső oszcillátornál.
Majd ma kipróbálom őket, már raktam egy rá egy 20MHz-s oszcillátort, de most bedőlök az ágyba. Köszi a késői válaszokat lesz mivel szórakoznom reggel.
Állítsd be az OSCCON-t. (pl. tegél bele 0x1100) Valamint meg kell nézni az FCKSM1:FCKSM0 bitek hogy állnak a konfigban. Ez összefügg a Clock Switching Operation funkcióval, ami, ha jól értem az adatlapot a boot után oszcit tud váltani a beállításoknak megfelelően.
Idézet: „Nincs változás 2mp ég a led, 2 mp-ig nem ég.” Végszükség esetén az adatlapot is el lehet olvasni... Az adatlap Register 7-2. táblázata szerint a CLKDIV regiszter RCDIV0 bitje 1-be íródik RESET-kor!!! Ez a Fast RC oszcillátor utóosztója, s kettes osztást állít be (4 MHz jut a PLL bemenetére).
Szia,
itt van kettő. Az első pic16f877-esre a másik 16f84-esre van.
Ahha!! Tehát mikor teljesül a DECFSZ akkor az 2 órajelciklus, akkor ez kavarhatott be. Tehát az adatlapon zárójelben feltüntetett ciklus csak akkor igaz amikor teljesül a feltétel.
Mi az az iteráció? Idézet: „Mi az az iteráció?” Ismétlési szerkezet, a programciklus egyszeri lefutása. A T3-as ciklusodban például egy NOP+DECFSZ+GOTO
most végigzongoráztam az egész időzítést. A következőt kaptam : T3-21 , T2-41 , T1-43 óraciklus. Akkor ezeket összeadom és elosztom 4Mhz-el? Vagy összeszorzom és úgy osztom 4Mhz-el?
A rajz szerint (fig7-1) a CLKDIV nem befolyásolja a PLL-re jutó frekit, az csak a FRCDIV-re menőt állítja.
Én inkább arra gondolok, hogy a reset után módosul az oszci beállítás sima Fast RC-re(FCR-re), de majd meglátjuk...
Lehet, hogy nem ugyanazt az adatlapot nézzük?
Én a DS39747D-page 91 ábráján azt látom, hogy vagy a külső oszcillátor megy a PLL-re, vagy az FRCDIV kimenet, s oda is van írva, hogy 8 MHz/4 MHz. Az eddigi adatok szerint a PLL megy, csak egy kettes szorzó hibádzik, ezért gondolom, hogy most 4 MHz megy a PLL-re, s az adatlap alapján RESET után pont ez várható. Idézet: „A következőt kaptam : T3-21 , T2-41 , T1-43 óraciklus.” Ez így biztosan nem jó, mert a T2 ciklusban 10-szer lefut T3 is, így vastagon 10x21 = 210 fölött kell, hogy legyen.
Az én adatlapomon ilyen nincs a 7.2-nél. Sőtt az egész doksiban 3 helyen van rcdiv0 említve ebből 2 találat ezen a lapon egy meg 3.xx -ben felsorolásként.
Olyan hogy reset után az rcdiiv0 egyere áll nincs, de most oktatásra megyek, majd szünetben megnézem, jó lenne ha csak ennyi lenne a baj. Ezt a program futása közben bárhol át lehet írni? NEm áll ettől fejre a vezérlő, hogy menet közben állítom az oszcillátor frekit? Idézet: „Lehet, hogy nem ugyanazt az adatlapot nézzük?” Az lehet! Én a DS39747A (2005-ös) Ebből csatoltam a képet is korábban, ott más a bekötés! Akkor most melyik rajz a jó? És ha mindkettő a maga idejében jó volt, akkor mikortól változott?
Az nem lehet hogy mindkét rajz jó, de más PIC re vonatkoznak ? Mert az egyiknek GA a vége, a másiknak meg GA010.
|
Bejelentkezés
Hirdetés |