- Messaggi: 583
- Ringraziamenti ricevuti 1
Difficoltà a far funzionare codice
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #1
da Guido
Difficoltà a far funzionare codice è stato creato da Guido
Salve ho scritto e simulato il codice di Pag. 168 della guida Step by Step, il problema che riscontro è che il led che lavora col timer non lampeggia, rimane spento, mi date dei consigli per farlo funzionare?
Uso Pic 18f4550
Allego codice:
Grazie
Uso Pic 18f4550
Allego codice:
Code:
#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 per bassa priorità
void High_Int_Event (void); // Prototipo di funzione per alta priorità
// Impostazione e Gestione priorità alta //
#pragma code high_vector = 0x08
void high_interrupt (void) {
_asm GOTO High_Int_Event _endasm //Salto x la gestione dell'interrupt alta priorità
}
#pragma code
#pragma interrupt High_Int_Event
void High_Int_Event (void) { // Funzione x la gestione dell'interruzione ad alta priorità
int i; // indice x il ciclo di pausa
if (INTCONbits.RBIF == 1 ) { //Controllo che l'interrup sia stato generato da PORTB
for (i=0; i<10000; i++) { // Pausa filtraggio spike
}
if (PORTBbits.RB4 == 0 ) { // Controllo la pressione di RB0
LATCbits.LATC1 = ~ LATCbits.LATC1 ; // Accendo il led
}
INTCONbits.RBIF == 0; //Resetto il flag x permettere nuove interuzioni
}
}
#pragma code low_vector = 0x18
void low_interrupt (void) {
_asm GOTO Low_Int_Event _endasm //Salto x la gestione dell'interrupt bassa priorità
}
#pragma code
#pragma interrupt High_Int_Event
void Low_Int_Event (void) { // Funzione x la gestione dell'interruzione ad alta priorità
if (INTCONbits.TMR0IF == 1 ) { //Controllo che l'interrup sia stato generato da Timer0
LATCbits.LATC2 = ~ LATCbits.LATC2 ; // lampeggia il led
INTCONbits.TMR0IF == 0; //Resetto il flag
}
}
void main (void){
unsigned int i; //variabile usata per creare un conteggio fittizio
// Imposto PORTA tutti ingrassi
ADCON1 = 0x0F; // Imposto tutti ingressi digitali
PORTA = 0x00;
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
PORTB = 0x00;
LATB = 0x00;
TRISB = 0xFF;
//Imposto PORTC tutti ingressi ed RC1 come uscita
PORTC = 0x00;
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD tutti ingressi
PORTD = 0x00;
LATD = 0x00;
TRISD = 0xff;
// Imposto PORTE tutti ingressi
PORTE = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups (); //Abilito resistori di pullups
INTCONbits.RBIE = 1; //Abilito le interruzioni su PORTB
INTCON2bits.RBIP = 1; //Abilito le interruzioni su PORTB come alta 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
T0CONbits.T0PS0 = 1; //
TMR0H = 0xF0; // preset for Timer0 MSB register
TMR0L = 0x40; // preset for Timer0 LSB register
INTCONbits.TMR0IE = 1; //Abilito le interruzioni del timer0
INTCON2bits.TMR0IP = 0; //Abilito le interruzioni del timer0 come bassa priorità
T0CONbits.TMR0ON = 1; // Abilito il Timer0
RCONbits.IPEN =1; //Abilito modalità interruzione a due livelli alta e bassa
INTCONbits.GIEH = 1; //Abilito gli interrups ad alta priorità
INTCONbits.GIEL = 1; //Abilito gli interrups a bassa priorità
// Ciclo infinito
while (1) {
} //end for
} // end main
Grazie
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
14 Anni 1 Mese fa #2
da Guido
Risposta da Guido al topic Re: Difficoltà a far funzionare codice
#pragma interruptlow Low_Int_Event
void Low_Int_Event (void)
Ho sbaglito ad assegnare il nome a queste istruzzioni, le ho corrette ma il led rimane ancora spento.
void Low_Int_Event (void)
Ho sbaglito ad assegnare il nome a queste istruzzioni, le ho corrette ma il led rimane ancora spento.
Si prega Accesso o Crea un account a partecipare alla conversazione.
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Difficoltà a far funzionare codice TIMER
Ciao Guido,
Il programma che hai postato e´ un po´ modificato rispetto a quello presentato nel testo "C18 Step by Step". In particolare vedo che hai cambiato la posizione del LED.
Non ho visto i dettagli di ogni cambiamento ma il led per come imposti la PORTC e´ il bit 1 e non 2.
Ricontrolla il registro TRISC e le righe:
sono in conflitto con quanto definito nel registro TRISC
Questo errore giustifica malfunzionamenti sul LED.
Saluti,
Mauro
Il programma che hai postato e´ un po´ modificato rispetto a quello presentato nel testo "C18 Step by Step". In particolare vedo che hai cambiato la posizione del LED.
Non ho visto i dettagli di ogni cambiamento ma il led per come imposti la PORTC e´ il bit 1 e non 2.
Ricontrolla il registro TRISC e le righe:
Code:
LATCbits.LATC1 = ~ LATCbits.LATC1 ; // Accendo il led
Code:
LATCbits.LATC2 = ~ LATCbits.LATC2 ; // lampeggia il led
sono in conflitto con quanto definito nel registro TRISC
Code:
TRISC = 0b11111101;
Questo errore giustifica malfunzionamenti sul LED.
Saluti,
Mauro
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
14 Anni 1 Mese fa #4
da Guido
Risposta da Guido al topic Re: Difficoltà a far funzionare codice TIMER
Chiedo umilmente scusa hai ragione .
Si prega Accesso o Crea un account a partecipare alla conversazione.
14 Anni 1 Mese fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Difficoltà a far funzionare codice
Ciao Guido,
non devi certo chiedere scusa.
Credo che aver compreso l'errore ti ha certamente portato un passo avanti.
E' dunque molto importante che il registro TRIS di ogni porta del PIC sia propriamente impostato al fine di far funzionare correttamente i LED. In particolare questo è vero anche per le periferiche interne del PIC.
Nel caso di ingressi analogici oltre al registro TRIS bisogna impostare anche i registri relativi alla configurazione del modulo ADC. Altre periferiche potrebbe sovrascrivere il valore del registro TRIS mentre altre richiedono che il registro TRIS sia propriamente impostato.
Bisogna sempre fare riferimento al datasheet, al paragrafo della porta che si sta usando e anche al paragrafo delle periferiche d'interesse.
Saluti,
Mauro
non devi certo chiedere scusa.
Credo che aver compreso l'errore ti ha certamente portato un passo avanti.
E' dunque molto importante che il registro TRIS di ogni porta del PIC sia propriamente impostato al fine di far funzionare correttamente i LED. In particolare questo è vero anche per le periferiche interne del PIC.
Nel caso di ingressi analogici oltre al registro TRIS bisogna impostare anche i registri relativi alla configurazione del modulo ADC. Altre periferiche potrebbe sovrascrivere il valore del registro TRIS mentre altre richiedono che il registro TRIS sia propriamente impostato.
Bisogna sempre fare riferimento al datasheet, al paragrafo della porta che si sta usando e anche al paragrafo delle periferiche d'interesse.
Saluti,
Mauro
Si prega Accesso 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.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti