Mircea Postat August 27, 2016 Partajează Postat August 27, 2016 (editat) E deja al doilea PIC (primul fiind 16F1847) care are toane sau imi scapa mie ceva. PIC 12F1571 cu oscilator intern la 8MHz, dar se pare ca totul se executa ca si cum oscilatorul ar fi la sub 1MHz, chiar daca functia Delay_ms() este practic independenta de frecventa (in plaja acceptabila). Programul functioneaza, dar Delay_ms(500) nu se executa in 500ms, ci 6-7secunde. Odata terminata Delay_ms(500), programul nu mai are probleme de timp caci citeste apasarea unui buton. Am nevoie de acea intarziere ca sa se coordoneze cu alt PIC care controleaza un LCD. Insa vreau si sa evit executia haotica in momentul cuplarii alimentarii, 80% schimba starea iesirilor in mod aleator. Cu intarziere nu mai sunt probleme. Care e problema oscilatorului? Configuratia ca mai jos: Initializarea registrilor o fac asa: ' Set-up the PICsub procedure InitMain() OPTION_REG = 0x80 ' Pull-up disabled INTCON = 0x00 ' No INT CM1CON0 = 0x00 ' No COMP PWM1CON = 0x00 ' No PWM ANSELA = 0x00 ' No AI ODCONA = 0x00 ADCON0 = 0x00' DAC1CON0 = 0x00 PORTA = 0x00 ' Clear PORTA TRISA = 0x28 ' All outputs but RA5/RA3end submain:' Main programInitMain()counter = 0Delay_ms(500) ' Asta e intarzierea care dureaza 6-7 secunde in loc de 500ms. while(TRUE)' aici citesc RA5 si aprind LED-uri pe RA0/1/2 wendend. Editat August 27, 2016 de thunderer Link spre comentariu
Stefan Postat August 27, 2016 Partajează Postat August 27, 2016 Am intalnit problema asta la 18F46k22 si probabil se intampla la multe altele. Cred ca MikroC-ului ii scapa ceva la setarea corecta a oscilatorului si trebuie sa setezi manual registrii. Incearca cu OSCCON = 0b01110000 (pag 53 catalog) Link spre comentariu
Bandi Szasz Postat August 27, 2016 Partajează Postat August 27, 2016 (editat) Cred ca setarea de oscilator este folosit doar pentru generarea functiei de delay_ si altor librarii care necesita calcule dupa valoarea oscilatorului, registrii in sine pentru PIC nu sunt setati. Am folosit diverse PIC-uri cu oscilatorul intern si la toate am fost nevoit sa setez din soft valoarea registrului OSCCON, altfel PIC-ul rula la valoarea default care in general este 500khz. Editat August 27, 2016 de bandi12 Link spre comentariu
mars01 Postat August 27, 2016 Partajează Postat August 27, 2016 (editat) Mircea, cum s-a scris mai sus, seteaza bitii OSCCON. In cazul tau, internal osc cu freq 8MHz, adauga in prima linie din functia InitMain() urmatoarea linie: OSCCON = 0x70 Editat August 27, 2016 de mars01 Link spre comentariu
Mircea Postat August 27, 2016 Autor Partajează Postat August 27, 2016 Nope, problema e in alta parte. Am revazut programul pentru 16F1847 (primul la care am detectat problema). Am OSCCON deja setat. ' Set-up the PICsub procedure InitMain() INTCON = 0x00 ' No INT OSCCON = 0x70 ' 8MHz clock CLKRCON = 0x00 ANSELA = 0x00 ' No ADC ANSELB = 0x00 ' No ADC FVRCON = 0x00 ' Vref disabled ADCON0 = 0x00 ' No ADC DACCON0 = 0x00 ' No DAC CM1CON0 = 0x00 ' No comps CM2CON0 = 0x00 ' No comps OPTION_REG = 0x80 ' No Pull-Up CCP1CON = 0x00 ' No CCP CCP2CON = 0x00 ' No CCP CCP3CON = 0x00 ' No CCP CCP4CON = 0x00 ' No CCP CPSCON0 = 0x00 ' No CPS PORTA = 0x00 PORTB = 0x00 TRISA = 0x31 ' Setup I/O ports TRISB = 0x0C Init_Rotary_Encoder() InitTimer() TMR1IE_bit = 1 ' Timer1 Interrupt enable INTCON.PEIE = 1 ' Peripheral Interrupts enable INTCON.GIE = 1 ' Interrupts global enableend sub PIC-ul 12F1571 l-am pus in cutie, plus ca e SMD. Cata vreme 16F1847 face la fel, ceva trebuie sa fie gresit in ce fac. @bandi, nu cred ca PIC-ul lucreaza la 500kHz din motivul de-l invoci, dar nici nu pot sa zic ca e gresit ce zici, caci ceva intre 500k si 1MHz este ce vad in executie. Foarte rar setez OSCCON-ul. De regula in Edit Project o fac numai. Inclusiv PLLx4 si altele. Majoritatea proiectelor mele sunt la 32-64MHz ca sa pot face rapid calcule si altele, pot confirma ca lucreaza la 32-64MHz comparat cu PIC-urile vechi limitate la 16-20MHz. Viteza se vede la executie. Link spre comentariu
Elison Postat August 27, 2016 Partajează Postat August 27, 2016 Cu OSCCON=0x70 bit 7 din OSCCON este 1,inseamna ca 4xPLL is enabled, asta pentru ca in configuration word 1, PLLEN are valoarea 0. Bitii 6-3 din OSCCON au valoarea 1100 ceea ce inseamna ca fregventa oscilatorului este 2MHz si este setat asa cum spun bitii 1-0, adica ceas determinat de FOSC<1:0> din configuration words(ceas intern). Eu cred ca cel mai bine ar fi sa pui bitii SCS din OSCCON la valoarea 1x, figura 5-1 din datasheet si sa alegi fregventa potrivita din bitii 6-3. Link spre comentariu
Mircea Postat August 27, 2016 Autor Partajează Postat August 27, 2016 (editat) 70 = 0111 0000O sa incerc cu 16MHz, poate nu se mai impiedica. Editat August 27, 2016 de thunderer Link spre comentariu
Elison Postat August 27, 2016 Partajează Postat August 27, 2016 OSCCON = 0x70 nu este valoarea in hex? Eu stiam ca in zecimal se pune OSCCON=70, dar este posibil sa ma insel. Oricum ar fi corect, eu tot as incerca sa pun bitii SCS la 1x. Link spre comentariu
Mircea Postat August 27, 2016 Autor Partajează Postat August 27, 2016 O sa incerc cu SCS, OSCCON devenind 01110011 = 0x73. Mai tarziu insa.0x70 este in hex bineinteles. Ai punctat bine. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum