Diferença entre ler PORT e PIN

9

Qual é a diferença entre ler PORTA e PINA? Qual a relação entre uma porta e seus pinos? Estou realmente confuso !!! amostra de leitura PORT: (o pino de leitura não é útil aqui)

Montagem f = 1MHZ ATmega8 Preciso complementar o PORTB a cada 1ms. (Dutycycle = 50%)

    LDI R16,$FF
    OUT DDRB,R16
    MAIN: LDI R16,00
    DELAY:CPI R16,200
    BREQ LOOP
    INC R16
    RJMP DELAY
    loop:IN R17,PORTB
    COM R17
    OUT PORTB,R17
    OUT R17,PORTB
    RJMP MAIN
Hanna
fonte
Devemos usar nossas bolas de cristal para descobrir qual microcontrolador (e para o código: qual linguagem de programação) você está usando?
Wouter van Ooijen
Desculpe, foi editado.
26413 Hanna
Esse é seu próprio código ou é de um exemplo? Se é um exemplo, de onde vem? Por que você diz "o alfinete de leitura não é útil aqui"?
precisa saber é o seguinte
Já testei antes no AVR studio. Você acha que no R17, o PINB está correto?
26413 Hanna

Respostas:

13

PORT é o buffer de SAÍDA, PIN é o buffer de ENTRADA.

Quando desejar definir o pino para uma tensão "alta" ou "baixa", escreva no registro PORT.

Quando você quiser saber qual a voltagem atualmente apresentada a um pino, leia o registro do PIN.

Os bits desses registradores representam os pinos correspondentes da porta de entrada / saída de uso geral.

Aqui está um esquema simplificado dos componentes eletrônicos dentro do AVR conectados a um único pino (clique aqui para obter fichas técnicas completas).

Este bloco de circuito é repetido para cada pino. Oito deles formam uma porta (porta A, por exemplo).

insira a descrição da imagem aqui

Começando na praça mais à esquerda (que representa a conexão física com o mundo externo), você pode ver três caminhos:

  1. O caminho mais superior é o resistor de pull-up selecionável por software
  2. O caminho do meio é usado quando o pino é configurado como uma saída
  3. O caminho mais baixo é usado quando o pino é configurado como uma entrada

Deve-se notar que parte ou todo esse circuito pode ser ignorado quando o pino é compartilhado com um periférico interno. Por exemplo, o conversor analógico-digital (ADC).

DrFriedParts
fonte
+1 Também vale a pena notar que, quando as portas são configuradas como entradas, gravar 1 em qualquer bit de PORT permite o resistor de pull up interno nesse pino.
Matt Young
Quando devo ler PORT?
26413 Hanna
Você leu do PIN. A leitura do PORT não fornecerá nada de útil.
Matt Young
@ usuário - A leitura do PORT fornecerá o estado dos resistores de pull-up (se o pull-up está ativado para esse pino ou não), mas, como Matt Young menciona, isso não é tão útil.
DrFriedParts
Eu adicionei uma amostra da leitura PORT
Hanna
4

Concordo com a resposta DrFriedParts completamente, no entanto, quero acrescentar que, de fato, você pode ler PORTpara descobrir se a porta / pino está configurada como SAÍDA alta ou baixa (quando DDR= 1porta / pino configurada como saída) ou se o interno o resistor de pullup está ativado (quando DDR= 0porta / pino configurada como entrada). Dessa maneira, uma porta de porta pode ser usada (de maneira bastante tola) como armazenamento geral ou para passar informações sobre o estado dos pullups de saída / entrada, como no cenário a seguir

Talvez uma parte do seu programa grave algo em portas ou ative / desative pullups, e a outra parte do programa leia PORTpara descobrir como ele está configurado. Ler PORTimediatamente após a escrita PORTnão faz sentido: depois de escrever PORT, você sabe qual é o valor PORT.

angelatlarge
fonte
Você pode me dar um código melhor? E por que no R17, o PINB não responde lá?
26713 Hanna
Não está claro na sua pergunta o que você está tentando fazer ... você pode esclarecer isso na sua pergunta: qual é o objetivo desse snippet de código? Você está apenas tentando alternar uma porta em uma determinada frequência e ciclo de serviço?
precisa saber é o seguinte
sim !!! apenas isso
Hanna
1

Para seus propósitos, a leitura do PORT realmente faz sentido: os pinos em questão são pinos de saída e você simplesmente deseja ler o último valor que escreveu, alterná-lo e escrevê-lo novamente. Então você está usando o registrador de portas como um byte de RAM observável externamente.

Por outro lado, para esse aplicativo em particular, você poderia simplesmente manter o valor em um registro e nem precisaria ler novamente o registro PORT.

microtherion
fonte
Então, por que a leitura do PIN está incorreta?
27713 Hanna
O valor que você recebe do PIN depende, em princípio, do que está anexado ao pino externamente e, em seu aplicativo em particular, você só está interessado no valor que escreveu anteriormente (Isso é, obviamente, bastante atípico de I / Pinos). Na prática, eu esperaria, no entanto, que os valores de PORT e PIN sejam idênticos aqui (você tentou?).
microtherion
Sim, eu testei antes em AVR studio.I acho que o que você disse é true.We só precisa complementar valor da porta ...
Hanna