Differenza tra lettura PORT e PIN


9

Qual è la differenza tra leggere PORTA e PINA? Qual è la relazione tra una porta e i suoi pin? Sono davvero confuso !!! esempio di lettura PORT: (qui il pin di lettura non è utile)

Assemblaggio f = 1MHZ ATmega8 Ho bisogno di integrare PORTB ogni 1 ms. (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

Dovremmo usare le nostre sfere di cristallo per scoprire quale microcontrollore (e per il codice: quale linguaggio di programmazione) stai usando ??
Wouter van Ooijen,

Scusa se è stato modificato.
Hanna,

È questo il tuo codice o proviene da un esempio? Se è un esempio, da dove viene? Perché dici "qui il pin di lettura non è utile"?
angelatlarge,

L'ho già provato in AVR studio. Pensi che in R17 il PINB sia corretto?
Hanna,

Risposte:


13

PORT è il buffer OUTPUT, PIN è il buffer INPUT.

Quando si desidera impostare il pin su una tensione "alta" o "bassa", scrivere nel registro PORT.

Quando vuoi sapere quale tensione è attualmente presentata a un pin, leggi il registro PIN.

I bit di questi registri rappresentano i pin corrispondenti della porta di input / output per scopi generici.

Ecco uno schema semplificato dell'elettronica all'interno dell'AVR collegato a un singolo pin (vai qui per i fogli dati completi).

Questo blocco di circuito viene ripetuto per ciascun pin. Otto di questi formano una porta (porta A, ad esempio).

inserisci qui la descrizione dell'immagine

Partendo dal quadrato più a sinistra (che rappresenta la connessione fisica con il mondo esterno), puoi vedere tre percorsi:

  1. Il percorso più in alto è il resistore pull-up selezionabile dal software
  2. Il percorso intermedio viene utilizzato quando il pin è configurato come output
  3. Il percorso più basso viene utilizzato quando il pin è configurato come input

Va notato che alcuni o tutti questi circuiti possono essere bypassati quando il pin è condiviso con una periferica interna. Ad esempio, il convertitore da analogico a digitale (ADC).


+1 Vale anche la pena notare che quando le porte sono configurate come ingressi, scrivere 1 su qualsiasi bit di PORT abilita la resistenza di pull up interna su quel pin.
Matt Young,

Quando dovrei leggere PORT?
Hanna,

Hai letto dal PIN. Leggere da PORT non ti darà nulla di utile.
Matt Young,

@utente - La lettura da PORT ti fornirà lo stato dei resistori di pull-up (sia che il pull-up sia abilitato per quel pin o meno), ma come menziona Matt Young, non è poi così utile.
DrFriedParts,

Ho aggiunto un campione di lettura PORT
Hanna,

4

Sono d'accordo con la risposta DrFriedParts completamente, tuttavia, voglio aggiungere che, puoi davvero leggere PORTper scoprire se la porta / pin è configurata come OUTPUT alta o bassa (quando DDR= 1, porta / pin configurata come uscita) o se l'interno la resistenza pullup è attivata (quando DDR= 0, porta / pin configurati come input). In questo modo una porta può essere utilizzata (in modo piuttosto stupido) come memoria generale o per passare informazioni sullo stato dei pullup di output / input, come nel seguente scenario

Forse una parte del programma scrive qualcosa sulle porte o attiva / disattiva i pullup e l'altra parte del programma legge PORTper scoprire come è configurata. Leggere PORTsubito dopo aver scritto PORTnon ha senso: dopo aver scritto PORT, sai qual è il valore di PORT.


Potete darmi un codice migliore? E perché in R17, PINB non risponde lì?
Hanna,

Dalla tua domanda non è chiaro cosa stai cercando di fare ... puoi chiarirlo nella tua domanda: qual è l'obiettivo di questo frammento di codice? Stai solo cercando di abilitare / disabilitare una porta per una particolare frequenza e ciclo di lavoro?
angelatlarge,

sì !!! proprio questo
Hanna,

1

Per i tuoi scopi, la lettura da PORT ha effettivamente senso: i pin in questione sono pin di output e vuoi semplicemente leggere l'ultimo valore che hai scritto, attivarlo e riscriverlo. Quindi stai usando il registro delle porte come byte di RAM osservabile esternamente.

D'altra parte, per questa particolare app, potresti semplicemente mantenere il valore in un registro e non dovresti nemmeno rileggere il registro PORT.


Quindi perché leggere il PIN non è corretto?
Hanna,

Il valore che ricevi dal PIN dipende, in linea di principio, da ciò che è attaccato esternamente al pin e, nella tua particolare applicazione, sei interessato solo al valore che hai scritto in precedenza (Questo, ovviamente, è piuttosto atipico di I / O pin). In pratica, tuttavia, mi aspetto che i valori di PORT e PIN siano identici qui (l'hai provato?).
microtherion,

Sì, l'ho già provato in AVR Studio. Penso che quello che hai detto sia vero. Dobbiamo solo integrare il valore della porta ...
Hanna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.