Pages: 1 [2]   Go Down
Author Topic: Aiuto con il C  (Read 950 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non sto mettendo in dubbio l'uso di parentesi, che ammetto che mi sia sfuggito, ma l'uso dei long.

e se l'ADC è a 12bit e SE vuole il valore in volt, allora il divisore dovrebbe essere 4096
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ho visto dopo che val era dichiarata UINT, e bastava, però ci sono PIC dove l'ADC è a 12bit smiley-lol...

Forse è meglio che lo rileggi il K&R, in C le operazioni matematiche "+ - * /" sono eseguite da sinistra verso destra, da destra verso sinistra sono eseguite le assegnazioni con operazione come "+=".
Dato che non ha specificato il modello di PIC è possibile che ha un ADC a 12 bit, però 4096 * 5 = 20480 che entra senza problemi anche in un signed int, quindi non c'è nessun motivo per usare i long.
Giusto per togliere ogni dubbio questo è uno sketch per Arduino che fa la stessa cosa e funziona perfettamente senza usare le parentesi, che comunque è sempre bene mettere ai fini della leggibilità del programma e per eliminare eventuali ambiguità, oltre ad accendere il led sul pin 13, per 100 ms, se il valore è maggiore di 3 stampa sul monitor seriale i valori letti che variano tra 0 e 4 come previsto.
Da notare che con il calcolo proposto da Cece il valore massimo è 4 e non 5 come probabilmente pensa lui perché l'out del ADC è al massimo 1023 e 1023 * 5 / 1024 = 4.995 che viene troncato a 4.

Code:
int SV;

void setup() {
   pinMode(13, OUTPUT);  
  Serial.begin(19200);
}

void loop() {
  SV = analogRead(A0) * 5 / 1024;
  if(SV>3) digitalWrite(13,HIGH);
  Serial.println(SV,DEC);
  delay(100);  
  digitalWrite(13, LOW);    
}
« Last Edit: November 20, 2012, 12:38:01 am by astrobeed » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Giusto per troncare alla radice ogni discussione, K&R capitolo 2, paragrafo 12, tabella 2.1, precedenza degli operatori che è la stessa riportata qui.
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ah, questa è una tabella da tenere sotto mano, anche se abbondo di parentesi e non ci faccio caso (lavorando con più linguaggi al giorno è facile mischiare i concetti)

interessante anche la tabella a fine pagina per l'uso delle precedenze coi puntatori..
io di solito scrivo (*p)++ ma non mi piace avere mille parentesi in giro ogni volta che accedo al valore della varibaile.
magari potrei passare a ++*p che mi pare anche abbastanza intuitivo.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ah, questa è una tabella da tenere sotto mano, anche se abbondo di parentesi e non ci faccio caso (lavorando con più linguaggi al giorno è facile mischiare i concetti)

Da notare che la tabella oltre a specificare il verso di lettura indica anche la priorità degli operatori, che poi è la stessa indicata dalle regole matematiche, p.e. * e / vengono eseguite prime di + e -, va da se che usare le parentesi anche se non realmente necessario è comunque utile per la leggibilità della riga.
Logged

Pages: 1 [2]   Go Up
Jump to: