Pagina 1 di 1

Utente m4tt3o e il C: redenzione?

MessaggioInviato: 27 feb 2012, 21:57
da Paolino
Ricevo questo messaggio da Foto Utentem4tt3o, l'utente boxer che non amava tanto il C al punto che non lo voleva studiare. Beh, forse che si sia redento? Giudicate voi, ma secondo me è sulla buona strada. Poi, se sono rose, fioriranno :ok:

m4tt3o ha scritto:Ciao Paolo, avevo detto che ti tenevo aggiornato.

Ho dato una ripassata al c, ho ragionato su ogni istruzione del programma, ci ho perso almeno 4-5 nottate, niente non funzionava, ho riprovato a scuola con lo stesso programma simulato a casa e funzionava! Morale della favola, proteus che avevo installato sul computer aveva qualche problema di simulazione, ne ho installato un altro e il programma funziona perfettamente.

Poi generare il PWM è veramente una stronzata colossale, sono 5 righe di codice.

Ma nonostante tutto voglio ringraziarvi, perché non mi avete fatto il programma e ci ho sbattuto la testa mi sono imparato qualcosa di nuovo, alla è veramente semplice il programma.

Dopo che ho ripassato sui libri e ragionando per farlo ci ho messo 30 minuti.

C'è qualche errorino non mi segna il duty cycle in percentuale sul display ma non ho avuto tempo di guardarlo domani vedo di correggerlo per il resto funziona tutto alla perfezione.

Codice: Seleziona tutto
    #include <vent_fin2.h>
    #include "na_lcd4x20_D2Free.c"
    #include "na_iodevice.c"



    void main()
    {
    unsigned int8 duty1=0, dutyxcent=0;
    unsigned int16 duty=0;
    float Vin,Temp;
    int1 FVent=FALSE;
       setup_adc_ports(AN0_AN1_AN3);
       setup_adc(ADC_CLOCK_DIV_2);
       setup_psp(PSP_DISABLED);
       setup_spi(SPI_SS_DISABLED);
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
       setup_timer_1(T1_DISABLED);
       setup_timer_2(T2_DIV_BY_4,50,1);
       setup_ccp1(CCP_PWM);
       set_pwm1_duty(818);
       setup_comparator(NC_NC_NC_NC);
       
    lcd_init();
    delay_ms(10);
    Presentation();
    delay_ms(1);
    set_adc_channel(0);
    delay_us(100);
    beep();
    Testata();
    delay_ms(1);

    while(True){
    duty=read_adc();

    If((Duty>100)&(Duty<921)){
    Vin=(duty*0.00498)+0.005;
    Temp=((15*Vin)+2.5);
    lcd_gotoxy(4,3);
    printf(lcd_putc,"%2.1f",Temp);
    }
    }
    If(temp>=20.0){
    duty1=(int8)(duty/13.81);
    duty1=duty+(int8)((duty1/10)+1);
    //Calcolo valore in percentuale duty cycle
    dutyxcent=(int8)(duty1/0.74);
    lcd_gotoxy(16,3);
    printf(lcd_putc,"%2u",dutyxcent);
    }
    If(!FVent){
    FVent=TRUE; //Accende ventola se è spenta
    duty1=70;
    lcd_gotoxy(7,4);
    lcd_putc("ON");
    beep();
    delay_ms(300);
    beep();
    set_pwm1_duty(duty1);
    delay_ms(1000);


    }

    If(Temp<19.0){  //Se la temperatura è più bassa di 19 gradi
    Duty1=0; //Duty generato 0% spegni la ventola
    Dutyxcent=0;
    FVent=FALSE;  //Avviso ventola ferma
    lcd_gotoxy(7,4);
    lcd_putc("OFF");


    set_pwm1_duty(duty1); //Setta il duty del segnale PWM

    //Calcolo valore in percentuale duty cycle
    dutyxcent=(int8)(duty1/0.74);
    lcd_gotoxy(16,3);
    printf(lcd_putc,"%2u",dutyxcent);

    }

    }




"Ai posteri l'aurdua sentenza".

Ciao.

Paolo.

Re: Utente m4tt3o e il C: redenzione?

MessaggioInviato: 27 feb 2012, 23:42
da TardoFreak
Meglio così.
Io sono contendo quando leggo certe cose. :D

Re: Utente m4tt3o e il C: redenzione?

MessaggioInviato: 28 feb 2012, 1:33
da m4tt3o
Un "grazie a tutti", domani abbiamo la consegna del 2° step vi faccio sapere.
Sulla programmazione sono sempre stato negato, per il semplice motivo che non la ho mai studiata. Quando dovevo fare un programma copiavo qua e la pezzi di codice e poi facevo il minestrone, senza sapere che cosa scrivevo, senza sapere neanche che l'istruzione printf serve per fare scrivere un qualcosa sul display per esempio, insomma sapevo poco e niente.
Il programma che ho postato nell'altro topic funzionava, ma generava il segnale PWM fisso, sempre allo stesso livello, quando doveva andare a 0 rimaneva allo stesso livello non lo sapevo perché proteus aveva problemi di simulazione. Come già detto ho preso questa cosa come sfida personale, un grazie a voi per non avermi fatto il programma, grazie anche a proteus che non funzionava ho preso i libri e mi sono messo a studiare.

Alla fine non è stato difficile, ho capito perfettamente le basi, per fare un programma devi metterti in testa uno schema su come procedere, bisogna seguire una logica, anzi io mi sono fatto uno schemino e poi ho sostituito le varie frasi con l'istruzione appropiata, per esempio: opzione a se la temperatura è piu alta di 20 gradi accendi la ventola PWM al 70% per esempio scrivi sul display vent on e segna il duty cycle in percentuale. Basta convertire queste righe con l'istruzione appropiata.

Nel codice c'è qualche errore, ma è accettabile è il mio primo programma che scrivo e funziona.
La ventola che ho è bella grossa, quindi il duty cycle al 50% non ce la fa a farla girare e ho dovuto fare alcune modifiche, comincia a girare al 70%.

Ho messo 2 volte questa istruzione

Codice: Seleziona tutto
//Calcolo valore in percentuale duty cycle
    dutyxcent=(int8)(duty1/0.74);
    lcd_gotoxy(16,3);
    printf(lcd_putc,"%2u",dutyxcent);


perché pensavo che serviva metterla sia nella parte che riguarda la rilevazione della temperatura se era minore di 19 gradi e spegni la ventola e viceversa, ma è errato.

Questa parte anche è sbagliata:

Codice: Seleziona tutto
    If((Duty>100)&(Duty<921)){
    Vin=(duty*0.00498)+0.005;
    Temp=((15*Vin)+2.5);


15 * Vin (5v) + 2.5 = 77.5 quindi può rilevare la temperatura fino a 77.5 per farlo arrivare a 100 basta mettere semplicemente 20 * Vin.

0.00489 è la risoluzione: Vmax/1023=0.00489

Codice: Seleziona tutto
   setup_timer_2(T2_DIV_BY_4,124,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty((int16)248);


Il valore 124 è stato diviso 4, mettendo il duty del pwm1 a 248, il duty cycle sta al 50%, 372 al 75% 496 al 100%.

Con l'istruzione set_pwm1_duty(xxx) si definisce il duty cycle del segnale PWM generato nel mio caso lo vario tra 0 e 50 e il duty cycle varierà tra o e 100%.

Insomma nonostante gli errori (Penso siano ammessi) ho imparato molte cose, oggi ho chiesto finalmente aiuto al professore perché appena mi ha chiesto quandosa sul programma ho saputo rispondere, senza fare brutte figure, si è messo a spiegarmi cosa non andava e cosa dovevo correggere e mi sono preso il cazziatone. Ha detto che è la prima volta da settembre che lo chiamo per chiedergli aiuto, per forza se lo chiamavo prima non sapevo che dirgli!

Ha fatto delle correzioni, mi ha spiegato meglio qualche istruzione e mi ha dato qualche consiglio, ho fatto in 6-7 ore un lavoro iniziato copiato qua e la da settembre.

Ora la ventola inizia a girare quando la temperatura supera i 20 gradi, sotto i 20 si spegne, rileva la temperatura in modo perfetto, non segna la percentuale del duty cycle ma ci sto arrivando.

Avevo detto che avevo scritto anche in altri forum e mi stavano dando una mano, ma mi facevano pezzi di codice per esempio: set_pwm(val_pwm)*Vin/valB dove io dovevo fare i calcoli e mettere i valori che mi occorrevano nella riga di codice ma non sapevo neanche cosa diceva quella riga di codice, non sapevo come calcolare il valore da metterci dentro, quindi avevo pezzi di programma vuoti, allora mi sono messo a studiare.

Re: Utente m4tt3o e il C: redenzione?

MessaggioInviato: 28 feb 2012, 1:59
da simo85
Complimenti :!:

m4tt3o ha scritto:er fare un programma devi metterti in testa uno schema su come procedere, bisogna seguire una logica, anzi io mi sono fatto uno schemino e poi ho sostituito le varie frasi con l'istruzione appropiata ...

Si chiama pseudocodice :ok:

TardoFreak ha scritto:Io sono contendo quando leggo certe cose.

Idem.

O_/

Re: Utente m4tt3o e il C: redenzione?

MessaggioInviato: 28 feb 2012, 9:14
da Paolino
Vedi, Foto Utentem4tt3o, che quanto ti avevo detto è stato confermato: con l'impegno e il sapersi proporre nel modo corretto, si arriva a risultati. Spero ti sia chiaro, dato che non sei pù un bimbo, il motivo del nostro insistere affinché non ti venisse consegnata la pappa pronta!

Ora non mollare! ;-)

Ciao.

Paolo.