PDA

Visualizza la versione completa : Logica programmino in C


Cicche
05-10-2008, 15:10
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 !


#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)
}

Cicche
05-10-2008, 16:28
Ho fatto delle prove aggiungendo anche



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:

menphisx
05-10-2008, 16:44
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.



#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 ...).

:ciauz:

Cicche
05-10-2008, 17:09
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 ...).

:ciauz:

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;" ?

oregon
05-10-2008, 17:10
Dipende dal compilatore che usi, ma non dovresti avere problemi a togliere completamente il

return 0;

e utilizzare

void main(void)

MItaly
05-10-2008, 18:53
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

int main(void)
e

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.

Cicche
05-10-2008, 20:47
Siete stati molto esaurienti, grazie per il supporto :)

Domani se ho tempo provo tutto sul pic !!

Loading