$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 (DRAIS_3C.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ; PDL: ; Programm: DRAIS_2A + 10ms Entprellen mit Timer 2 + 5s warten nach Fahrer ; HARDWARE: ; T1 liegt an CEX0 ; Es wird die Zeit zwischen vier Tastendrücken von T1 gemessen. ; T3 Ein neuer Messzyklus kann gestartet werden. ; Hardware: VC_2 ; Sysclock: 3 MHz ; 1.Runde 2.Runde 3.Runde STOPP ; T1 ------|_|------------|_|-------|_|-------|_|------- ; ; Die fallende Flanke von T1 startet die Zaehlung ; Der PCA-Interrupt zaehlt mit den Registern 3,2 die Anzahl der Ueberlaufe ; Sysclk 3 MHz ; Zeit Runde 1 - 3 = PCA0_T1 - PCA0_T2 + R3,R2-1 ; -1 da bereits beim Start das Register R2 um 1 erhoeht wird ; ; ZeitMAX=< 2^n n=32 Bit --> 2^32*(1/750kHz) = ca. 5727 s = 95,4 min= 1h 35,4 Min ; Die Zeitberechnung: ; ; Danach wird der PCA0-Zahler gestoppt ; ; Die Anzahl der Überlaeufe wird über Interrupt ; gezaehlt und in R2,R3 gespeichert. ; SPEICHERUNG: der Werte im externen Speicher ;X:0x0000: 0.-Byte Fahrer Nr. ;X:0x0001: 1.-Byte Runde Nr. ;X:0x0002: 0.-Byte Zaehlerstand ;X:0x0003: 1.-Byte Zaehlerstand ;X:0x0004: 2.-Byte Zaehlerstand ;X:0x0005: 3.-Byte Zaehlerstand ;............ ;X:0x0010: 2.-Byte Zaehlerstand ;X:0x0011: 3.-Byte Zaehlerstand ; ; PDL ; Initialisierung mit Configuration Wizard; ; Drei Zustaende ; Auf Messung Warten F0=0 ; Messung laeuft F0=1 ; Messung stoppen ; ; ;Erstellt am: Samstag, 23. Januar 2010 12:43:43 ;Programmiert: Juergen Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;PCA0L=LB ;PCA0H=HB ;R2=LB ;R3=HB ;4-Byte-Wert Zeit=PCA0L - PCA0H - R2 - R3 ;R4 = Rundenzaehler 1-3 - Impulszaehler = R4=4 ;Kommentar: ; ;Aenderungen: ;Geaendert am: Samstag, 23. Januar 2010 12:43:43 ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 05BH call ISR_PCA0 RETI ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: call Init_Device ;Aufruf zur Initialisierung der Controller Funktionen call X_LOESCH ;Speicherzellen X:0x0000 - X:0x00011 werden auf 0 gesetzt mov DPTR,#0h ;Datenpointer auf 0000h mov R2,#0 ;LB Interrupt-Zaehler mov R3,#0 ;HB Interrupt-Zaehler mov R4,#0 ;Runden Nr mov R5,#3 ;Zaehlregister für die Rundenanzahl mov R6,#228 ;=5s/22ms clr F0 ;Messung laeuft --> F0=1 clr P3.2 ;Leuchtdioden setb P3.3 setb P3.4 ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jnb P1.3, INIT ;Warteschleife jmp ABFRAGE ;Nach ABFRAGE ;------------------------------------------------------------------------ ;PCA-Interrupt ;------------------------------------------------------------------------ ISR_PCA0: ;Welcher Interrupt? 1. Start 2. Ueberlauf 3. Kontaktmatte jb F0,UEBERLAEUFE_PCA0 ;F0 = 0 falls T1 nicht zuvor betaetigt F0=1 Messung laeuft jnb CCF0,NUR_SCHARF ;T1 betaetigt? War das der Beginn der Messung? ;ENTPRELLEN call WARTEN_10MS jb P1.1,WARTEN_NOK ;war keine 10ms betaetigt ; 1. START setb CR ;PCA-Timer laeuft setb F0 ;Flag F0 Messung laueft setb P3.2 ;Leuchtdioden clr P3.3 setb P3.4 ;MESSUNG LAEUFT clr CCF0 ;Fallende Flanke T1 bestaetigt WARTEN_NOK: RET ;2. UEBERLAUF UEBERLAEUFE_PCA0: jb CCF0,WERT_WRn ;Falls fallende Flanke T1 clr CF ;Ueberlauf Interrupt erkannt djnz R6,NOCH_KEINE5s ;Fuer den Fahrer 5s warten setb 20H.0 ;20H.0 NOCH_KEINE5s: call UEBERLAEUFE_ZAEHLEN jmp NUR_SCHARF ;3. KONTAKTMATTE WERT_WRn: clr CCF0 ;Fallende Flanke T1 bestaetigen call WARTEN_10MS jb P1.1,NUR_SCHARF ;P1.1 war keine 10ms auf 0 jnb 20H.0,NUR_SCHARF ;noch keine 5s fuer den Fahrer 1 abgelaufen clr 20H.0 ;Flag für 5s zuruecksetzen mov R6,#228 ;Um neue 5s zu ueberprüfen call WR_ZAEHLERSTAND ; jnb CF,NUR_SCHARF ;ist auch Ueberlauf PCA0 aufgetreten? clr CF ;Falls zwischenzeitlich oder vorher aufgetreten call UEBERLAEUFE_ZAEHLEN NUR_SCHARF: ret UEBERLAEUFE_ZAEHLEN: clr C ;Carry null setzen mov A,R2 ;LB in Akku add A,#1 ;1 addieren mov R2,A ;LB in R2 zurueck jnc KEIN_UEBERTRAG ;R3 erhaelt keinen Uebertrag inc R3 ;Uebertrag trat auf KEIN_UEBERTRAG: RET WR_ZAEHLERSTAND: clr CCF0 ; mov A,#1 ;Fahrer 1 movx @DPTR,A ;0000H - Fahrer 1 inc DPTR ; inc R4 ;0001H in R4 die Runden-Nr. mov A,R4 movx @DPTR,A ; inc DPTR mov A,PCA0CPL0 ;0002H - PCA0L movx @DPTR,A ; inc DPTR mov A,PCA0CPH0 ;0003H - PCA0H movx @DPTR,A inc DPTR ;DPTR erhoehen mov A,R2 ;0004H - R2 movx @DPTR,A ; inc DPTR mov A,R3 ;0005H - R3 movx @DPTR,A ; inc DPTR djnz R5,MESSUNG_NB ;Messung nicht beendet clr CR ;PCA0-Zaehler STOPP setb P3.2 ;MESSUNG BEENDET setb P3.3 clr P3.4 MESSUNG_NB: RET WARTEN_10MS: setb TR2 ;TIMER2 rennt los jnb TF2H,$ ;10ms vorbei? clr TR2 ;Timer STOPP clr TF2H ret X_LOESCH: mov A,#0 ;mit 0 wird ueberschrieben mov DPTR,#0 ;Datenpointer mov R2,#12H ;Anzahl der Werte - 11H Damit ersichtlich SCHLEIFE_X: movx @DPTR,A ; inc DPTR djnz R2,SCHLEIFE_X ;Bereits 12h Werte? ret ;------------------------------------ ;- Generated Initialization File -- ;------------------------------------ ; Peripheral specific initialization functions, ; Called from the Init_Device label PCA_Init: anl PCA0MD, #0BFh mov PCA0MD, #003h mov PCA0CPM0, #011h ret Timer_Init: mov CKCON, #010h mov TMR2RLL, #0B2h mov TMR2RLH, #08Ah mov TMR2L, #0B2h mov TMR2H, #08Ah 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 - Skipped, Push-Pull, Digital ; P1.1 - CEX0 (PCA), Push-Pull, Digital ; P1.2 - Unassigned, Push-Pull, Digital ; P1.3 - Unassigned, Push-Pull, Digital ; P1.4 - Unassigned, Push-Pull, Digital ; P1.5 - Skipped, Push-Pull, Digital ; P1.6 - Skipped, Push-Pull, Digital ; P1.7 - Skipped, Push-Pull, Digital ; P2.0 - Skipped, Push-Pull, Digital ; P2.1 - Skipped, Push-Pull, Digital ; P2.2 - Skipped, Push-Pull, Digital ; P2.3 - Skipped, Push-Pull, Digital ; P2.4 - Skipped, Push-Pull, Digital ; P2.5 - Skipped, Push-Pull, Digital ; P2.6 - Skipped, Push-Pull, Digital ; P2.7 - Skipped, Push-Pull, Digital ; P3.0 - Skipped, Push-Pull, Digital ; P3.1 - Skipped, Push-Pull, Digital ; P3.2 - Skipped, Push-Pull, Digital ; P3.3 - Skipped, Push-Pull, Digital ; P3.4 - Unassigned, Push-Pull, Digital ; P3.5 - Unassigned, Push-Pull, Digital ; P3.6 - Unassigned, Push-Pull, Digital ; P3.7 - Unassigned, Push-Pull, Digital mov P0MDOUT, #0FFh mov P1MDOUT, #0FFh mov P2MDOUT, #0FFh mov P3MDOUT, #0FFh mov P0SKIP, #0FFh mov P1SKIP, #0E1h mov P2SKIP, #0FFh mov P3SKIP, #00Fh mov XBR1, #041h ret Oscillator_Init: mov OSCICN, #081h ret Interrupts_Init: mov EIE1, #010h mov IT01CF, #010h mov IE, #080h 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