Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Timer0 Interrupt

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Timer0 Interrupt

Messaggioda Foto UtenteLuca90x » 8 mag 2013, 20:35

ciao a tutti!sto approfondendo la parte del datasheet riguardante il timer0 di un 16f887;
il circuito che sto cercando di implementare è, credo, abbastanza semplice:

-cristallo a 20 MHz
-timer0 impostato come timer (F=FOSC/4)
-prescaler 1:256 -> 51.2 us per ogni istruzione -> circa 19531 conteggi per 1 secondo -> circa 76 interrupt (per adesso cercare la perfezione credo sia inutile, se comunque non funziona: perdonate i "circa" :) )

quindi per i primi 75 interrupt un led collegato a RD1 è off per i successivi 76 è on; dopodichè la variabile viene resettata e si ricomincia.
Premesso che il circuito è solo alimentazione PIC, MCLR, cristallo, e led e resistenza su RD1, e per i programmi prima ha tranquillamente funzionato, credo che il problema sia nella parte software; l'ho riscritta in mille maniere, tentando diversi approcci, ma non funziona comunque, il led rimane spento. Secondo voi c'è qualcosa che non va nel codice?
Codice: Seleziona tutto
#ifndef _XTAL_FREQ#define _XTAL_FREQ 20000000 //20Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/20000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/20000.0)))
#endif

// CONFIG1
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


#define _XTAL_FREQ 20000000     //Specifico la frequenza del cristallo che sto usando

#include <xc.h>                       //Header file generico
#include <delays.h>

void __delay_1ms(unsigned int time);    //Prototipo funzione delay
void interrupt isr(void);               //Prototipo funzione interrupt
                                        //NB:non si mette dentro il main,
                                        //viene richiamata automaticamente
                                        //dal PIC come ISR, e svolge ciò che
                                        //si mette dentro

unsigned int cont = 0;

void main(void) {

    //Attivo e setto i parametri per il Timer0
OPTION_REGbits.T0CS = 0;                //Timer0 settato con oscillatore interno [F=FOSC/4]
OPTION_REGbits.PSA = 0;                 //Prescaler al Timer0
OPTION_REGbits.PS = 111;                //Valore del prescaler (attuale = 256)

    //Attivo interrupt per Timer0
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.T0IE = 1;


INTCONbits.T0IF = 0;            //Inizializzo timer

TRISDbits.TRISD1 = 0;

while(1){
    if(cont == 76){
        PORTDbits.RD1 = 1;
    }
    if(cont == 0){
        PORTDbits.RD1 = 0;
    }
}

}

void __delay_1ms(unsigned int time){
    while(time-- != 0){
        __delay_ms(1);

    }
}

void interrupt isr(void){
    if(INTCONbits.T0IF){
        if(cont <= 142){
            ++cont;
        }else{
            cont = 0;
        }
        INTCONbits.T0IF = 0;
    }
}
Avatar utente
Foto UtenteLuca90x
15 1 3
 
Messaggi: 20
Iscritto il: 5 mar 2013, 17:38

1
voti

[2] Re: Timer0 Interrupt

Messaggioda Foto Utentenand92 » 8 mag 2013, 23:11

Ciao, potresti fare queste prove:
- cambiare pin, o addirittura usare intere porte, per verificare che non sia un problema di configurazione.
- usare l'oscillatore interno, per verificare che non sia un problema di clock
- inglobare il cambio di stato del pin nella procedura di interrupt, per evitare problemi di sincronia (che potrebbero sorgere in futuro qualora tu decida di complicare il ciclo "while (1)"

Ciao
Avatar utente
Foto Utentenand92
55 1 2
 
Messaggi: 36
Iscritto il: 7 mag 2012, 18:10


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti