Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    4

    Logica programmino in C

    Buongiorno a tutti !

    Mi sto avvicinando al C per poter programmarmi dei pic (16F84)

    Fatte le prime prove funzionanti di accensione led, spegnimento e lampeggio a diverse frequenze ho cercato di buttar giù questo codice, errori non me ne segna, ma penso ci sia qualche problema di "logica", soprattutto per la variabile "molt".

    Vorrei sapere da voi se effettivamente, costruito così, quando il main va a eseguire il ciclo "for(z;molt)" riesce a leggere il valore di quante volte è stato eseguito nel primo IF.

    Ho cercato di colorarvi i punti in dubbio, così da render più leggibile il codice.

    Se ci sono altri errori o avete consigli sulla stesura del programma son naturalmente ben accetti. Perchè sono 3 giorni che mi sono avvicinato all'oscuro mondo della programmazione. Grazie !
    codice:
    #include <htc.h>
    #include"delay.c" 
    #define Aspetta 250       //definisce la var Aspetta con 250ms
    void pausa(char ripeti);  // void è un puntatore che chiama il ciclo pausa quando viene chiamato dalprogramma principale. 
    void flash(char nvolte);
    void incremento(char molt);
    
    main(void) 
    {
    TRISA = 1;              //setta RA0 in entrata
    TRISB = 0;				//setta RB in uscita
    	{
    char y;					//dichiara y
    char molt=0;			//inizializza "molt" 
    char tot=50;
    
    for(y=0;y<=tot;y++)     //ripeti per 50 volte
    		{
    	DelayMs(130);
    if(PORTA==0b00000001)	//se viene premuto il bottone 
    			{
    PORTB = 0b00000001;		//accendi il led
    DelayMs(100);			//aspetta 100ms
    PORTB = 0b00000000;		//spegni il led
    DelayMs(130);			//aspetta 100ms
    incremento;				//chiama la funzione "incremento"
    						//incrementa molt di 1 
    			}	
    		}
    	{
    
    char z;
    for(z=0;z<=molt;z++)	         //ripeti quante volte è "molt"
                                             //il valore di "molt" dovrebbe corrispondere
                                             //ad ogni esecuzione vera di IF 
    		{
    pausa(60);				//richiama pausa 60 volte, corrisponde a 1 minuto
    		}
    flash(5);				//richiama sequenza flash 5 volte
    	}
    	}
    }
    
    void 
    flash(char nvolte)
    {
    	char nflash;
    	for (nflash=0;nflash<=nvolte;nflash++)   //ripeti quante volte è stato dichiarato 
                                                                  //nel main
    PORTB = 0b00000001;		                     //accendi il led
    DelayMs(250);			                    //aspetta 250ms
    PORTB = 0b00000000;		                   //spegni il led
    DelayMs(250);			                  //aspetta 250ms
    }
     
    void
    incremento(char molt)
    {
    	molt++;				//incrementa "molt" ogni volta 
    						//che viene chiamata la funzione dall'IF
    } 
    
    
    void
    pausa(char ripeti)            //nome assegnato alla funzione del ciclo 
    {                                  //apertura della funzione ciclo 
    char x;                          //definisce l'esistenza di x 
    for(x=0;x<=ripeti;x++)     //il ciclo vero e proprio  
    DelayMs(Aspetta);	   //ogni ciclo corrisponde a 1 secondo
    DelayMs(Aspetta);				
    DelayMs(Aspetta);
    DelayMs(Aspetta);          //l'argomento del ciclo (qui finisce il ciclo e ci và il punto e virgola) 
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    4
    Ho fatto delle prove aggiungendo anche

    codice:
    if(PORTA==0b00000000)
    {
    DelayMs(240);
    }
    Nel ciclo FOR, ma il pic si comporta così:

    accendo
    parte il ciclo FOR
    Lampeggio (primo if)
    pausa (secondo if)
    ripete fino a che non finisce FOR.

    In pratica è come se verificasse sempre (o non tenesse conto) degli IF dentro il ciclo FOR.

    :master:

  3. #3

    Re: Logica programmino in C

    Non so' quanto differisca il C per PIC, da quello standard; ma ci sono svariate cose che non vanno. E il compilatore non avrebbe dovuto compilare questo codice.

    codice:
    #include <htc.h>
    #include"delay.c" 
    #define Aspetta 250       //definisce la var Aspetta con 250ms
    
    void pausa(char ripeti);
    void flash(char nvolte);
    
    int main(void) 
    {
    				//setta RB in uscita
       char y, z;				//dichiara y
       char molt=0;		//inizializza "molt"[/COLOR] 
       char tot=50;
    
       TRISA = 1;              //setta RA0 in entrata
       TRISB = 0;
    
       for(y=0; y < tot; y++) {
    
          DelayMs(130);
    
          if(PORTA==0b00000001) {
    
             PORTB = 1;		//accendi il led
             DelayMs(100);
    
             PORTB = 0;		//spegni il led
             DelayMs(130);			//aspetta 100ms
             molt++; //Non c'è bisogno di una funzione per incrementare di uno una variabile ...
    
          }	
       
       }
    
    
       for(z=0; z < molt; z++) {
    
          pausa(60);
    
       }
    
       flash(5);
    
       return 0;
    
    }
    
    void flash(char nvolte)
    {
       char nflash;
    
       for (nflash=0; nflash < nvolte; nflash++) {
    
          PORTB = 1;		                     //accendi il led
          DelayMs(250);			                    //aspetta 250ms
    
          PORTB = 0;		                   //spegni il led
          DelayMs(250);			                  //aspetta 250ms
    
       }
    
    }
    
    void pausa(char ripeti)
    {
       char x;
    
       for(x=0; x < ripeti; x++){
    
          DelayMs(Aspetta);
          DelayMs(Aspetta);				
          DelayMs(Aspetta);
          DelayMs(Aspetta);
    
       }
    
    }
    Ho aggiustato anche l'identazione, e ordinato il codice (prima si capiva poco ...).


  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    4

    Re: Re: Logica programmino in C

    Originariamente inviato da menphisx
    Non so' quanto differisca il C per PIC, da quello standard; ma ci sono svariate cose che non vanno. E il compilatore non avrebbe dovuto compilare questo codice.

    Ho aggiustato anche l'identazione, e ordinato il codice (prima si capiva poco ...).

    Grazie, sei stato molto gentile, tra qualche minuto provo così.

    però mi rimangono 2 dubbi sulle modifiche che hai fatto

    1)int main(void)

    Ho un pic che lavora a 8 bit, devo mettere solo

    main(void) ?


    2)return 0;

    Questo ritorna a inizio di "int main(void)" ?

    Il ciclo mi basta farlo fare 1 sola volta, se lo levo creo problemi al compilatore ?
    devo mettere break; o posso semplicemente cancellare il "return 0;" ?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Dipende dal compilatore che usi, ma non dovresti avere problemi a togliere completamente il

    return 0;

    e utilizzare

    void main(void)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6

    Re: Re: Re: Logica programmino in C

    Originariamente inviato da Cicche
    Grazie, sei stato molto gentile, tra qualche minuto provo così.

    però mi rimangono 2 dubbi sulle modifiche che hai fatto

    1)int main(void)

    Ho un pic che lavora a 8 bit, devo mettere solo

    main(void) ?
    In C standard se si omette il tipo del valore restituito è sottinteso un int, per cui
    codice:
    int main(void)
    e
    codice:
    main(void)
    sono perfettamente identici, anche se il primo è più chiaro.
    2)return 0;

    Questo ritorna a inizio di "int main(void)" ?
    return serve per terminare la funzione restituendo un valore al chiamante; ora, visto che stai lavorando su un PIC il valore restituito credo che sia assolutamente indifferente, ma è comunque buona prassi lasciare il return 0 in fondo alla funzione per chiarezza.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    4

    Re: Re: Re: Re: Logica programmino in C

    Siete stati molto esaurienti, grazie per il supporto

    Domani se ho tempo provo tutto sul pic !!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.