Toggling LED's højt, når Timer0 overloebsbeholdere

M

M3GAPL3X

Guest
Hi guys,

Jeg forsøger at lave en simpel Timer0 program hvor LED-lyset slukket og end på efter 1 sekund.Jeg bruger et 8 bit timer, 31 kHz intern LPINSRC ur med en 1:30 pre-scaler.LED's er ikke toggling start og end på og end off igen.De er bare fra off til on næsten instanteously.

Her er min kode:

Code:/ / LED blinker til og fra hver 1 sekund uden afbryder# include <p18f14k50.h>/ / pragma koder

# pragma config FOSC = IRC / / muliggøre Indre Oscillator/ / funktion prototyper

void init (void);void vigtigste ()

(

TRISC = 0x00; / / sæt PORTC's som output

LATC = 0x00;init ();mens (1)

(/ / hvis overflow flag er sat for timer0, lyser LED, nulstille overflow flag bit og nulstille TMR0L lave byte til 0x05

if (INTCONbits.TMR0IF == 1)

(

LATC = 0xff;

/ / INTCONbits.TMR0IF = 0;

TMR0L = 0x05;

))

)/ / Funktion til initalize oscillator registre

void init (void)

(

OSCCONbits.SCS1 = 1;

/ / aktivere 31 kHz kHz ur

OSCCONbits.IRCF2 = 0;

OSCCONbits.IRCF1 = 0;

OSCCONbits.IRCF0 = 0;OSCCONbits.OSTS = 0; / / enheden kører fra interne oscillator

OSCTUNEbits.INTSRC = 0; / / 31 kHz enheden er direkte afledt LFINTOSC/ / configure Timer0

T0CONbits.T08BIT = 1 / / Timer0 konfigureret som en 8 bit register/ / Indre Instruction Cycle Clocka

T0CONbits.T0CS = 0;T0CONbits.PSA = 0;

/ / configure prescale værdien af 1:32

T0CONbits.T0PS2 = 0;

T0CONbits.T0PS1 = 1;

T0CONbits.T0PS0 = 0;/ / belastning TMR0L til en værdi af 05

TMR0L = 0x05;

INTCONbits.TMR0IF = 0;/ / aktivere TMR0 efter at gøre det muligt for alle relaterede registre

T0CONbits.TMR0ON = 1;

)
/**************** FODNOTER *************

Med en 31 kHz ur, frekvens er 31 kHz / 4 = ca 8 kHz.
8 kHz svarer

til ,125 ms per instruktion så 8000 instruktioner i sekundet.
Med en 32 bit pre-skalær,

instruktioner pr ms er 4.
Derfor omkring 250 tæller i sekundet.
En 8-bit timer kan holde

en max værdi for 256, så belastningen TMR0L med 0x05.

* /
 
her er min kode til at blinke en LED baseret på timer0 om 12F675.Det bruger interrupts men samme tankeproces gælder.

håber det hjælper.

Code:

/ / Forudindlæs timeren med en offset at hjælpe med at justere timing# include <htc.h>__CONFIG (MCLRDIS & Unprotect & BORDIS & WDTDIS & INTIO & PWRTEN);/ / hardwarekonfiguration

# define nLED 2 / / LED på gpio2

# define MaxCnt 1000000 / 250 / / maksimalt tælle til klappen LED

# define T0Offset (255-250 3) / / timer0 offset så timeren overloebsbeholdere på nøjagtig 250 cyklusser (= 250us)usignerede CHAR sGPIO / / skygge gpiovoid interrupt LED (void) (

statisk usignerede int T0Counter = MaxCnt / / initialisere t0 counter.
"statisk" at bevare værdien

T0IF = 0; / / rydde interrupt flag

TMR0 = T0Offset / / belastning timeren med offset

T0Counter-= 1;

if (T0Counter == 0) (

T0Counter = MaxCnt / / reset T0Counter

sGPIO ^ = (1 <<nLED); / / flash nLED pin

)

)void

Main (void)

(

TRISIO = ~ (1 <<nLED) / / alle gpio stifter til input andre end nLED og nButtonLED

OPTION = 0b11011000 / / oprettelsen af optioner register;

/ / 1 / / GPPU: pull-up handicappede

/ / 1 / / INTEDG: afbryder på stigende kant

/ / 0 / / T0CS: timer0 kilde vælge - intern taktcyklus

/ / 1 / / T0SE: timer0 kant vælge - afbryder på høj-til-lave transisiton

/ / 1 / / PSA: prescaler udvalgt til at vagthund

/ / 000 / / PS0 .. 2: prescaler sats vælge - 000 = 1/ / GPPU = 1; INTEDG = 1; T0CS = 0; T0SE = 1; PSA = 0;sGPIO = 0; / / klar gpio stifterT0IE = 1 / / aktivere timeren 0 afbryder

ei () / / aktivere global afbryder.
= GIE = 1;mens (1) (

/ / TODO Auto-genereret hovedfunktion

GPIO = sGPIO;

)

)

 
Tak!Jeg
vil tage et kig på den.Jeg faktisk regnede den ud.

Her er mit endelige kode, hvis andre ønsker det:

Code:/ / LED blinker til og fra hver 1 sekund uden afbryder# include <p18f14k50.h>/ / pragma koder

# pragma config FOSC = IRC / / muliggøre Indre Oscillator/ / funktion prototyper

void init (void);void vigtigste ()

(

TRISC = 0x00; / / sæt PORTC's som output

init ();

mens (1)

(

/ / hvis overflow flag er sat for timer0, lyser LED, nulstille overflow flag bit og nulstille TMR0L lave byte til 0x05

if (INTCONbits.TMR0IF == 1)

(

LATC ^ = 0xff;

INTCONbits.TMR0IF = 0;

TMR0L = 0x00;

))

)/ / Funktion til initalize oscillator registre

void init (void)

(

OSCCONbits.SCS1 = 1;

/ / aktivere 31 kHz kHz ur

OSCCONbits.IRCF2 = 0;

OSCCONbits.IRCF1 = 0;

OSCCONbits.IRCF0 = 0;OSCCONbits.OSTS = 0; / / enheden kører fra interne oscillator

OSCTUNEbits.INTSRC = 0; / / 31 kHz enheden er direkte afledt LFINTOSC/ / configure Timer0

T0CONbits.T08BIT = 1 / / Timer0 konfigureret som en 8 bit register/ / Indre Instruction Cycle Clocka

T0CONbits.T0CS = 0;T0CONbits.PSA = 0;

/ / configure prescale værdien af 1:32

T0CONbits.T0PS2 = 1;

T0CONbits.T0PS1 = 0;

T0CONbits.T0PS0 = 0;/ / belastning TMR0L til en værdi af 05

TMR0L = 0x00;

INTCONbits.TMR0IF = 0;/ / aktivere TMR0 efter at gøre det muligt for alle relaterede registre

T0CONbits.TMR0ON = 1;

)
/**************** FODNOTER *************

Med en 31 kHz ur, frekvens er 31 kHz / 4 = ca 8 kHz.
8 kHz svarer

til ,125 ms per instruktion så 8000 instruktioner i sekundet.
Med en 32 bit pre-skalær,

instruktioner pr ms er 4.
Derfor omkring 250 tæller i sekundet.
En 8-bit timer kan holde

en max værdi for 256, så belastningen TMR0L med 0x05.

* /
 

Welcome to EDABoard.com

Sponsor

Back
Top