Ancora problemi con codice TIMER

13 Anni 8 Mesi fa #1 da Guido
Ancora problemi con codice TIMER è stato creato da Guido
Salve, non ci arrivo o non vedo l'errore, ho riscritto il codice (copiato) ma ancora non va il lampeggio del led a bassa priorità, funziona il lampeggio quando premo il pulsante, ma non il resto dove sbaglio?
Grazie della vostra pazienza.
Uso un pic 18f4550

# include <p18f4550.h>
# include <portb.h>

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF


//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilitato il Watchdog Timer
//LVT = OFF Disabilitato programmazione LVT
//PBADEN = OFF Disabilitato gli ingrassi analogici

void Low_Int_Event (void); //Prototipo di funzione bassa priorità

void High_Int_Event (void); //Prototipo di funzione alta priorità

#pragma code high_vector = 0x08
void high_interrupt (void) {
_asm GOTO High_Int_Event _endasm
}


#pragma code

#pragma interrupt High_Int_Event
void High_Int_Event (void) { //Funzione x la gestione dell'interrupt alta priorità
int i; // Indice x il ciclo di pausa
if ( INTCONbits.RBIF == 1 ) { //Controllo che l'interrupt sia stato generato da PORTB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
if (PORTBbits.RB4 == 0) { //Controllo la pressione di RB4
LATDbits.LATD1 = ~ LATDbits.LATD1; //Accendo il Led 1
}
INTCONbits.RBIF == 0; //Resetto il flag
}
}

#pragma code low_vector = 0x18
void low_interrupt (void) {
_asm GOTO Low_Int_Event _endasm
}

#pragma code

#pragma interruptlow Low_Int_Event
void Low_Int_Event (void) { //Funzione x la gestione dell'interrupt bassa priorità
if ( INTCONbits.TMR0IF == 1 ) { //Controllo che l'interrupt sia stato generato da Timer0
LATDbits.LATD0 = ~ LATDbits.LATD0; //Inverto lo sato del Led 0
INTCONbits.TMR0IF = 0; // Resetto il flag
}
}

void main (void) {
unsigned int i; //Variabile usata per creare un conteggio fittizio di pausa

//Imposto PORTA tutti ingrrssi

LATA = 0x00;
TRISA = 0xFF;

//Imposto PORTB tutti ingrrssi

LATB = 0x00;
TRISB = 0xFF;

//Imposto PORTC tutti ingressi

LATC = 0x00;
TRISC = 0xFF;

//Imposto PORTD tutte uscite

LATD = 0x00;
TRISD = 0x00;

//Imposto PORTE tutti ingrrssi

LATE = 0x00;
TRISE = 0xFF;


EnablePullups (); //Abilita i resistori di PUL-UP sulla PORTB

INTCONbits.RBIE = 1; //Abilito le interruzioni su PORTB

INTCON2bits.RBIP = 1; //Abilito le interruzioni su PORTB come alta priorità

//Abilito il timer per funzionare a bassa priorità
T0CONbits.T08BIT = 0; //Modalità a 16 bit

T0CONbits.T0CS = 0; //Clock interno



T0CONbits.PSA = 0; //Abilito prescaler

T0CONbits.T0PS0 = 0;
T0CONbits.T0PS1 = 0; //Prescaler 32
T0CONbits.T0PS2 = 1;




INTCONbits.TMR0IE = 1; //Abilito le interruzioni del timer0

INTCON2bits.TMR0IP = 0; //Abilito le interruzioni del Timer come bassa priorità

T0CONbits.TMR0ON = 1; //Abilito il Timer0

//Abilito le interruzioni

RCONbits.IPEN = 1; //Abilito interruzioni alta e bassa priorità

INTCONbits.GIEH = 1; //Abilito gli interrupt ad alta priorità

INTCONbits.GIEL = 1; //Abilito gli interrupt a bassa priorità

while (1) { //Ciclo infinito

}
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido
  • Platinum Member
  • Platinum Member
Di più
13 Anni 8 Mesi fa #2 da Guido
Risposta da Guido al topic Re: Ancora problemi con codice TIMER
Cocciuto nel sapere, ho invertito le priorità. Funziona. Come lancio la simulazione con Proteus lampeggia il led LATD0, se premo il pulsante lampeggia LATD1, il problema si presenta quando resetto il Pic, se premo il pulsante il led rimane spento.
Qualche consiglio?
Nota: ho provato ha cambiare i settaggi del timer e questo riponde cambiando il lampeggio (frequenza).
Grazie.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido
  • Platinum Member
  • Platinum Member
Di più
13 Anni 8 Mesi fa #3 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Ancora problemi con codice TIMER
Ciao,

molto bene, vedo che le cose vanno avanti.
Unico dubbio è relativo al fatto che invertendo il codice funziona. Non ho controllato se il codice è identico a quello presentato sul testo C18 Step by Step, se cosi fosse la simulazione dovrebbe funzionare anche con quello originale.

Non ho mai usato Proteus per le simulazioni, non è che quando metti in reset il PIC questo rimane in stato di reset?

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
13 Anni 8 Mesi fa #4 da Guido
Risposta da Guido al topic Re: Ancora problemi con codice TIMER
Ti scrivo il codice:

# include <p18f4550.h>
# include <portb.h>

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF


//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilitato il Watchdog Timer
//LVT = OFF Disabilitato programmazione LVT
//PBADEN = OFF Disabilitato gli ingrassi analogici

void Low_Int_Event (void); //Prototipo di funzione alta priorità

void High_Int_Event (void); //Prototipo di funzione basa priorità

#pragma code high_vector = 0x18
void high_interrupt (void) {
_asm GOTO High_Int_Event _endasm
}


#pragma code

#pragma interruptlow High_Int_Event
void High_Int_Event (void) { //Funzione x la gestione dell'interrupt bassa priorità
int i; // Indice x il ciclo di pausa
if ( INTCONbits.RBIF == 1 ) { //Controllo che l'interrupt sia stato generato da PORTB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
if (PORTBbits.RB4 == 0) { //Controllo la pressione di RB4
LATDbits.LATD1 = ~ LATDbits.LATD1; //Accendo il Led 1
}
INTCONbits.RBIF == 0; //Resetto il flag
}
}

#pragma code low_vector = 0x08
void low_interrupt (void) {
_asm GOTO Low_Int_Event _endasm
}

#pragma code

#pragma interrupt Low_Int_Event
void Low_Int_Event (void) { //Funzione x la gestione dell'interrupt alta priorità
if ( INTCONbits.TMR0IF == 1 ) { //Controllo che l'interrupt sia stato generato da Timer0
LATDbits.LATD0 = ~ LATDbits.LATD0; //Inverto lo sato del Led 0
INTCONbits.TMR0IF = 0; // Resetto il flag
}
}

void main (void) {
unsigned int i; //Variabile usata per creare un conteggio fittizio di pausa


//Imposto PORTA tutti ingrrssi

LATA = 0x00;
TRISA = 0xFF;

//Imposto PORTB tutti ingrrssi

LATB = 0x00;
TRISB = 0xFF;

//Imposto PORTC tutti ingressi

LATC = 0x00;
TRISC = 0xFF;

//Imposto PORTD tutte uscite

LATD = 0x00;
TRISD = 0x00;

//Imposto PORTE tutti ingrrssi

LATE = 0x00;
TRISE = 0xFF;


EnablePullups (); //Abilita i resistori di PUL-UP sulla PORTB

INTCONbits.RBIE = 1; //Abilito le interruzioni su PORTB

INTCON2bits.RBIP = 0 ; //1 Abilito le interruzioni su PORTB come alta priorità


T0CONbits.TMR0ON = 1;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
T0CONbits.T08BIT = 0;// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CONbits.T0CS = 0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CONbits.T0SE = 0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CONbits.PSA = 0;// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CONbits.T0PS2 = 1;// bits 2-0 PS2:PS0: Prescaler Select bits
T0CONbits.T0PS1 = 1;
T0CONbits.T0PS0 = 1;
TMR0H = 0xFE; // preset for Timer0 MSB register
TMR0L = 0x79; // preset for Timer0 LSB register





INTCONbits.TMR0IE = 1; //Abilito le interruzioni del timer0

INTCON2bits.TMR0IP = 1 ; //0Abilito le interruzioni del Timer come bassa priorità



//Abilito le interruzioni

RCONbits.IPEN = 1; //Abilito interruzioni alta e bassa priorità

INTCONbits.GIEH = 1; //Abilito gli interrupt ad alta priorità

INTCONbits.GIEL = 1; //Abilito gli interrupt a bassa priorità

while (1) { //Ciclo infinito

}
}

I settaggi del timer per comodità li ho copiati dal programma che avete citato nel sito: Launch Pic visto che pasticciavo sulle frequenze. Premetto che ho prima usato il codice proposto nella guida e funziona.
Per il reset ho alimentato a 5V una resistenza da 4k7 collegata ad un pulsante a terra, nel mezzo dei due componeti ho collegato il filo che va al piede del MCLR.
Salve e grazie

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido
  • Platinum Member
  • Platinum Member
Di più
13 Anni 8 Mesi fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Ancora problemi con codice TIMER
Ciao,

la circuiteria di Reset mi sembra corretta (tolto il fatto che normalmente si usa una resistenza di 10Kohm e non 4.7Kohm).

Non hai modo di provare il circuito su breadboard?

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login