Γειά σου CITRO, υποθέτω πως η ερώτησή σου είναι:
Στο datasheet του PICxyz αναφέρει τα registers TRIS PORT και LAT που αφορούν τα I/O ports. Δεν καταλαβαίνω την διαφορά τους. Αν θέλω να δώσω τιμή και να διαβάσω σε ποιούς απευθύνομαι και γιατί; <
Σε datasheet της σειράς PIC18xyz γράφει:
I/O PORTS
There are up to three ports available. Some pins of the I/O ports are multiplexed with an alternate function from the peripheral features on the device. In general, when
a peripheral is enabled, that pin may not be used as a general purpose I/O pin.
Each port has three registers for its operation. These registers are:
• TRIS register (data direction register)
• PORT register (reads the levels on the pins of the device)
• LAT register (output latch)
The PORTA Data Latch (LATA register) is useful for read-modify-write operations on the value that the I/O pins are driving.
Που σημαίνει ότι τα 3 ports (PORTA, PORTB, PORTC) έχουν δυνατότητες εισόδου και εξόδου οι οποίες δηλώνονται στα TRISA, TRISB και TRISC αντίστοιχα. To bit=1 σημαίνει είσοδος και το bit=0 έξοδος. Το παρακάτω παράδειγμα δηλώνει τα pins Α7, Α6, Α5, Α4 ως εισόδους και τα A3, A2, A1, A0 ως εξόδους.
Κώδικας:
movlw b'11110000'
movwf TRISA
Η κατάσταση των I/O καταχωρείται στα PORTx και στους νεώτερους PIC και στα LATx. Οι registers LATx δημιουργήθηκαν για να διορθώσουν μία 'ασάφεια' όταν διάβαζες το PORTx για να δεις (θυμηθείς) τι είχες γράψει στο pin εξόδου ή τα λάθη που συνέβαιναν αν έκανες διάβασμα-αλλαγή-γράψιμο στην ίδια πόρτα.
Λ.χ. στο παράδειγμα μας δίνεις έξοδο LOW και στα 4 pins εξόδου (Α0,1,2,3) και σε άλλο σημείο του προγράμματος θέλεις να 'θυμηθείς' αν είχες δώσει HIGH ή LOW στην έξοδo A2:
Κώδικας:
clrf PORTA
; -------------------------------------- ή εναλλακτικά
movlw b'00000000'
movwf PORTA
;
; -------------------------------------- σε άλλο σημείο ελέγχουμε την
; -------------------------------------- κατάσταση της εξόδου A2
;
movfw PORTA ; <<< 'κακή' μέθοδος με πιθανότητα ασάφειας
andlw b'00000100'
skpnz
goto A2wasHIGH
goto A2wasLOW
; -------------------------------------- ή
btfsc PORTA,2 ; <<< 'κακή' μέθοδος με πιθανότητα ασάφειας
goto A2wasHIGH
goto A2wasLOW
; -------------------------------------- ή
movfw LATA ; <<< 'ασφαλής' μέθοδος
andlw b'00000100'
skpnz
goto A2wasHIGH
goto A2wasLOW
; -------------------------------------- ή
btfsc LATA,2 ; <<< 'ασφαλής' μέθοδος
goto A2wasHIGH
goto A2wasLOW
Οταν καθορίζεις την κατάσταση των εξόδων είναι 'ασφαλές' το να γράψεις σε όλη την πόρτα (movwf PORTA) παρά να κάνεις bit set/reset (bsf PORTA,2). Στην περίπτωση του LATA είναι εντάξει και οι δύο μέθοδοι (movwf LATA ή bsf LATA,2).
Φιλικά,
Γιώργος