Dissolvenza led

  • x206
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
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
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
  • Elit Utente
Di più
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
Code:
duty_cycle >= 0;
con
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
  • Giovane Utente
Di più
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:
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
  • Elit Utente
Di più
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
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 LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi