;--------------------------------------------------------------------
;
;	set_cren.asm
;
;	Setzt auf dem 2-Prozessor-Board das RCEN-Fuse-Bit des
;	Slave Prozessors. Das geht nur im Parallel-Programmier-Modus.
;	Der Port B ist dazu 1 zu 1 mit dem Port B des Slaves verbunden.
;	(Master ist der AVR auf dem diese Software läuft, Slave ist der
;	zweite AVR dessen RCEN Bit gesetzt wird). 
;
;	Insgesammt gilt folgendes Bit Mapping:
;
;	Master		Slave		Bemerkung
;	Port B 		Port B 		alle 8 Bit 1 zu 1 verbunden
;	PD 1		XTAL1		Quarzosz. Eingang des Slaves
;	PD 3		PD 3		WR Pin für Parallelprog.
;	PD 5		PD 5		XA0 Pin für Parallelprog.
;	PD 6		PD 6		XA1 Pin für Parallelprog.
;
;--------------------------------------------------------------------


.include "1200def.inc"	; Target ist ein 1200er

.def temp = r16		; Universalvariable für dies und das
.def pa   = r17		; Einstellregister für die Wartezeit bei Pause

; ------ Bitdefinitionen für Port D ------
.equ XA0    = 5		;
.equ XA1    = 6
.equ WR     = 3
.equ XTAL1  = 1
.equ prg12v = 0		; +12V für Parallelprog wird von PD0 angest.

;---------------- Ports auf Ausgang schalten ------------------------

	ser temp
	out DDRB, temp
	out DDRD, temp

;---------------- los gehts -----------------------------------------


	;Vcc einschwingen lassen
	ldi pa, 255
	rcall pause

	;Startkonfiguration setzen

	cbi PORTD, XA0		; XA0, XA1 und XTAL auf 0 vorsetzen
	cbi PORTD, XA1 
	cbi PORTD, XTAL1
	sbi PORTD, WR		; WR ist aktiv low, deshalb mit 1 vorsetzen
	cbi PORTD, prg12v	; Reset des Slaves auf 0 setzen
	
	clr temp		; PORT B auf 0 vorsetzen
	out PORTB, temp

	;Der Reset der am Slave jetzt anliegt muß min. 100ns bestehen
	;bevor die 12V angelegt werden dürfen
	ldi pa, 255
	rcall pause

	;Parallelprog Modus aktivieren, dazu Reset auf 12V legen und 
	;min. 100ns warten (BS muß dabei auf 0 liegen aber das ist in
	;der benutzten Hardware eh auf GND hart verdrahtet
	
	sbi PORTD, prg12v	; 12V anlegen
	
	ldi pa, 255		; warten
	rcall pause
	
	;auf gehts mit den einzelnen Schritten

	sbi PORTD, XA1		; XA1 XA0 auf 10 setzen
				; (Enable Command loading)

	ldi pa, 255
	rcall pause
	
	ldi temp, 0b01000000	; 01000000 am Datenport anlegen
	out PORTB, temp

	ldi pa, 255
	rcall pause
	
	sbi PORTD, XTAL1	; positiven Puls auf XTAL1 ausgeben
	cbi PORTD, XTAL1

	ldi pa, 255
	rcall pause
	
	cbi PORTD, XA1		; XA1 XA0 auf 01 setzen
	sbi PORTD, XA0		; (enable data loading)
	
	ldi pa, 255
	rcall pause
		
	ldi temp, 0b11011110	; 1111 1110 als Daten anlegen 
				; RCEN Fuse ist Bit0 (0=RC Osziallator aktiviert)
				; Achtung: Bit5 ist Serial-programing-enabled SPIEN
				;	und muß programmiert bleiben, d.h auf 0 !!!
	out PORTB, temp		; Daten rausschreiben
	
	ldi pa, 255
	rcall pause

	sbi PORTD, XTAL1	; positiven Puls auf XTAL1 ausgeben
	cbi PORTD, XTAL1

	ldi pa, 255
	rcall pause
	
	cbi PORTD, WR		; Schreibvorgang starten durch WR auf 0
	ldi pa, 26
	rcall pause		; für 1.5 ms warten
	sbi PORTD, WR
		
	ldi pa, 255
	rcall pause
	
	cbi PORTD, prg12v	; 12V Programmierspannung vom Reset wieder weg	
	
fertig:
	rjmp fertig
	
	
;-------------------------- pause --------------------------------------------
; abhängig vom Inhalt von reg. pa wird entspr. lange gewartet
; einmal pa entspricht einmal überlaufen des 8-Bit Timers mit
; einem Vorteiler von 1, d.h. t= (1/fq) * 1 * 256
; (der Master läuft auf einen 4.433 MHz Quarz)

pause:
		
pa_loop:
	; Vorteiler für den Timer auf 1 setzen
	ldi temp, 0b00000001
	out tccr0, temp

	; das Überlaufbit des Counters zurücksetzen,
	in temp, tifr
	sbr temp, exp2(tov0)
	out tifr, temp

	; Den Zähler mit Null vorsetzen
	clr temp
	out tcnt0, temp

	; wenn tcnt0 überläuft wird tov0 gesetzt
cwait:	in temp, tifr
	sbrs temp, tov0
	rjmp cwait

	dec pa			; jetzt ist der Timer einmal übergelaufen, 
	brne pa_loop		; pa runterzählen, wenn noch nicht auf 0
				; dann nochmal hoch und den Timer neu aufziehen
	ret
	