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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.