PIC16F877A codice asm I2C per 24C256 E2PROM

PIC16F877A ha una interfaccia hardware IIC, si shoule set relativo registro in ordine, o si utilizza il codice bleow: (lavoro in 4MHZ)

;
;************************************************* ************************; Page3 (600-6FF)
;
; Page3 (600-6FF)
;; Page3 (600-6FF)
;************************************************* ****************************; Page3 (600-6FF)
; ** Due wire/I2C Bus READ / WRITE di routine di Microchip; pagina3 (600-6FF)
; CMOS ** 24LCXX / 85Cxx EEPROM seriale per l'interfacciamento a; pagina3 (600-6FF)
; ** PIC16C57 8-bit CMOS microcomputer singolo chip; pagina3 (600-6FF)
; ** Revsied Versione 2.0
; **; Pagina3 (600-6FF)
; ** Utilizzare la parte = PIC16F57
; ** Nota: 1) Tutti i tempi sono basate su una frequenza di cristallo di riferimento di 4MHz; pagina3 (600-6FF)
; ** Che è equivalente ad un tempo di ciclo di istruzione di 1 usec.; Page3 (600-6FF)
; ** 2) Indirizzo e valori letterali vengono letti in ottale, salvo diversa; pagina3 (600-6FF)
; ** Specificato.
;************************************************* ****************************; Page3 (600-6FF)

;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Due wire/I2C - Errore CPU tabella di comunicazione di stato e subroutine
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Ingresso: W-reg = codice di errore; pagina3 (600-6FF)
; Uscita: ERCODE = codice di errore; pagina3 (600-6FF)
; FLAG (ERROR) = 1; pagina3 (600-6FF)
;
; Degli errori in modalità codice di stato; pagina3 (600-6FF)
; ------- ------------------------------------------ ------------; Page3 (600-6FF)
; 1: 3 bloccato basso dalla periferica (l'autobus è ancora occupato); pagina3 (600-6FF)
; 2: 4 bloccato bassi dispositivo (l'autobus è ancora occupato); pagina3 (600-6FF)
, 3: No riconoscere dal dispositivo (nessuna stretta di mano); pagina3 (600-6FF)
; Non 4: 4 bus rilasciato per master per generare po 'STOP; pagina3 (600-6FF)
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
;
; Subroutine per identificare lo stato del clock seriale (3) e di dati di serie; pagina3 (600-6FF)
; (4) condizione in base alla tabella di stato di errore.I codici sono generati; pagina3 (600-6FF)
; diagnosi dispositivo utile per bus /.
;

;
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Routine di comunicazione bus INIZIO
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Ingresso: nessuno
; Uscita: inizializzare il bus di comunicazione
; Tempo impiegato: MMAX 23 Cycle.
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
;
; Genera bit di start (3 è elevato, mentre il 4 va da alta a bassa transizione); pagina3 (600-6FF)
e controllare lo status del clock seriale.

BSTART

MOVLW B'00000001 '; Metti 1,2 line in stato di output; pagina3 (600-6FF)
TRIS PORTB; pagina3 (600-6FF)

;************************************************* **************************
BSF IIC_SDA; rendere i dati linea è di alto livello
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)
BCF IIC_SCL; Fai la linea di clock è di basso livello
;************************************************* **************************
NOP
BSF IIC_SCL; Fai la linea di clock è pari a 1
; NOP
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)
BCF IIC_SDA; rendere i dati Lin ha 0 di 1 quando clock = 1

; NOP
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)

BCF IIC_SCL; treno orologio di partenza; pagina3 (600-6FF)

RETLW .0; pagina3 (600-6FF)

;
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; STOP routine di comunicazione bus
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Input: Nessuno
; Output: Bus di comunicazione, condizione di arresto
; Tempo impiegato: MMAX 18 Cycle.
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
;
; Genera STOP bit (4 va dal basso verso l'alto durante lo stato di alta 3); pagina3 (600-6FF)
e verificare le condizioni degli autobus.; Page3 (600-6FF)
;
BSTOP

BCF IIC_SDA; rendere i dati riga = 0; pagina3 (600-6FF)

MOVLW B'00000001 '; Metti 1,2 line in stato di output; pagina3 (600-6FF)
TRIS PORTB; pagina3 (600-6FF)

BCF IIC_SDA; rendere i dati lint = 0 di nuovo
NOP; Page3 (600-6FF)
; NOP; pagina3 (600-6FF)
NOP

BSF IIC_SCL; Imposta orologio = 1
NOP; Page3 (600-6FF)
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)

BSF IIC_SDA; rendere i dati linea 1 da 0, quando la linea di clock = 1
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)
BCF IIC_SCL; Fai la linea di clock a bassa
NOP

RETLW .0; pagina3 (600-6FF);------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Dati seriali da inviare al PIC EEPROM seriale, bit-by-subroutine bit; pagina3 (600-6FF)
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Input: Nessuno
; Di uscita: A (DI) del dispositivo EEPROM seriale; pagina3 (600-6FF)
; Tempo impiegato: MAX 17 Cycle.
;------------------------------------------------- ----------------------------; Page3 (600-6FF)

Bitin

BSF EEPROM, DI; In caso di dati di input = 1
MOVLW B'10000001 '; Force linea SDA come input; pagina3 (600-6FF)
TRIS PORTB; pagina3 (600-6FF)

; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)

BSF IIC_SDA; pagina3 (600-6FF)
BSF IIC_SCL; clock ad alta
NOP; Page3 (600-6FF)
; NOP; pagina3 (600-6FF)
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)
Btfss IIC_SDA; pagina3 (600-6FF)
BCF EEPROM, DI; pagina3 (600-6FF)
BCF IIC_SCL; pagina3 (600-6FF)

RETLW .0; pagina3 (600-6FF)

;
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Ricevere dati seriali da EEPROM seriale per PIC, bit-by-subroutine bit
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Ingresso: EEPROM file
; Di uscita: Da (DO) del dispositivo EEPROM seriale per PIC
; Tempo impiegato: max 13 bici.
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
;BITOUT

MOVLW B'00000001 '; Metti 1,2 line in stato di output; pagina3 (600-6FF)
TRIS PORTB; pagina3 (600-6FF)

Btfss EEPROM, DO; Verificare lo stato di invio dei dati; pagina3 (600-6FF)
GOTO bit0; = 0; pagina3 (600-6FF)
BSF IIC_SDA; = 1; pagina3 (600-6FF)
GOTO CLKOUT

Bit0

BCF IIC_SDA; po 'di uscita 0; pagina3 (600-6FF)

CLKOUT
BSF IIC_SCL; pagina3 (600-6FF)
; NOP
; NOP; pagina3 (600-6FF)
NOP; Page3 (600-6FF)
NOP; Page3 (600-6FF)
BCF IIC_SCL; pagina3 (600-6FF)RETLW .0; pagina3 (600-6FF);
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Subroutine INVIARE DATI
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Ingresso: TXBUF
; Di uscita: i dati X'mitted al dispositivo EEPROM
; Tempo impiegato: MMAX 201 Cycle.; Page3 (600-6FF)
;================================================= ========================; Page3 (600-6FF)
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
;
TX
MOVLW .8; 8 bit di dati; pagina3 (600-6FF)
MOVWF COUNT; pagina3 (600-6FF)
;
TXLP

BCF EEPROM, DO, in caso di dati = 0; pagina3 (600-6FF)
BTFSC TXBUF, 7; sì?; Page3 (600-6FF)
BSF EEPROM, DO, no, pertanto, i dati = 1; pagina3 (600-6FF)CALL BITOUT, inviare dati; pagina3 (600-6FF)
RLF TXBUF, 1; dati shift; pagina3 (600-6FF)
DECFSZ CONTE, 1; dati a 8 bit inviare over?; Page3 (600-6FF)

GOTO TXLP; No.CALL Bitin, sì, leggere la conferma bit; pagina3 (600-6FF)

BTFSC EEPROM, DI; verificare confermare bit; pagina3 (600-6FF)
BCF IIC_ACK; inviare i dati fallito; pagina3 (600-6FF)

RETLW .0; pagina3 (600-6FF);
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; RICEVERE subroutine DATI
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
; Input: Nessuno
; Di uscita: RXBUF = ricezione dati a 8 bit
; Tempo impiegato: MMAX 222 Cycle.
;------------------------------------------------- ----------------------------; Page3 (600-6FF)
;
RX
MOVLW .8; 8 bit di dati; pagina3 (600-6FF)
MOVWF COUNT; pagina3 (600-6FF)
CLRF RXBUF
BCF STATUS, C; pagina3 (600-6FF)
;
RXLP
RLF RXBUF, 1; dati Shift di buffer; pagina3 (600-6FF)
CALL Bitin; pagina3 (600-6FF)
BTFSC EEPROM, DI; pagina3 (600-6FF)
BSF RXBUF, 0; bit di ingresso = 1; pagina3 (600-6FF)
DECFSZ CONTE, 1, 8 bit?; Page3 (600-6FF)
GOTO RXLP; pagina3 (600-6FF)
BSF EEPROM, DO; Set riconoscere bit = 1; pagina3 (600-6FF)

CALL BITOUT; a STOP ulteriori contributi; pagina3 (600-6FF)

RETLW .0; pagina3 (600-6FF)

 

Welcome to EDABoard.com

Sponsor

Back
Top