Configuración (Arduino Pro Mini ATmega328p 16MHz, 5V, sin pin conectado):
Cuandosellamadesdesetup()
,estofunciona:
pinMode(11,INPUT_PULLUP);boolidentifiesAsFast=digitalRead(11);//alwaystrue
Estono:
constuint8_tidentificationPinBitNumber=PB3;//pin11constbyteidentificationPinBit=bit(identificationPinBitNumber);DDRB&=~identificationPinBit;PORTB|=identificationPinBit;boolidentifiesAsFast=PINB&identificationPinBit;//occasionallyfalse
Elpin11noestáconectado,pero,comopuedeverarriba,lotengomuyalto.Asíqueesperaríaquesiempretuvieraunvalorde1.
¿Quémefaltaalhacerlamanipulacióndirectadepuertos?
MesaleelcomportamientoconcuatroArduinoProMinisdiferentes.TodossonProMinisoriginales,diseñadosporSparkfun,fabricadosenlosEstadosUnidosycompradosaDigi-Key.Unadeellaslasaquéreciénsacadadelabolsaoriginal.PuedequetengaquequitareinsertareladaptadorFTDIunastreintaveces,peroeventualmentepuedoreproducirelproblema.
Agregarunademorade100msentrelaextraccióndelpin11ylalecturapareceresolverelproblema.Sinembargo,noentiendoporquéeseretrasoseríanecesario.
PB3
paraelpin11escorrecto,comoverifiquéconectandounLEDyhaciendoqueparpadee.Consultetambiéneldiagramadeasignacióndepinesquesepuedeencontrarencualquierotrositiodelaweb:
Código completo:
// Felix E. Klee <[email protected]>
const uint8_t ledPinBitNumber = PB5; // pin 13
const byte ledPinBit = bit(ledPinBitNumber);
const uint8_t identificationPinBitNumber = PB3; // pin 11
const byte identificationPinBit = bit(identificationPinBitNumber);
unsigned long delayDuration; // ms
void turnLedOn() {
PORTB |= ledPinBit;
}
void turnLedOff() {
PORTB &= ~ledPinBit;
}
void setDelayDuration() {
#if 0
pinMode(11, INPUT_PULLUP);
bool identifiesAsFast = digitalRead(11); // always true
#else
// Input pullup:
DDRB &= ~identificationPinBit;
PORTB |= identificationPinBit;
bool identifiesAsFast = PINB & identificationPinBit; // occasionally false
#endif
delayDuration = identifiesAsFast ? 300 : 3000;
}
void setup() {
DDRB |= ledPinBit; // Set up LED pin for output
setDelayDuration();
}
void loop() {
turnLedOn();
delay(delayDuration);
turnLedOff();
delay(delayDuration);
}