$NOMOD51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(C8051F340.inc) ;die C8051F340-spezifischen Daten $list ;es wird ein Listing erstellt $title (P08_MCWS08.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: ;T2 Duty Cycle in ca. 2s von 0% auf 100% ;T3 Duty Cycle ab ca. 2s von 100% auf 0% ;Ueberlegung: Alle 21,8 ms wird ein Interrupt erzeugt --> 46,7 Interrupts ;ergeben eine Sekunde 91,5 Interrupts ergeben 2 Sekunden ; 91 Interrupts werden gezaehlt --> 65536/91 = 720 ; Es wird das Compareregister von 0 91 mal um jeweils 720 erhoeht. ; Es wird das Compareregister von 65535 91 mal um jeweils 720 erniedrigt. ; Duty-Cycle ca. 0% ist durch Test entstanden ;Erstellt am: Freitag, 10. August 2007 09:36:16 ;Programmiert: ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Freitag, 10. August 2007 09:36:16 ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ INC_DUTY_L EQU 0D0h ;Low Byte von 720 INC_DUTY_H EQU 002h ;High Byte von 720 CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 05Bh clr CF ;Counter Flag quittieren call ISR_PCA ;Interrupt Service Routine aufrufen reti ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: call Init_Device ;Aufruf der Initialisierung ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: mov C,P1.1 ;Kopieren des Ausgangsports mov P3.2,C mov P3.3,C mov P3.4,C jnb P1.2,FLANKE_AUF ;Flanke spaeter jnb P1.3,FLANKE_AB ;Flanke frueher jmp ABFRAGE ;Warteschleife ;Init Duty-Cycle kleiner = Flanke spaeter ;Init Duty-Cycle groesser = Flanke frueher FLANKE_AUF: setb F0 ;F0 Flag 1=AUF mov R2,#92 ;Zaehlregister laden mov PCA0L, #000h ;PCA0 initialisieren mov PCA0H, #000h mov PCA0CPL1, #000h ;PCA0CP Compare initialisieren mov PCA0CPH1, #000h setb EA ;Interrupts freigeben jmp ABFRAGE FLANKE_AB: clr F0 ;F0 Flag 0=AB mov R2,#92 ;Zaehlregister laden mov PCA0CPL1, #0F9h ;PCA0CP Compare initialisieren mov PCA0CPH1, #0FFh ;9 im Low-Byte damit kein "Aufblinken" ;Durch Tests ermittelt setb EA ;Interrupts freigeben jmp ABFRAGE ;Entscheidung - ISR - Flanke auf oder ab? ISR_PCA: jnb F0,AB_FERTIG ;F0 = 0 dann nach AB djnz R2,WEITER_AUF ;Ist AUF fertig? clr F0 ;F0 Flag zuruecksetzen clr EA ;Interrupts sperren ret AB_FERTIG: djnz R2,WEITER_AB ;Ist AB fertig? setb F0 ;Jetzt kann wieder AUF kommen clr EA ;Interrupts sperren ret WEITER_AUF: mov A,PCA0CPL1 ;Compare P1.1 Low Byte in Akku clr C add A,#INC_DUTY_L ;Addieren mit Carry mov PCA0CPL1,A ;wieder zurueck mov A,PCA0CPH1 ;HB addc A,#INC_DUTY_H ;Carry und High Byte 720 addieren mov PCA0CPH1,A ;wieder zurueck ret WEITER_AB: mov A,PCA0CPL1 ;Compare P1.1 Low Byte in Akku clr C subb A,#INC_DUTY_L ;Subtrahieren mit Carry mov PCA0CPL1,A ;wieder zurueck mov A,PCA0CPH1 ;HB subb A,#INC_DUTY_H ;Carry + High Byte 720 subtrahieren mov PCA0CPH1,A ;wieder zurueck ret ; Peripheral specific initialization functions, ; Called from the Init_Device label ; ;PCA-Clck 3 MHz --> 1/3 MHz*65536=21,8453 ms Periodendauer ; PCA_Init: mov PCA0CN, #040h ; PCA0 control anl PCA0MD, #0BFh ; PCA0 mode mov PCA0MD, #003h mov PCA0CPM1, #0C2h mov PCA0L, #000h mov PCA0H, #000h mov PCA0CPL1, #000h mov PCA0CPH1, #000h ret Timer_Init: mov TMOD, #011h mov CKCON, #002h ret Port_IO_Init: ; P0.0 - Skipped, Push-Pull, Digital ; P0.1 - Skipped, Push-Pull, Digital ; P0.2 - Skipped, Push-Pull, Digital ; P0.3 - Skipped, Push-Pull, Digital ; P0.4 - Skipped, Push-Pull, Digital ; P0.5 - Skipped, Push-Pull, Digital ; P0.6 - Skipped, Push-Pull, Digital ; P0.7 - Skipped, Push-Pull, Digital ; P1.0 - CEX0 (PCA), Push-Pull, Digital ; P1.1 - CEX1 (PCA), Push-Pull, Digital ; P1.2 - CEX2 (PCA), Push-Pull, Digital ; P1.3 - CEX3 (PCA), Push-Pull, Digital ; P1.4 - CEX4 (PCA), Push-Pull, Digital ; P1.5 - T0 (Timr0), Push-Pull, Digital ; P1.6 - T1 (Timr1), Push-Pull, Digital ; P1.7 - Unassigned, Push-Pull, Digital ; P2.0 - Unassigned, Open-Drain, Digital ; P2.1 - Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digital ; P2.4 - Unassigned, Open-Drain, Digital ; P2.5 - Unassigned, Open-Drain, Digital ; P2.6 - Unassigned, Open-Drain, Digital ; P2.7 - Unassigned, Open-Drain, Digital ; P3.0 - Unassigned, Open-Drain, Digital ; P3.1 - Unassigned, Open-Drain, Digital ; P3.2 - Unassigned, Open-Drain, Digital ; P3.3 - Unassigned, Open-Drain, Digital ; P3.4 - Unassigned, Open-Drain, Digital ; P3.5 - Unassigned, Open-Drain, Digital ; P3.6 - Unassigned, Open-Drain, Digital ; P3.7 - Unassigned, Open-Drain, Digital mov P0MDOUT, #0FFh mov P1MDOUT, #0FFh mov P0SKIP, #0FFh mov XBR1, #075h ret Oscillator_Init: mov OSCICN, #083h mov CLKMUL, #080h clr A ; Wait 5us for initialization djnz ACC, $ orl CLKMUL, #0C0h Osc_Wait2: mov A, CLKMUL jnb ACC.5, Osc_Wait2 ret Interrupts_Init: mov EIE1, #010h mov IT01CF, #010h mov IE, #000h ret ; Initialization function for device, ; Call Init_Device from your main program Init_Device: lcall PCA_Init lcall Timer_Init lcall Port_IO_Init lcall Oscillator_Init lcall Interrupts_Init ret end