- Messaggi: 583
- Ringraziamenti ricevuti 1
aiuto PWM
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #1
da Guido
aiuto PWM è stato creato da Guido
Come sempre ho bisogno del vostro aiuto e competenza, sto lavorando sul segnale PWM, ho capito come settatre (trovare) la frequenza, non riesco a far uscire il segnale alla pressione di RB4.
Da subito sono partito col codice trovato in STEP by STEP(funziona bravo Laurenti), il problema è che funziona sempre.
Vi scrivo il codice:
Grazie
Da subito sono partito col codice trovato in STEP by STEP(funziona bravo Laurenti), il problema è che funziona sempre.
Vi scrivo il codice:
Code:
# 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
//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 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 bassa priorità
int i; // Indice x il ciclo di pausa
if ( INTCONbits.RBIF == 1 ) //Controllo che l'interrupt sia stato generato da PORTB
if ( PIR1bits.TMR2IF ==1) {
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
if (PORTBbits.RB4 == 0) { //Controllo la pressione di RB4
LATCbits.LATC1 = ~ LATCbits.LATC1 ; //Accendo il Led 1
}
INTCONbits.RBIF == 0; //Resetto il flag
PIR1bits.TMR2IF = 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;
//T2CON | = 56;// bits 6-3 Post scaler 1:1 thru 1:16
//T2CONbits.TOUTPS3 = 0;
//T2CONbits.TOUTPS2 = 1;
//T2CONbits.TOUTPS1 = 1;
//T2CONbits.TOUTPS0 = 1;
//T2CONbits.TMR2ON = 1;// Timer2 on bit: 1=Timer2 is on;
//T2CONbits.T2CKPS1 = 0;// bits 1-0 Prescaler Rate Select bits
//T2CONbits.T2CKPS0 = 1;
T2CON = 0b00111101;
PR2 = 252; // PR2 (Timer2 Match value)
// 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
//OpenPWM2 (period); //Apro il modulo pwm
PIE1bits.TMR2IE = 1; //Abilito le interruzioni del timer2
IPR1bits.TMR2IP = 1; //Abilito le interruzioni del Timer come alta priorità
//Abilito le interruzioni
RCONbits.IPEN = 0; //1Abilito interruzioni alta e bassa priorità
INTCONbits.GIE = 1; //Abilito gli interrupt ad alta priorità
INTCONbits.PEIE = 1; //1Abilito gli interrupt delle periferiche
while (1) { //Ciclo infinito
SetDCPWM2 (500); //Aggiorno il duty cycle
}
}
Grazie
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Ricky85
-
- Anziano Utente
-
Less
Di più
- Messaggi: 50
- Ringraziamenti ricevuti 0
14 Anni 1 Mese fa #2
da Ricky85
Risposta da Ricky85 al topic Re: aiuto PWM
Ciao Guido,
Non ho capito quale effetto vorresti avere... se ti spieghi iù precisamente posso provare a darti una mano...
Non ho capito quale effetto vorresti avere... se ti spieghi iù precisamente posso provare a darti una mano...
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 #3
da Guido
Risposta da Guido al topic Re: aiuto PWM
Si e ti ringrazio, voglio semplicemente che alla pressione del pulsante esca la frequenza settata col segnale PWM. Ho bisogno che mi modifichi il codice che ho scritto (copiato ) e trasformato.
Grazie
Grazie
Si prega Accesso o Crea un account a partecipare alla conversazione.
14 Anni 1 Mese fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: aiuto PWM
Ciao Guido,
Il programma sopra riportato non è molto chiaro.
Stai usando troppe cose assieme, Timer e PWM.
Tutte le istruzioni del PWM sono commentate quindi il PWM non è attivo.
Non ho controllato cosa accade al timer e se effettivamente genera le interruzioni.
In ogni modo quando hai il PWM abilitato l'uscita non la devi controllare (invertendola manualmente) , il modulo PWM la controllerà automaticamente. Questo è il vantaggio di avere il modulo PWM, ovvero imposti tutto e non devi fare altro.
Devi chiarire l'esempio. Lasciando cosi tanti commenti non è più chiaro.
Non modificare troppo gli esempi, cerca di fare sempre tutto in maniera progressiva. Un salto troppo grande porta solo confusione. In questi giorni hai imparato molto, ma non forzare l'arrivo all'obbiettivo.
Saluti,
Mauro
Il programma sopra riportato non è molto chiaro.
Stai usando troppe cose assieme, Timer e PWM.
Tutte le istruzioni del PWM sono commentate quindi il PWM non è attivo.
Non ho controllato cosa accade al timer e se effettivamente genera le interruzioni.
In ogni modo quando hai il PWM abilitato l'uscita non la devi controllare (invertendola manualmente) , il modulo PWM la controllerà automaticamente. Questo è il vantaggio di avere il modulo PWM, ovvero imposti tutto e non devi fare altro.
Devi chiarire l'esempio. Lasciando cosi tanti commenti non è più chiaro.
Non modificare troppo gli esempi, cerca di fare sempre tutto in maniera progressiva. Un salto troppo grande porta solo confusione. In questi giorni hai imparato molto, ma non forzare l'arrivo all'obbiettivo.
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 1 Mese fa - 14 Anni 1 Mese fa #5
da Guido
Risposta da Guido al topic Re: aiuto PWM
Salve, mi spiace deluderti ma non ci arrivo, continua a lampeggiarmi il led. Voglio che lampeggi solo alla pressione del pulsante. Dove sbaglio?
Code:
# 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 ) & (PIR1bits.TMR2IF ==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
LATCbits.LATC1 = 1 ; //Accendo il Led 1
}
INTCONbits.RBIF = 0; //Resetto il flag
PIR1bits.TMR2IF = 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
OpenPWM2 (period); //Apro il modulo pwm
PIE1bits.TMR2IE = 1; //Abilito le interruzioni del timer2
IPR1bits.TMR2IP = 1; //Abilito le interruzioni del Timer come alta priorità
//Abilito le interruzioni
RCONbits.IPEN = 0; //Abilito interruzioni alta priorità
INTCONbits.GIE = 1; //Abilito gli interrupt ad alta priorità
INTCONbits.PEIE = 1; //1Abilito gli interrupt delle periferiche
while (1) { //Ciclo infinito
SetDCPWM2 (500); //Aggiorno il duty cycle
}
}
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.
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