Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Periodenmessung

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Assembler
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Michael



Anmeldungsdatum: 28.12.2005
Beiträge: 1

BeitragVerfasst am: 28. Dez 2005 10:08    Titel: Periodenmessung Antworten mit Zitat

Hallo smile
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 ??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Assembler Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen