[Risolto] Tone() non va su A0~A6.

Ancora ho da capire come sono definiti i nomi dei piedini di uscita di Arduino Uno e Nano. In particolare al momento di doverli assegnare a qualche funzione.
Ho sviluppato un progetto che utilizza 9 uscite per pilotare 8 relè ed una per un LED (alla 13). Poi ho messo il bluetooth ai piedini 0 e 1. Quindi per un certo caso rimane le uscite 4 3 e 2. Le prime due mi servirebbero per una seriale software e l' uscita 2 potrebbe essermi utile per una altra funzione, durante il debug.

Bene, detto questo, volevo implementare un allarme su di una delle uscite A0~A6. All' atto della prova, la libreria Tone() non lavora su quelle uscite. Provato a riscrivere e cambiare uscita, ma nessuna ha dato segni di validità.

Poi di riflesso, pare che la detta libreria sia in conflitto con MS2Time(). Sebbene credo non dovrebbe usare il Timer1. Il timer1, mi serve per temporizzare le uscite 12~5.

Ho cercato di capire cosa c'è scritto nelle librerie, ma ancora è un linguaggio che faccio a fatica a capire :slight_smile:

Quali opzioni esistono per il progetto ?

https://arduino-info.wikispaces.com/Timers-Arduino
La tone() lavora con il timer 1

Grazie della informazione. Ecco dove è che mi nasce il conflitto con la MSTime().

Forse potrei anche pausare la temporizzazione, per il periodo che sta suonando.
Rimane ancora il dubbio sul perché non mi lavora alle uscite A0~A6.

Credo che dovrei farmi una funzione diversa da Tone() con i periodi in software, poi il bit banging sull' uscita interessata.
Ho scritto una funzione per suonare con un PIC, ma usa 2 timers. Non è che anche Tone() ha lo stesso modo?. Perché un timer viene impegnato per la frequenza ed il secondo è usato per la durata?
Vado a vedere il link.

Altrimenti, passo la temporizzazione al timer tre. Poi passo metà delle uscite su A0~A3. In tal modo libero quattro uscite digitali e posso usare il Tone() in modo consueto.

Secca un po', dopo aver quasi portato a termine il progetto.

…La tone() lavora con il timer 1…

A me risulta che lavori con il timer 2: infatti, usando tone non può essere utilizzato il PWM con i pin 3 ed 11.

Forse occorre settare i pin analogici come output.

http://playground.arduino.cc/ComponentLib/Servotimer1
La servo timer 1 vecchia dice è quella che ora è dentro l’IDE

Anche ServoTimer.h conferma che usa Timer1 su Arduino Uno. Anche perchè è il timer a 16 bit
#define _useTimer1
e dentro a Tone.cpp leggo #define USE_TIMER2

Scusa nid, cosa c'entra la libreria Servo?

Perchè sono sicurissimo che le due , tone e servo NON vanno in conflitto.

Ho editato sopra, dentro a Tone.cpp leggo #define USE_TIMER2
Il timer2 = pin 3 e 11 e infatti il reference della tone() dice non usi pwm su 3 e 11 se usi la tone

Se usa il timer2, non ho conflitti con MS2time() che usa il timer1.
Di PWM non ne faccio uso. Ancora il dubbio perché non si può usare A0~A6 come digitali. In pratica è quello che fa Tone().

Ripeto: forse prima in setup devi definire le uscite analogiche come uscite digitali.

A titolo informativo si nota nella libreria (Tone.cpp)

void Tone::begin(uint8_t tonePin)
{
  if (_tone_pin_count < AVAILABLE_TONE_PINS)
  {
    _pin = tonePin;
8<----8<----8<----8<----8<----8<----
void Tone::play(uint16_t frequency, uint32_t duration)
{
  uint8_t prescalarbits = 0b001;
  int32_t toggle_count = 0;
  uint32_t ocr = 0;

  if (_timer >= 0)
  {
    // Set the pinMode as OUTPUT
    pinMode(_pin, OUTPUT);
8<----8<----8<----8<----8<----8<----

Si deduce che ad ogni chiamata Tone.Play(), si imposta l’uscita dichiarata come OUTPUT.
Poi ho visto una nota che su certe uscite è sconsigliato l’ uso. Forse quelle che implicano il PWM, che magari fanno uso dei timers.
A parte vari problemi, del progetto che ho in mente. Per rimanere nel topico, quali eventuali limitazioni possono influire nell’ implementare Tone() sulle dette porte.
Una domanda?
“È perché bisogna definire il nome del piedino in modo numerico ? Oppure è valido anche come Anumero ?”
Forse è citato in qualche header il #define delle porte di Arduino, correlate ai vari nomi del micro usato. Ora mi sfugge dove cercarlo.

Libreria MsTimer l'unica cosa che trovo è MSTimer2, che come dice il nome usa il timer2

ExperimentUno:
.... Una domanda?
"È perché bisogna definire il nome del piedino in modo numerico ? Oppure è valido anche come Anumero ?"
Forse è citato in qualche header il #define delle porte di Arduino, correlate ai vari nomi del micro usato. Ora mi sfugge dove cercarlo.

A0, A1, ... sono solo delle #define che comunque vengono trasformate in numero. La loro definizione si trova in "pins_arduino.h" che uno dei files del core di Arduino.

In particolare:

#define PIN_A0   (14)
#define PIN_A1   (15)
#define PIN_A2   (16)
#define PIN_A3   (17)
#define PIN_A4   (18)
#define PIN_A5   (19)
#define PIN_A6   (20)
#define PIN_A7   (21)

static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;

Guglielmo

@ gpb01
Quindi in entrambe le notazioni, numerica e alfanumerica, è ammesso ?

Poi per i timers, se il ragionamento è corretto Tone() inizia ad allocare un timer partendo da timer2, poi l' uno e poi lo zero. Questo ad ogni nuova istanza.
Credo che darò un occhio all' assembler(o listing) se ci trovo una chiamata in entrambe le funzioni( Tone e MStimer2). Al caso dovrò passare le temporizzazioni al timerOne.

ExperimentUno:
@ gpb01
Quindi in entrambe le notazioni, numerica e alfanumerica, è ammesso ?

Normalmente si ... io, ad esempio, uso quasi sempre la notazione "numerica" ... :wink:

Guglielmo

Hai ragione, perché è quella che si può usare con una variabile e calcolarla.

A parte il cercare di far suonare da quelle porte. Ma neppure un semplice impulso ogni tanto, non ne sortisce nulla.
Ho fatto la simulazione e non ho trovato nessun problema. Ho caricato lo sketch e con il reale Nano non avviene niente.
È frustrante dover trovare una soluzione, visto che alla apparenza non ci sono problemi.

Il programma fa la più semplice operazione di dare un pinMode(19, OUTPUT) e poi usare digitalWrite(19, HIGH) (o LOW) e ho collegato alla porta A5. Ma rimane in alta impedenza.

Ti conviene fare riferimento ai pin analogici con A0-A5, così con ci sono equivoci:

pinMode(A5, OUTPUT);
digitalWrite(A5, LOW);

Comunque devi ottenere il risultato, altrimenti il micro è parzialmente danneggiato.

Comincio a sospettare la seconda ipotesi.
Anche provando ad usare le operazioni dirette sui registri del micro, le uscite non cambiano di livello logico.
Esempio

void setup() {
    DDRC = 0b111111;
}
void loop() {
    PORTC = 0;
    delay(1000);
    PORTC = 0b111111;
    delay(1000);
}

Provato a misurare le uscite, ma ho visto solo un 20ina di mV, senza cambiare di livello logico.
Domani provo con l'UNO, visto che questo Nano mi ha disilluso.
Comunque sulla uscita A5, sono sicuro che l' l'ho vista funzionare, quando ho implementato ardpicprog
Al limite prenderò un Nano nuovo, che tanto costa poco più dell'ATmega328P, almeno riferito ad un clone
.
EDIT
Finalmente ho trovato la risposta. La porta è danneggiata.
Caricando lo sketch su UNO, le 6 uscite rispondono ai requisiti, ma caricato su questo Nano non va.
Quindi, scusate un po lo scompiglio, era la cosa più remota che potevo sospettare.

Ma "questo nano" è un nano vero o uno di quei cloni di cui parli poco sopra che costano "poco più del solo ATMEGA328P", quindi circa 5 euro ? ? ? ?

No, no è proprio un bel clone :slight_smile: Con tanto di piedini da saldare.
A dargli 5 € è già un disonesto chi li chiede :slight_smile:

So che potrebbe essere un rischio, ma intanto monto questo, che ho cambiato il firmware per le uscite fallaci. Se non dura, provvederò a cambiarlo.