ongelman käyttämällä ajastimet kanssa PIC18F4550, apua tarvitaan?

E

elrayes

Guest
Hei kaikki

Haluan vain käyttää timer0 vuonna PIC18F4550 ja todella
Olen väsynyt lukemaan ja yrittää vieressä Olen erittäin huono ohjelmoija, joten yritämme auttaa minua tässä koodi, olen käyttäen MPLAB C18 kääntäjään, tätä koodia käytetään esiin eräitä LED's PORT D kun ajastin päättyy, i-kirjain käytetty ISR toteuttaa kaiken tämän, koodi rakennus on hienoa ja ladata tavoite mutta MCU ei toimi:

#
include <p18f4550.h>
#
include <stdlib.h>
#
include <timers.h>

# pragma keskeyttää high_isr
# pragma interruptlow low_isr

mitätön init_int (void)
(
/ / configuring katkaisevat
INTCON = 0xA0;
INTCON2 = 0x04;
)

# pragma koodi high_vector = 0x08
mitätön interrupt_at_high_vector (void)
(
_asm goto high_isr _endasm
)
# pragma koodi

# pragma koodi low_vector = 0x18
mitätön interrupt_at_low_vector (void)
(
_asm goto low_isr _endasm
)
# pragma koodi# pragma keskeyttää high_isr

mitätön high_isr (void)
(
if (INTCONbits.TMR0IF == 1)
(
INTCONbits.TMR0IF = 0;
PORTD = 0x0f;
)
)

# pragma interruptlow low_isr
mitätön low_isr (void)
(
)

# pragma koodi

int x = 0x0000;
mitätön main (void)
(
TRISD = 0x00;
LATD = 0x00;

OpenTimer0 (TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_8);
WriteTimer0 (0x0000);

kun taas (1)
(
high_isr ();
)
)

toivon joku voisi ratkaista tämän.
kiitos

 
Vain neuvoja ....

Haluatko LEDit on hehku perustuu Interrupt käsite eikä Polling käsite.Mutta nyt te kutsutte toiminto "high_isr" on samalla silmukka, joka on ISR.Kun ajastin päättyy se automaattisesti soittaa ISR.

Kun saat keskeyttää ja äänestyspaikkojen käsitteitä tehdä ohjelman työtä.

 
Oletko osoitettu erittäin tärkeänä, timer0 keskeyttää?

Hurraa

Ravi

 
itse olen muuttanut edellä koodi toiseen i löytyy C18 esimerkkejä mikrosirun ja silti se ei toimi ja oikeastaan olen ihan sekaisin, tämä on uusi koodi:

#
include <p18f4550.h>
#
include <timers.h>

//------------------------------------------------ ----------------------------

mitätön main (void);
mitätön InterruptHandlerHigh (void);

liitto
(
struct
(
unsigned Aikakatkaisu: 1; / / lippu merkitsee TMR0 aikakatkaisu
unsigned Ei mitään: 7;
) Bit;
unsigned char Byte;
) Lippu;

//------------------------------------------------ ----------------------------
/ / Main rutiini

mitätön
main ()
(
Flags.Byte = 0;
INTCON = 0x20; / / poistaa maailmanlaajuinen ja mahdollistaa TMR0 keskeyttää
INTCON2 = 0x84; / / TMR0 korkea prioriteetti
RCONbits.IPEN = 1; / /
enable tärkeystasoihin
TMR0H = 0; / /
klart ajastin
TMR0L = 0; / /
klart ajastin
T0CON = 0x87; / / perustaa timer0 - prescaler 1:8 / / 0x82
/ / T0CON = 0xB8; / / ei ennalta-skaalain sidotut
/ / T0CON = 0b10011000; / / ei ennalta-skaalain sidotut
INTCONbits.GIEH = 1; / /
enable katkaisevat
TRISB = 0;
TRISA = 0;
/ / Lata = 0x00;

kun taas (1)
(
PORTA = 0x01;
if (Flags.Bit.Timeout == 1)
(/ / Aikakatkaisu?
Flags.Bit.Timeout = 0; / /
klart aikakatkaisu indicor
LATBbits.LATB7 = LATBbits.LATB0; / /
kopiointi LED tilan RB0 on RB7
)
)
)

//------------------------------------------------ ----------------------------
/ / Korkea prioriteetti keskeyttää vektori

# pragma koodi InterruptVectorHigh = 0x08
mitätön
InterruptVectorHigh (void)
(
_asm
goto InterruptHandlerHigh / / siirtyä keskeyttää rutiini
_endasm
)

//------------------------------------------------ ----------------------------
/ / Korkea prioriteetti keskeyttää rutiini

# pragma koodi
# pragma keskeyttää InterruptHandlerHigh

mitätön
InterruptHandlerHigh ()
(
if (INTCONbits.TMR0IF)
(/ / Tarkista TMR0 overflow
INTCONbits.TMR0IF = 0; / /
klart keskeyttää lippu
Flags.Bit.Timeout = 1; / / osoittavat aikakatkaisu
LATBbits.LATB0 =! LATBbits.LATB0; / / vaihtaa LED-RB0
)
)

etusijalle katkaisevat käytössä
kuka tahansa voi auttaa?

kiitos etukäteen

 
1.En ole niin hyvä C. Oletko sidottuja timer0 keskeyttää korkeiden ensisijaisesti?
2.Oletko simuloitava MPLAB SIM?Saat tietää ongelman.

Hurraa

Ravi

 
Tarkista, että asetukset, sinun hallituksen olisi tuettava oskillaattoria asetukset annat siinä.
Ex: incase annoitte 4 * HSPLL ja kideoskillaattorin on noin 25MHz, se antaa noin 4 * 25MHz = 100MHz.Mutta jos rekisterinpitäjä käytät tukee vähemmän kuin (<100MHz) koodisi ei toimi sen kanssa.

Myös,
ette kuormituksen arvoja ajastin rekistereistä (TMR0L)
Initialise joka kerta rekistereissä on ISR.

 

Welcome to EDABoard.com

Sponsor

Back
Top