- Messaggi: 30
- Ringraziamenti ricevuti 0
Dissolvenza led
- x206
-
Autore della discussione
- Giovane Utente
-
Less
Di più
5 Anni 1 Mese fa #1
da x206
Dissolvenza led è stato creato da x206
Salve,
ho provato un programma dove vorrei avere l'effetto dissolvenza di un led
utilizzando un segnale PWM, appena accendo il pic tutto ok, ma
dal secondo ciclo il led si accende subito al massimo, mentre si spegne gradualmente
e non capisco perchè, vi posto il codice per vedere dove sbaglio
Grazie
ho provato un programma dove vorrei avere l'effetto dissolvenza di un led
utilizzando un segnale PWM, appena accendo il pic tutto ok, ma
dal secondo ciclo il led si accende subito al massimo, mentre si spegne gradualmente
e non capisco perchè, vi posto il codice per vedere dove sbaglio
Grazie
Code:
#include <xc.h>
#include "PIC18F4550_config.h"
#include "delay.h"
#include "delay.c"
#include <pwm.h>
#include <timers.h>
void board_initialization (void);
int main(void) {
board_initialization ();
// Periodo del segnale PWM
unsigned char period;
unsigned int duty_cycle;
// Apro il TMR2 per il PWM
OpenTimer2 (TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
// Imposto una frequenza di 20KHz
period = 249;
// Apro il modulo PWM
OpenPWM2(period);
// Ciclo infinito
while (1){
for (duty_cycle = 0; duty_cycle <= 1024; duty_cycle ++) {
SetDCPWM2 (duty_cycle);
delay_ms (10);
}
for (duty_cycle = 1024; duty_cycle >= 0; duty_cycle --) {
SetDCPWM2 (duty_cycle);
delay_ms (10);
}
}
}
//*************************************
// Implementazione della funzione
//*************************************
void board_initialization (void) {
// Imposto PORTA
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD
LATD = 0x00;
TRISD = 0xFF;
// Imposto PORTE
LATE = 0x00;
TRISE = 0xFF;
}
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Cosimix
-
- Elit Utente
-
Less
Di più
- Messaggi: 198
- Ringraziamenti ricevuti 26
5 Anni 1 Mese fa - 5 Anni 1 Mese fa #2
da Cosimix
Risposta da Cosimix al topic Dissolvenza led
Salve!
Fai un debug e controlla cosa succede alla variabile duty_cycle.
Il controllo della variabile del secondo ciclo for potrebbe essere sempre verificato.
Prova a sostituire
con
Saluti,
Cosimo
Fai un debug e controlla cosa succede alla variabile duty_cycle.
Il controllo della variabile del secondo ciclo for potrebbe essere sempre verificato.
Prova a sostituire
Code:
duty_cycle >= 0;
Code:
duty_cycle > 0;
Saluti,
Cosimo
Ultima Modifica 5 Anni 1 Mese fa da Cosimix.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- x206
-
Autore della discussione
- Giovane Utente
-
Less
Di più
- Messaggi: 30
- Ringraziamenti ricevuti 0
5 Anni 1 Mese fa - 5 Anni 1 Mese fa #3
da x206
Risposta da x206 al topic Dissolvenza led
Ciao Cosimo,
ti ringrazio ora funziona bene, ho provato anche a cambiare il tipo di variabile
al duty_cycle, da "unsigned int" a "signed int" e funziona lo stesso lasciando:
Grazie per l'attenzione per questi problemi molto basilari, ma per me
non sempre ovvi.
ti ringrazio ora funziona bene, ho provato anche a cambiare il tipo di variabile
al duty_cycle, da "unsigned int" a "signed int" e funziona lo stesso lasciando:
Code:
duty_cycle >= 0;
Grazie per l'attenzione per questi problemi molto basilari, ma per me
non sempre ovvi.
Ultima Modifica 5 Anni 1 Mese fa da x206.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Cosimix
-
- Elit Utente
-
Less
Di più
- Messaggi: 198
- Ringraziamenti ricevuti 26
5 Anni 1 Mese fa - 5 Anni 1 Mese fa #4
da Cosimix
Risposta da Cosimix al topic Dissolvenza led
Ciao!
Quando il tipo di una variabile è unsigned int, la variabile stessa può contenere valori da 0 a 65535. Nel secondo ciclo for, quando la variabile duty_cycle vale 0, il controllo duty_cycle >= 0 ha esito positivo. Quindi, con il successivo decremento duty_cycle --, la variabile duty_cycle assume un valore pari a 65535! Non rimane a 0 e non può scendere al di sotto (a differenza di quanto accade quando la dichiari signed int), ma si "riempie" al suo valore massimo. Quindi i successivi controlli saranno sempre verificati!
Saluti,
Cosimo
Quando il tipo di una variabile è unsigned int, la variabile stessa può contenere valori da 0 a 65535. Nel secondo ciclo for, quando la variabile duty_cycle vale 0, il controllo duty_cycle >= 0 ha esito positivo. Quindi, con il successivo decremento duty_cycle --, la variabile duty_cycle assume un valore pari a 65535! Non rimane a 0 e non può scendere al di sotto (a differenza di quanto accade quando la dichiari signed int), ma si "riempie" al suo valore massimo. Quindi i successivi controlli saranno sempre verificati!
Saluti,
Cosimo
Ultima Modifica 5 Anni 1 Mese fa da Cosimix.
I seguenti utenti hanno detto grazie : x206
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