21.12.2013 Views

Maskinnära programmering 6B2266

Maskinnära programmering 6B2266

Maskinnära programmering 6B2266

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Alla PIC-processorer har åtminstone en inbyggd räknare, Timer0. Timer0 är en 8-<br />

bitsräknare, den räknar således hela tiden från 0 till 255 då den slår runt och börjar<br />

från 0 igen. Med OPTION - registret väljer man räknehastigheten.<br />

Med ett tal Duty mellan 0 och 255 styr man PWM-signalen. Så länge Timer0 räknar<br />

under talet Duty låter man PWM-utgångspinnen vara "1", för att 0-ställa den så fort<br />

Timer0 räknat förbi talet Duty.<br />

Eftersom programmet hela tiden ( åtminstone varje Timer0-tick ) måste "läsa av"<br />

Timer0 får man inte så mycket processortid över för annat med denna metod ( ju<br />

högre PWM-frekvens, desto mindre tid till övriga uppgifter ).<br />

Många PIC-processorer har inbyggda "PWM-enheter". De kan självständigt generera<br />

PWM-signaler utan allt för stor inblandning från "huvudprogrammet".<br />

PWM-signal med Timer0<br />

/*<br />

pwmpic.c Timer0-PWM-signal ( Bad example! )<br />

===========================================<br />

*/<br />

#include "16F628.h"<br />

#pragma config |= 0x3ff0<br />

#define ON 1<br />

#define OFF 0<br />

#pragma bit PWM_out @ PORTB.0<br />

#pragma bit Contact @ PORTB.1<br />

char MoreToDo(void);<br />

char Duty; /* global variable */<br />

void main( void)<br />

{<br />

Duty = 0; /* start with zero DutyCycle */<br />

TRISB = 0b11111110 ; /* PORTB.0 is output */<br />

/* PORTB.1 is input */<br />

OPTION = 0b11000111; /* Timer0 Prescaler divide by 256 */<br />

while (1) /* forever */<br />

{<br />

char i;<br />

if (TMR0 < Duty) PWM_out = 1;<br />

else PWM_out = 0;<br />

Duty = MoreToDo(); /* Be back in one TIMER0-tick ! */<br />

}<br />

}<br />

34

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!