Mudar função (in e output) de um pino em tempo de execução

Olá jovens, boa.

Gostaria de saber como mudar um determinado pino do Arduino de entrada para saída no meio do código, sem ser na void setup...
Estou com um projeto e o fato de eu não conseguir mudar isso fez com que eu tivesse que triplicar o número de pinos usados...
Eu vi um post dizendo que tinha como fazer, mas não sei como.
Tentei simplesmente declarar a pinMode no meio do código, mas não deu certo, as leituras de input ficam loucas '-'...
Se precisar ser mais específico, estou usando um MEGA.
Quem souber, por favor, vai ajudar muito mesmo.

pinMode(pino, OUTPUT);

//para mudar de novo... 

pinMode(pino, INPUT);

bubulindo:

pinMode(pino, OUTPUT);

//para mudar de novo...

pinMode(pino, INPUT);

Olhe só jovem, foi isso que eu fiz, mas deu errado T-T
Como eu falei
A escrita de out funciona
Mas a leitura de in fica doida

Antes de mais, eu não sou jovem e não gosto dessa maneira de tratar alguém, principalmente tendo em conta quem é que está a dar conselhos aqui...

Vens aqui, fazes uma questão especifica, recebes a resposta correcta para essa pergunta e nem sequer percebes que faltam dois pedaços de informação.

Um deles é o código que estás a correr... Se não podes mostrar o código no fórum então é porque o projecto é para aulas (e nesse caso tens um professor para responder), se for por causa de algum segredo empresarial, eu cobro para dar conselhos.

O outro problema é que aparte de alguns protocolos muito especificos (como 1-Wire ou I2C), é bastante raro usar o mesmo pino para entrada e saída... e o motivo é que o que normalmente ligas a uma entrada não dá bem com o que normalmente ligas a uma saída.

Então o que é que tens ligado nesses pinos para usares como entrada e saída?
Já agora, e em antecipação à resposta que vais dar, que é que sabes de electricidade?

bubulindo:
Antes de mais, eu não sou jovem e não gosto dessa maneira de tratar alguém, principalmente tendo em conta quem é que está a dar conselhos aqui...

Vens aqui, fazes uma questão especifica, recebes a resposta correcta para essa pergunta e nem sequer percebes que faltam dois pedaços de informação.

Um deles é o código que estás a correr... Se não podes mostrar o código no fórum então é porque o projecto é para aulas (e nesse caso tens um professor para responder), se for por causa de algum segredo empresarial, eu cobro para dar conselhos.

O outro problema é que aparte de alguns protocolos muito especificos (como 1-Wire ou I2C), é bastante raro usar o mesmo pino para entrada e saída... e o motivo é que o que normalmente ligas a uma entrada não dá bem com o que normalmente ligas a uma saída.

Então o que é que tens ligado nesses pinos para usares como entrada e saída?
Já agora, e em antecipação à resposta que vais dar, que é que sabes de electricidade?

Me desculpe, não queria desrespeitar.

Basicamente eu queria fazer um pequeno testador de Gates lógicos. Nada empresarial, nem tenho empresa nem nada, só hobbie. Eu queria colocar, por exemplo, todas as combinações possíveis na entrada de um NAND (7400) e testar se a saída está correta. Acontece que, caso eu fosse testar um NOR (7402) por exemplo, a pinagem dele é diferente. No 7400 é 1 entrada, 2 entrada, 3 saída, e assim vai. No 7402 é 1 saída, 2 entrada, 3 entrada. Então eu precisaria mudar a função de um pino de entrada para saída ao longo do código, a depender do CI a ser testado. Eu testei declarar a pinMode em funções auxiliares, e as outs estavam até certas, mas as ins estavam instáveis e erradas. Eu "corrigi" o problema usando buffers, mas daí aumentei o número de pinos de arduino para pinos do CI que eu preciso usar de 1 para 3. Eu não estou no computador no momento, não estou com o código completo, mas acho que deu pra entender.

Respondendo às outras perguntas: eu sou estudante do Instituto Federal da Bahia, faço curso técnico em eletrônica e ensino médio. Estou no 3° ano /4. Eu tenho matéria de eletrônica digital, que envolve só esses Gates lógicos e coisas tipo os buffers e somadores. O projeto não é da matéria, é que eu fiquei chateado depois de montar um circuito grande na protoboard pra testar e descobrir depois que um dos CIs estava ruim, mesmo eu tendo testado ele com algumas combinações antes de usar. Acontece que eu ainda não tenho matéria de microcontroladores ou microprocessadores, logo, não tenho um professor a quem perguntar...

No que diz respeito aos protocolos especiais, eu ainda sou iniciante e não conheço-os.

Bom, acho que é só.

Mais uma vez, desculpe por te chamar de jovem. Sou novo no fórum e não pensei que fosse ofender alguém só por isso.
Obrigado pela atenção :slight_smile:

Sem ver o código e as ligações não posso dizer muito mais.

Como estás a ligar? Não precisarás dum pull up nalgum lado?

Eu diria que se não tens os pinos ligados poderias ter um programa de teste sem teres de mudar a direcção dos pinos e apenas mudando as ligações. No entanto se já tens hardware montado como uma ZIF socket, então não é fácil.

Mas sinceramente, acho que só vendo o código para perceber o que estarás a fazer mal.

bubulindo:
Sem ver o código e as ligações não posso dizer muito mais.

Como estás a ligar? Não precisarás dum pull up nalgum lado?

Eu diria que se não tens os pinos ligados poderias ter um programa de teste sem teres de mudar a direcção dos pinos e apenas mudando as ligações. No entanto se já tens hardware montado como uma ZIF socket, então não é fácil.

Mas sinceramente, acho que só vendo o código para perceber o que estarás a fazer mal.

//Esses são os pinos que vão no CI, em ordem
#define pino1 3
#define pino2 4
#define pino3 5

//Os botões vão selecionar qual CI vai ser testado
#define botao1 6
#define botao2 7

//Leds que vão indicar se está tudo ok ou não
#define verde 8
#define vermelho 9

//Protótipo das funções dos testes
void NAND();
void NOR();

//Variáveis de seleção
int a = 0;
int b = 0;

//Variável de armazenamento de saída
int s = 0;

void setup() {
 //Os botões ficam como entrada
 pinMode(botao1, INPUT);
 pinMode(botao2, INPUT);

 //Os LEDs ficam como saída
 pinMode(verde, OUTPUT);
 pinMode(vermelho, OUTPUT);

}

void loop() {
 //Lê os botões e seleciona qual CI será testado
 a = digitalRead(botao1);
 b = digitalRead(botao2);
 if (a == 1) {
   NAND();
 }
 if (b == 1) {
   NOR();
 }
 delay(10); 
}

void NAND () {
 //Aqui eu defino se o pino é saída ou entrada, e é aqui que está o problema
 //No NAND, como eu já disse, o 7400 é (no CI) entrada entrada saída
 //Já no NOR, 7402, é saída entrada entrada
 //O que é entrada no CI tem que ser saída no arduino, e vice-versa
 pinMode(pino1, OUTPUT);
 pinMode(pino2, OUTPUT);
 pinMode(pino3, INPUT);

 //Não vou colocar todas as possibilidades dos gates pq eu reescrevi só para colocar no forum mesmo
 digitalWrite(pino1, HIGH);
 digitalWrite(pino2, LOW);
 delayMicroseconds(10);
 s = digitalRead(pino3);
 if (s == 1) {
   digitalWrite(verde, HIGH);
   delay(1000);
   digitalWrite(verde, LOW);
 }
 else {
   digitalWrite(vermelho, HIGH);
   delay(1000);
   digitalWrite(vermelho, LOW);
 }
 
}

void NOR () {
 //Aqui está o problema: na primeira vez que eu seto pode até funcionar,
 //mas quando mudo para outro gate, por exemplo, se eu testei
 //o NAND e agora testo o NOR, a leitura de in fica instável
 pinMode(pino1, INPUT);
 pinMode(pino2, OUTPUT);
 pinMode(pino3, OUTPUT);
 
 digitalWrite(pino2, HIGH);
 digitalWrite(pino3, LOW);
 delayMicroseconds(10);
 s = digitalRead(pino1);
 //Checa se a saída condiz com a tabela verdade do gate
 if (s == 0) {
   digitalWrite(verde, HIGH);
   delay(1000);
   digitalWrite(verde, LOW);
 }
 else {
   digitalWrite(vermelho, HIGH);
   delay(1000);
   digitalWrite(vermelho, LOW);
 }
 
}

Activa os pull ups nos botões...

Coloca um serial print dentro de cada função antes de iniciar e vê se as funções não estão a ser chamadas à sorte.

Na selecção das funções coloca que um botão tem de ser pressionado e o outro não como condições.

bubulindo:
Activa os pull ups nos botões...

Coloca um serial print dentro de cada função antes de iniciar e vê se as funções não estão a ser chamadas à sorte.

Na selecção das funções coloca que um botão tem de ser pressionado e o outro não como condições.

Olhe só, o problema não está aí.
Eu não mandei o código que estou a usar agora pelo simples motivo de que ele não tem nada com o meu problema...
Eu, originalmente, fiz as coisas por controle remoto, aproveitei que estava querendo entender como aquela coisa funcionava, usei um display ao invés de LEDs, etc. Eu ainda sou iniciante, e como não tenho muito tempo, gosto de aprender a usar logo tudo de uma vez...
Botões são para depois, não fiz com eles também porque só tenho 4, e eu precisaria de 16, e no meu kit arduino veio um controle infravermelho...
Como eu disse, não é que seja aquele problema gigante, eu consegui contorná-lo utilizando buffers, e consigo com isso [e com um MEGA] ler um CI de até 16 pinos de boa, mas eu realmente fiquei querendo saber o porquê de meu in estar louco, já que eu vi lugares dizendo a mesma coisa que você falou na sua primeira resposta: é só declarar o pinMode em qualquer lugar do código.
Eu vou fazer mais testes aqui, e eu usei o monitor serial e tudo mais, como eu disse, esse código aí em cima eu escrevi só pra entender o meu problema, mas novamente, valeu a atenção :slight_smile:

Vou testar mais e mais aqui pra ver se descubro o problema...