problema utilizzando timer con PIC18F4550, help needed?

E

elrayes

Guest
Ciao a tutti

Voglio solo uso timer0 in PIC18F4550 e realmente
Sono stanco di lettura e di cercare, accanto
Sono un pessimo programmatore, quindi cercate di aiutarmi in questo codice, che
sto utilizzando MPLAB C18 compilatore, questo codice viene utilizzato per luce su alcuni LED PORT D quando il timer scade, i PVR utilizzati per attuare tutto questo, il codice edificio è fine e scaricato sul computer di destinazione, ma il lavoro non è MCU:

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

# pragma interrupt high_isr
# pragma interruptlow low_isr

init_int nullo (void)
(
/ / configurazione di interrupt
INTCON = 0xA0;
INTCON2 = 0x04;
)

# pragma code high_vector = 0x08
interrupt_at_high_vector nullo (void)
(
_asm goto high_isr _endasm
)
# pragma code

# pragma code low_vector = 0x18
interrupt_at_low_vector nullo (void)
(
_asm goto low_isr _endasm
)
# pragma code# pragma interrupt high_isr

high_isr nullo (void)
(
if (INTCONbits.TMR0IF == 1)
(
INTCONbits.TMR0IF = 0;
PORTD = 0x0F;
)
)

# pragma interruptlow low_isr
low_isr nullo (void)
(
)

# pragma code

int x = 0x0000;
void main (void)
(
TRISD = 0x00;
LATD = 0x00;

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

while (1)
(
high_isr ();
)
)

spero che qualcuno possa risolvere questo problema.
grazie

 
Solo un consiglio ....

Se si desidera che il LED di bagliore sulla base del concetto di interrupt e non il concetto di polling.Ma qui si sta chiamando la funzione "high_isr" nel ciclo while, che è un PVR.Una volta che il timer scade automaticamente si chiama il PVR.

Una volta verificare con l'interrupt e concetti seggi per rendere il vostro programma di lavoro.

 
Hai assegnato la massima priorità alla timer0 interrompere?

Salute

Ravi

 
in realtà ho cambiato il codice sopra ad un altro che ho trovato in C18 esempi da microchip e ancora non funziona e
sono veramente in un caos, questo è il nuovo codice:

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

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

void main (void);
InterruptHandlerHigh nullo (void);

unione
(
struct
(
unsigned Timeout: 1 / / flag per indicare un timeout TMR0
Nessuno unsigned: 7;
Bit);
unsigned char Byte;
Bandiere);

//------------------------------------------------ ----------------------------
/ / Main routine

void
main ()
(
Flags.Byte = 0;
INTCON = 0x20; / / disabilitare e abilitare globale TMR0 interrupt
INTCON2 = 0x84; / / TMR0 alta priorità
RCONbits.IPEN = 1; / / consentire livelli di priorità
TMR0H = 0; / /
eliminiamo il timer
TMR0L = 0; / /
eliminiamo il timer
T0CON = 0x87; / / istituito timer0 - prescaler 1:8 / / 0x82
/ / T0CON = 0xB8; / / pre-scaler non assegnato
/ / T0CON = 0b10011000; / / pre-scaler non assegnato
INTCONbits.GIEH = 1; / /
enable interrupt
TRISB = 0;
Trisa = 0;
/ / Lata = 0x00;

while (1)
(
PORTA = 0x01;
if (Flags.Bit.Timeout == 1)
(/ / Timeout?
Flags.Bit.Timeout = 0; / /
eliminiamo timeout indicor
LATBbits.LATB7 = LATBbits.LATB0; / / copia LED di stato da RB0 a RB7
)
)
)

//------------------------------------------------ ----------------------------
/ / Alta priorità interrompere vettore

# pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
(
_asm
goto InterruptHandlerHigh / / Vai alla routine di interrupt
_endasm
)

//------------------------------------------------ ----------------------------
/ / Alta priorità di routine di interrupt

# pragma code
# pragma interrupt InterruptHandlerHigh

void
InterruptHandlerHigh ()
(
if (INTCONbits.TMR0IF)
(/ / Per verificare TMR0 overflow
INTCONbits.TMR0IF = 0; / /
eliminiamo interrompere bandiera
Flags.Bit.Timeout = 1; / / indicare timeout
LATBbits.LATB0 =! LATBbits.LATB0; / / passare LED RB0
)
)

interrupt abilitato ad alta priorità
chiunque può aiutare?

grazie in anticipo

 
1.Io non sono che una buona in C. Ha assegnato timer0 di interrompere la massima priorità?
2.Ha simulato in MPLAB SIM?Potrai imparare a conoscere il problema.

Salute

Ravi

 
Verificare con le impostazioni di configurazione, il consiglio dovrebbe sostenere l'oscillatore impostazioni fornire in questo senso.
Es: in caso si ha 4 * HSPLL e cristallo oscillatore è a circa 25MHz, dà circa il 4 * 25MHz = 100MHz.Ma se il controllore si utilizzano supporti meno di questo (<100MHz) il codice non funziona con questo.

Inoltre, lei non ha valori di carico a timer registri (TMR0L)
Inizializza ogni volta che i registri in PVR.

 

Welcome to EDABoard.com

Sponsor

Back
Top