Interrupts von P1H Kategorie: Progr. Assembler, TaskingTools, OS (von pauli - 17.11.2007 18:40) | ||
| ||
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: |