$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 (PWM16SUB.A51)
;------------------------------------------------------------------------
;Programmbeschreibung
;------------------------------------------------------------------------
;Programm:
;im Uhrzeigersinn PW erhöhen
;gegen Uhrzeigersinn PW erniedrigen
;Pulsweitenmodulation mit Timer 2 zur Servomotoransteuerung,
;Servomotor in Stellung Links = 19,1ms = 64636 = FC7CH
;Servomotor in Stellung Mitte = 18,5ms = 64036 = FA24H
;Servomotor in Stellung Rechts = 17,9ms = 63436 = F7CCH
;T2 startet Anfahrt langsam auf T3
;bis Servo-Schenkel T3 berührt
;
; Ausgabe an Port 1.1 (VG1/C13).
; Periodendauer 20ms
; T2 - Pulsweite variabel
;
;
;
;Datum: 29.Dezember 2002
;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
PWM_L_LINKS EQU 07CH ;FC7C
PWM_H_LINKS EQU 0FCH ;Compare Wert
CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h
jmp INIT
;------------------------------------------------------------------------
;Initialisierungsteil für On-Chip Peripherie
;------------------------------------------------------------------------
ORG 100H ;Programmstart bei 100H
INIT:
;Timer Intitialisierung
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
;------------------------------------------------------------------------
;Programmschleife
;------------------------------------------------------------------------
mov CCL1,#PWM_L_LINKS ;Compare Capture Low Byte
mov CCH1,#PWM_H_LINKS ;CC High Byte
PWM:
jb P1.2,PWM ;Start mit Taste 2 betaetigt?
;------------------------------------------------------------------------
;Anfahren von Taster P1.3
;------------------------------------------------------------------------
KALIBRATION:
jnb P1.3,T1_3 ;Taster T1_3 betätigt
WARTE3:
mov R2,#0FH ;Länge innere Schleife
WARTE2:
djnz R2,WARTE2
djnz R3,WARTE3
mov A,CCL1 ;in LOW in Akku
subb A,#1 ;-1
mov CCL1,A ;wieder zurück in Compare 1 LOW
jnz KALIBRATION ;Falls Akku nicht 0 weiter herunterzaehlen
mov A,CCH1 ;HIGH Compare in AKKU
subb A,#1 ;-1
mov CCH1,A ;Wieder zurück in Compare 1 HIGH
mov A,CCL1 ;unmittelbar LOW-Byte herunterzaehlen, ansonsten springt Servo
subb A,#1
mov CCL1,A
jmp KALIBRATION
;------------------------------------------------------------------------
;Schreiben von Compare 1 in externen Speicher 2000H
;------------------------------------------------------------------------
T1_3:
mov DPTR,#2000H ;Adresse 2000
mov A,CCH1 ;High-Byte Compare
movx @DPTR,A ;High-Byte in 2000H
mov A,CCL1 ;Low-Byte in Akku
inc DPTR ;Adresse DPTR 2001H
movx @DPTR,A ;Low-Byte in 2001H
jmp INIT
end