	LIST	p=16F84A

#include <p16f84a.inc>

warte	equ	0Ch	;Zähler für Warteschleife 

		org	00h		;Resetvektor
		goto	main

		org	0Ah
main		clrw
		movwf	PORTA		;alle A auf 0
		movwf	PORTB		;alle B auf 0
		bsf	STATUS,RP0	;umschalten auf Speicherbank 1
		movlw	02h
		movwf	TRISA		;A1 als Eingang, alle anderen als Ausgänge
		movlw	00h
		movwf	TRISB		;Alle B als Ausgänge
		clrw			;w-Register löschen
		bcf	STATUS,RP0	; zurückschalten auf Speicherbank1

Schalter	btfsc	PORTA,1		;Schalter offen?
		goto	Anfragen	; Nein: Anfrage starten
		goto	Schalter	; Ja: Weiter warten

Anfragen	bsf	PORTA,2		;Anfrage raus
		bsf	PORTB,2		;LED an B2 (rot) geht an
		call	wait		;Signal halten
		bcf	PORTA,2		;Anfrage ausschalten (BUS ist frei)
		call	wait		;kurz warten
		bsf	STATUS,RP0	;Wechsel auf Speicherbank 1
		bsf	TRISA,2		;A2 ist jetzt Eingang (Empfangsbereit am BUS)
		bcf	STATUS,RP0	;Speicherbank auf 0 zurück


Empfang		btfss	PORTA,2		;Antwort vom Slave?
		goto	Empfang		; Nein: weiter warten
		bsf	PORTB,3		;2. LED (grün an B3) anschalten (Antwort erhalten)
		

clear		btfss	PORTA,1		;Schalter gedrückt?
		goto	clear		; Nein: weiter warten
		call	wait		;kurz warten
		clrw			;w-Register löschen
		movwf	PORTB		;LEDs ausschalten
		call	wait		;kurz warten
		bsf	STATUS,RP0	;wechsel auf Speicherbank 1
		bcf	TRISA,2		;A2 ist jetzt Ausgang
		bcf	STATUS,RP0	;zurück auf Bank 0
		goto	Schalter	; von vorn

wait		movlw	0C8h
		movwf	warte		;warte mit 0FFh laden
wait_loop	decfsz	warte		;255 Taktzyklen warten
		goto	wait_loop
		return			;weiter im Hauptprogramm

	END
