spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Informatica > P. in C, C++

Rispondi
 
Strumenti discussione Modalitā  visualizzazioe
  #1  
Vecchio 18-12-2006, 18.30.53
cortocircuito cortocircuito non è collegato
Nuovo robottaro
 
Data registrazione: 18-12-2006
Residenza: italia
Messaggi: 2
Potenza reputazione: 0
cortocircuito E' per ora ancora un mistero
Predefinito Alle prime armi ...

Salve,
comincio a muovere i primi passi sulla programmazione dei pic usando un 16f84 e linguaggio c, e forse, alcuni dubbi sono anche leciti.

Ho realizzato su bread board un semplice semaforo con tre led, e fin qui tutto ok.
Nonostante abbia piu' volte letto e riletto la spiegazione rilasciata dall'autore del programma, alcune cose non mi sono chiare,
per l'esattezza, una volta che il programma ha completato la sequenza di accensione dei led, come procede ?
Il comando for, per la precisione, come si comporta ?
Ecco il listato:

//******************************
//* SEMAFORO *
//******************************

#include<htc.h>
#include"Delay.h"
#define Aspetta 250
void pausa(char ripeti);
main()
{
TRISB = 0;
while(1)
{
PORTB = 0b00000010; // Accendi led verde
pausa(22); // Mantieni aceso il led verde
PORTB = 0b00000110; // Accendi led giallo
pausa(8); // Mantieni acceso led giallo
PORTB = 0b10000000; // Spengi led verde e giallo
PORTB = 0b00001000; // Accendi led rosso
pausa(22); // Mantieni acceso led rosso
}
}
void
pausa(char ripeti)
{
char x;
for(x=0;x<=ripeti;x++)DelayMs(Aspetta);
}

Altra domanda,
si puo' con il 16f84 memorizzare un informazione al suo interno ?
Mi spiego meglio: prendendo ad esempio il semaforo, la cui sequenza di accensione č giunta al verde, posso riavviare il ciclo dallo stesso led ?
Se si, quali sono le istruzioni ?

Altrimenti, quale č un pic che fa al mio caso ?

Grazie !
Rispondi citando
  #2  
Vecchio 19-12-2006, 08.29.48
L'avatar di R2D2
R2D2 R2D2 non è collegato
Administrator
 
Data registrazione: 05-12-2002
Residenza: Milano - Corsico
Messaggi: 746
Potenza reputazione: 85
R2D2 E' per ora ancora un mistero
Predefinito

Ciao,
analizziamo con ordine il listato che hai postato.

Come ogni programma C tutto parte dalla funzione main().

TRISB = 0;

Questa istruione dice al PIC che la porta B e' tutta in output.

while(1)
{
...
}

Questo e' un ciclo che viene ripetuto fintanto che la condizione e' vera.
Per definizione in C il valore 0=False 1=True.
Questo vuol dire che il ciclo while(1) non finisce mai ovvero il programma non finisce mai (e questo risponde alla prima domanda).

All'interno del ciclo while vengono eseguite queste istruzioni:

PORTB = 0b00000010; // Accendi led verde

Imposta lo stato dei pin della porta B in 0=off; 1=on. In questo caso attiva il pin B1 (dove si presuppone che sia collegato il led verde).

pausa(22); // Mantieni aceso il led verde

Questa istruzione richiama la funzione pausa() passandogli il valore 22. Questa funzione l'analizziamo dopo ma ti dico subito che l'effetto e' quello di attendere 5.750 secondi.

PORTB = 0b00000110; // Accendi led giallo

Imposta i pin B2 e B3 a on, quindi accende i relativi led.

pausa(8); // Mantieni acceso led giallo

Attende 2,250 secondi

PORTB = 0b10000000; // Spengi led verde e giallo
PORTB = 0b00001000; // Accendi led rosso

A me sembra un errore concettuale. Io ipotizzo che tu hai su B1 il led verde, B2 il giallo e B3 il led rosso.
la prima istruzione spegne tutti e tre i led (B1, B2 e B3) ma attiva il PIN B7 (cosa c'e' attaccato ?).
la seconda istruzione attiva il PIN B3 e quindi il led rosso.
Ammesso che serva attivare il PIN B7 e' meglio utilizzare una istruzione sola e precisamente:

PORTB = 0b10001000;

pausa(22); // Mantieni acceso led rosso

Apetta nuovamente 5,750 secondi.

Finito questa sequenza il programma riprende dalla prima istruzione del ciclo while() e quindi riaccende il led verde.


Come detto prima all'interno del ciclo while si richiama la funzione pausa() per generare un ciclo di attesa, vediamo come.

void pausa(char ripeti)

Questo indica che la funzione pausa() riceve in ingresso un parametro chiamato ripeti che e' di tipo char, ovvero 8 bit.

char x;

definisce una variabile interna alla funzione di 8 bit. Questa variabile "scomparira'" quando si esce dalla funzione.

for(x=0;x<=ripeti;x++)

Definisce un ciclo. Al suo interno ci sono tre stadi. Primo, viene inizializzata la variabile che funge da contatore ovvero x=0. Secondo, la variabile contatore viene testata per vedere se si e' giunti alla conclusione del ciclo. Terzo, la variabile contatore viene incrementata al valore successivo.

In questo caso il ciclo for verra' ripetuto per ripeti+1 volte (e' un errore? credo che si volesse fare per ripeti volte).

Ad ogni iterazione del ciclo for viene eseguita:

DelayMs(Aspetta);

Che richiama una funzione della libreria "Delay.h" che effettua una pausa di n millisecondi. In questo caso n=Aspetta.

Quindi quando dalla funzione main() viene richiamata pausa(22) all'interno della funzione le variabili hanno questo valore:

ripeti = 22;
x = da 0 a 22;
Aspetta = 250 (definita in cima al listato).

Quindi il ciclo for eseguira' per 23 volte una pausa di 250 millisecondi = 5750 millisecondi ovvero 5,750 secondi.


Spero di non aver incasinato troppo la spiegazione.

Bye
Rispondi citando
  #3  
Vecchio 19-12-2006, 10.23.16
cortocircuito cortocircuito non è collegato
Nuovo robottaro
 
Data registrazione: 18-12-2006
Residenza: italia
Messaggi: 2
Potenza reputazione: 0
cortocircuito E' per ora ancora un mistero
Predefinito

Grazie per il tuo interessamento ... allora:
gran parte della tua spiegazione mi č chiara.
Vado ai punti dove ho ancora delle perplessitā o non ho chiaro alcuni concetti:

>PORTB = 0b00000010; // Accendi led verde
>Imposta lo stato dei pin della porta B in 0=off; 1=on. In questo caso attiva il >pin B1 (dove si presuppone che sia collegato il led verde).
Si, e per l'esattezza ho collegato il verde a RB1, il giallo a RB2 ed il rosso a RB3.

>pausa(22); // Mantieni aceso il led verde
>Questa istruzione richiama la funzione pausa() passandogli il valore 22. >Questa funzione l'analizziamo dopo ma ti dico subito che l'effetto e' quello di >attendere 5.750 secondi.
La pausa, non dovrebbe essere di 5,5 secondi ?
Non cambia granchč, ma io ho fatto questo ragionamento: 250mS x 22= 5,5.
Giusto ?


>pausa(8); // Mantieni acceso led giallo
>Attende 2,250 secondi
Come sopra ?

>PORTB = 0b10000000; // Spengi led verde e giallo
>PORTB = 0b00001000; // Accendi led rosso
>A me sembra un errore concettuale. Io ipotizzo che tu hai su B1 il led verde, >B2 il giallo e B3 il led rosso.
>la prima istruzione spegne tutti e tre i led (B1, B2 e B3) ma attiva il PIN B7
>(cosa c'e' attaccato ?).
Hai ragione, ho sbagliato. Intendevo spegnere i led verde e giallo, pertanto il comando esatto doveva essere:
PORTB=0b00000000
(A proposito, in queste circostanze, si puo' abbreviare in questo modo: PORTB=0 ?)


>Come detto prima all'interno del ciclo while si richiama la funzione pausa() >per generare un ciclo di attesa, vediamo come.
>void pausa(char ripeti)
>Questo indica che la funzione pausa() riceve in ingresso un parametro >chiamato ripeti che e' di tipo char, ovvero 8 bit.
Quindi "ripeti" č un nome imposto, si poteva chiamare anche in un altro modo ?

>for(x=0;x<=ripeti;x++)
>Definisce un ciclo. Al suo interno ci sono tre stadi.
>Primo, viene inizializzata la variabile che funge da contatore ovvero x=0.
>Secondo, la variabile contatore viene testata per vedere se si e' giunti alla >conclusione del ciclo.
>Terzo, la variabile contatore viene incrementata al valore successivo.
OK, ma quanto vale inizialmente "ripeti" ?
Perchč, se ho ben capito, anche "ripeti" dovrebbe avere un valore numerico.

>In questo caso il ciclo for verra' ripetuto per ripeti+1 volte
> (e' un errore? credo che si volesse fare per ripeti volte).
Forse si, ecco perchč questo passaggio mi resta ancora scuro !
Ammesso che volessi ripetere il ciclo per vole 3 volte ?
Mi puoi dire l'esatta definizione di for ?

>Quindi quando dalla funzione main() viene richiamata pausa(22) all'interno >della funzione le variabili hanno questo valore:
>ripeti = 22;
>x = da 0 a 22;
>Aspetta = 250 (definita in cima al listato).
Perchč hai associato ripeti a 22 ?
Non c'e' nel listato tale attribuzione.

Insomma, per quanto hai letto, mi resta l'enigma della funzione for.
Probabilmente, sono stati indicati dei parametri/valori che mi confondono.
Forse, limitando il ciclo come suggerito,e facendo uscire il programma dal loop creato, posso capire meglio.


Grazie !
Rispondi citando
  #4  
Vecchio 19-12-2006, 13.39.27
L'avatar di saveriop
saveriop saveriop non è collegato
Robottaro master
 
Data registrazione: 16-08-2005
Residenza: firenze
Etā : 46
Messaggi: 428
Potenza reputazione: 83
saveriop E' una stupenda persona in cui credere
Predefinito

Citazione:
Orginalmente inviato da cortocircuito Visualizza messaggio
Grazie per il tuo interessamento ... allora:
La pausa, non dovrebbe essere di 5,5 secondi ?
Non cambia granchč, ma io ho fatto questo ragionamento: 250mS x 22= 5,5.
Giusto ?
la sintassi del for e' la seguente:

for(condizione iniziale;condizione di ciclo;variazione condizione)

nel tuo caso hai
Codice:
for(x=0;x<=ripeti;x++)
significa che all'ingresso del ciclo for, la variabile x viene impostata a 0. Il ciclo continua fintanto che x e' minore o uguale a ripeti; ad ogni ciclo la variabile x viene incrementata di 1 (in C x++ equivale a x=x+1).

Se passi 22 alla funzione pausa, allora avrai che il ciclo conta da 0 a 22 ossia 23 volte. Per farlo contare 22 volte basta scrivere il ciclo for in modo diverso, per esempio:

Codice:
for(x=1;x<=ripeti;x++)
oppure
Codice:
for(x=0;x<ripeti;x++)
In C si preferisce in genere la seconda, in quanto gli indici sono sempre zero based e per altri motivi che in genere hanno a che fare coi puntatori etc...
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalitā  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code č Attivato
Le smilies sono Attivato
[IMG] č Attivato
Il codice HTML č Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
programmazione alle prime armi snoop P. in C, C++ 4 28-10-2012 09.51.40
Quali armi? illonghi Robot WARS 30 03-12-2010 21.35.54
Aiuto, alle prime armi!! Marco87 Progettazione 3 17-09-2008 13.05.42
alle prime armi baby84 P. in Visual Basic 3 14-06-2006 08.57.18


Tutti gli orari sono GMT. Adesso sono le: 18.41.01.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB