Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu citirea RA1 la un PIC16F876A


moro

Postări Recomandate

N-am folosit niciodata PWM-ul, asa ca in continuare doar presupun.

Din data sheet nu ma prind daca duty cycle e procent din perioada sau valoare absoluta.

Daca e ultima varianta, sunt sanse sa ai probleme din cauza ca e mai mare decat perioada. Cel putin mie asa-mi da:

- perioada = 0xA*4*Tosc*TMR2 = 40*M

- duty_cycle = (0x16<<2 + 0)*Tosc*TMR2 = 88*M,

unde M=multiplicator, acelasi pentru ambele=Tosc*TMR2.

 

Sugestie: incearca cu un duty-cycle (mult) mai mic.

 

Mai ai o problema la

CCP1CON=0x4C;
unde programezi un 1 pentru un bit neutilizat (bitul din 4 e bit6).
Link spre comentariu
  • Răspunsuri 40
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • moro

    14

  • francezu

    10

  • pegas

    6

  • cirip

    3

Top autori în acest subiect

E corect ce spune Liviu M , ai setat duty cycle prea mare, in cazul asta pinul CCP1 nu comuta, ramane mereu 1 logic.

Din datasheet:

1)PWM Period = [(PR2) + 1] • 4 • TOSC •(TMR2 Prescale Value)

2)PWM Duty Cycle =(CCPR1L:CCP1CON<5:4>) •TOSC • (TMR2 Prescale Value)

Egaland perioada cu duty cycle se obtine CCP1L:CCP1CON<5:4> maxim :

CCPR1L:CCP1CON<5:4> =(PR2 + 1)*4 = (10+1)*4=44 = b'0000101100' deci:

CCPR1L=b'00001011' = 11

CCP1CON<5:4>= b'00' = 0

 

In alta ordine de idei, ce compilator folosesti ? Nu are librarie pt PWM ?

Link spre comentariu

Folosesc mikro C, am incercat si cu ce are prin librariile sale legat de pwm si acelasi rezultat, momentan numa ce am ajuns de la servici. O sa vad maine. Va tin la curent !

Link spre comentariu

Am revenit, din pacate cu aceasi dezamagire, am atasat totusi cateva pagini dintr-o carte unde am gasit un exemplu clar de setare in pwm mode, ba chiar am facut ca la prosti mota`mo, am verificat adresele si registrii daca corespund cu ce microcontroler am eu (in carte era vorba de 18F452).

Am incercat sa micsorez dutycycle, o sa iau referinta exemplul acela unde perioada este 44uS, in carte era 22us (50%) dutycycle, am incercat sa pun perioada pentru dutycycle si acelasi rezultat 0.

In simulator vad ca starea pinului CCP1 sta tot timpul in 0 logic, am incercat chiar cu un rezistor de pull-up la +5V sa vad ce se intampla, nu e nici high nici low iesirea lui CCP1

 

void main() {  T2CON=0x05; // (00000101)  timer 2 ON si prescaler la 4  PR2=0x0A;  CCPR1L= 0x0A; // 00001010  TRISC=0; // seteaza portulc iesire digitala  PORTC=0xFF;  CCP1CON=0x0C; // (00001100) setup CCP1 for pwm mode  /*PORTC = 0;  TRISC=0;  PWM1_Init(5000);  PWM1_Start();  PWM1_Set_Duty(192);    */ }
francezu am incercat si cu ce avea el prin librarie, am gasit ceva acolo care pana la urma l-am lasat in /* */. Tot la fel face, nu reactioneaza deloc, ma gandisem ca o fi ceva de la soft, dar nu. Am scris si microcontrolerul si acelasi rezultat si pe hardware :-?
Link spre comentariu

cateva observatii:

 

1. de ce ai pus ceva in CCP1PRL? nu ziceai ca lucrezi cu modulul 2?

2. eu lucrez in asm, nu c, si conteaza aici in ce bank sunt. de ex. trisc si portc sunt in bankuri diferite si tu nu le schimbi nicaieri.

3. nu am lucrat cu PWM, ma uit in datasheet. poate trebuie respectata exact ordinea?

 

8.3.3 SETUP FOR PWM OPERATION

The following steps should be taken when configuring

the CCP module for PWM operation:

1. Set the PWM period by writing to the PR2 register.

2. Set the PWM duty cycle by writing to the

CCPR1L register and CCP1CON<5:4> bits.

3. Make the CCP1 pin an output by clearing the

TRISC<2> bit.

4. Set the TMR2 prescale value and enable Timer2

by writing to T2CON.

5. Configure the CCP1 module for PWM operation.

Link spre comentariu

Dupa parerea mea, exemplul din carte e cam "defect".Dupa ce obtine cei 10 biti pentru dutycycle (22 zecimal, 0x16 hexa, 10110 binar)

CCPR1L:CCP1CON<5:4> = 0000010110

, cand ii separa in cei doi registri din care provin ii termina complet si definitiv.Daca luam cei 8 biti MSB pentru CCPR1L => CCPR1L = 00000101, si mai raman pentru CCP1CON<5:4>=10.Cu alte cuvinte:CCPR1L=0x05 siCCP1CON=0x2C.
Link spre comentariu

merge lool :101

Am incercat sa iau fiecare bit si sa-l setez separat

Am inlocuit T2CON=0x05; cu codul de mai jos

T2CON.TMR2ON = 1;  // timer 2 enableT2CON.T2CKPS1 =0; // prescale 4T2CON.T2CKPS0 =1;
Vad ca acum am pwm pe CCP1, o sa ma uit maine dimineata mai atent sa vad ce se intampla pe acolo, bine macar ca am reusit enable la pwm cu toate ca nu pricep foarte bine de ce prima data nu a mers si cand am luat fiecare bit separat a mers.

Multzam fain !

Link spre comentariu

8.3.3 SETUP FOR PWM OPERATIONThe following steps should be taken when configuringthe CCP module for PWM operation:1. Set the PWM period by writing to the PR2 register.2. Set the PWM duty cycle by writing to theCCPR1L register and CCP1CON<5:4> bits.3. Make the CCP1 pin an output by clearing theTRISC<2> bit.4. Set the TMR2 prescale value and enable Timer2by writing to T2CON.5. Configure the CCP1 module for PWM operationAi respectat ordinea si ce scrie aici?

Link spre comentariu

1. Set the PWM period by writing to the PR2 register.2. Set the PWM duty cycle by writing to theCCPR1L register and CCP1CON<5:4> bits.3. Make the CCP1 pin an output by clearing theTRISC<2> bit.4. Set the TMR2 prescale value and enable Timer2by writing to T2CON.5. Configure the CCP1 module for PWM operationDaca pun ca in pasii de mai sus nu imi functioneaza pwm-ul, dar daca inversez 4 cu 5 atunci functioneaza :-?Oricum mai trebuie sa experimentez putin cu formulele de calcul pentru frecventa, am observat ca nu pusca niste calcule cu oscilograma de pe iesire, ma refer ca timp/frecventa. O sa revin cu detalii imediat

Link spre comentariu

M-am tot jucat cu diferite valori pentru CCPR1L ca sa obtin diferite valori pt dutycycle, am incercat niste valori folosind un calculator de aici http://www.micro-examples.com/public/mi ... lator.html

 

Dar de exemplu la un clock de 4MHZ cu PR2 60 si Timer2 prescale la 16 ca sa obtin un 73% duty cycle imi da acel calculator valoarea decimala 44, simulat cu 44 decimal ( 2C hex) corespund timpii in oscilograma.

Eu am incercat sa fac un calculator in excel care sa ma scuteasca de calcule matematice, insa ce nu inteleg eu in datasheet'ul picului CCPR1L:CCP1CON < 5:4 > = PWM duty cycle/(TMR2PS *TOSC)

Acea valoare PWM duty cycle din cate am vazut este exprimata in secunde (microsecunde) si nu stiu la care parte din perioada totala se refera? la toff sau ton? De ce intreb asta, la 1024HZ mie T = 1000 us , la un dutycycle de 73% mie imi zice ca din T, ton este 712uS si Toff 264 uS.

Eu am incercat sa pun una din valorile toff si ton acolo in formula la PWM duty cycle dar nu imi da deloc valoarea decimala 44 pentru CCPR1L, imi da ori 173 ori 66 decimal. A mai intampinat cineva problema de genul?

Link spre comentariu

Eu am incercat sa fac un calculator in excel care sa ma scuteasca de calcule matematice, insa ce nu inteleg eu in datasheet'ul picului CCPR1L:CCP1CON < 5:4 > = PWM duty cycle/(TMR2PS *TOSC)

Formula este corecta. Termenul din partea stanga a ecuatiei este un registru compus, pe 10 biti, care este comparat intern cu TMR2(+ 2 clock-uri) pt a determina momentul cand iesirea trebuie sa comute in 0 logic.Vezi figura 8-3 din datasheet. Registrul este format astfel: primii 8 biti provin din CCPR1L, iar ultimii 2 LSB provin din bitii 5 si 4 ai CCP1CON. Duty cycle register= CCPR1L * 4 + CCP1CON < 5:4 > ; ccpr1L se inmulteste cu 4 pt a muta bitii cu 2 pozitii spre stanga.PWM duty cycle, din partea dreapta a ecuatiei, reprezinta timpul cat iesirea trebuie sa stea in 1 logic (Ton).
Link spre comentariu

Daaa, chiar am incercat niste mici jonglerii cu bitii, respectiv cu primii doi biti a lui CCPR1L, am observat ca pentru valoarea decimala cum era la mine cu 173, am scos ultimii 2 biti din ccpr1l si mi-a dat 44, m-am jucat si cu alte valori si e ok. O sa incerc astazi sa implementez o decrementare/incrementare cu niste butoane sa vad ce iasa :d

Link spre comentariu

Pana la urma am reusit sa fac sa mearga si cu instructiunile pwm din libraria lui mikroc, mama daca nu m-am chinuit tot weekend-ul sa fac o incrementare/decrementare a factorului de umplere ca sa ajung in final ca avea proteus niste bube si efectiv nu vruia sa-mi execute codul, desi era scris corect.

Poate ajuta pe cineva intamplarea mea, cautand pe google am dat peste asta http://www.edaboard.com/thread196923.html

Am incercat sa inlocuiesc acel dll cu cel din arhiva si intradevar merge, nu mai am probleme in simulari, am atasat si eu aici acel dll bun

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