Progetto Arduino

Salve,
Mi servirebbe un aiuto per un progetto di arduino che prevede l'acquisizione di un codice ad 8 bit tramite dipswitch. Il codice in binario dovrà poi essere convertito in codice gray e sommato di 1 ( es col dip inserisco il valore binario 0111 (7) e in gray mi dovrà dare 1100 (8)) e il risultato dovrà essere visualizzato su 8 led.
Al massimo posso usare 12 pin di arduino e pensavo di utilizzare un multiplexer 7415 per l'acquisizione dei dati dal dip
Grazie in anticipo

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Salve,
Sono Gianmarco e sono di Acquaviva, ho 15 anni e da un po di tempo mi esercito con arduino a scuola.
Il fatto è che io di elettronica ci capisco poco o nulla per questo mi servirebbe il vostro aiuto.
Grazie in anticipo

Ma se vuoi rappresentare un codice gray da un binario, non capisco perche' ti servano 8 Led.
8 Pin di input per i dip switch e 4 Pin di Output per i Led

Eh il progetto prevede la rappresentazione del segnale cosi
e appunto volevo usare il multi per diminuire i pin di ingresso

Brunello:
Ma se vuoi rappresentare un codice gray da un binario, non capisco perche' ti servano 8 Led.

Per il semplice motivo che il codice gray richiede lo stesso numero di bit di un valore binario in quanto è dato dal xor del binario con se stesso shiftato di uno a destra.
Semmai gli bastano 12 pin perché può collegare sia i dip switch che i led sotto forma di matrice 4x2 senza usare nessun hardware aggiuntivo, a parte le resistenze di limitazione corrente per i led.

@VAL8: La presentazione va fatta nell'apposito thread, ovvero QUI e NON in questo thread. Con l'occasione ti prego anche di leggere il REGOLAMENTO ... Grazie.

Guglielmo

Per il semplice motivo che il codice gray richiede lo stesso numero di bit di un valore binario

a volte mi sento un Cog....e.

... un codice ad 8 bit va da 00 (0) a FF (255) ... oppure intendi leggere quale degli 8 dip-switch e' acceso in base alla posizione, indifferentemente dalla codifica hex ?

EDIT: Brunello, probabilmente stavi pensando al codice BCD :wink:

Il dip switch lo devo utilizzare per creare il codice binario ad 8 bit
se il dip è spostato in una determinata posizione mi da valore 1 sennò 0 e così dovrei creare il segnale ad 8 bit, una volta ricevuto il segnale su arduino devo trasformare da binario a Gray sommato di 1 e i led si devono accendere in base al valore, se il primo bit è 0 il primo led è spento senno si accende e così anche per gli altri 7 led.
Ma il mio problema è che non so scrivere il programma su arduino perchè la parte fisica l'ho già montata sulla breadbord.

Semmai gli bastano 12 pin perché può collegare sia i dip switch che i led sotto forma di matrice 4x2 senza usare nessun hardware aggiuntivo, a parte le resistenze di limitazione corrente per i led.

EDIT: Brunello, probabilmente stavi pensando al codice BCD

Poi non ho risposto perchè sono dovuto scappare, ma stavo proprio pensando a 8pin per il dipswitch e a 4 pin per i led, messi in matrice.
Anzi, visto che sono in pausa pranzo, mi sono voluto divertire un pò
Dovrebbe funzionare. Per i Led li ho collegati in charlieplexing
Poi metto anche un disegnino dei collegamenti

/*
  Converte un numero letto da dipswitch e lo converte in codice gray 
  e lo visualizza su led in charlieplexing
*/

// definisce i pin dei led per il charlieplexing
#define led_A A0
#define led_B A1
#define led_C A2
#define led_D A3

// definisce i pin (MSB)7,6,5,4,11,10,9,8 come ingressi
byte ddrb_mask =  ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) );
byte ddrd_mask =  ~((1 << DDD4) | (1 << DDD5) | (1 << DDD6) | (1 << DDD7) );
byte portb_mask = ((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2) | (1 << PORTB3) ); // Pullup
byte portd_mask = ((1 << PORTD4) | (1 << PORTD5) | (1 << PORTD6) | (1 << PORTD7) ); // Pullup
byte pinb_mask = ((1 << PINB0) | (1 << PINB1) | (1 << PINB2) | (1 << PINB3) );
byte pind_mask = ((1 << PIND4) | (1 << PIND5) | (1 << PIND6) | (1 << PIND7) );

int dec;
int binario[10];
int i;
unsigned int gray ;
unsigned int num ;

void setup()
{
  // imposta i pin A0---A4 come input
  DDRC = DDRC & ~ ((1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3));

  // imposta i pin come input
  DDRD = DDRD & ddrd_mask; // PortaD 4,5,6,7
  DDRB = DDRB & ddrb_mask; // PortaB 8,9,10,11
  // abilita il pullup, perche' i dipswich vanno verso il Ground
  PORTD = PORTD | portd_mask;
  PORTB = PORTB | portb_mask;
  Serial.begin (115200);
}
void ritardo() {
  delay(2); // ritardo per il refresh dei led
}
void loop()
{
  num = (PINB & pinb_mask) + ( PIND & pind_mask); // legge i dip switch
  //num++ ; // aumenta di uno
  gray = (num >> 1) ^ num ; // converte in codice gray
  Serial.print (num);
  Serial.print(" = ");
  Serial.println ( gray );
  conversione(gray) ;
  visua_numero();

  if (binario[8] == 1 )
    imposta_pins(led_B, led_A); // 1 led
  ritardo();
  if (binario[7] == 1 )
    imposta_pins(led_A, led_B); // 2 led
  ritardo();
  if (binario[6] == 1 )
    imposta_pins(led_C, led_B); // 3 led
  ritardo();
  if (binario[5] == 1 )
    imposta_pins(led_B, led_C); // 4 led
  ritardo();
  if (binario[4] == 1 )
    imposta_pins(led_C, led_A); // 5 led
  ritardo();
  if (binario[3] == 1 )
    imposta_pins(led_A, led_C); // 6 led
  ritardo() ;
  if (binario[2] == 1 )
    imposta_pins(led_D, led_B); // 7 led
  ritardo();
  if (binario[1] == 1 )
    imposta_pins(led_B, led_D); // 8 led
  ritardo() ;
  if (binario[0] == 1 )
    imposta_pins(led_D, led_A); // 9 led
  ritardo() ;
}

void imposta_pins(int high_pin, int low_pin)
{
  reset_pins();
  pinMode(high_pin, OUTPUT);
  pinMode(low_pin, OUTPUT);
  digitalWrite(high_pin, HIGH);
  digitalWrite(low_pin, LOW);
}

void reset_pins()
{
  DDRC = DDRC & ~ ((1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3)); // pinMode INPUT
  PORTC = PORTC | ((0 << PORTC0) | (0 << PORTC1) | (0 << PORTC2) | (0 << PORTC3)); //  digitalWrite LOW);
}

void conversione( int dec) { // riempe il vettore 
  for (i = 0; i < 9; i++) {
    if (dec % 2 == 0) {
      binario[i] = 0;
    } else {
      binario[i] = 1;
    }
    dec = dec / 2;
  }
}

void visua_numero() { // visualizza su seriale
  for (i = 8; i >= 0; i--) {
    Serial.print("  ");
    Serial.print( binario[i]);
  }
  Serial.println();
}

Gentilissimo!
Le spiacerebbe però spiegarmi come montare i led sulla breadboard perchè non sono molto pratico nell'interpretazione dei disegni ahahah
e anche le resistenze per i basta che ne metto 1 per uscita o una prima di ogni led?

Scusa un attimo
ma perche nel disegno ci sono 9 led? serve per l'overflow?

avevo letto che leggevi gli 8 bit e poi sommavi di uno
quindi se ad "1111 1111" (255) (0xFF) sommo UNO, passo da 8 a 9 Bit

ahhhh ok perfetto
caspita ha pensato a tutto ahahah gentilissimo veramente
grazie mille :smiley: