- Messaggi: 583
- Ringraziamenti ricevuti 1
Correzione e consigli su codice un pulsante x una
13 Anni 8 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 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: 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 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
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da Mauro Laurenti al topic Re: Correzione e consigli su codice un pulsante x una
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
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: 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 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: 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 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.
Login
© LaurTec 2006 - 2024