Jump to content
ELFORUM - Forumul electronistilor

delay de 1Us in PICC LITE


vlad_2770

Recommended Posts

Am gasit in pachetul PICC Lite urmatoarea rutina pentru delay de 1 Us: * To use DelayUs it is only necessary to include this file; to use * DelayMs you must include delay.c in your project. * *//* Set the crystal frequency in the CPP predefined symbols list in HPDPIC, or on the PICC commmand line, e.g. picc -DXTAL_FREQ=4MHZ or picc -DXTAL_FREQ=100KHZ Note that this is the crystal frequency, the CPU clock is divided by 4. * MAKE SURE this code is compiled with full optimization!!! */#ifndef XTAL_FREQ#define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */#endif#define MHZ *1000L /* number of kHz in a MHz */#define KHZ *1 /* number of kHz in a kHz */#if XTAL_FREQ >= 12MHZ#define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \ while(--_dcnt != 0) \ continue; }#else#define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \ while(--_dcnt != 0) \ continue; }#endifDar mie mi se pare ca aceasta rutina pentru cuartz-ul de 4MHz nu merge corect. Daca pun x=250 sigur nu vor fi 250 de Us.Astept o parere.Multumesc

Link to comment
  • Replies 10
  • Created
  • Last Reply

Top Posters In This Topic

  • vlad_2770

    7

  • Cristiano

    4

Popular Days

Top Posters In This Topic

Pai sa vedem:

 

XTAL_FREQ = 4Mhz, deci din cod va rezulta _dcnt = (250/3)|1 = 83

 

Bucla while va fi implementata cam asa:

 

loop:

decfsz _dcnt

goto loop

 

care dureaza (3*_dcnt) cicli. Cum _dctn = 83, rezulta 249 de microsecunde. La asta se mai adauga 2 cicli pentru initializarea lui _dcnt (movlw .83; movwf _dcnt) => 251 microsecunde. Dovada:

 

 

Posted Image

Link to comment

NOROC de tine ca eu nu mi-am dat seama unde greseam. eu cind am calculat am facut asa:_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \ si am pus 250/(12/4)/1 dar am calculat ca 12/4 = 4 in loc de 3.Oricum trebuia sa simulez la fel ca tine cu Stopwatch.Multumesc foarte mult pentru raspuns.

Link to comment

Am inca o intrebare la tine.Cum ai reusit sa simulezi cu cele doua breakpoint-uri? in asa fel ca in fereastra de stopwatch sa ai exact doar codul rulat intre cele doua breakpoint-uri si sa vezi ca s-au executat 251 de cicli si ca timpul este de 251 de Us. Eu am adaugat doua brackpoint-uri intr-un program simplu:void main(){ DelayMs(1); NOP();}dar cind vreau sa rulez imi apare un mesaj de warning si ma anunta ca nu va tine cont de breakpoint-uri. M-am dus in help si am gasit asta:Fix unresolved breakpointsIf you have set a breakpoint on a line of high-level language code (e.g., C code) that cannot be resolved (into assembly code), you will get a warning message. Also, in the breakpoint dialog, a yellow question mark will appear next to the unresolved breakpoint.Often optimized code will cause this problem. Rebuild your application without optimizing and try the breakpoint again.Another solution is to simply move the breakpoint to another line of code that can be resolved.optimizare nu am si cind deschid din meniul Debuger -> Breakpoints cele doua breakpoint-uri au cite un semn de intrebare galben. Imi poti spune te rog unde gresesc eu?Multumesc.

Link to comment

Si nici rularea pas cu pas nu o vad adica nu vad sageata verde si nici codul in fereastra Disassembly Listing nu este. Fereastra este goala cu toate ca am ales la Debugger ->Select Tool -> MPLAB SIM

Link to comment

ajung sa nu mai inteleg nimik. Tu mi-ai scris ceva foarte corect. Cind insa ma uit in codul meu care este :void main(){ DelayUs(10); NOP();}in asm vad ca se transforma in:13: void main()14: {0007D0 3003 MOVLW 0x315: 16: DelayUs(10);0007D1 1283 BCF 0x3, 0x50007D2 1303 BCF 0x3, 0x60007D3 00A0 MOVWF 0x200007D4 2FD6 GOTO 0x7d60007D5 2FD6 GOTO 0x7d60007D6 1283 BCF 0x3, 0x50007D7 1303 BCF 0x3, 0x60007D8 0BA0 DECFSZ 0x20, F0007D9 2FDB GOTO 0x7db0007DA 2FDC GOTO 0x7dc17: 18: NOP();0007DC 0000 NOP19: 20: }0007DD 2804 GOTO 0x4De ce nu vad doar 0007D8 0BA0 DECFSZ 0x20, F0007D9 2FDB GOTO 0x7d6ca asa ar trebui sa fie normal.Nu inteleg ce sunt cu 0007D4 2FD6 GOTO 0x7d60007D5 2FD6 GOTO 0x7d6am eu o problema cu MPLAB-ul???MULTUMESC

Link to comment

spune-mi te rog ce optimizari ai activate. eu nu am activata nici o optimizare.nu stiu de ce apare in codul tauvoid interrupt ISR(void){}despre ce este vorba?multumesc.

Link to comment

Pai am asa:PICC compiler:Global optimization level: 9Enable assembler optimizationPICC assembler:Enable optimizationIn delay.h scrie asa:

MAKE SURE this code is compiled with full optimization!!!

Later edit: void interrupt ISR(void) e rutina de intreruperi. Am adaugat-o din obisnuinta, pentru exemplul de fata n-are relevanta.
Link to comment

Da am facut ce mi-ai zis si am otinut si eu mai putin cod. Nu seamana la sfarsit cu al tau dar macar merge si la 250Us am 253Us. Ma declar multumit.Multumesc foarte mult pentru sprijin.Mi-ai fost de mare ajutor si am invatat ceva de la tine.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines