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

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
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)