Graag wil ik een piezo buzzer aansturen met een pic16F877. Echter stuit dit op veel problemen. Het is een van mijn eerste projecten met een PIC. Heb altijd met AVR gewerkt. Ik ben erachter gekomen dat er software matig verschillen zijn tussen de twee soorten Microcontrollers.

Ik stuur het piezo aan via het PWM kanaal van de PIC16F877 (o.a. RC2)

Ik heb een buzzer met een resonantie frequentie bij 4kHz.

Ik heb in de datasheet van de PIC16F877 gelezen dat je met een aantal registers te maken hebt: CCPR1L en CCPR1H en moet je natuurlijk de dutycycle kunnen instellen. Echter kan ik hier geen goede informatie over vinden. Heeft iemand hier misschien een goede site over of tips?

Heb je hoofdstuk 8.3 (PWM Mode) van het datasheet wel gelezen?
Met een step-by-step beschrijving en voorbeelden in paragraaf 8.3.3.

OK. ik zal het gespecificeerder uitleggen. De eerste stap van het stappenplan die u noemde:

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

hier begint voor mij het probleem al. Ik weet niet hoe ik iets in dit PR2 register kan schrijven. ik zie in tabel 8.3 een aantal waarden staan met daarbij de prescaler.

Ik weet mijn prescaler niet, of hoe ik deze zelf kan bepalen weet ik ook niet.

overgens wil ik in C programmeren!

Ik weet niet hoe ik iets in dit PR2 register kan schrijven.

Wat dacht je van:

PR2 = 57;

Ik weet mijn prescaler niet, of hoe ik deze zelf kan bepalen weet ik ook niet.

Hoofdstuk 7 overgeslagen (Hoe zet je TMR2 op)

overgens wil ik in C programmeren!

Meestal hebben de C compilers een support library, en klets je tegen de library, niet rechtstreeks tegen de hardware. In PICC18 bijvoorbeeld:

OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_8);
OpenPWM1(255);
SetDCPWM1(25);

OK.


PR2=57;

ik heb gelezen dat de waarde van PR2 de PWM frequentie bepaald en dat deze zoals alle andere moet liggen tussen de 0x00 en 0xFF.

De formule die daarbij komt kijken is dan:
PWM period = [(PR2) + 1] x 4 x Tosc x TMR2 prescaler.

De input klok Tosc heeft een prescale optie van 1:1, 1:4 en 1:16 (staat in hoofdstuk 7 van datasheet)

Dan is mijn vraag, waarom zou ik hiervoor een prescaler willen instellen? Wordt dit gedaan om de microcontroller te laten "rusten"?

OK, ik moet dus het Timer2 register instellen, zoals op pagina 55 van het document (pag. 57 in acrobat reader), dus met TMR2ON=1
T2CKPS1:T2CKPS0 = mijn prescale factor.

Maar dan heb ik dus de volgende vragen. Welke criteria bepalen de instellingen van mijn prescaler?

ik heb ooit eens een prescaler gebruikt in een klok. Die prescaler zorgde ervoor dat mijn klok daardoor voor meer rust zorgde.