;----------------------------------------------------------------------
;
; set lmx2320.asm
;
; Programm zum programmieren des PLLs (LMX2320) im 13cm Converter
; (mit 70cm ZF Ausgang)
; mit dem AT90S1200. Das ist besonders trickreich weil der S1200
; keinen Befehl zum lesen des FLASH hat (LPM). Deshalb werden die 
; eigentlichen Daten im EEPROM abgelegt.
;
; Historie
; 12.02.2001	Programmentwicklung beginnt für MB15E07
; 13.02.2001	Programm läuft 1A im Simulator
; 21.02.2001	Timer integriert für kurze Wartezeit vor der 
;			Programmierung bis Vcc am PLL stabil ansteht
;		und Hardwaretest an der 13cm Bake
;		Bugfix: Port B war nicht als Ausgang konfiguriert
;		Sleep mit PowerDown am Programmende eingefügt
; 15.04.2001	Umgeschrieben auf LMX2320 
;		(die Bits entspr. gesetzt für 1888 MHz)
;		Software getestet und geht!
;
;----------------------------------------------------------------------


;**** Includes ****

.include "1200def.inc"	; Programm für AT90S1200


;**** Definitionen ****

.CSEG

.def EEdat = r0
.def EEadr = r17
.def dummy = r16

;+++++++++++++++++++++++++ Hauptprogramm +++++++++++++++++++++++++++++++


	rcall pause

	ldi EEadr, plldaten	; Point mit Addr. der Daten im E2 laden
	
	ldi dummy, $FF		; alle Pins von Port B auf Ausgang setzen
	out DDRB, dummy

schleifenanfang:

	rcall EEread		; ein Byte vom E2 holen

	sbrc EEdat,1		; Sprung zum Prg-Ende überspringen wenn Bit1
	rjmp fertig		; in EEdat gesetzt ist (Endekennung)

	out PORTB, EEdat	; Datenbit rausschreiben auf Port B (Bit 0)
	
	sbi PORTB, 1		; Bit 1 an Port B setzen (Clock hoch)
	cbi PORTB, 1		; Bit 1 an Port B löschen (Clock wieder runter)

	inc EEadr		; Daten-Pointer weitersetzen

	rjmp schleifenanfang 	; wieder hoch für nächstes Bit

fertig:
	sbi PORTB, 2		; Bit 2 an Port B setzen (Load Enable hoch)
	cbi PORTB, 2		; Bit 2 an Port B löschen (Load Enable wieder runter)

	inc EEadr		; Zeiger weiterstellen für nächstes Bit (1. Bit
				; im nächsten Programmierwort wenn noch eins kommt)

	sbrs EEdat, 2		; wenn das Bit 2 im zuletzt gelesen Datenbyte gesetzt
	rjmp schleifenanfang 	; ist dann wars das letzte Programmierwort, d.h.
				; nicht nochmal hochspringen


	; PLL ist fertig programmiert, jetzt die CPU einschläfern damit sie nicht stört

	in dummy, MCUCR		; Controlregister einlesen
	sbr dummy, exp2(SE)	; Sleepmode enable (noch nicht einschalten)
	sbr dummy, exp2(SM)	; wähle 'power down' als sleepmodus
	out MCUCR, dummy	; Controlregister zurückschreiben
	sleep			; sleepmode einschalten (sleep wird im simulator
				; ignoriert, funktioniert auf der hardware aber prima)


ende:				; Endlosschleife, fängt den Prozessor 
	rjmp ende		; (nur falls er irgendwie aus dem sleep
				; aufwachen sollte)


;------------------------- EEread --------------------------------------

; Greift auf die Zelle im EEPROM zu deren Addresse in EEadr hinterlegt
; ist. Der ausgelesene Wert steht hernach in EEdat.

EEread:

	sbic EECR, EEWE		; warten bis das EEPROM soweit ist
	rjmp EEread

	out EEAR, EEadr		; zu lesende Addresse ins Eprom-Adr.-Register
				; eintragen

	sbi EECR, EERE		; EEPROM lese-strobe setzen

	in EEdat, EEDR		; Daten auslesen

	ret			; Rücksprung


;------------------------- Pause ---------------------------------------

; Läst den 8Bit-Timer mit max. Vorteilung (1024) einmal ablaufen, das
; ergibt eine Pausedauer von ca. 65ms bei fq=4MHz. Wenn der 1200er auf
; internen RC Osz. mit ca. 1MHz läuft sind es eben ca. 260ms. In der 
; Zeit kann die Betriebsspannung am PLL stabil werden.

pause:
	ldi dummy, 0b00000101	; Vorteiler auf 1024 setzen
	out TCCR0, dummy
	
	clr dummy		; den Zähler selbst auf 0 setzen
	out TCNT0, dummy

	in dummy, TIFR		; das Überlaufflag des Zählers 
	sbr dummy, 2^TOV0	; auf 0 zurücksetzten
	out TIFR, dummy
pw:	in dummy, TIFR		; Überlaufflag in Register holen
	sbrs dummy, TOV0	; ist das Überlaufflag schon gesetzt?
	rjmp pw			; wenn nicht dann weiter warten

	ret
	
	
; -------------- hier kommen noch die Daten für den PLL ----------------

; Hier kommen noch die Programmierdaten, je Bit ein Byte.
; Endekennung für ein Programmierwort ist das Bit1 (Wertigk.2).
; Nach dem letztem Programmierwort (üblicherweiße nach dem zweiten)
; wird auch noch das Bit2 (Wertigk.4) gesetzt, d.h. eine 6.

.ESEG

plldaten:
	.db 1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,2		; Ref. 500kHz bei 13MHz fq
	.db 0,0,0,0,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,6 	; 1888 MHz be 500kHz Ref.





