Forum: Mikrocontroller und Digitale Elektronik ATxmega Port einlesen und speichern


von matze (Gast)


Lesenswert?

Hallo,
das hier ist für euch bestimmt einen ganz triviale Frage.

Ich möchte kontinuierlich 8Bit-Werte über einen Port des ATxmega 32MHz 
einlesen und im RAM speichern.
Kann mir jemand (grob) sagen wie viele Takte, bzw. welche Zeit für das 
Einlesen+Speichern in Anspruch genommen wird??

schon mal vielen Dank

von Steffen H. (avrsteffen)


Lesenswert?

Was heißt kontinuierlich? Soll Beispielsweise in einer Interruptroutine 
100 8-Bit Werte vom Port in ein RAM-Array gespeichert werden?

Mehr Informationen wären da nicht schlecht um dir zu helfen.

Die einfachste Variante in ASM sieht so aus:
1
.equ    r15        = SAVE_SREG
2
3
.equ    READ_PORT    = PORTD_base
4
.equ    Anzahl_Bytes  = 100          ; Deklarierung der Anzahl zu lesender Bytes
5
.dseg
6
.org 2000
7
.equ    PORT_VALUE:    .BYTE(Anzahl_Bytes)    ; Deklarierung des Arrays (PORT_VALUE) im Datensegment(RAM)
8
.cseg
9
10
// -------------- Interrupt -----------------
11
Read_PORT_VAL:                  ; 5 Takte für Interrupt Aufruf
12
; *** Vorbereitung ***
13
  lds    SAVE_SREG, CPU_SREG          ; 2 Takte
14
  push  XL                  ; 1 Takt
15
  lds    XL, CPU_RAMPX            ; 2 Takte
16
  push  XL                  ; 1 Takt
17
  push  XH                  ; 1 Takt
18
  push  r0                  ; 1 Takt
19
  push  r24                  ; 1 Takt
20
  push  r25                  ; 1 Takt
21
  ldi    XL, Byte3(PORT_VALUE)        ; 1 Takt
22
  sts    CPU_RAMPX, XL            ; 2 Takte
23
  ldi    XH, Byte2(PORT_VALUE)        ; 1 Takt
24
  ldi    XL, Byte1(PORT_VALUE)        ; 1 Takt
25
  ldi    r24, Byte1(Anzahl_Bytes)      ; 1 Takt
26
  ldi    r25, Byte2(Anzahl_Bytes)      ; 1 Takt
27
read_loop:
28
  lds    r0, (READ_PORT + PORT_IN_offset)  ; 2 Takte
29
  st    X+, r0                ; 1 Takt
30
  sbiw  r25:r24, 1              ; 2 Takte
31
  brne  read_loop              ; 2 Takte -> read_loop | 1 Takt wenn fertig
32
  pop    r25                  ; 2 Takte
33
  pop    r24                  ; 2 Takte
34
  pop    r0                  ; 2 Takte
35
  pop    XH                  ; 2 Takte
36
  pop    XL                  ; 2 Takte
37
  sts    CPU_RAMPX, XL            ; 2 Takte
38
  pop    XL                  ; 2 Takte
39
  sts    CPU_SREG, SAVE_SREG          ; 2 Takte
40
  reti                    ; 4 Takte bis 128kb Program memory | 5 Takte bis 8Mb Program memory
41
// ------------ Interrupt Ende --------------

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.