$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 (ServoLRN) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: ;Pulsweitenmodulation mit Timer 0 und Timer 2 ;zur Servomotoransteuerung, ;Ausgabe an Port 1.1 (VG1/C13) 5V (VG1/C4) GND (VG1/C21) ;Periodendauer 20ms ;Pulsweite variiert von ; 0° - F719h = 63257 -> Impulsbreite = 2279 ;180° - FD82h = 64898 -> Impulsbreite = 638 ;156 Schritte - ; T2 - Pulsweite kleiner ; T3 - Pulsweite größer ; Timer 0 16-Bit-Zähler ; ;Grundlegende Funktion: Interruptbetrieb ;* der Reloadwert im CRC legt die Periodendauer fest ;* der Wert im Register CC1 legt das Tastverhaeltnis fest ; Der Wert in Timer 0 legt die Geschwindigkeit fest ;Datum: 5.12.2005 ;Programmiert: Christian Eberle ; ;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 F830CH ;Initialisierung von Konstanten ;0° Grenze GOH EQU 0F8h ;Grenze 0 Grad High Byte GOL EQU 1Ah ;Grenze 0 Grad Low Byte GUH EQU 0FDh GUL EQU 082h ;Grenze 180 Grad CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 000BH nop nop nop call ISRTIMER0 reti ;------------------------------------------------------------------------ ;Initialisierungsteil für On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ; Programmstart bei 100H INIT: mov TMOD,#00000010B ;Timer 0 Initialisierung 8-Bit Autoreload 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 mov th0,#0h mov R7,#10h setb TR0 ;Timer0 läuft los ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ PWM: jmp PWM ISRTIMER0: djnz r7, ISRENDE ;wenn carry 0 dann ISRENDE mov R7,#10h ;auffuellen von R7 jb P1.2,TASTE3 ;T2 abwaerts nicht betätigt clr C ;loeschen carry mov A,CCh1 ;CCh 1 in Akku subb A,#GOH ;0f8h von A beziehen jnc weiter ;wenn carry 0 dann WEITER clr C ;loeschen carry mov A,CCl1 ;CCl 1 in Akku subb A,#GOL ;1ah von A baziehen jc TASTE3 ;wenn carry 1 dann TASTE3 WEITER: clr C mov A,CCL1 ;Inhalt von CCL1 subb A,#1 ;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: mov A,CCh1 ;CCh 1 in Akku subb A,#GUH ;0fdh von A beziehen jc weiter2 ;wenn carry 1 dann Weiter2 clr C ;loeschen carry mov A,CCl1 ;CCl 1 in Akku subb A,#GUL ;82h von A baziehen jnc ISRENDE ;wenn carry 0 dann ISRENDE WEITER2: jb P1.3,ISRENDE ;T3 aufwaerts nicht betätigt clr C ;loeschen carry mov A,CCL1 ;Inhalt von CCL1 add A,#1 ;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