Página 1 de 1
Supervisão de pino

Enviado:
09 Ago 2007 17:58
por Nik
Olá pessoal,
Estou com uma dúvida aqui: Num projeto que eu fiz, o nível de um pino deveria descer e depois subir, gerando alguns pulsos. Mas às vezes ocorre que ele desce e não sobe mais, o que causa muitos problemas. É destinado a acionar um servo-motor, e por causa disso o bicho não roda.
Questão: Pensei em supervisionar o pino por ele mesmo, ou seja, toda vez que ele for comandado para mudar de estado, fazer a leitura do pino, e caso não esteja correto, comandar novamente até ele chegar no nível certo. Isso é POSSÍVEL? Quando eu fizer a leitura, ele não vira um input e entra em alta-impedância?
Valeu

Enviado:
09 Ago 2007 19:00
por brasilma
Olá Nik,
Depende da instrução que for utilizada, isto porque as portas dos '51 possuem em sua estrutura, um latch que aciona posteriormente o transistor de saída.
Então algumas instruções trabalham com o conteúdo de saída deste latch e outras com o valor presente no pino.
Isto ocorre pois caso vc tenha um transitor na configuração emissor comum (emissor ligado ao GND) conectado a um pino, e escreva nessa saída "1", e posteriormente tente lê-la, veria um "0", para evitar isso o controlador lê a saída do latch que está acionando o transistor de saída do processador.
Para verificar isto faça um teste simples, escreva um "1" em um pino que esteja com um pull-down externo, e depois tente lê-lo com um mov e na sequencia execute uma operação lógica com ele e compare os resultados.
Abraços,
MArcos.

Enviado:
10 Ago 2007 09:45
por Nik
Valeu Marcos,
Fiz o teste aqui e realmente funciona, porém vi na descrição do hardware que o teste tem que ser feito com a instrução jnb ou jb, que fazem a leitura do pino, e não do latch.
Para testar, fiz o seguinte:
setb P1.3
jnb P1.3,$-1
e
clr P1.3
jb P1.3,$-1
E tudo rodou legal. Para confirmar se o teste é válido, inverti a condição de teste:
setb P1.3
jb P1.3,$-1
e
clr P1.3
jnb P1.3,$-1
Nesse caso a rotina ficava presa nesse ponto, pois verificava que a condição era contrária ao valor do pino e voltava a testar.
Agora vou fazer uns testes estressantes para confirmar se o problema realmente desapareceu o posto os resultados.
Abraços

Enviado:
16 Ago 2007 09:58
por Nik
Pois é pessoal,
Estou aqui novamente para dar um retorno sobre o problema. Infelizmente as soluções adotadas de nada adiantaram, e o problema persiste, o seja, o pino que deveria ir para nível alto, não vai, mesmo eu tendo criado um loop, após o comando de setar o pino, que lê o valor e retorna ao comando caso esteja com valor errado.
Não entendo como esse problema pode continuar a ocorrer....

Enviado:
16 Ago 2007 10:37
por brasilma
Olá Nik,
Quando a coisa é assim "macabra" o problema pode ser outro.
Faça uma rotina o mais simples possivel e de preferência em assembler para testar (se já não estiver fazendo);
Lembrar que a capacidade de fornecer corrente "1" dos controladores é "miserável" = 60uA (portas 1,2,3) e 800uA (porta 0) , já em sorver "0" 1,6mA (portas 1, 2, 3) e 3,2mA (porta 0).
Abraços,
MArcos.