ProMini - prove Porte

Buongiorno a tutti,
sto facendo delle prove utilizzando un ProMini e 6 display a 7 segmenti collegati alle porte D e B.
Non riesco proprio a capire perchè i segmenti A e B (collegati a TX ed al RX) non vogliono accendersi.
I collegamenti sono esatti e collegati direttamente ai 5V funzionano.
Il programma utilizzato per le prove è:

//  non funziona

int num = 0;

byte values[] = {
   //hgfedcxx
  B00000000, // 0  -0
};

byte display[] = {
  B11111111, // PIN 13
  B11111111, // PIN 12
  B11111111, // PIN 11
  B11111111, // PIN 10
  B11111111, // PIN 9
  B01111111, // PIN 8
};

void setup() {
  Serial.begin(9600);
  Serial.println("Prove_porte/prova_10_A_Tutto");
  DDRD = B11111111;
  DDRB = B11111111;
}

void loop() {
  PORTB = display[0];
  PORTD = values[num];
  delay (500);

  PORTB = display[1];
  PORTD = values[num];
  delay (500);

  PORTB = display[2];
  PORTD = values[num];
  delay (500);

  PORTB = display[3];
  PORTD = values[num];
  delay (500);

  PORTB = display[4];
  PORTD = values[num];
  delay (500);

  PORTB = display[5];
  PORTD = values[num];
  delay (500);
}

Qualcuno sa darmi una spiegazione?

Grazie + saluti
Enrico

Non credo di aver ben capito ...
... hai due segmenti collegati ai pin TX ed RX del Arduino Pro Mini ? Usi la seriale ...

e ti chiedi perchè quei pin non funzionino ?

Guglielmo

Vedo tre errori prima di tutto:

  1. La porta B ha solo 6 uscite utilizzabili: le altre non vanno forzate, ma bisogna fare un OR (|) per le uscite d attivare e un AND(&) per le uscite da disattivare.
  2. La tabella display è sbagliata: la porta B sta quasi sempre tutta a 1!
  3. Non vedo la tabella dei numeri ma, d'altra parte, stai provando solo con num=0.

Inoltre, come dice Guglielmo, quando vengono trasmessi/ricevuti dati sulla seriale vedrai lampeggiare i segmenti collegati a Tx/Rx.

I display sono a catodo comune?
Se è a catodo comune, è giusto attivarlo portando a 0 l'uscita collegata al catodo, ma devi portare a 1 le uscite collegate agli anodi, invece io leggo:

byte values[] = {
// hgfedcxx
  B00000000, // 0  -0
};

Spero che tu abbia messo una resistenza per ogni anodo (se i display sono a catodo comune) e che la corrente sia minore di 10mA/segmento, quindi almeno 330 ohm.

Per fare la scansione dei display puoi fare così:

byte disp=0 // Numero del display da attivare da 0 a 5.

void setup()
{
//Display543210 (Catodo comune).
DDRB=0b00111111;
}

void mpx()
{
PORTB|=0b00111111; // Spegne tutti.
PORTB&=~(1<<disp); // Accende il display desiderato.
}

void loop()
{
for (n=0; n<=5; n++)
  {
  mpx();
  ...
  ...  
  }
}

Grazie, farò prezioso uso dei vs consigli.

Come avrete notato la mia ignoranza nel campo è abissale, ma sto imparando.

Non sapevo che la seriale "lavorasse" sui TX - RX.

Grazie di tutto. Saluti
Enrico

TX e il pin da cui vengonio trasmessi i dati seriali, RX è il pin in cui vengono ricevuti. Essi sono collegati al convertitore Seriale <-> USB che è presente sulla scheda e che ti permette dil collegamneto con il computer.

Guglielmo

Sul Pro Mini ? :wink:

Ciao, Ale.

No, vero, il Pro Mini ha solo il connettore per attaccare un convertitore Seriale <-> USB esterno alla scheda che però ...
... l'utente sicuramente lo ha visto che usa la seriale e trasmette i dati al PC   :grin: :grin: :grin:

Guglielmo

l'utente sicuramente lo ha visto 

Si, uso lo FT232RL.

x Datman grazie, il programmino funziona; devo però eliminare il ciclo "for" in quanto non voglio ripetere lo stesso numero sui vari display (immagino comunque sia possibile anche se, al momento, non so come ... ma ci penserò); vorrei invece sapere il perchè dell'utilizzo di "DDRB=0b00111111;" invece di B11111111. So che è corretta, ma perchè?

Ne approfitto, vorrei alimentare il tutto con un caricatore da 9V e 300 mA sul pin RAW, supportando questo, da letteratura, un max di 40 mA è sufficente inserire un resistore da 20 o 30 Ohm?

Saluti
Enrico

Scusa ... per fare cosa vorresti inserire una resistenza e dove esattamente ? ? ?

Guglielmo

Finora non me ne ero mai preoccupato, ma guardando quest'immagine

sembra che l'alimentazione non debba superare i 40 mA. Pur con le mie scarse conoscenze la cosa mi sembra un po' assurda, comunque ...
Da reminiscenze scolastiche ricordo questa formula
I = V/R
quindi aumentando la resistenza gli ampere dovrebbero ridursi.
Saluti
Enrico

... direi riminiscenze mooooolto vage ... :grin:

NO, quello che è indicato li è quanto si può assorbire da un pin di Arduino. Ti rammento infatti che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Quanto invece la scheda assorbe NON lo decidi tu ma la sua "resistenza" e quella degli oggetti che gli colleghi che, per la formula che hai scritto, darà una determinata corrente che NON sei tu a dove imporre, ma che è il circuito stesso che assorbe dall'alimentatore il quale, ovviamnete, deve essere in grado di fornire almeno il 35/40% in più di quanto richiesto, onde evitare di surriscaldarlo.

Quindi, ad esempio, se tra arduino e periferiche tu hai bisogno di 200 mA, dovrai usare, per non surriscaldalo, un alimentatore che è in grado di fornirne almeno un 300 mA, meglio 500mA :grinning_face_with_smiling_eyes:

Guglielmo

Grazie

Sotto specificano: Raccomandato: 20mA!

E' la stessa cosa. La prima forma è standard, mentre la seconda è una di quelle semplificazioni/complicazioni-che-confondono-le-idee del mondo di Arduino. :slight_smile:

... possono specificare quello che gli pare, quello che fa testo è il datashet!

Inoltre le schede di Pighixxx notoriamente NON sono esenti da errore (alcune ne contengono di gravi che non ha fatto in tempo a correggere prima dei casini vari).

Guglielmo

Beh... Se vai a vedere sul datasheet i grafici delle caratteristiche di uscita:
Figure 31-306.ATmega328: I/O Pin Output Voltage vs. Sink Current (VCC = 5 V)
Figure 31-308.ATmega328: I/O Pin Output Voltage vs. Source Current (VCC = 5 V)
le curve sono limitate proprio a 20mA.

... stiamo parlando di Absolute Maximum Rating dove viene chiaramente specificato 40mA ... è più che sicuro attestarsi su un 60/70% di tale valore senza creare alcun problema al chip.

Le curve sono fatte con un valore standard di riferimento che poco ha a che vedere con i valori limite (per non danneggiare il chip). Esse servono piuttosto ad indicare il valore di tensione da aspettarsi sul pin in funzione della corrente assorbita che, in ogni caso, è bene sia sempre sotto i 30mA (per stare tranquilli e non rischiare).

Guglielmo

Ancora grazie a tutti!!!

Giusto per essere ben chiari e non commettere errori ...

Absolute Maximum Rating:

DC Current per I/O Pin ................... 40.0mA
DC Current VCC and GND Pins .... 200.0mA

Stresses beyond those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. This is a stress rating only and functional operation of the device at these or other conditions beyond those indicated in the operational sections of this specification is not implied. Exposure to absolute maximum rating conditions for extended periods may affect device reliability.

Guglielmo