Progetti

   

Sponsor

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: Dissolvenza led

Dissolvenza led 3 Settimane 1 Giorno fa #1

  • x206
  • Avatar di x206
  • Offline
  • Fresh Boarder
  • Messaggi: 18
  • Karma: 0
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
#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;
 }
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Dissolvenza led 3 Settimane 1 Giorno fa #2

  • Cosimix
  • Avatar di Cosimix
  • Offline
  • Gold Boarder
  • Messaggi: 181
  • Ringraziamenti ricevuti 17
  • Karma: 3
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
duty_cycle >= 0;
con
duty_cycle > 0;

Saluti,
Cosimo
Ultima modifica: 3 Settimane 1 Giorno fa da Cosimix.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Dissolvenza led 3 Settimane 1 Giorno fa #3

  • x206
  • Avatar di x206
  • Offline
  • Fresh Boarder
  • Messaggi: 18
  • Karma: 0
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:
duty_cycle >= 0;

Grazie per l'attenzione per questi problemi molto basilari, ma per me

non sempre ovvi.
Ultima modifica: 3 Settimane 1 Giorno fa da x206.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Dissolvenza led 3 Settimane 1 Giorno fa #4

  • Cosimix
  • Avatar di Cosimix
  • Offline
  • Gold Boarder
  • Messaggi: 181
  • Ringraziamenti ricevuti 17
  • Karma: 3
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: 3 Settimane 1 Giorno fa da Cosimix.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: x206
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015