Go Down

Topic: Topic permanente di programmazione newbie (Read 38485 times) previous topic - next topic

Michele Menniti

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à.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html


Michele Menniti

#2
Mar 04, 2012, 09:59 pm Last Edit: Mar 04, 2012, 10:03 pm by menniti Reason: 1
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 :(
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72

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

Michele Menniti


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!?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72

Non mi prende a parolacce:
Code: [Select]

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.

astrobeed


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.


Michele Menniti


Non mi prende a parolacce:
Code: [Select]

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 ;)
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:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

ratto93



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: [Select]

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 ;)
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 ?
Se corri veloce come un fulmine, ti schianterai come un tuono.

Michele Menniti

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.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

ratto93

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.
Se corri veloce come un fulmine, ti schianterai come un tuono.

ratto93


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: [Select]
#define crf = 0x10;
e compila senza problemi, alla fine è solo un numero :P

stacco perchè mi aspetta una brutta giornata a scuola domani..
Se corri veloce come un fulmine, ti schianterai come un tuono.

Michele Menniti


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.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lucadentella


L'ho appena provato così:
Code: [Select]
#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 ;
lucadentella.it

Michele Menniti



L'ho appena provato così:
Code: [Select]
#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.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Go Up