Sari la conținut
ELFORUM - Forumul electronistilor

Setare frecventa PIC18F46K22


Postări Recomandate

Salut,

 

Am achizitionat un PIC18F46K22 si acum m.am apucat sa fac cateva programe cu el. Problema e ca nu stiu exact cum se seteaza frecventa.

Conform datasheet, frecventa maxima e 64 MHz(cu PLL). Asadar am setat frecventa oscilatorului intern ca fiind maxima si am activat PLL( deci teoretic trebuia sa mearga la 64Mhz, iar frecventa de executare a instructiunilor sa fie 8 MHz (MIPS=FOSC/4). Am facut urmatoarele setari:

#pragma config FOSC = HSHP  #pragma config PLLCFG = ON

 

Asta teoretic ar fi trebuit sa seteze frecventa pe 64MHz.

Am facut urmatorul program:

TRISA=0;   while(1){   PORTAbits.RA0=1;   //pe RA0 am legat un led   for(long i=1; i<8000000;i++); PORTAbits.RA0=0; for(long i=1; i<8000000;i++);   }

 

si am cronometrat cat timp sta ledul aprins. Am obtinut 8 secunde. Asta ar insemna ca executa cele 8.000.000 din for in 8 secunde, deci rezulta o frecventa de 1 MHz, nu 8 cat am planificat.

 

 

In continuare am incercat sa ii pun un cristal de 16MHz si sa activez PLL cu urmatoarele setari:

 

#pragma config FOSC = ECHPIO6 #pragma config PLLCFG = ON

 

Teoretic trebuia sa foloseasca ca sursa oscilatorul extern multiplicat de 4 ori. Am facut acelasi experiment, iar de data asta ledul statea aprins 32 secunde. Deci o frecventa de 250Khz, si mai prost.

 

Nu inteleg unde gresesc. Daca cineva imi poate explica de ce am obtinut 1 MHz la primul experiment si cum se seteaza frecventa oscilatorului extern, m-ar ajuta foarte mult.

Multumesc.

Editat de nimeni_altci
Link spre comentariu
  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

”Asta ar insemna ca executa cele 8.000.000 din for in 8 secunde, deci rezulta o frecventa de 1 MHz, nu 8 cat am planificat.”

E o părere , poate greșesc. MIPS se referă la instrucțiuni ASM ( de un ciclu ) , rămâne  de văzut compilatorul în câte instrucțiuni ASM traduce linia respectivă de cod C.

Link spre comentariu

si am cronometrat cat timp sta ledul aprins. Am obtinut 8 secunde. Asta ar insemna ca executa cele 8.000.000 din for in 8 secunde, deci rezulta o frecventa de 1 MHz, nu 8 cat am planificat.

 

Setarile pentru 64Mhz sunt corecte.Gresesti cand crezi ca "for(long i=1; i<8000000;i++);" consuma 8.000.000 cycles.

In functie de compilator, ai mult mai multe instructiuni pe care procesorul le va face.

In cazul tau sigur ai aprox. 128.000.000.

128.000.000 in 8sec => 16Mhz

 

Ai inteles ce vreau sa spun?

Link spre comentariu

Vedeti ca in primul rand 64/4 = 16 nu 8

Eu verific frecventa reala cu un Timer sau PWM , numai instructiunile simple in asamblare se executa intr-un ciclu de Fosc/4 , instructiunea FOR presupune mai multi pasi , macar 2 ,  se incrementeaza "i" si apoi scrie pinul portului

 

... de unde tragem concluzia ca instructiunea FOR este o instructiune complexa in asamblare ?

ce opcode are ca de mult o caut ?

Link spre comentariu

Si ce nu ti-e logic din faptul ca incrementeaza counterul i si executa instructiunea corespunzatoare , in cazul asta scrie pinul portului la fiecare incrementare ? Nu conteaza ca scrie aceeasi valoare "0" sau "1" consecutiv de 8 mil ori daca asta pare ciudat, putea fi alta instructiune cu alta valoare de fiecare data

Editat de Depanatoru
Link spre comentariu

Vedeti ca in primul rand 64/4 = 16 nu 8

Eu verific frecventa reala cu un Timer sau PWM , numai instructiunile simple in asamblare se executa intr-un ciclu de Fosc/4 , instructiunea FOR presupune mai multi pasi

Multumesc tuturor pentru raspunsuri, am inteles ca de fapt un for implica mai multe instructiuni pe ciclu. Imi cer scuze ca am scris 8, si nu 16. Am lucrat azi cu un alt PIC de 32 Mhz si am ramas setat ca trebuie sa fie 8. La ce te referi cand spui ca verifici frecventa cu timerul? Cum anume?

Link spre comentariu

Pai destul de simplu , la fiecare intrerupere a timerului la overflow se comuta pinul unde masori frecventa . Atunci e garantat exact , atentie numai la proprietatile fiecarui timer . De exemplu poate fi Fosc/4/256 pentru un timer obisnuit de 8 biti ( sunt si care incrementeaza pe fiecare front al tactului Fosc/2/256 )

Editat de Depanatoru
Link spre comentariu

In continuare am mai intampinat o problema. Am incercat sa fac o comunicare serial pe UART intre PIC si calculator. Pentru a face conversia am folosit un PL2303, iar pentru a vedea ce trimit am folosit Serial Monitor de la Arduino. Problema e ca programul meu pur si simplu nu merge si nu inteleg de ce(teoretic ii trimit o litera si trebuie sa imi trimita aceeasi litera ianpoi) . Am verificat de multe ori registrele. Mentionez ca e vorba tot despre PIC18F46K22.

Acesta este programul:

 

PIC18 UART.txt

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări