$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 (HELLER_100Hz.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Hardware: C4 = Vcc C21 = GND Steuerleitung = P1.1 = C13 ;Programm: ;T2 wird eine LED heller ;T3 Wird eine LED dunkler (Uebung) ;Timer 2 arbeitet mit Periodendauer 10ms --> Reload=55536 ;der Zeitpunkt fuer die ansteigende Flanke wird durch CC1 variiert ;Die helligkeit wird in 125 Studen variiert ;Von dunkel nach hell in 12,5 Sekunden ;Erstellt am: Sonntag, 24. Juni 2007 17:34:38 ;Programmiert: ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Sonntag, 24. Juni 2007 17:34:38 ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ PERIODE_L EQU 0F0H ;legt die Periodendauer von Timer 2 fest 10ms PERIODE_H EQU 0D8H ;55536 = 0D8F0H PWM_ANF_L EQU 0F0H ;Compare Wert Lampe aus PWM_ANF_H EQU 0D8H ; WERT_ADD EQU 80 ;Additionswert N_MAL_R_T EQU 10 ;100 ms Zeitdauer nach der CC1 Wert erhoeht wird DAUER EQU 10000/WERT_ADD ; 125 * 100ms = 12,5 s CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp ABFRAGE ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 02Bh clr TF2 ;Interrupt bestaetigen call ISR_T2 ;ISR Interrupt Timer 2 reti ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: ;Hier muss zuerst die Interruptsteuerung eingestellt werden ;Dann Timer 2 im Reload-Modus mit 1 Mikrosekunde ;Timer 2 Compare Capture Register fuer steigende Flanke ;Anfangswert für Compare-Captureregister der variiert wird ; ;Interrupt-Programmierung mov IEN0,#10110000B ;Interrupt Freigabe mov T2CON,#00010000B ;Timer2 Einstellung:Timer mit f=f(osz)/12 ;Mode 0 ->Reload bei Ueberlauf mov CCEN,#00001000B ;Compare Mode des CC1 freigeben mov CRCL,#PERIODE_L ;Low Byte von Compare Reload Capture mov CRCH,#PERIODE_H ;High Byte von Compare Reload Capture mov CCH1,#PWM_ANF_H ;Pulsweitenmodulation Anfangswert mov CCL1,#PWM_ANF_L mov R2,#N_MAL_R_T ;nach 10 mal 10ms = 100ms wird es etwas heller mov R3,#DAUER ;125*80 = 10000 Mikrosekunden setb T2I0 ;Timer2 laeuft los ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jnb P1.2,INIT ;Start mov C,P1.1 ;Bit kopieren mov P3.2,C ;LED jnb P1.3,STOP ;Stop jmp ABFRAGE ISR_T2: djnz R2,ISR_T2_ENDE ;schon N*10ms mov R2,#N_MAL_R_T call CC1_ADD ;Flanke etwas breiter djnz R3,ISR_T2_ENDE ;das Ganze 125 mal clr T2I0 ;Timer 2 Stop ISR_T2_ENDE: ret CC1_ADD: clr C ;Carry zuruecksetzen mov A,CCL1 ; add A,#WERT_ADD ;Akku - Wert mov CCL1,A jnc CC1_ADD_ENDE ;kein Uebertrag inc CCH1 ;subtrahiere 1 von CC1H CC1_ADD_ENDE: ret STOP: clr T2I0 jmp ABFRAGE end