Pin analogici 6 e 7 Atmega**8 TQFP

Ciao ragazzi, i pin analogici 6 e 7 che stanno sugli Atmega in package TQFP sono previsti dall'IDE? Non mi serve usarli come digitali quindi userò la funzione analogRead(). Sto disegnando un pcb e non vorrei buttarlo. Grazie a tutti

Dai un occhio al mini, li vengono usati :)

A prescindere dal fatto che l'IDE li gestisca o meno (non mi ricordo, devo controllare sul file pins_arduino) puoi accederci manipolando direttamente i registri delle porte, ossia usando DDRC, PORTC e PINC per impostare i pin come input o output e per leggere/scrivere lo stato dei pin. ;)

ratto93: Dai un occhio al mini, li vengono usati :)

Ho controllato i file, sono presenti sulla schedina ma non sono mappati internamente nel core, né nella versione 002x dell'IDE né nella 1.0. La loro definizione non porta ad errori perché le costanti A6 e A7 sono definite ma non so come poi vengano processate dal compilatore. Se guardi il file pin_arduino vedi infatti che le mappature dei pin arrivano fino a 18 (A5).

leo72:
Ho controllato i file, sono presenti sulla schedina ma non sono mappati internamente nel core, né nella versione 002x dell’IDE né nella 1.0. La loro definizione non porta ad errori perché le costanti A6 e A7 sono definite ma non so come poi vengano processate dal compilatore. Se guardi il file pin_arduino vedi infatti che le mappature dei pin arrivano fino a 18 (A5).

Ho trovato una discussione sul vecchio forum dove l’utente Coding Badly ha dato un indizio:

The code of interest is in…
{YourArduinoDirectory}\hardware\arduino\cores\arduino\wiring_analog.c

It looks like ADC6 and ADC7 should work. The first line of code…

ADMUX = (analog_reference << 6) | (pin & 0x07);

…sets the input channel based on the pin. Six and seven will pass safely through the expression so ADMUX should be properly set. The datasheet doesn’t mention anything special that needs to be done to select channels 6 or 7. The rest of the code starts a conversion, waits for the conversion, and returns the result…

sbi(ADCSRA, ADSC);
while (bit_is_set(ADCSRA, ADSC));
low = ADCL;
high = ADCH;
return (high << 8) | low;

I can’t see any reason that it wouldn’t work.

Continuo ad indagare, al limite faccio una prova su un pcb almeno ci leviamo sto dubbio senza tanti sbattimenti (ci penso io a quelli).
Visto che devo fare il pcb per programmarlo ci metto anche un potenziometro da 10K sul pin 7 e predispongo anche i pin della seriale; carico uno sketch che legge quel pin e mi spedisce i valori via seriale, con un 2009 vedo che valori mi manda. Se i pin funzionano dovrei ricevere valori da 0 a 1023.
So che è “la strada dell’orto”…

Fare l'ortolano può anche essere piacevole, basta che stai attento a dove pianti i cetrioli :D

[quote author=Michele Menniti link=topic=106280.msg797525#msg797525 date=1337292300] Fare l'ortolano può anche essere piacevole, basta che stai attento a dove pianti i cetrioli :D [/quote] :) C'è da fare molta più attenzione se coltivi i trisunghi, se ci cadi sopra te lo ricordi finchè campi

trisunghi?? che roba è?

e metti il link alla discussione, tnx

Pelletta: [quote author=Michele Menniti link=topic=106280.msg797525#msg797525 date=1337292300] Fare l'ortolano può anche essere piacevole, basta che stai attento a dove pianti i cetrioli :D

:) C'è da fare molta più attenzione se coltivi i trisunghi, se ci cadi sopra te lo ricordi finchè campi [/quote] Non so nemmeno io cosa sono, so di certo che non vorrei mai cadere su un cetriolo, penso che anche questa sarebbe un'esperienza indimenticabile :fearful:

Come ho detto anche io:

leo72:
Ho controllato i file, sono presenti sulla schedina ma non sono mappati internamente nel core, né nella versione 002x dell’IDE né nella 1.0. La loro definizione non porta ad errori perché le costanti A6 e A7 sono definite ma non so come poi vengano processate dal compilatore. Se guardi il file pin_arduino vedi infatti che le mappature dei pin arrivano fino a 18 (A5).

A6 e A7 li puoi usare perché sono costanti che Arduino predefinisce.
Però il codice che converte il numero di pin nell’effettivo piedino si ferma ad A5. Quindi per usare A6 e A7 la via breve è proprio DDRx/PORTx.

Esempio: pin A6 in output, segnale HIGH
DDRC |= (1<<A6)
PORTC |= (1<<A6)

leo, tu parli di segnali digitali, Pelletta vuole valori analogici

Pelletta:
Ciao ragazzi, i pin analogici 6 e 7 che stanno sugli Atmega in package TQFP sono previsti dall’IDE?
Non mi serve usarli come digitali quindi userò la funzione analogRead().

Il pin A6 e A7 sono definiti in pins_arduino. in /variants/mega

const static uint8_t A6 = 60;
const static uint8_t A7 = 61;

La funzione alalogRead è definita in Arduino.h, il codice è in wiring_analog.c

int analogRead(uint8_t pin)
{
	uint8_t low, high;

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif
	
#if defined(__AVR_ATmega32U4__)
	pin = analogPinToChannel(pin);
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#elif defined(ADCSRB) && defined(MUX5)
	// the MUX5 bit of ADCSRB selects whether we're reading from channels
	// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
  
	// set the analog reference (high two bits of ADMUX) and select the
	// channel (low 4 bits).  this also sets ADLAR (left-adjust result)
	// to 0 (the default).
#if defined(ADMUX)
	ADMUX = (analog_reference << 6) | (pin & 0x07);
#endif

	// without a delay, we seem to read from the wrong channel
	//delay(1);

#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

	// we have to read ADCL first; doing so locks both ADCL
	// and ADCH until ADCH is read.  reading ADCL second would
	// cause the results of each conversion to be discarded,
	// as ADCL and ADCH would be locked when it completed.
	low  = ADCL;
	high = ADCH;
#else
	// we dont have an ADC, return 0
	low  = 0;
	high = 0;
#endif

	// combine the two bytes
	return (high << 8) | low;
}

lesto: leo, tu parli di segnali digitali, Pelletta vuole valori analogici

Sì ma non cambia nulla. Intendevo dire che A6 e A7 sono accettati perché definiti in wiring.h ma la gestione di quei pin non possono essere fatte con le funzioni digitalQualcosa o analogQualcosa perché le tabelle di conversione da pin a bit del registro non arrivano, sugli Atmega328, a contemplare quei pin ma solo fino a A5.

Il codice di Coding Badly è la routine di lettura dell'ADC che già fa la funzione analogRead. A parte ciò, Bud, vuoi semplificarti la vita? Edita il file pins_arduino.c presente in /hardware/arduino/cores/arduino ed aggiungi gli elementi mancanti agli array che mappano i pin. Così non devi inventarti la ruota per gestire quei pin :P

leo72:
…perché le tabelle di conversione da pin a bit del registro non arrivano, sugli Atmega328, a contemplare quei pin ma solo fino a A5.

@Pelletta
Stai parlando dell’Atmega328 o dell’Atmega2560?
Perché nel 2560 i pin 6 e 7 analogici ci sono.

Prova col file allegato (va per l’IDE 0022).

pins_arduino.c (11.7 KB)

Grazie Leo, appena mi arrivano i 328 provo e faccio sapere come è andata.

@lesto e menniti: per quanto riguarda i trisunghi posso solo dire che sono un metro lunghi... vi ho fatto una coglionella, ci cascano sempre tutti :sweat_smile:

Pelletta: per quanto riguarda i trisunghi posso solo dire che sono un metro lunghi... vi ho fatto una coglionella, ci cascano sempre tutti :sweat_smile:

E' tipo la sbiriguda.