$NOMOD51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(C8051F320.inc) ;die C8051F340-spezifischen Daten $list ;es wird ein Listing erstellt $title (STOPPUHR_A2.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ; PDL: ; Programm: ZEIT_T1_T2 ; Es wird die Zeit zwischen zwei Tastendrücken gemessen. ; T3 Ein neuer Messzyklus kann gestartet werden. ; Hardware: VC_2 ; Sysclock: 3 MHz ; ; T1 ------|__________|------------ ; T2 ---------------------------|__________|------------ ; ; Die fallende Flanke von T1 startet die Zaehlung ; Die fallende Flanke von T2 loest eine Uebernahme der PCA0-Daten aus uns stoppt den Zaehler. ; Der PCA-Interrupt zaehlt mit den Registern 3,2 die Anzahl der Ueberlaufe ; Sysclk 3 MHz ; Zeit = 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/3MHz) = ca. 1431,6 s = ca. 23,86 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 Zaehlerstand ;X:0x0001: 1.-Byte Zaehlerstand ;X:0x0002: 2.-Byte Zaehlerstand ;X:0x0003: 3.-Byte Zaehlerstand ; 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) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Samstag, 23. Januar 2010 12:43:43 ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h anl PCA0MD,#0BFh ; WDTE = 0 schaltet Watchdog aus 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:0x0003 werden auf 0 gesetzt mov DPTR,#0h ;Datenpointer auf 0000h mov R2,#0 ;LB Interrupt-Zaehler mov R3,#0 ;HB Interrupt-Zaehler 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? jb F0,UEBERLAEUFE_PCA0 ;F0 = 0 falls T1 nicht zuvor betaetigt jnb CCF1,NUR_SCHARF ;T1 betaetigt? War das der Beginn der Messung? setb CR ;PCA-Timer laeuft setb F0 ;Flag F0 Messung laueft setb P3.2 ;Leuchtdioden clr P3.3 setb P3.4 clr CCF1 ;Fallende Flanke T1 trat auf UEBERLAEUFE_PCA0: jnb CF,TASTER_2 ;Falls fallende Flanke T2 clr CF ;Ueberlauf Interrupt erkannt ;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 TASTER_2 ;R3 erhaelt keinen Uebertrag inc R3 ;Uebertrag trat auf TASTER_2: jnb CCF2,NUR_SCHARF clr CCF2 ;Flag zuruecksetzen - Interrupt quittieren call WR_ZAEHLERSTAND_2 clr CR NUR_SCHARF: ret WR_ZAEHLERSTAND_2: mov A,PCA0CPL2 ;0000H - PCA0L movx @DPTR,A ; inc DPTR mov A,PCA0CPH2 ;0001H - PCA0H movx @DPTR,A inc DPTR ;DPTR erhoehen mov A,R2 ;0002H - R2 movx @DPTR,A ; inc DPTR mov A,R3 ;0003H - R3 movx @DPTR,A ; inc DPTR setb P3.2 ;Leuchtdioden setb P3.3 clr P3.4 RET X_LOESCH: mov A,#0 ;mit 0 wird ueberschrieben mov DPTR,#0 ;Datenpointer mov R2,#4 ;Anzahl der Werte SCHLEIFE_X: movx @DPTR,A ; X:0x0000 inc DPTR djnz R2,SCHLEIFE_X ;Bereits 4 Werte? ret ;----------------------------------------------------------- ;- Generated Initialization File ZEIT_T1_T2CWG -- ;----------------------------------------------------------- PCA_Init: anl PCA0MD, #0BFh mov PCA0MD, #009h mov PCA0CPM1, #011h mov PCA0CPM2, #011h mov PCA0CPM4, #0C2h ret Port_IO_Init: ; P0.0 - Skipped, Open-Drain, Digital ; P0.1 - Skipped, Open-Drain, Digital ; P0.2 - Skipped, Open-Drain, Digital ; P0.3 - Skipped, Open-Drain, Digital ; P0.4 - Skipped, Open-Drain, Digital ; P0.5 - Skipped, Open-Drain, Digital ; P0.6 - Skipped, Open-Drain, Digital ; P0.7 - Skipped, Open-Drain, Digital ; P1.0 - CEX0 (PCA), Open-Drain, Digital ; P1.1 - CEX1 (PCA), Push-Pull, Digital ; P1.2 - CEX2 (PCA), Open-Drain, Digital ; P1.3 - Unassigned, Open-Drain, Digital ; P1.4 - Unassigned, Open-Drain, Digital ; P1.5 - Unassigned, Open-Drain, Digital ; P1.6 - Unassigned, Open-Drain, Digital ; P1.7 - Unassigned, Open-Drain, 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 P1MDOUT, #002h mov P0SKIP, #0FFh mov XBR1, #043h ret Oscillator_Init: ;mov OSCICN, #081h ;PROGRAMMIERUNG AUF 3 MHZ FEHLER CPU CLOCK ret Interrupts_Init: mov EIE1, #010h mov IE, #080h ret ; Initialization function for device, ; Call Init_Device from your main program Init_Device: lcall PCA_Init lcall Port_IO_Init lcall Oscillator_Init lcall Interrupts_Init ret end