Läsa från SRAM på AVR? Ut på display?
Postat: 7 september 2010, 11:44:17
Jag kan inte komma på hur jag ska göra om jag vill skriva ut en textsträng, som ligger i SRAM, på en (standard)display.
Jag kan skriva ut en sträng som är sparad i Program-minnet(Anna är SNYGG!). Hela programmet är inte med(så det kanske inte funkar som det är nu)men det viktiga(för frågeställningen) är med.
Om jag vill skriva ut de 70 byte som är lagrat i variabeln "Val" i SRAM. Hur gör jag då?
Jag kan ju inte bara skriva "PRINT_TEXT Val" för då laddas väl Z med adressen till "Val" i SRAM och sedan läser LPM den adressen, fast i Flash-minnet.
Sen en liten fråga till: Varför måste man ladda Z med adressen Text1 och sedan ta det gånger två"(@0*2)"? Är är själva "Text1" en byte också eller hur ligger det till?
Jag kan skriva ut en sträng som är sparad i Program-minnet(Anna är SNYGG!). Hela programmet är inte med(så det kanske inte funkar som det är nu)men det viktiga(för frågeställningen) är med.
Kod: Markera allt
.NOLIST
.INCLUDE "m168def.inc"
.LIST
;-----------------------------------------------------------------------------------------------
.DEF LPMdata = r0 ;Register för data som läses med "lpm"
.DEF temp = r16 ;Temporärt register
.EQU EOL = 0 ;End Off Line
;-----------------------------------------------------------------------------------------------
.MACRO PRINT_TEXT
ldi ZL, LOW(@0*2)
ldi ZH, HIGH(@0*2)
rcall Print_data
.ENDMACRO
;-----------------------------------------------------------------------------------------------
.DSEG
.ORG 0x100
Val: .BYTE 70
;-----------------------------------------------------------------------------------------------
.ORG PMSTART
Text1: .DB" Anna ", 0b11100001, "r SNYGG!", EOL ; 16 bytes
;-----------------------------------------------------------------------------------------------
Main:
rcall Print_init
PRINT_TEXT Text1
rcall Delay
rjmp Main ;Börja om på Main
;-----------------------------------------------------------------------------------------------
Print_Data:
ldi temp, WRITE_DATA ;Sätt 3-ledningsbussen för sändning
out LCD_set, temp ;
Print_Next:
lpm ;Hämta tecken från PM (r0 <- @Z)
mov temp, LPMdata
out LCD_data,temp
cpi temp, EOL ;Om detta tecken är lika med EOL...
breq Print_Done ;...hoppa till "Print_Done...
rcall SEND ;...annars, sänd LCD_data till Displayen
adiw ZL, 1 ;Addera registerpar med direktdata (flyttar Z-pekare)
rjmp Print_Next ;Skicka nästa tecken
Print_Done:
ret ;EOL(End Off Line), Returnera
Jag kan ju inte bara skriva "PRINT_TEXT Val" för då laddas väl Z med adressen till "Val" i SRAM och sedan läser LPM den adressen, fast i Flash-minnet.
Sen en liten fråga till: Varför måste man ladda Z med adressen Text1 och sedan ta det gånger två"(@0*2)"? Är är själva "Text1" en byte också eller hur ligger det till?