- Messaggi: 583
- Ringraziamenti ricevuti 1
Correzione e consigli su codice un pulsante x una
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
14 Anni 2 Mesi fa #1
da Guido
Correzione e consigli su codice un pulsante x una è stato creato da Guido
Salve, ho modificato il codice scritto sulla guida C18 Step by Step a pag. 168 in base alle mie esigenze, ora ho bisogno che qualch'uno mi dica se può funzionare, se no, dove ho sbagliato.
Il codice fa emettere una nota alla pressione del pulsante.
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 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 & INTCONbits.TMR0IF == 1 ) { //Controllo che l'interrup sia stato generato da PORTA e TMR0
for (i=0; i<10000; i++) { // Pausa filtraggio spike
}
if (PORTBbits.RB0 == 0) { // Controllo la pressione di RA0
T0CONbits.T08BIT = 0; //Modalità a 16 bit
T0CONbits.T0CS = 0; //Clok interno
T0CONbits.T0SE = 0; // TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CONbits.PSA = 1; //Non abilito Prescaler
T0CONbits.T0PS2 = 0; // bits 2-0 PS2:PS0: Prescaler Select bits
T0CONbits.T0PS1 = 0; //
T0CONbits.T0PS0 = 0; //
TMR0H = 0xE0; // preset for Timer0 MSB register
TMR0L = 0x7F; // preset for Timer0 LSB register
LATCbits.LATC1 = 0x0F; // Esce freq. 620Hz
}
INTCONbits.RBIF == 0; //Resetto il flag x permettere nuove interuzioni
INTCONbits.TMR0IF == 0; //Resetto il flag x permettere nuove interuzioni
}
}
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à
INTCONbits.TMR0IE = 1; //Abilito le interruzioni del Timer
INTCON2bits.TMR0IP = 1; //Abilito le interruzioni del Timer come alta priorità
T0CONbits.TMR0ON = 1; //Abilito il Timer0
INTCONbits.GIEH = 1; //Abilito gli interrups ad alta priorità
// Ciclo infinito
for (;
{
} //end for
} // end main
Il codice fa emettere una nota alla pressione del pulsante.
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 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 & INTCONbits.TMR0IF == 1 ) { //Controllo che l'interrup sia stato generato da PORTA e TMR0
for (i=0; i<10000; i++) { // Pausa filtraggio spike
}
if (PORTBbits.RB0 == 0) { // Controllo la pressione di RA0
T0CONbits.T08BIT = 0; //Modalità a 16 bit
T0CONbits.T0CS = 0; //Clok interno
T0CONbits.T0SE = 0; // TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CONbits.PSA = 1; //Non abilito Prescaler
T0CONbits.T0PS2 = 0; // bits 2-0 PS2:PS0: Prescaler Select bits
T0CONbits.T0PS1 = 0; //
T0CONbits.T0PS0 = 0; //
TMR0H = 0xE0; // preset for Timer0 MSB register
TMR0L = 0x7F; // preset for Timer0 LSB register
LATCbits.LATC1 = 0x0F; // Esce freq. 620Hz
}
INTCONbits.RBIF == 0; //Resetto il flag x permettere nuove interuzioni
INTCONbits.TMR0IF == 0; //Resetto il flag x permettere nuove interuzioni
}
}
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à
INTCONbits.TMR0IE = 1; //Abilito le interruzioni del Timer
INTCON2bits.TMR0IP = 1; //Abilito le interruzioni del Timer come alta priorità
T0CONbits.TMR0ON = 1; //Abilito il Timer0
INTCONbits.GIEH = 1; //Abilito gli interrups ad alta priorità
// Ciclo infinito
for (;

} //end for
} // end main
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 2 Mesi fa #2
da Guido
Risposta da Guido al topic Re: Correzione e consigli su codice un pulsante x una
Salve, ho provato a simulare il codice con MPLAB, selezzionato Debugger, Select Tool, Mpilab Sim e poi Animate, non succede nulla, dove ho sbagliato?
Grazie.
Grazie.
Si prega Accesso o Crea un account a partecipare alla conversazione.
14 Anni 2 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Correzione e consigli su codice un pulsante x una
Ciao Guido,
per poter simulare un programma è necessario che il programma sia prima compilato con successo.
Solo dopo la compilazione è possibile effettuare la simulazione.
Infatti la simulazione avviene sul codice macchina e non sul codice C.
Simulare programmi con interruzioni potrebbe non essere banale.
In particolare la pressione del tasto deve avvenire simulando la pressione dello stesso scrivendo nell'apposito registro PORTx
attento che questa parte di codice potresbbe funzionare diversamente da quello che vuoi:
Perché poi controlli i due eventi insieme?
L'inizializzazione del Timer la devi fare solo una volta, non ad ogni Interrupt.
Eventualmente nella routine dell'interrupt cambi solo la frequenza generata per mezzo del Timer, in base al pulsante premuto.
Saluti,
Mauro
per poter simulare un programma è necessario che il programma sia prima compilato con successo.
Solo dopo la compilazione è possibile effettuare la simulazione.
Infatti la simulazione avviene sul codice macchina e non sul codice C.
Simulare programmi con interruzioni potrebbe non essere banale.
In particolare la pressione del tasto deve avvenire simulando la pressione dello stesso scrivendo nell'apposito registro PORTx
attento che questa parte di codice potresbbe funzionare diversamente da quello che vuoi:
Code:
if (INTCONbits.RBIF & INTCONbits.TMR0IF == 1 )
Perché poi controlli i due eventi insieme?
L'inizializzazione del Timer la devi fare solo una volta, non ad ogni Interrupt.
Eventualmente nella routine dell'interrupt cambi solo la frequenza generata per mezzo del Timer, in base al pulsante premuto.
Saluti,
Mauro
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 2 Mesi fa #4
da Guido
Risposta da Guido al topic Re: Correzione e consigli su codice un pulsante x una
Grazie ho corretto il codice. Ora per vedere se funziona lo posso simulare via softwer?
Si prega Accesso o Crea un account a partecipare alla conversazione.
14 Anni 2 Mesi fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Correzione e consigli su codice un pulsante x una
Ciao Guido,
se il file si compila senza errori, impostando il simulatore come hai descritto in precedenza dovrebbe funzionare.
Piuttosto che usare la funzione Animate, usa quella step by step, per vedere passo passo le istruzioni eseguite.
Saluti,
Mauro
se il file si compila senza errori, impostando il simulatore come hai descritto in precedenza dovrebbe funzionare.
Piuttosto che usare la funzione Animate, usa quella step by step, per vedere passo passo le istruzioni eseguite.
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