Michael
Anmeldungsdatum: 28.12.2005 Beiträge: 1
|
Verfasst am: 28. Dez 2005 10:08 Titel: Periodenmessung |
|
|
Hallo
Bin ein Neuling in der Programmierung 8051 und habe Probleme !
Das Programm sollte die Periode eines Signals (15 bis 25ms) messen und über den Analogausgang DAC0 ausgeben. Die Messung erfolgt über CCF0 mit positiver und über CCF1 mit negativer Flanke ; wollte dann die Messung PERIODE_A mit PERIODE_B addieren und dann (/2) ausgeben.
Problem 1: Die Messung PERIODE_A hat ca. alle 250ms einen undefinierbaren Wert
Problem 2: Die Messung PERIODE_B ist extrem unstabil und wurde derzeit nicht benützt
Problem 3: Die Impulse 1Hz und 10Hz (derzeit noch nicht verwendet) funktionieren nicht (Interrupt CCF2 wird anscheinend nicht abgearbeitet !)
;---------------------------------------------
;Periodenmessung
;---------------------------------------------
$include (c8051F020.inc)
PCA_Init:
mov PCA0CN, #040h
mov PCA0MD, #002h
mov PCA0CPM0, #021h
mov PCA0CPM1, #011h
mov PCA0CPM2, #049h
mov PCA0CPL2, #050h
mov PCA0CPH2, #0C3h
DAC_Init:
mov DAC0CN, #080h
Voltage_Reference_Init:
mov REF0CN, #003h
Port_IO_Init:
mov P2MDOUT, #0FFh
mov P3MDOUT, #0FFh
mov XBR0, #010h
mov XBR2, #0C0h
Oscillator_Init:
mov OSCICN, #005h
Interrupts_Init:
mov EIE1, #008h
mov EIP1, #008h
mov IE, #080h ;Enable Interrupts
;Definition der Variablen
CAPT_PeriodA DATA 30H
PERIOD_A DATA 32H ;Periodendauer gemessen mit positiver Flanke (2Byte)
CAPT_PeriodB DATA 34H
PERIOD_B DATA 36H ;Periodendauer gemessen mit negativer Flanke (2Byte)
Count DATA 38H
PCA_Val DATA 40H ;PCA Counterwert
FLAG_A BIT 20H.0
FLAG_B BIT 20H.1
Takt_10Hz BIT 20H.5 ;Taktimpulse 10Hz
Takt_1Hz BIT 20H.3 ;Taktimpulse 1Hz
SWITCH BIT P0.3
MOV Count,#10d
;********* Hauptprogramm *********************
;
; Testprogramm
MAIN:
CLR C ;Periodenmessung_B ausgeben
MOV A,#00h
SUBB A,PERIOD_A
MOV DAC0L,A
MOV A,#58h
SUBB A,PERIOD_A+1
MOV DAC0H,A ;Output Messwert ueber DAC0
JNB SWITCH,Test
MOV P2,DAC0L ;Testausgabe Port P2+3
MOV P3,DAC0H
JMP MAIN
Test:
MOV P2,Count
MOV P3,20h
JMP MAIN
;********* Ende Hauptprogramm ****************
;********* Interrupt Routinen ****************
;---------------------------------------------
; RESET AND INTERRUPT VECTOR TABLE
;---------------------------------------------
CSEG
ORG 04Bh ; PCA Verctor programmable counter array
ljmp PCA_ISR ; PCA Interrupt Service Routine
PCA_ISR: MOV PCA_Val,PCA0L ; PCA Counterwert Speichern
MOV PCA_Val+1,PCA0H
PUSH ACC ; Programmstatuswort und ACC ablegen
PUSH PSW
Routine_CCF0: JNB CCF0,Routine_CCF1 ; Periodenmessung positive Flanke
CLR CCF0
JB FLAG_A,CAPTURE_A2
CAPTURE_A1: MOV CAPT_PeriodA,PCA_Val
MOV CAPT_PeriodA+1,PCA_Val+1
SETB FLAG_A
JMP Routine_CCF1
CAPTURE_A2: CLR C
MOV A,PCA_Val
SUBB A,CAPT_PeriodA
MOV PERIOD_A,A
MOV A,PCA_Val+1
SUBB A,CAPT_PeriodA+1
MOV PERIOD_A+1,A
CLR FLAG_A
Routine_CCF1: JNB CCF1,Routine_CCF2 ; Periodenmessung negative Flanke
CLR CCF1
JB FLAG_B,CAPTURE_B2
CAPTURE_B1: MOV CAPT_PeriodB,PCA_Val
MOV CAPT_PeriodB+1,PCA_Val+1
SETB FLAG_B
JMP Routine_CCF2
CAPTURE_B2: CLR C
MOV A,PCA_Val
SUBB A,CAPT_PeriodB
MOV PERIOD_B,A
MOV A,PCA_Val+1
SUBB A,CAPT_PeriodB+1
MOV PERIOD_B+1,A
CLR FLAG_B
Routine_CCF2: JNB CCF2,Routine_CCF3 ; Taktgenerator Clk1Hz Clk10Hz
CLR CCF2
DJNZ Count,Clock2
MOV Count,#10d
JB Takt_10Hz,Clock1
SETB Takt_10Hz
JMP Clock2
Clock1: CLR Takt_10Hz
Clock2: JB Takt_1Hz,Clock3
SETB Takt_1Hz
JMP Routine_CCF3
Clock3: CLR Takt_1Hz
Routine_CCF3:
POP PSW
POP ACC
RETI
;********* Ende Interrupt Poutinen ***********
end
Kann mir jemand sagen wo der (die) Fehler liegt ?? |
|