Re: schnelles SPI Kategorie: Progr. Assembler, TaskingTools, OS (von André H. - 14.05.2006 16:02) | ||
Als Antwort auf Re: schnelles SPI von Michael - 2.05.2006 22:37 | ||
| ||
Hallo Micha, > dank erst mal für deine schnelle Beantwortung meiner Frage. Ich hab zwar zum Assembler noch > keinen Draht, werde mich aber mit dem Tasking-Tool beschäftigen. > (hoffe dass ich damit klar komme ;-) ). > Wenn ich das korrekt lese stehen die UP`s auf Adresse 0765AH und 075D6H Nein. Das sind die Adressen der OS-seitigen Integer-Stackoperationen. Damit werden Werte vom Threadstack geholt, bzw. darauf geschoben. Die einsprungadresse und das Segment (1, 2 oder 3) legst Du selber fest bzw. mu�t Du aus dem Listing (*.lst-Datei nach dem Assemblieren) entnehmen. Das von mir gepostete Beispiel ist nicht ganz komplett, sondern enthält nur die Routinen ohne Assembler-Infos. Hier die komplette ASM-Datei, die assemblierbar ist: $segmented $model(medium) $extend $nomod166 $stdnames(reg164ci.def) $NOLOCALS regdef R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15 ;non-used Regs by I²C-Subs: R3, R5, R8, R9, R10, R11, ((R14), R15) ;************************************************************************************************************** ; P1L.0 CC60IO DI ; P1L.1 COUT60 DO ; P1L.2 CC61IO CLK ; P1L.3 COUT61 CS ; P1L.4 CC62IO ; P1L.5 COUT62 ; P1L.6 COUT63 ; P1L.7 CTRAP ; P1H.0 CC6POS0 ; P1H.1 CC6POS1 ; P1H.2 CC6POS2 ; P1H.3 T7IN ; P1H.4 CC24IO ; P1H.5 CC25IO ; P1H.6 CC26IO ; P1H.7 CC27IO P1L_ EQU 0FF04h ; Definition der OS-Routinen OSsegment EQU 0 POP_R4 EQU 0765AH ;uses: R4, R12, R13, R14 PUSH_R12 EQU 075D6H ;uses: R1, R2, R12, R13,R14,R15 POP_LONG EQU 07680H ;return in R4, R5 PUSH_LONG EQU 075fEH ;Value in R12, R13 userseg SECTION CODE word at 30000h ; Segment 3, Adresse 0000h assume dpp3:userseg ;************************************************************************************************************ ; Byte schreiben SPI wrbyte proc far CALLS OSsegment,POP_R4 ;data MOVB RH4, RL4 MOV R13,#0h _1: ;for i=0 ... 7 ROL R4, #1 BMOV COUT60,C BCLR CC61IO ; Clock BSET CC61IO CMPI1 R13,#07h JMPR cc_SLT,_1 ; next for; jump if R13 < 0x07 BSET COUT60 POP R1 POP R1 RETS wrbyte endp ; Byte lesen SPI rdbyte proc far MOV R12,#0 MOV R13,#0h _2: ;for i=0 ... 7 BCLR CC61IO ; Clock SHL R12, #1 BMOV R12.0,CC60IO BSET CC61IO CMPI1 R13,#07h JMPR cc_SLT,_2 ; next for; jump if R13 < 0x07 CALLS OSsegment,PUSH_R12 ;state POP R1 POP R1 RETS rdbyte endp userseg ENDS END > Wie rufe ich diese Unterprogramm dann korrekt auf? Ohne Parameterübergabe geht das mit system.call(). Mit Parameterübergabe mu� Du eigene Funktionen schreiben: inline function wrByte(int data) { inline vmcodes.VM_INLINE_SYSCALL + 0x300;// 0x300 = Segment 3 inline 0; // Offset Einsprungadresse } inline function rdByte() returns int { inline vmcodes.VM_INLINE_SYSCALL + 0x300; inline 0x1E; // Offset Einsprungadresse } MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: schnelles SPI (von Michael - 8.06.2006 20:03) |