Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Interrupts von P1H Kategorie: Progr. Assembler, TaskingTools, OS (von pauli - 17.11.2007 18:40)
Ich nutze:
C-Control II Unit, CC2-Application-Board
Hallo!

Ich möchte das Signal von einem Modellbau Empfänger (3 Kanäle) in Assembler auswerten.
Das Impulslänge liegt zwischen 0.7 n und 2.5 ms.
Momentan löse ich das Problem über polling was aber zu ungenau ist.

Hier ein Auszug:


;***************************************************
; register mapping
;      r11     =scan counter for channel 1
;      r12     =scan counter for channel 2
;      r13     =scan counter for channel 3
                public  getPulseLength

getPulseLength        proc far

                push    r1
                push    r4
                push    r5
                push    r6
                push    r7
                push    r11
                push    r12
                push    r13

                CALLS   OSsegment,POP_R4
                bclr IEN

                mov     r5,#0  
                mov     r6,#0  
                mov     r7,#0  
                ;initialize the pulse length counter for each channel
                mov     r11,#0  
                mov     r12,#0  
                mov     r13,#0  
;stepchain:
;0=wait for low
;1=wait for high
;2=scan high
;3=finished
scanLoop:
                ;jumptable for ch1
                cmp     r5,#0
                jmpr    cc_EQ,ch1WaitForLow
                cmp     r5,#1
                jmpr    cc_EQ,ch1WaitForHigh
                cmp     r5,#2
                jmpr    cc_EQ,ch1Scan
                cmp     r5,#3
                jmpr    cc_EQ,ch1End

                jmpr    cc_UC,scanFinished      ;must NOT happen!!
ch1WaitForLow:                  
                jb      P1H.0,ch1End
                mov     r5,#1
                jmpr    cc_UC,ch1End
ch1WaitForHigh:
                jnb     P1H.0,ch1End
                mov     r5,#2
                jmpr    cc_UC,ch1End
ch1Scan:
                add     r11,#1
                jb      P1H.0,ch1End
                mov     r5,#3
ch1End:
                ;jumptable for ch2
                cmp     r6,#0
                jmpr    cc_EQ,ch2WaitForLow
                cmp     r6,#1
                jmpr    cc_EQ,ch2WaitForHigh
                cmp     r6,#2
                jmpr    cc_EQ,ch2Scan
                cmp     r6,#3
                jmpr    cc_EQ,ch2End

                jmpr    cc_UC,scanFinished      ;must NOT happen!!
ch2WaitForLow:                  
                jb      P1H.1,ch2End
                mov     r6,#1
                jmpr    cc_UC,ch2End
ch2WaitForHigh:
                jnb     P1H.1,ch2End
                mov     r6,#2
                jmpr    cc_UC,ch2End
ch2Scan:
                add     r12,#1
                jb      P1H.1,ch2End
                mov     r6,#3
ch2End:
                ;jumptable for ch3
                cmp     r7,#0
                jmpr    cc_EQ,ch3WaitForLow
                cmp     r7,#1
                jmpr    cc_EQ,ch3WaitForHigh
                cmp     r7,#2
                jmpr    cc_EQ,ch3Scan
                cmp     r7,#3
                jmpr    cc_EQ,ch3End

                jmpr    cc_UC,scanFinished      ;must NOT happen!!
ch3WaitForLow:                  
                jb      P1H.3,ch3End
                mov     r7,#1
                jmpr    cc_UC,ch3End
ch3WaitForHigh:
                jnb     P1H.3,ch3End
                mov     r7,#2
                jmpr    cc_UC,ch3End
ch3Scan:
                add     r13,#1
                jb      P1H.3,ch3End
                mov     r7,#3
ch3End:
                ;check if all channels are finished
                cmp     r5,#3
                jmpr    cc_NE,scanLoop
                cmp     r6,#3
                jmpr    cc_NE,scanLoop
                cmp     r7,#3
                jmpr    cc_NE,scanLoop
scanFinished:



Diese Lösung ist ungenau und verbrät wertvolle CPU, daher muss ich das über Interrupts lösen.
Meine Frage ist nun wie ich auf steigende und fallende Flanke von P1H.0-3 per Interrupt reagieren kann.
Dabei soll auch die Zeit von einem hochauflösenden Timer erfasst werden.
Gleichzeitig muss auch die Ausgabe vom PWM Signale an allen 3 PWM ports zur verfügung stehen.
Ich hoffe die Hardware kann das...

Ich würde also um folgenden Beispiel Code bitten:
Konfiguration der Interrupts auf steigende und fallende Flanke.
Starten eines Hochauflösenden Timers.
Reaktion auf den Interrupt in Assembler und auslesen vom Timer.



Danach würde ich in C2 die Daten aus 0FD02 - 0FD07 auslesen ,mit dem Analogwert
von einem SMM Element mischen und an die Servos per PWM ausgeben.
Es soll in einem Modellhubschrauber die Paddelstange ersetzt werden.
Ein erster Startversuch heute hat gezeigt dass das System zu langsam und ungenau ist,
 was vom pollen kommt.

Danke, lg pauli!


    Antwort schreiben


Antworten: