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;
}
}

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
