;
; --------------------------------------------
;  Programma per pilotare un Philips PCF8576T
; --------------------------------------------
;
; Copyright Fusco Carlo 2003
;
; Versione:  2.2
;            | |
;            | |---Versione protocollo I2C.
;            |
;            |-----Versione applicazione.
;
; --------------------------------------------
; What's new
;
; Versione 2.2
; ------------
; Memorizzazione della stringa nella eeprom.
;
; Versione 1.2
; ------------
; Modificata la funzione di trasmissione e di 
; delay.
;
; Versione 0.2
; ------------
; Versione del protocollo funzionante. 
;
; Versione 0.0
; ------------
; Versione non funzionante. Il protocollo I2C
; implementa solo il funzionamento da master
; e come unico master della rete.
;
; --------------------------------------------
; 
; Configurazione delle porte del PIC:
;
; RA0 - SDA
; RA1 - SCL
; RA2 - Led ack
; RA3 - 
; RA4 - 
;
; RB0 - 
; RB1 - 
; RB2 - 
; RB3 - 
; RB4 - 
; RB5 - 
; RB6 - 
; RB7 - 
;
; Nota: RA0 e RA1 necessitano di resistori di 
;       pull-up verso Vdd.
;
; Quarzo: 4 MHz
;
; --------------------------------------------
;
; --------------------------------------------
;  Direttive assemblatore
; --------------------------------------------
;
	PROCESSOR	16F84A
	RADIX		DEC
	INCLUDE		"P16F84A.inc"
	__CONFIG	H'3FF1'
	ERRORLEVEL	2
;
; --------------------------------------------
;  Programma applicazione
; --------------------------------------------
;
	ORG	00BCh
tx_a	RES	1
cont	RES	1
ind_ee	RES	1

	ORG	2100h

; Prima   stringa:"ABLASOR "
; Seconda stringa:"   OLRAC"
; Terza   stringa:"    YRAM"

N	EQU	5	; Lunghezza della stringa.

	RADIX	HEX
	de	008b,000b,0083,00cb,0000,0049	; Prima stringa
	de	008b,000b,0083,004a,0089,0049	; indirizzo 0000h
	de	008e,000b,0000,0000
	de	0000,0000,0000,0000,0000,0000	; Seconda stringa
	de	0089,0049,0000,0049,008e,000b	; indirizzo 0010h
	de	008b,000b,0080,0049
	de	0000,0000,0000,0000,0000,0000	; Terza stringa
	de	0000,0000,0020,0084,008e,000b	; indirizzo 0020h
	de	008b,000b,0029,0089
	RADIX	DEC

	ORG	0000h
	clrf	cont
	movlw	0016h	; Carica l'indirizzo
	movwf	ind_ee	; della stringa.
	call	i2c_ini
	call	mode_set
	call	blink

main	movfw	ind_ee
	movwf	0009h
	bsf	03h,5
	bsf	88h,0
	bcf	83h,5
	movfw	08h	; Trasmetti il primo byte.
	movwf	tx_a
	call	tx_lcd
	incf	ind_ee,1; Aggiungi 1 all'indirizzo.

	movfw	ind_ee
	movwf	0009h
	bsf	03h,5
	bsf	88h,0
	bcf	03h,5
	movfw	08h	; Trasmetti il secondo byte.
	movwf	tx_a
	call	tx_lcd
	incf	ind_ee,1; Aggiungi 1 all'indirizzo.

	incf	cont,1	; Aggiungi 1 al contatore.
	movlw	N
	subwf	cont,0	; w=N-w
	btfss	0003h,2	; Il risultato è 0?
	goto	main	; no ripeti.
	sleep		; si termina.

mode_set	call	i2c_start
		movlw	01110000b	; indirizzo
		movwf	tx_byte
		call	i2c_tx_byte
		movlw	11100000b	; device select
		movwf	tx_byte
		call	i2c_tx_byte
		movlw	01001000b	; mode set
		movwf	tx_byte
		call	i2c_tx_byte
		call	i2c_stop
		return

blink	call	i2c_start
	movlw	01110000b	; indirizzo
	movwf	tx_byte
	call	i2c_tx_byte
	movlw	11100000b	; device select
	movwf	tx_byte
	call	i2c_tx_byte
	movlw	11110100b	; blink off
	movwf	tx_byte
	call	i2c_tx_byte

	movlw	00000100b	; data pointer
	movwf	tx_byte
	call	i2c_tx_byte

	call	i2c_stop
	return

tx_lcd	call	i2c_start
	movlw	01110000b	; indirizzo
	movwf	tx_byte
	call	i2c_tx_byte
	movlw	01100000b	; device select
	movwf	tx_byte
	call	i2c_tx_byte
	movfw	tx_a
	movwf	tx_byte
	call	i2c_tx_byte
	call	i2c_stop
	return

; --------------------------------------------
;  Fine programma applicazione
; --------------------------------------------
;
;
; --------------------------------------------
;  Protocollo I2C
; --------------------------------------------
; Questa implementazione del protocollo I2C
; utilizza un file register per contenere il
; byte da trasmettere e uno per per uso interno.
; A ogni chiamata della funzione i2c_tx_byte
; bisognerà, quindi, memorizzare prima il byte 
; nel file register. Esso viene stabilito dalla
; seguente direttiva:
;
	ORG	00ceh
tx_byte	RES	1
counter	RES	1


; E' possibile memorizzare ovunque le funzioni
; del protocollo modificando la seguente diret-
; tiva:
;
	ORG	03a1h
;
; Inizializzazione 
; ----------------
;

i2c_ini	bsf	03h,5	; Seleziona Bank1
	bcf	85h,0	; RA0 output
	bcf	85h,1	; RA1 output
	bcf	83h,5	; Seleziona Bank0
	bsf	05h,0
	bsf	05h,1
	return
;
; Ritardo di 20us
; ---------------

i2c_delay
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop	; 10us
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop	; 20us
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	return	; 30us

;
; Start condition
; ---------------
; In:  SDA e SCL entrambi alti.
; Out: SDA e SCL entrambi bassi.
;

i2c_start	bcf	05h,0
		call	i2c_delay
		bcf	05h,1
		call	i2c_delay
		return
;
; Stop condition
; --------------
; In:  SDA e SCL entrambi bassi.
; Out: SDA e SCL entrambi alti.
;

i2c_stop	bsf	05h,1
		call	i2c_delay
		bsf	05h,0
		call	i2c_delay
		return
;
; Trasmetti bit 0
; ---------------
; In:  SDA E SCL entrambi bassi.
; Out: SDA E SCL entrambi bassi.
; 48 us

i2c_tx_bit_0	nop
		bsf	05h,1
		call	i2c_delay
		bcf	05h,1
		nop
		call	i2c_delay
		return
;
; Trasmetti bit 1
; ---------------
; In:  SDA E SCL entrambi bassi.
; Out: SDA E SCL entrambi bassi.
; 48 us

i2c_tx_bit_1	bsf	05h,0
		bsf	05h,1
		call 	i2c_delay
		bcf	05h,1
		bcf	05h,0
		call	i2c_delay
		return
;
; Trasmetti byte
; --------------
; Il byte da trasmettere è contenuto in tx_byte.
;

i2c_tx_byte_2	movlw	8
		movwf	counter
iter		rlf	tx_byte,1
		btfsc	03h,0
		call	i2c_tx_bit_1
		btfss	03h,0
		call	i2c_tx_bit_0
		decfsz	counter,1
		goto	iter
; ack
		bsf	03h,5	; Seleziona Bank1
		bsf	85h,0	; RA0 input
		bcf	83h,5	; Seleziona Bank0
		bsf	05h,1
		call	i2c_delay
		movlw	0
		btfss	05h,0
		movlw	1
		movwf	counter	; counter=1 se ack
		bcf	05h,1
		call	i2c_delay	
		bsf	03h,5	; Seleziona Bank1
		bcf	85h,0	; RA0 output
		bcf	83h,5	; Seleziona Bank0
		return
;

i2c_tx_byte	call	i2c_tx_byte_2
		decfsz	counter,1	
		goto	led_on
led_off		bsf	03h,5	; Seleziona Bank1
		bcf	85h,2	; RA2 output
		bcf	83h,5	; Seleziona Bank0
		bcf	05h,2	; spegne led
		return

led_on		bsf	03h,5	; Seleziona Bank1
		bcf	85h,2	; RA2 output
		bcf	83h,5	; Seleziona Bank0
		bsf	05h,2	; accende led
		goto	i2c_tx_byte

;
; --------------------------------------------
;  Fine protocollo I2C
; --------------------------------------------
;
	end
;
; --------------------------------------------
;  Fine codice asm
; --------------------------------------------
;
;
; --------------------------------------------
;  Simboli
; --------------------------------------------
;
; spazio - 0000,0000
; A	 - 008b,000b
; B	 - 0083,00cb
; C	 - 0080,0049
; Y	 - 0020,0084
; L	 - 0000,0049
; M	 - 0029,0089
; O	 - 0089,0049
; R	 - 008e,000b
; S	 - 0083,004a
; Z	 - 0080,0064
