- Messaggi: 583
- Ringraziamenti ricevuti 1
aiuto PWM
13 Anni 7 Mesi fa - 13 Anni 7 Mesi fa #11
da Guido
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 Guido al topic Re: aiuto PWM
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.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
13 Anni 7 Mesi fa #12
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: aiuto PWM
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 7 Mesi fa - 13 Anni 7 Mesi fa #13
da Guido
Risposta da Guido al topic Re: aiuto PWM
Ciao, ho riscrito il codice, non è cambiato nulla, ho anche disabilitato gli spike. Ho notato una cosa, se metto : OpenPWM2(period) ; nel while esce la frequenza settata ma il pulsante non lo vede (lampeggia sempre il led), non è che bisogna scrivere nel while una funzione del tipo: se premo RB4 abilito OpenPWM2(period) ; nell'interrupt?
Continuo a sbattere la testa sull'interrupt perche come hai scritto nal testo la gestione del PWM senza niente (pulsanti) lo capita e provata, in polling (senza interrupt) gestisco il pulsante è l'interrupt che mi blocca e se la mia esperienza può servire anche ad altri voglio arrivare per corregere dove sbaglio.
Grazie.
# include <p18f4550.h>
# include <pwm.h>
# include <timers.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON
//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
//CCP2MX = ON il modulo CCP è posto su RC1
void High_Int_Event (void); //Prototipo di funzione basa 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
unsigned char period; //Periodo del segnale pwm
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
OpenPWM2(period) ; //Apro il modulo pwm
}
else {
ClosePWM2 () ; // Chiudo il modulo pwm
}
}
INTCONbits.RBIF = 0; //Resetto il flag
}
void main (void) {
int i; //Variabile usata per creare un conteggio fittizio di pausa
unsigned char period; //Periodo del segnale pwm
int duty_cycle = 0; //Duty Cycle
//Imposto PORTA tutti ingrrssi
LATA = 0x00;
TRISA = 0xFF;
//Imposto PORTB tutti ingrrssi
LATB = 0x00;
TRISB = 0xFF;
//Imposto PORTC tutti ingressi ad RC1 come uscita
LATC = 0x00;
TRISC = 0b11111101;
//Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
//Imposto PORTE tutti ingrrssi
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à
OpenTimer2 (TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_8 ); //Apro il timer2 per il pwm
period = 252; //249Imposto una frequenza di 20KHz
//Abilito le interruzioni
RCONbits.IPEN = 0; //Abilito interruzioni alta priorità
INTCONbits.GIE = 1; //Abilito gli interrupt ad alta priorità
INTCONbits.PEIE = 1; //Abilito gli interrupt delle periferiche
while (1) { //Ciclo infinito
SetDCPWM2 (500); //Aggiorno il duty cycle
}
}
Nota: senza questa istruzione : else {
ClosePWM2 () ; // Chiudo il modulo pwm
}
mi apre e mi chiude il modulo di continuo.
Continuo a sbattere la testa sull'interrupt perche come hai scritto nal testo la gestione del PWM senza niente (pulsanti) lo capita e provata, in polling (senza interrupt) gestisco il pulsante è l'interrupt che mi blocca e se la mia esperienza può servire anche ad altri voglio arrivare per corregere dove sbaglio.
Grazie.
# include <p18f4550.h>
# include <pwm.h>
# include <timers.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON
//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
//CCP2MX = ON il modulo CCP è posto su RC1
void High_Int_Event (void); //Prototipo di funzione basa 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
unsigned char period; //Periodo del segnale pwm
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
OpenPWM2(period) ; //Apro il modulo pwm
}
else {
ClosePWM2 () ; // Chiudo il modulo pwm
}
}
INTCONbits.RBIF = 0; //Resetto il flag
}
void main (void) {
int i; //Variabile usata per creare un conteggio fittizio di pausa
unsigned char period; //Periodo del segnale pwm
int duty_cycle = 0; //Duty Cycle
//Imposto PORTA tutti ingrrssi
LATA = 0x00;
TRISA = 0xFF;
//Imposto PORTB tutti ingrrssi
LATB = 0x00;
TRISB = 0xFF;
//Imposto PORTC tutti ingressi ad RC1 come uscita
LATC = 0x00;
TRISC = 0b11111101;
//Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
//Imposto PORTE tutti ingrrssi
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à
OpenTimer2 (TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_8 ); //Apro il timer2 per il pwm
period = 252; //249Imposto una frequenza di 20KHz
//Abilito le interruzioni
RCONbits.IPEN = 0; //Abilito interruzioni alta priorità
INTCONbits.GIE = 1; //Abilito gli interrupt ad alta priorità
INTCONbits.PEIE = 1; //Abilito gli interrupt delle periferiche
while (1) { //Ciclo infinito
SetDCPWM2 (500); //Aggiorno il duty cycle
}
}
Nota: senza questa istruzione : else {
ClosePWM2 () ; // Chiudo il modulo pwm
}
mi apre e mi chiude il modulo di continuo.
Ultima Modifica 13 Anni 7 Mesi fa da 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 7 Mesi fa #14
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: aiuto PWM
Ciao Guido,
se metti OpenPWM nel while il pulsante non lo vede poiché, come detto in precedenza, è il modulo PWM a controllare l'uscita RC1.
Saluti,
Mauro
se metti OpenPWM nel while il pulsante non lo vede poiché, come detto in precedenza, è il modulo PWM a controllare l'uscita RC1.
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