Sari la conținut
ELFORUM - Forumul electronistilor

Recomandare PIC pentru modulare pwm sinus


moro

Postări Recomandate

  • Răspunsuri 38
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • moro

    17

  • 10vid

    9

  • Liviu M

    3

  • MatyC

    2

Top autori în acest subiect

Salut la toata lumea,Pentru referinte anterioare vedeti la sectiunea CQ-YO la radioamatorism topicurile "Stie cineva un soft free de filtrare FTB la un fisier mp3 ?" si"Filtrarea digitala a spectrului de frecvente".Implementarea este placa demo dsPIC starter Kit1. Ultima postare la "Stie cineva un soft free de filtrare FTB la un fisier mp3 ?".Acum sunt la faza de a transfera cele 256 sau 512 valori fractionale filtrate lamodulul PWM output compare pentru a genera semnalul filtratfara sa folosesc DMA.Exista dsPIC cu 4K sau mai mult de memorie DMA ?Scuze, trebuia sa introduc acestea ca topic nou. O sa deschid topicul azi sau maine ca nu-mi da voie sa scriu un nou mesaj mai repede.dsPIC33FJ256GP506 de pe placa demo are 2K DMA adrese adica 1K de datein DMA.Topicul acesta cu filtrarea digitala a fost deschis de Cirip, insa si pe mine ma intereseaza foarte mult. :dans:

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

Salut, am revenit, ca sa nu mai deschid alt topic, intreb si eu pe cei care au patit`o inaintea mea,

cu pic18f4431 cand activez intreruperea void interrupt () in simulator (proteus vsm isis7) imi apre un mesaj de eroare de genul:

 

PIC18 MEMORY PC=0x0034 Read of unimplemented memory address 0x0C2B returns

Mai jos este codul...

int  sine[16]={64,90,111,124,127,119,101,77,51,27,9,1,4,17,38,64};int i;void main() {INTCON=0xC0;// enable GIE and PEIE interruptsPIE3.PTIE=1; // enable pwm module interruptsTrisB=0; PortB=0x00; PTCON0=0x00; // 1:1 postscale; 1:1 prescale; Freerunning mode PWMCON0=0x20; PWMCON1=0x03; //////////// PTMR - PWM TIME BASE 12 bit register  ///////////////// PTMRL=0x05;  // lower 8 bits of PTMR PTMRH=0x00;  // upper 4 bits of PTMR /////////// END OF PTMR /////////////////////////////// ////////////PTPER - PWM TIME BASE PERIOD 12 bit register//////////////// PTPERL=0xe8; // lower 8 bits of PTPER PTPERH=0x07; // upper 4 bits of PTPER/////////// END OF PTPER ///////////////////////////////////////////// dutycycle registersPDC0L=0x0f;PDC0H=0x01;//////////////////////////////////PTCON1=0x80; // pwm timebase enabled, timebase counts upwhile(1);}void interrupt()   {if(PIR3.PTIF==1) {i++;PDC0L=sine[i];return;} }

 

Am observat ca atuci cand nu activez bitii GIE si PEIE din INTCON nu am aceea eroare.

Eu ca si compilator C folosesc mikroC... si vruiam sa stiu daca a mai intampinat cineva problema asta.... ce ar fi de facut

Link spre comentariu

Bitul PIR3.PTIF nu trebuie sa-l mai verifici daca e setat, el este intotdeauna setat la intrarea in rutina de servire a intreruperii, pentru ca el este acela care a provocat intreruperea. Totusi, el trebuie sters inaintea iesirii din acea intrerupere, ca sa nu mai provoace si alte intreruperi nedorite, ci sa fie setat din nou de timer.

Deci in rutina aceea trebuie doar incrementat acel " i " si sters bitul PIR3.PTIF.

Link spre comentariu

Esti sigur ca e nevoie de return cand iesi din functia interrupt?

 

In eventualitatea extinderii ulterioare a functiei, eu as lasa testul flagului, numai ca l-as extinde din

if(PIR3.PTIF==1) {
in (sper sa existe mnemonicele respective in mikroC)

if(PIR3.PTIF && PIR3.PTIE) {
Motivul - flagurile sunt "activate" in caz de eveniment, chiar daca intreruperile nu-s activate. Testul "dublu" te poate scapa de batai de cap.

Sunt de acord cu 10vid - flagul (PTIF) trebuie resetat la iesirea din functie. De asemenea, daca e cazul (daca iti trebuie timpi mai scurti decat ce poate timerul), trebuie reincarcat timerul cu valoarea de start.

Link spre comentariu

Ai dreptate, Liviu. Am omis sa spun de reincarcarea timerului cu o noua valoare.Totusi, testarea bitilor de intrerupere nu trebuie facuta decat in cazul in care avem mai multe surse generatoare de intreruperi, testam toti acei biti ca sa aflam care a generat intreruperea. In cazul de fata, cu o singura posibila sursa de intrerupere, e clar cine a generat intreruperea, asa ca nu mai trebuie testat.

Link spre comentariu

Ai dreptate, nu cunosc tot proiectul, nici daca moro il extinde, asa ca daca ramane asa cum e, nu-i nevoie de test.

Pen'ca testul nu consuma nici mult timp si nici multe resurse, ma gandeam (si am specificat asta) ca-l poate lasa "sa fie gata" incaz de dezvoltari ulterioare.

 

M-am uitat putin in documentatia de la mikroC si nici ei nu folosesc return la iesirea din functie, asa ca sunt sanse ca asta sa fie problema lui moro.

Link spre comentariu

daca pun in bucla if PIR3.PTIF==1 && PIE3.PTIE==1 si fara return; imi da eroare :

PIC18 MEMORY PC=0x003A Read of unimplemented memory address 0x0XXX returns

 

daca nu includ o bucla if cu cele doua conditii

void interrupt() {

i++;

PDC0L=sine;

}

imi da

PIC18 MEMORY PC=0x0032 Read of unimplemented memory address 0x0XXX returns

 

Am incercat si asa:

void interrupt() {

if(PIR3.PTIF==1){

PDC0H=sine;

PDC0L=sine;

PIE3.PTIe=0;

}

}

 

cu s-au fara PIE3.PTIE=0 nu mai imi da acele erori de mai sus dar nici dutycycle nu-mi face... Deja incep sa raman fara idei :-?

 

Problema asta am mai intalnito si cu PIC18F25K20 si atunci stiu ca nu am folosit return; ... acolo era putin mai simplu ca foloseam doar modulul CCP1 si timer2 dar la fel ca aici primeam acele erori, nu inteleg unde nu pusca intreruperile astea

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