- Messaggi: 583
- Ringraziamenti ricevuti 1
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
}
}
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
- Autore della discussione
- Platinum Member
Riduci
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.
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
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
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
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.
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
# 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
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
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
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.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.