;---------------------------------------------------------------------- ; ; 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.