- Messaggi: 583
- Ringraziamenti ricevuti 1
Correzione e consigli su codice un pulsante x una
13 Anni 8 Mesi fa #6
da Guido
Risposta da Guido al topic Re: Correzione e consigli su codice un pulsante x una
Ciao, lo provato con PROTEUS non va, al posto dello speaker ho messo un led e questo rimane fisso, non lampeggia, vi ho collegato un oscilloscopio, linea piatta. Per essere certo che il programma DEMO funzionasse vi ho caricato il codice per far laccendere un led alla pressione del pulsante publicato nella guida Step by Step, ha funzionato.
Ripropongo il codice per vedere se qualch'uno trova l'errore.
#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 == 1 ) { //Controllo che l'interrup sia stato generato da PORTB
for (i=0; i<10000; i++) { // Pausa filtraggio spike INTCONbits.TMR0IF == 1
}
if (PORTBbits.RB0 == 0) { // Controllo la pressione di RB0
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
}
}
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.TMR0IF == 1; //Controllo che l'interrup sia stato generato da TMR0
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à
INTCONbits.TMR0IF == 0; //Resetto il flag x permettere nuove interuzioni
// Ciclo infinito
for (; {
} //end for
} // end main
Grazie.
Ripropongo il codice per vedere se qualch'uno trova l'errore.
#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 == 1 ) { //Controllo che l'interrup sia stato generato da PORTB
for (i=0; i<10000; i++) { // Pausa filtraggio spike INTCONbits.TMR0IF == 1
}
if (PORTBbits.RB0 == 0) { // Controllo la pressione di RB0
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
}
}
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.TMR0IF == 1; //Controllo che l'interrup sia stato generato da TMR0
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à
INTCONbits.TMR0IF == 0; //Resetto il flag x permettere nuove interuzioni
// Ciclo infinito
for (; {
} //end for
} // end main
Grazie.
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 #7
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Correzione e consigli su codice un pulsante x una
Ciao Guido,
non ho mai usato proteus per simulare i programmi per PIC, per cui non sono certo dei suoi limiti.
Alcune periferiche potrebbero non essere simulabili.
L'esempio che hai simulato e fatto funzionare faceva uso degli interrupt?
Questo weekend rilascio il nuovo PCB di Freedom II (vers. 3).
Della versione attuale ho ancora dei pezzi (vers. 2).
Se vuoi un PCB te ne posso regalare uno (contattami privatamente).
Aggiungi i componenti minimi per sperimentare la tua applicazione e potrai eseguire il codice in pratica.
In questo modo puoi fare delle prove sul banco e non pensare troppo a eventuali limiti del simulatore.
Saluti,
Mauro
non ho mai usato proteus per simulare i programmi per PIC, per cui non sono certo dei suoi limiti.
Alcune periferiche potrebbero non essere simulabili.
L'esempio che hai simulato e fatto funzionare faceva uso degli interrupt?
Questo weekend rilascio il nuovo PCB di Freedom II (vers. 3).
Della versione attuale ho ancora dei pezzi (vers. 2).
Se vuoi un PCB te ne posso regalare uno (contattami privatamente).
Aggiungi i componenti minimi per sperimentare la tua applicazione e potrai eseguire il codice in pratica.
In questo modo puoi fare delle prove sul banco e non pensare troppo a eventuali limiti del simulatore.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
13 Anni 8 Mesi fa #8
da Guido
Risposta da Guido al topic Re: Correzione e consigli su codice un pulsante x una
Sei troppo gentile, ma ti dico di no, sto abbusando della tua pazzienza e questo mi basta.
Grazie Guido
Grazie Guido
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 #9
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Correzione e consigli su codice un pulsante x una
Non è un problema.
Nel limite del mio tempo tendo sempre a rispondere.
...per esempio questa settimana sono stato un po' impegnato...e non ho risposto.
La morale del PCB è che dovresti fare anche qualche esperienza pratica.
Ti assicuro che sbattere la testa per vedere lampeggiare un LED vero da' molte soddisfazioni e dà una maggior sensazione di controllo sul microcontrollore. Nel tuo caso potresti anche usare una breadboard.
Usando i simulatori devi conoscere bene l'ambiente di sviluppo e i limiti che questo può avere.
Saluti,
Mauro
Nel limite del mio tempo tendo sempre a rispondere.
...per esempio questa settimana sono stato un po' impegnato...e non ho risposto.
La morale del PCB è che dovresti fare anche qualche esperienza pratica.
Ti assicuro che sbattere la testa per vedere lampeggiare un LED vero da' molte soddisfazioni e dà una maggior sensazione di controllo sul microcontrollore. Nel tuo caso potresti anche usare una breadboard.
Usando i simulatori devi conoscere bene l'ambiente di sviluppo e i limiti che questo può avere.
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.