Sida 1 av 1

.dreg .ereg Fråga för ATmega16

Postat: 27 februari 2007, 09:38:55
av port513
Tjenixen

Hur ska jag använda tex .dreg?

.dreg
MinVar: .db 0x0F, 0xF0

Den kan jag inte komma åt från koden, varför?

Men lägger jag MinVar i .cseg så kommer jag åt den men inte i .dreg.

Lite exempel på hur jag hanterar .db och .byte i både .creg och .dreg önskas

Om jag har MinVar i .cseg så kan jag ju göra följande

ldi zl, low(MinVar)
ldi zh, high(MinVar)
lpm

och få ut första byten i r0 men hur gör jag om jag har MinVar i .eseg eller .dseg?

*** EDIT ***

Problemet som jag ser det här är att jag inte kan läsa en .db definierad variabel. Varför inte detta?
Jag kan skriva och läsa till 0x60 annars men inte om jag sätter en .db där då får jag konstant 0x0F som värde tillbaks.

*** SLUT EDIT ***

/Henke

Postat: 27 februari 2007, 11:57:02
av exile
Du har tre minnen i en AVR (oftast)

1.RAM, ett flyktigt minne som adressera snabbt och kan skrivas till många gånger.
Till den använder man .dreg. För att komma åt använder man bland annat ld och st.

2.EEPROM, är icke flyktigt minne som används för att spara variabler som behöver vara kvar trots strömmen försvinner.
Till gången till detta minne är via register som exempel EEARH, EEARL, EEDR och EECR, för mer information se databladet som tillhör den uC du arbetar med.

3. Program minnet, är icke flyktigt minne som programmet lagras i. Man kan dessutom lagra konstanter där, exempel vis strängar, tabeller och mm.. som man inte ändrar.
Till gången fås gen lpm...



.db används för att göra sätta en konstant i ett icke flyktigt minne
Exempel:
const2: .db 1,2,3

.BYTE används till att reservera en plats åt en variabel i ett flyktigt minne
Exempel:
vartab: .BYTE 4

Men om avr assembler kan läsas i AVRStudio -> help -> AVR Tools User Guide -> AVR assembler

Hoppas att de svarade lite gran på dina frågor ^^

Postat: 27 februari 2007, 12:02:41
av port513
Så att jag kan sätta

.dseg
MinVar: .db 0x09

Är alltså fel?

Postat: 27 februari 2007, 12:31:17
av exile
Ja...

Du måste manuellt ge variabel i ram minnet dess värde.

Exempel:

Kod: Markera allt

.dseg
Minvarabel: .BYTE 1

//ger Minvarabel 0x09
ldi r16, 0x09
sts Minvarabel, temp


Edit:
Tanken med använda "Minvarabel:" är för att slippa använda direkt addreser vilket kan leda till misstag om man råkar ha två variabler men samma adress, men den här metoden så slipper man det...

Postat: 27 februari 2007, 12:35:15
av port513
Skumt att inte kompilatorn bråkar om det utan sväljer det utan problem och dessutom reserverar platsen man anger i .db direktivet

Men då försvan ett antal moln på himeln iaf ;)

.eseg = Ickeflyktigt för data som kan ändras men måste sparas mellan av/på på uC

.dseg = Flyktigt minne för variabler som kan ändras under körning

.cseg = Ickeflyktigt för konstanter som inte kommer att ändras

Rätt så va?


/Henke

Postat: 27 februari 2007, 12:39:28
av exile
Ja, Det sammanfattar det hela bra ^^

Assemblerar sväljer nästan allt, både på gott och ont ^^

Postat: 27 februari 2007, 12:41:09
av port513
Proggat mycket TASM och MASM32 tidigare men just AVR-ASM är ju helt annat ;)

Dessutom är jag pinsamt nog en gammal Javelin:are ;)


/Henke