$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 (T0_INTZA.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Hardware: C4 = Vcc C21 = GND Steuerleitung = P1.1 = C13 ;Programm: ;T2 startet Programm - TIMER0 Reload-Betrieb Zeitdauer RELOAD_T0 Periodendauer ;Nach nI n Interrupts von RELOAD_T0 wird der 16-Bit Wert im Compareregister erhoeht ;oder erniedrigt sobald der Wert RE Rechter Endwert oder LI Linker Endwert erreicht ist erfolgt ;Umkehr. ;Ermittelte Werte oben - unten ;Oben: FDA0h ;Unten: F820h ;Erstellt am: Sonntag, 3. Juni 2007 14:08:19 ;Programmiert: J. Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Sonntag, 3. Juni 2007 14:08:19 ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ RELOAD_T0 EQU 256-152 ;Reload-Wert Timer 0 nI EQU 3 Periode_low EQU 0E0H ;legt die Periodendauer von Timer 2 fest 20ms Periode_high EQU 0B1H ;45536 = 0B1E0H PWMANL EQU 0B8H ;Compare Wert 2ms => 18 ms PWMANH EQU 0FAH ;Compare Wert F830H UEL EQU 0F0h ;Unterer Endwert UEH EQU 0F7h OEL EQU 080h ;Oberer Endwert OEH EQU 0FDh CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 0Bh call ISR_TIMER_0 ;Interrupt Timer 0 reti ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: mov TMOD,#00000010B ;Timer 0 Autoreload mov TH0,#RELOAD_T0 mov IEN0,#00010010B ;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 ;------------------------------------------------------------------------ ABFRAGE: jnb P1.2,LOS_GEHTS ;Start jnb P1.3,STOP ;Stop jmp ABFRAGE LOS_GEHTS: mov R2,#nI ;Anzahl Interrupts T0 setb F0 ;F0=1 aufwaerts zuerst aufwaerts setb EAL ;Interrupt freigeben jmp ABFRAGE STOP: clr EAL ;Interrupt sperren jmp ABFRAGE ISR_TIMER_0: ;------------------------------------------------------------------------ ;Wieviele Interrupts? ;------------------------------------------------------------------------ djnz R2,NOCH_NICHTN ;keine n Interrupts ;------------------------------------------------------------------------ ;F0=1 --> Aufwaerts --> ABFRAGE CC1 kleiner RE ;------------------------------------------------------------------------ jnb F0,ABWAERTS ;F0=0-->ABWAERTS mov A,CCH1 ;ABFRAGE - High Byte CC1 in Akku cjne A,#OEH,ZU_KLEIN ;CC1 kleiner als RE=FE0Ch, dann aufwaerts mov A,CCL1 cjne A,#OEL,ZU_KLEIN clr F0 jmp NOCH_NICHTN ;------------------------------------------------------------------------ ;CC1 erhoehen ;------------------------------------------------------------------------ ZU_KLEIN: ;CC1 wird um 1 erhoeht mov A,CCL1 ;CC1L +1 clr C ;Carry auf 0 setzen add A,#1 ;Inhalt von CC1L +1 mov CCL1,A ; mov A,CCH1 ;Inhalt von CC1H + Carry addc A,#0 mov CCH1,A mov R2,#nI ;Zaehlregister neu laden jb F0,NOCH_NICHTN ;FLAG aufwaerts F0 ABWAERTS: ;------------------------------------------------------------------------ ;CC1 - Wert groesser Linker Endwert ? ;------------------------------------------------------------------------ mov A,CCH1 ;AFRAGE - CC1 groesser LE cjne A,#UEH,ZU_GROSS mov A,CCL1 cjne A,#UEL,ZU_GROSS setb F0 ;wieder aufwaerts jmp NOCH_NICHTN ;------------------------------------------------------------------------ ;CC1 - 1 ;------------------------------------------------------------------------ ZU_GROSS: mov A,CCL1 ;CC1-1 clr C subb A,#1 mov CCL1,A mov A,CCH1 subb A,#0 mov CCH1,A mov R2,#nI ;Zaehlregister neu laden NOCH_NICHTN: ret end