Pages: [1] 2 3 ... 36   Go Down
Author Topic: Topic permanente di programmazione newbie  (Read 32336 times)
0 Members and 1 Guest are viewing this topic.
Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sto lavorando ad un firmware piuttosto complesso nella struttura, lo devo praticamente stravolgere, alla fine ho deciso di riscriverlo, troppo disordine. Chiaramente ora vorrei rifarlo secondo le mie esigenze ma le mie conoscenze in C sono prossime allo 0 (partendo da negativo!); fondamentalmente riorganizzerò i blocchi del software precedente più altri usciti dai preziosi suggerimenti di Astrobeed e di Leo72, ma il "contorno" me lo devo riceare e lì sono usciti subito i primi problemi; ho scaricato tempo fa da un link il language reference di Arduino ma le mie scarne conscenze non mi permettono di superare ciò che lì è dato per scontato. Ho pensato allora di aprire questo Topic per porre domande che per me sono importanti e per molti di voi saranno banali, man mano che usciranno le mie esigenze. Ciò vale anche per i messaggi di errore che a volte escono e che mi fanno impazzire per trovare la soluzione. Il mio tempo è scarso quindi il vostro aiuto diventa per me prezioso. Naturalmente questo Topic potrebbe diventare un serbatoio di richieste di chiunque abbia un qualsiasi dubbio di programmazione.
Chiudo questo post qui come premessa e nel successivo pongo la prima domanda. Grazie a chiunque collaborerà.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22972
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-wink
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ed ecco il primo quesito :
Ho necessità di creare uno switch case in cui le risposte siano "S" e "N" e non 1 e 2. Ho scritto questo
Quote
byte response = NULL;// variabile globale messa prima del setup
//il seguito si trova in loop
Serial.println("Vuoi riprogrammare i fuse di questo micro? S/N");
  while(response == NULL) {
      while (Serial.available() == 0);   // aspetta un carattere
      response = Serial.read();  // legge la risposta dell'utente
   
  switch(response) {
      case 'S':
      case 's':
        mode = ATMEGA;
        break;
      case 'N':
      case 'n':
        Serial.println("Togli il micro dallo zoccolo e premi il pulsante RESET");
        end_programming();
        break;
      default:
        Serial.println("Per favore premi S o N");
        response = NULL;  // reset response so we go thru the while loop again
        break;
se premo s, S, n o N comunque mi esce il messaggio d'errore. Perché?

EDIT: falso problema, funziona, non chiedetemi cosa ho fatto, non lo so smiley-sad
« Last Edit: March 04, 2012, 04:03:44 pm by menniti » Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22972
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.
http://arduino.cc/en/Reference/Char

http://www.java2s.com/Code/C/Language-Basics/Howtouseswitchchar.htm
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.
http://arduino.cc/en/Reference/Char

http://www.java2s.com/Code/C/Language-Basics/Howtouseswitchchar.htm
Ma quella del tipo char era la strada che avevo tentato di seguire creando una global:
char yesno = "" (o anche = NULL) ma mi ha preso a parolacce già su questa definizione, invece ora col tipo byte riconosce le quattro modalità e risponde correttamente, boh!?
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22972
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non mi prende a parolacce:
Code:
void loop() {
char stringa='a';
switch(stringa) {
    case 'a':
        break;
    }
}

byte è un tipo di dati di arduino che altro non è se non un unsigned char. Ma se devi fare confronti con le lettere mi pare più corretto usare il tipo di dati appropriato, cioè char, dato che byte è stato "inventato" proprio per trattare numeri.
Logged


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

Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.

char e unsigned char (byte) sono la stessa cosa per il C, cambia solo il modo di trattarli nei calcoli, ma su i confronti non cambia nulla, un carattere ascii altro non è che un valore numerico.

Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non mi prende a parolacce:
Code:
void loop() {
char stringa='a';
switch(stringa) {
    case 'a':
        break;
    }
}

byte è un tipo di dati di arduino che altro non è se non un unsigned char. Ma se devi fare confronti con le lettere mi pare più corretto usare il tipo di dati appropriato, cioè char, dato che byte è stato "inventato" proprio per trattare numeri.
come a parolacce? ma ti sto chiedendo aiuto! Comunque, il chiarimento di Astro mi sta bene, per ora devo andare avanti, alle finezze penseremo in un secondo momento smiley-wink
Altro problema, solo di carattere estetico: il gruppo:
Quote
Serial.print("SIGNATURE: ");
    #if (read_signature1 < 10) //serve per mostrare lo 0 iniziale per valori <16 = 10
        Serial.print("0");
    #endif
  Serial.print(read_signature1, HEX);
nelle mie misere intenzioni doveva aggiungere uno 0 quando ho un esadecimale <16, per evitare di vedere F o A invece di 0F o 0A, invece lo zero esce inesorabilmente sempre, l'errore è nel fatto che read_signature1 contiene un valore HEX ed io lo confronto con una banale 10, avevo provato $10 ma anche qui fiumi di imprecazioni dell'IDE smiley-red
Logged


Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 28
Posts: 5515
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.

char e unsigned char (byte) sono la stessa cosa per il C, cambia solo il modo di trattarli nei calcoli, ma su i confronti non cambia nulla, un carattere ascii altro non è che un valore numerico.


+1

Non mi prende a parolacce:
Code:
void loop() {
char stringa='a';
switch(stringa) {
    case 'a':
        break;
    }
}

byte è un tipo di dati di arduino che altro non è se non un unsigned char. Ma se devi fare confronti con le lettere mi pare più corretto usare il tipo di dati appropriato, cioè char, dato che byte è stato "inventato" proprio per trattare numeri.
come a parolacce? ma ti sto chiedendo aiuto! Comunque, il chiarimento di Astro mi sta bene, per ora devo andare avanti, alle finezze penseremo in un secondo momento smiley-wink
Altro problema, solo di carattere estetico: il gruppo:
Quote
Serial.print("SIGNATURE: ");
    #if (read_signature1 < 10) //serve per mostrare lo 0 iniziale per valori <16 = 10
        Serial.print("0");
    #endif
  Serial.print(read_signature1, HEX);
nelle mie misere intenzioni doveva aggiungere uno 0 quando ho un esadecimale <16, per evitare di vedere F o A invece di 0F o 0A, invece lo zero esce inesorabilmente sempre, l'errore è nel fatto che read_signature1 contiene un valore HEX ed io lo confronto con una banale 10, avevo provato $10 ma anche qui fiumi di imprecazioni dell'IDE smiley-red
Scusa, fatti una #define che ti contiene il numero esadecimale da confrontare no ?
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ma se faccio
define cfr 10
no mi assegna la sigla cfr al pin 10? Non devo comunque dirgli che 10 è un valore HEX, ma nei tipi di dati non lo vedo.
Logged


Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 28
Posts: 5515
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè dovrebbe assegnarti il pin 10 alla sigla CRF ?
alla fine, se nel setup non metti che crf è un pin con il solito pinMode, crf resta una variabile come tante altre..
spero di essermi spiegato in maniera chiara  smiley-roll-sweat


poi se proprio vuoi te la inizializzi solo all'interno della funzione in cui la usi così eviti altri problemi, senza contare che così facendo al termine della funzione la ram che veniva occupata dalla varibile, viene liberata.
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 28
Posts: 5515
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè dovrebbe assegnarti il pin 10 alla sigla CRF ?
alla fine, se nel setup non metti che crf è un pin con il solito pinMode, crf resta una variabile come tante altre..
spero di essermi spiegato in maniera chiara  smiley-roll-sweat


poi se proprio vuoi te la inizializzi solo all'interno della funzione in cui la usi così eviti altri problemi, senza contare che così facendo al termine della funzione la ram che veniva occupata dalla varibile, viene liberata.
Edit:
L'ho appena provato così:
Code:
#define crf = 0x10;
e compila senza problemi, alla fine è solo un numero smiley-razz

stacco perchè mi aspetta una brutta giornata a scuola domani..
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè dovrebbe assegnarti il pin 10 alla sigla CRF ?
alla fine, se nel setup non metti che crf è un pin con il solito pinMode, crf resta una variabile come tante altre..
spero di essermi spiegato in maniera chiara  smiley-roll-sweat


poi se proprio vuoi te la inizializzi solo all'interno della funzione in cui la usi così eviti altri problemi, senza contare che così facendo al termine della funzione la ram che veniva occupata dalla varibile, viene liberata.
Sì, hai ragione, sei stato chiarissimo, solo non capisco perché facendo il confronto diretto con 10 non va ed invece dovrebbe andare facendolo con una variabile che contiene 10, senza specificargli che è un valore hex.
Ok, provo come hai fatto tu, buonanotte e grazie.
Logged


Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'ho appena provato così:
Code:
#define crf = 0x10;

mmm ci sono alcuni errori in quella define, vedi http://arduino.cc/en/Reference/Define
Define non fa altro che sostituire la stringa prima della compilazione, quindi niente = o ;
Logged

lucadentella.it

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12643
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'ho appena provato così:
Code:
#define crf = 0x10;

mmm ci sono alcuni errori in quella define, vedi http://arduino.cc/en/Reference/Define
Define non fa altro che sostituire la stringa prima della compilazione, quindi niente = o ;
infatti "=" non ci vuole, comunque anche confrontantolo così non va.
Logged


Pages: [1] 2 3 ... 36   Go Up
Jump to: