$nomod51                ;der Modus fuer 8051 wird abgeschaltet
$debug
$nolist                 ;es wird kein Listing fuer reg535 erstellt
$include(reg535.pdf)    ;die 80535-spezifischen Daten
$list                   ;es wird ein Listing erstellt
$ title (ServoLR)
;------------------------------------------------------------------------
;Programmbeschreibung
;------------------------------------------------------------------------
;Programm:Pulsweitenmodulation mit Timer 2 zur Servomotoransteuerung, 
;         Ausgabe an Port 1.1 (VG1/C13). 
;	  Periodendauer 20ms
;	  Pulsweite variiert von 17ms - 19.5ms F448H-FE0CH 
;	  156 Schritte -
;         T2 - Pulsweite kleiner
;	  T3 - Pulsweite größer
;	  Timer 0 16-Bit-Zähler 
; 	  
;Grundlegende Funktion:
;* der Reloadwert im CRC legt die Periodendauer fest
;* der Wert im Register CC1 legt das Tastverhaeltnis fest
;
;Datum: 12.Januar 2001         
;Programmiert: J. Walter
;
;Verwendete Einspruenge: keine 
;
;Verwendete Unterprogramme: keine       
;
;
;Verwendete Register und Variable:
;Registerbank(0)        
;             
;
;Kommentar: 
;
;Aenderungen:
;Datum:
;
;
;------------------------------------------------------------------------
;Initialisierungsteil für allgemeine Konstanten
;------------------------------------------------------------------------
Periode_low     EQU 0E0H	;legt die Periodendauer fest 20ms
Periode_high    EQU 0B1H	;45536 = 0B1E0H
PWMANL		EQU 030H   	;Compare Wert 2ms => 18 ms
PWMANH          EQU 0F8H	;Compare Wert F830H


CSEG AT 0H              	;Legt absolute Codesegmentadresse auf 0h
jmp INIT

;------------------------------------------------------------------------
;Interrupt-Vektoren
;------------------------------------------------------------------------
ORG 000BH
call ISRTIMER0
reti

;------------------------------------------------------------------------
;Initialisierungsteil für On-Chip Peripherie
;------------------------------------------------------------------------
ORG 100H               	 	;Programmstart bei 100H

INIT:
mov TMOD,#00000001B		;Timer 0 Initialisierung 16-Bit
mov IEN0,#10010010B		;Interrupt Freigabe
                           
mov  T2CON,#00010001B   	;Timer2 Einstellung:Timer mit f=f(osz)/12
                        	;Mode 0 ->Reload bei Ueberlauf
mov CCEN,#00001000B    		;Compare Mode des CC1 freigeben

mov CRCL,#Periode_low   	;Low Byte von Compare Reload Capture
mov CRCH,#Periode_high  	;High Byte von Compare Reload Capture

mov CCH1,#PWMANH		;Pulsweitenmodulation Anfangswert
mov CCL1,#PWMANL
          
setb TR0			;Timer0 läuft los

;------------------------------------------------------------------------
;Programmschleife
;------------------------------------------------------------------------

PWM:
jmp PWM	

ISRTIMER0:
jb P1.2,TASTE3			;T2 abwaerts nicht betätigt
clr C
mov A,CCL1			;Inhalt von CCL1
subb A,#16			;oberes Nibble um 1 erniedrigen
mov CCL1,A			;Neuer Comparewert LB
jnc TASTE3			;High-Byte wird nicht verändert
mov A,CCH1			;Inhalt von CCH1
dec A				;Inhalt um 1 erniedrigen
mov CCH1,A			;Neuer Comparewert HB


TASTE3:
jb P1.3,ISRENDE			;T3 aufwaerts nicht betätigt
clr C
mov A,CCL1			;Inhalt von CCL1
add A,#16			;oberes Nibble um 1 erniedrigen
mov CCL1,A			;Neuer Comparewert LB
jnc ISRENDE			;High-Byte wird nicht verändert
mov A,CCH1			;Inhalt von CCH1
inc A				;Inhalt um 1 erniedrigen
mov CCH1,A			;Neuer Comparewert HB		

ISRENDE:

ret


end