[Risolto] Funzionamento encoder su Atmega 1284 su breadboard

Buonasera,

Sto costruendo una radio con RDA5807A e lcd 40 x 4 e dopo aver scritto e testato il codice su Arduino UNO, lo ho trasferito su un 1284: si tratta di un kit(comprensivo di quarzo, resistenze, condensatori ed anche un 7805 per alimentarlo) trovato su Amazon con già caricato il bootloader(magari fa a pugni con l’IDE 1.8.13 portable che uso).

Con sottomano il pinout, ho collegato il tutto ai singoli pin, funziona tutto tranne l’encoder che ho usato per la sintonia; non incrementa o decrementa il valore associato.
A questo punto ho caricato solo il codice relativo all’ encoder temendo conflitti, ma continua a non funzionare: il codice è questo

/***********************************************************
  File name: _16_RotaryEncoderModule.ino
  Description: The information of rotary encoder module has been
             detected by UNO R3,and displayed in the serial monitor
             When the rotary encoder turns clockwise, the angular
             displacement is increased;when it turns counterclockwise,
             it’s decreased.If you press the switch on the rotary
             encoder, related readings will return to zero
  Website: www.adeept.com
  E-mail: support@adeept.com
  Author: Tom
  Date: 2016/06/15
***********************************************************/

#define APin 2 //Set the digital 2 to A pin
#define BPin 3 //Set the digital 3 to B pin
#define Prova 14
volatile int lastEncoded = 0;
volatile long encoderValue = 8700;
long lastencoderValue = 0;
float frequency;

int lastMSB = 0;
int lastLSB = 0;

void setup()
{
  
  pinMode(APin, INPUT_PULLUP);//initialize the A pin as input
  pinMode(BPin, INPUT_PULLUP);//initialize the B pin as input
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
  pinMode(Prova, INPUT_PULLUP);

  Serial.begin(9600); //opens serial port, sets data rate to 9600 bps

}

void loop()
{

  Serial.println(encoderValue);


  frequency = encoderValue / 100;

  if (frequency < 87.00) frequency = 87.00;
  if (frequency > 108.00) frequency = 108.00;
  delay(1000);
  //Serial.println(frequency);
 
}

void updateEncoder() {
  int MSB = digitalRead(APin); //MSB = most significant bit
  int LSB = digitalRead(BPin); //LSB = least significant bit
  int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
  if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
  lastEncoded = encoded; //store this value for next time
  Serial.println(APin);
  Serial.println(BPin);
  Serial.println(sum);
}

Come prova del 9 ho collegato gli stessi encoder e caricato lo stesso codice su un arduino UNO ed ha funzionato; il modello di encoder non dovrebbe essere rilevante, perchè ho provato sia il classico a 20 scatti + pulsante che si trova comunemente, sia altri prelevati da componenti di ascensori(già ultilizzati con successo in altri progetti definitivi); inoltre ho indagato il file pins_arduino.h presente nel core dell’IDE per verificare il pinout e confermo che gli interrupt INT0 e INT1 (che su arduino sono sul D2 e D3) sono sui pin fisici 16 e 17 corrispodenti a D10 e D11.

Prima di caricare lo sketch in questione, ho provato i collegamenti caricando altri programmi, dal semplice Blink, esempi da librerie, ad uno scritto ad hoc, che impiega un BME 280 ed un lcd 40 x 4 per visualizzare i valori: pertanto il resto dei pin (I2C, seriali, analogici, ecc.) sembrano funzionare.

Quindi sono arrivato qui per vedere se qualcuno ha già avuto questo specifico problema, perchè cercando in rete non sono riuscito a trovare qualcosa di utile.

Da ultimo, per poter caricare gli sketch , sono andato sul sito https://lauszus.com/Sanguino e sul gitHub
ho trovato il collegamento da inserire nelle preferenze per trovare nel gestore di schede la board Sanguino ed i relativi processori: https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json

Per adesso ringrazio in anticipo e spero di non aver scritto castronerie ed aver inserito correttamente il codice; se servono altre informazioni chiedete e vedrò di fornirle.

Saluti

Lo sai, vero, che se usi i classici encoder "a scatti" ti serve un solo interrupt e due sole istruzioni nella ISR ? ... tutta quella roba serve per gli encoder "free-running", senza scatti ... :wink:

A parte quello, sembrera' banale chiederlo, ma hai messo le resistenze di pullup (o pulldown, dipende come hai collegato il tuo encoder) sui due ingressi ?

Etemenanki:
Lo sai, vero, che se usi i classici encoder "a scatti" ti serve un solo interrupt e due sole istruzioni nella ISR ? ... tutta quella roba serve per gli encoder "free-running", senza scatti ... :wink:

A parte quello, sembrera' banale chiederlo, ma hai messo le resistenze di pullup (o pulldown, dipende come hai collegato il tuo encoder) sui due ingressi ?

Rapidissimo.. grazie..

Allora per quanto riguarda il codice ho tenuto questo perchè, come hai detto, uso anche encoder più "professionali" e funziona anche con quelli a scatti, mentre per le resistenze ho attivato quelle di pullup interne con INPUT_PULLUP nella dichiarazione dei pin.

Ho provato altri esempi di codice per encoder, alcuni non usano gli interrupt altri delle librerie, ma i valori non riuscivano a stare dietro alla rotazione dell'albero se azionato velocemente.

Non funziona perchè stai usando i pin 2 e 3 come interrupt esterni 0 e 1, ma questa associazione vale solo per l' ATMega328, non per il 1284. Stando al pinout per usare gli interrupte 0 e 1 dovresti usare i pin 10 e 11, corrispondenti ai pin fisici dell'integrato 16 e 17.

Ciao, Ale.

ilguargua:
Non funziona perchè stai usando i pin 2 e 3 come interrupt esterni 0 e 1, ma questa associazione vale solo per l' ATMega328, non per il 1284. Stando al pinout per usare gli interrupte 0 e 1 dovresti usare i pin 10 e 11, corrispondenti ai pin fisici dell'integrato 16 e 17.

Ciao, Ale.

Già considerato; lo avevo indicato nel messaggio, nel paragrafo dopo il codice.
Le cose più ovvie dovrei averle già controllate, ma stasera ricontrollo.
Non è l'unico 1284 che ho, magari ne provo uno senza bootloader e dopo un ripasso della materia, glielo carico io o lo programmo direttamente

Saluti

Già considerato; lo avevo indicato nel messaggio, nel paragrafo dopo il codice.

Hai ragione, scusa, ho letto solo il codice e li sono indicati i pin 2 e 3.

Non è l'unico 1284 che ho, magari ne provo uno senza bootloader

Provare non nuoce, ma non credo stia li l'inghippo, dovrebbe essere una cosa più legata all'hardware fisico che non al software.

Ciao, Ale.

ilguargua:
Hai ragione, scusa, ho letto solo il codice e li sono indicati i pin 2 e 3.

Provare non nuoce, ma non credo stia li l'inghippo, dovrebbe essere una cosa più legata all'hardware fisico che non al software.

Ciao, Ale.

Quando uno dice di aver controllato le cose più ovvie, non credetegli.

Avevo si controllato tutti i collegamenti ed il codice ma, nella definizione dei pin in testa al listato, erano rimasti i valori 2 e 3 contro 10 e 11, quindi Ale, avevi comunque ragione, grazie per avermici fatto pensare.
Ci sarei dovuto arrivare da solo quando il display, collegato sui pin da 0 a 7, faceva cose strane quando muovevo l'encoder.

Grazie a tutti e scusatemi per il tempo perso dietro a questa banalità

Saluti