$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 (SRV_INTLR) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: SeRVo INTerrupt Links Rechts ;Prinzipielles Verfahren Betriebsystem: Interrupt ;Da CC1 16 Bit Register ->DPTR wird missbraucht ;Pulsweitenmodulation mit Timer 2 zur Servomotoransteuerung, ;Anschluesse: ;Steuerung - Port 1.1 (VG1/C13)Orange ;+5V - A4 - Rot ;GND – A21 - Braun ;Periodendauer: 20ms ;Pulsweite variiert von ca.: 17ms - 19.5ms - F448H-FE0CH ; ; T2 - Pulsweite kleiner (Beginn) ; T3 - Pulsweite größer ; ; ;Grundlegende Funktion: ;* der Reloadwert im CRC legt die Periodendauer fest ;* der Wert im Register CC1 legt das Tastverhaeltnis fest ;k Faktor wieviel Mal pro Periodendauer Tpwm inkrementiert - dekrementiert wird ; ;Datum: 12.Januar 2005 ;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 ;Anfangswert: Compare Wert 2ms => 18 ms PWMANH EQU 0F8H ;Anfangswert: Compare Wert F830CH K-FAKTOR EQU 01H ;Wie oft wird dekrementiert CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 002BH ;Interrupt Vektor Timer 2 clr TF2 ;Interrupt erkannt call ISR_T2 reti ;------------------------------------------------------------------------ ;Initialisierungsteil für On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: mov IEN0,#10110000B ;EAL, ET2, SER, 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 ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ PWM: jmp PWM ISR_T2: mov R2,#K-FAKTOR ;K Faktor Laden jb P1.2,TASTE3 ;PWM kleiner (T2) nicht betätigt mov DPL,CCL1 ;CC1 in Datenpointer mov DPH,CCH1 K_MAL_T2: inc DPTR ;inc DPTR djnz R2,K_MAL_T2 ;k Mal wird inkrementiert mov CCL1,DPL ;DPTR in CC1 mov CCH1,DPH TASTE3: jb P1.3,ISRENDE ;PWM groesser (T3) nicht betaetigt mov DPL,CCL1 ;CC1 in Datenpointer mov DPH,CCH1 K_MAL_T3: ;-------------------- ;DEC DPTR nachahmen ;-------------------- clr C ;Carry ruecksetzen mov A,DPL ;DPL in Akku subb A,#1 ;Akku - 1 mov DPL,A jnc DEC_FERTIG DPL_0: ;DPH mov A,DPH ;DPH in Akku dec A ;Akku-1 mov DPH,A DEC_FERTIG: djnz R2,K_MAL_T3 ;k Mal wird dekrementiert mov CCL1,DPL ;DPTR in CC1 mov CCH1,DPH ISRENDE: ret end