Sari la conținut
ELFORUM - Forumul electronistilor

PWM cu PIC16F1704, PPS si minunatul MikroC


Stefan

Postări Recomandate

Este pentru prima oara cand ma joc cu PICe dastea mai "exotice" cu pin peripheral select si nu reusesc sa-l conving ca pe RC5 (sau RC3) am nevoie de impulsuri modulate in durata. PIC-ul este 16F1704 tactat la 1MHz intern si cu un LED conectat (si functional) la RC0 pentru a verifica functionarea timerului 1.

 

Mentionez ca in PROTEUS  totul functioneaza perfect. Adica aplicatia intreaga are PWM la RC5 modulat de o intrare analogica la RA0 + feedback la RA2, controlul unui LED RGB pentru a "arata" procentul (factorul de umplere) PWM si un LED de status general.

Dupa ce am scris tot codul si am vazut ca nu functioneaza "on real machine" am lasat doar codul de mai jos pentru a verifica PWM, nu vrea sa mere!

  TRISC = 0x00;                      // All pins is output
  LATC = 0x00;                       // All RC pins sets to low
  
  Unlock_IOLOCK();
  PPS_Mapping_NoLock(_RC3, _OUTPUT, _CCP1);
  PPS_Mapping_NoLock(_RC5, _OUTPUT, _CCP2);
  Lock_IOLOCK();
  
  PWM2_Remappable_Init(1000);     // 1KHz
  PWM2_Remappable_Start(); //
  PWM2_Remappable_Set_Duty(128); //di tiest

Aveti ceva experiente cu MikroC, PPS si PWM ?

Link spre comentariu

Nu stiu cum este in MicroC, eu lucrez cu FlowCode si la configurarea microcontrollerului, pentru PWM, trebuie sa setez bitul 18 (PPSLOCK One Way). 

Mie mi-au rezultat urmatoarele cuvinte de configurare: 

0x1=0x1a4 (si aici trebuie sa configurezi bitul OSCCON pentru ceas intern <OSCCON=0x70;>)

0x2=0x18fb

 

image.thumb.png.926a617eff708e789d6766b008b3b12d.png

16f1704.TXT

Link spre comentariu

@bercioiu mulțumesc pentru răspuns. GUI-ul arată superb față de cum știam eu flowcode-ul.

Abia diseară o sa vad cum este cu PPSLOCK, am presupus ca asta face funcția din biblioteca PPS.

Lock_IOLOCK();

Oscilatorul intern funcționează (am setat OSSCON dar nu am postat tot codul) pentru ca am "martor" un LED controlat de TMR1.

 

Tot diseară testez HEX-ul atasat și dacă funcționează imi e clar ca ori eu ori bibliotecile din MikroC suntem praf.

Link spre comentariu

Exact cu modelul respectiv de PIC nu am lucrat insa am folosit alte modele cu PPS, vezi ca in setarile proiectului (properties) ai aoclo o optiune care trebuie activata ca sa lasi software-ul sa poata seta de mai multe ori registrii PPS altfel o poti seta o singura data, acuma nu stiu daca asta o fi problema. Insa am intalnit situatii cu UART in care nu mergea corect libraria de "PPS_Mapping_NoLock" si am recurs la setarea manuala a registriilor de "RxyPPS" pentru PWM2 la RC5 ar fi:  

 

 Unlock_IOLOCK();
 RC5PPS = 0xD;
 Lock_IOLOCK();

 

Link spre comentariu

La fel si io prefer sa fac "de mana" lucrurile care-s simple... un exemplu pt. 1705, I2C si UART (I2C e "dublu" de complicat ca  e bidirectional...):

 

  //mapping I2C and UART pins
  SSPCLKPPS = 0b00010000; //pin C0
  SSPDATPPS = 0b00010001; //pin C1
  RC0PPS    = 0b00010000; //SCL-SCK
  RC1PPS    = 0b00010001; //SDA
  RC4PPS    = 0b00010100; //TX on C4
 

 

Link spre comentariu

Fara a oferi o rezolvare punctuala, voi sugera mai mult o directie.

Pentru picurile astea mai noi eu folosesc MPLABX. Suporta doar programatoarele mai noi (Pickit4 in cazul meu), dar are un utilitar MPLAB Code Configurator. Utilitarul asta iti configureaza picul si creeaza toate functiile corespunzatoare. Dupa care nu mai ramane decat sa le introduci in main.c si gata. Oarecum, uneori mai trebuie sa modifici cate ceva. Cand nu imi place ce a facut, preiau partea de initializare si mai departe scriu eu functiile. In orice caz, ma ajuta sa trec mai usor peste partea de initializare.

In plus, utilitarul asta te scuteste uneori sa mai sapi in datasheet (in cazul meu era gresit, foloseam 16F18855; dupa o zi de cautari absurde, m-am scos cu MCC).

Spor!

Link spre comentariu

@bercioiu HEX-ul postat de dvs. genereaza PWM la RC5, frecventa nu corespunde dar nu asta conteaza acum.

In PICKIT4 bitul respectiv (PPSLOCK) cred ca este PPS1WAY si l-am invartit pe toate partile (doua) dar degeaba.

 

Cand spui PWM hard te referi la CCP sau chiar la modulele PWM dedicate?

Eu vreu sa generez un singur semnal PWM cum asa de usor se facea la 16F877/887...

 

FlowCode era chiar simpatic dar parca ma obosea sa urmaresc "codul", avantajul la el e ca poti avea ceva functional in doar cateva minute.

 

In mod normal CCP1 era la RC5 dar atata le-am frecta ca nici nu mai stiam cum sunt.

  Unlock_IOLOCK();
  PPS_Mapping_NoLock(_RC3, _OUTPUT, _CCP2);
  PPS_Mapping_NoLock(_RC5, _OUTPUT, _CCP1);
  Lock_IOLOCK();

@Bandi Szasz la sfatul Dv.s am incercat si asa:

 

  Unlock_IOLOCK();
  //PPS_Mapping_NoLock(_RC3, _OUTPUT, _CCP2);
  //PPS_Mapping_NoLock(_RC5, _OUTPUT, _CCP1);
  RC3PPS = 0xD;   //PWM2 la RC3
  RC5PPS = 0xC;   //PWM1 la RC5
  Lock_IOLOCK();

Atat cu apelarea bibliotecii PWMx_Remappable cat si  cu biblioteca PWMx.

 

@kit a fost o scurta perioada cand imi placeau PICele dar am cam abandonat partea asta de progamare MCU si nu mai am rabdare sa invat MPLABX cu al sau compilator de C, dar niciodata nu se stie.

 

Editat de Stefan
Link spre comentariu

Da, probabil ca nu am setat pll-ul si de aceea nu corespunde frecventa.

Pwm hard, ma refer la cpp, in FlowCode, la propirietati pwm, pot seta doar tmr2,4 sau 6.

Link spre comentariu

Ma gandeam ca de CCPTMRS se ocupa biblioteca din MikorC si nu ii mai spun eu ce sa faca, oricum eu nu am utilizat timerele alea. Totusi se pare ca au mari probleme cu testarea bibliotecilor pentru unele PIC-uri si cine vrea sa rezolve cu adevarat trebuie sa deschisa un ticket (program cu licenta).

Am testat un exemplu dat de ei, pentru un alt model de PIC tot cu remap, si nu merge nici daca-l ...

 

Singura rezolvare probabil e sa scriu totul de gheruta.

 

Editat de Stefan
Link spre comentariu

@kit m-am uitat putin pe internet si am vazut ca MCC e destul de simplu de utilizat si am zis ca nu am ce pierde daca il incerc.

Am reusit sa scot PWM la RC5 1KHz 50% fara a scrie o linie de cod :rade:

 

MCC-1704-PWM.png

Link spre comentariu

@stefan: mda, cam la asta ma refeream. Daca ceva merge insa stramb, trebuie sa citesti bine de tot codul generat, sa vezi daca-l folosesti corect. Eventual daca nu mai trebuie sa adaugi si tu cate ceva. Mare atentie insa, adaugirile/modificarile nu se fac in fisierele generate, ca se pierd!

Spor!

Link spre comentariu

E destul de bine gandit si la o noua generare imi arata daca fisierele vechi (cele generate de MCC) sunt diferite de ce trebuie sa genereze si iti face o analiza intre ele.

Partea amuzanta e ca am generat si setarile pentru DAC, in realitate functioneaza dar nu mai functioneaza in Proteus :rade:

O sa incerc sa fac totul in MPLAB cu XC8 si daca nu imi iese ma mut in MikroC si "fur" registrii pentru PWM.

 

Data viitoare trebuie sa ma gandesc de 3 ori cand cumpar PICe doar ca dau bine la pret si in fisa tehnica.

Link spre comentariu
  • 4 săptămâni mai târziu...

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