Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Utente m4tt3o e il C: redenzione?

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Utente m4tt3o e il C: redenzione?

Messaggioda Foto UtentePaolino » 27 feb 2012, 21:57

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

1
voti

[2] Re: Utente m4tt3o e il C: redenzione?

Messaggioda Foto UtenteTardoFreak » 27 feb 2012, 23:42

Meglio così.
Io sono contendo quando leggo certe cose. :D
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

6
voti

[3] Re: Utente m4tt3o e il C: redenzione?

Messaggioda Foto Utentem4tt3o » 28 feb 2012, 1:33

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.
Avatar utente
Foto Utentem4tt3o
12 2
 
Messaggi: 33
Iscritto il: 10 ago 2010, 19:56

0
voti

[4] Re: Utente m4tt3o e il C: redenzione?

Messaggioda Foto Utentesimo85 » 28 feb 2012, 1:59

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_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[5] Re: Utente m4tt3o e il C: redenzione?

Messaggioda Foto UtentePaolino » 28 feb 2012, 9:14

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti