Sida 4 av 5

Re: Hur mycket går det att slakta i denna kod?

Postat: 9 februari 2012, 17:32:19
av jesse
Vad är meningen med den här tråden, egentligen?

Det finns tusentals exempel på hur man använder EEPROM i en AVR (googla!) och vill du ha mer specifik information om detaljer så finns databladen. Det känns som en väldigt märklig diskussion där TS gissar en massa saker och sedan frågar om det 'stämmer'. Det är väl bättre att ta reda på fakta direkt istället, genom att läsa någon bra tutorial?

En av de bättre sidorna om AVR assembler är denna: Beginners Programming in AVR Assembler

Och när det gäller minnenas organisation och adressering så är det det första man får läsa om man kollar in Atmel's officiella AVR Assembler User Guide. Den kan na förresten ladda ner och ha som referens, så är det bara att läsa när det uppstår frågor.

Processorns arkitektur beskrivs även grafiskt i alla datablad, ungefär så här:

Bild

Sedan är det bara att välja kapitel efter vilken enhet du vill veta mer om.

Re: Hur mycket går det att slakta i denna kod?

Postat: 9 februari 2012, 19:03:00
av 1802
jesse: I skolan hade man lärare, att fråga om man fattat vad man läst. Till det funkar inte google. Och hur trr du jag fick fatt i mitt pdf datablad? Denna tråd har lärt mig mycket. Jag hoppas att fler lärt sig nått.

Re: Hur mycket går det att slakta i denna kod?

Postat: 10 februari 2012, 01:06:20
av jesse
Nej, fråga på bara... jag tyckte bara frågorna var lite jobbiga att förstå (varför du ville ha svar på dem, nästan hypotetiska frågor).. Men jag förstår att du försöker lära dig.

Försök utgå från det praktiska behovet, och lär dig lite i taget... Det kan vara svårt att försöka ta in för mycket på en gång.

Nu vet inte jag vad 'memorymaps' betyder... du har väl programmerat i en annan miljö tidigare.. Men egentligen fungerar minnesaccessen så här i en AVR:

Spara och läsa data i SRAM med instruktioner som LDS, STS, LD Y+,Rd...

Läsa data ur programminnet (flash) med LPM (Load Program Memory location) (och mer sällan - lagra data i flashminnet med SPM)

Skriva och läsa EEPROM fungerar på ett annat sätt. EEPROM'et behandlas som en 'extern' enhet odär du använder särskilda I/O-register för att sätta adressen (EEPROM-adressregistret), skriva eller läsa data (EEPROM dataregistret) och kontrollera status (EEPROM statusregistret).... Så det går inte att nå EEPROM-data direkt med en instruktion som med SRAM.

Däremot, i programmeringsmiljön (AVR GCC) kan man adressera de tre minnesområdena direkt genom segment-direktiv (.DESG, .ESEG, .CSEG)... där kan du lägga variabler eller labels som pekar på särskilda adresser i de olika minnena. Men det är du själv som senare måste skilja de olika variablerna/pekarna åt, till vilket minne de ska används.
AVR Assembler User Guide
4-14 Development Tools User Guide
4.5.10 ESEG - EEPROM
Segment
The ESEG directive defines the start of an EEPROM Segment. An Assembler file can
consist of several EEPROM Segments, which are concatenated into one EEPROM
Segment when assembled. The BYTE directive can not be used within an EEPROM
Segment. The EEPROM Segments have their own location counter which is a byte
counter. The ORG directive (see description later in this document) can be used to
place constants at specific locations in the EEPROM memory. The directive does not
take any parameters.
Syntax:

Kod: Markera allt

.ESEG
Example:
.DSEG ; Start data segment
        vartab: .BYTE 4 ; Reserve 4 bytes in SRAM
.ESEG
        eevar: .DW 0xff0f ; Initialize one word in
; EEPROM
.CSEG ; Start code segment
        const: .DW 2 ; Write 0x0002 in prog.mem.
        mov r1,r0 ; Do something

Re: Hur mycket går det att slakta i denna kod?

Postat: 10 februari 2012, 02:37:57
av 1802
jesse: snigelen's bild ovan är en utmärkt memorymap :) På en C64 Ligger det mesta mellan $0000-$ffff smidigt. Men även den har ex "font rom" i annat lager.

Re: Hur mycket går det att slakta i denna kod?

Postat: 10 februari 2012, 09:50:39
av sodjan
> Nu vet inte jag vad 'memorymaps' betyder...

"Karta över minnet" ? :-)

Re: Hur mycket går det att slakta i denna kod?

Postat: 10 februari 2012, 11:36:01
av jesse
Ja, eller , ja , jo... men om det hade någon mer specifik betydelse, tekniskt sett...? Men jag lämnar det.

Om man vill fördjupa sig i hur en AVR är konstruerad så ska man leta upp ett exemplar av boken "Mikroprocessorteknik" av Per Foyer.

De första 76 sidorna handlar allmänt om processorer och processorarkitekturer, så att man får koll på begreppen (Jag hoppade över det mesta av den delen, kanske därför jag undrade över 'memorymaps' förut :D )

Sedan följer ett antal sidor specifikt om AVR-arkitekturen, följt av hur ALU-enheten fungerar (Aritmetic Logic Unit - själva 'hjärtat' i processorn') och vilka instruktioner som finns till den. Totalt ägnas omkring 135 sidor åt AVR assembler, mycket välstrukturerat och lättläst. Rekommenderas till alla som vill lära sig allt om hur en 8-bitars AVR fungerar.

Re: Hur mycket går det att slakta i denna kod?

Postat: 10 februari 2012, 11:41:16
av sodjan
> men om det hade någon mer specifik betydelse, tekniskt sett...?

Nej, det betyder just "en karta över minnet"...

Re: Hur mycket går det att slakta i denna kod?

Postat: 10 februari 2012, 11:55:49
av snigelen
> boken "Mikroprocessorteknik" av Per Foyer.

Den är med på Bokias bokrea. 169:-

Re: Hur mycket går det att slakta i denna kod?

Postat: 15 oktober 2012, 18:34:50
av 1802
"Du kan föresten ta bort raderna av typen "cpi r17,0x00 ; Jämför r17 med 0", eftersom de kommer direkt efter en instruktion som sätter Z-flaggan i SREG om r17 är noll. De tillför alltså ingenting."

Funkar detta även om man inte räknar från $00-$ff? Tex $05-$55.


;/ Lopop i loop fördröjning.
ldi r17, 0xfe ; nolla ett reg ex. r17
ldi r18, 0xff ; nolla ett reg ex. r18

inc r18 ; öka r18 med 1

inc r17 ; öka r17 med 1
;/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 ; Jämför r17 med 0
brne $0009 ; Hoppa till inc r17 om inte lika
cpi r18,0x00 ;/Jämför r18 med 0
brne $0008 ;/Hoppa till inc r18 om inte lika

Re: Hur mycket går det att slakta i denna kod?

Postat: 15 oktober 2012, 20:21:20
av j.po
nej, Z sätts när resultatet är noll

Re: Hur mycket går det att slakta i denna kod?

Postat: 15 oktober 2012, 20:47:57
av 1802
Misstänkte det. Och jag vill ha min kod universell. Men å andra sidan kan man justera mot just noll, så funkar det utan cpi. Gäller bara att komma ihåg....

Re: Hur mycket går det att slakta i denna kod?

Postat: 15 oktober 2012, 23:23:38
av jesse
Den där koden gör inte "loop i loop": Du laddar r17 och r18 före loopen. Sedan räknar du ner båda. Men r17 måste ju sättas till rätt värde varje gång den ska börja om. Därför måste det sättas efter att du gjort inc r18.

Kom igen nu. Nu får du lära dig att använda labels. Så här enkelt är det:

Kod: Markera allt

;/ Lopop i loop fördröjning.
ldi r17, 0xfe ; nolla ett reg ex. r17
ldi r18, 0xff ; nolla ett reg ex. r18
yttre_loop:
inc r18 ; öka r18 med 1
inre_loop:
inc r17 ; öka r17 med 1
;/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 ; Jämför r17 med 0
brne inre_loop ; Hoppa till inc r17 om inte lika
cpi r18,0x00 ;/Jämför r18 med 0
brne yttre_loop ;/Hoppa till inc r18 om inte lika
Hur vill du göra koden mer "generell?". Du menar att du vill kunna välja hur lång tid det ska vara fördröjning?
Jag skulle valt att göra en subrutin som skapar en fördröjning som kör x varv, då x är ett värde som ligger i r18.
r17 kan sättas till 255. Då får du totalt 256*r18 varv.

Kod: Markera allt

;/ Lopop i loop fördröjning.
delay:
    ldi r17, 0x255 ; sätt hur många inre varv som ska köras.
inre_loop:
    nop ;/ Här kan man lägga en dummy operation för att slöa ner mer
    dec r17 ; minska r17 med ett.
    brnz inre_loop ; Hoppa till inc r17 om inte noll.
    dec r18 ; minska r18 med ett.
    brnz delay ;/Hoppa till inc r18 om inte noll
    ret
Nu har du en subrutin med namnet delay. Det anropas så här:

Kod: Markera allt

    ldi r18, 50 ; sätt r18 till antal varv. (Jag räknar varv i decimalform - det är lättare att förstå än hexadecimalt.)
    rcall delay ; kör 50 varv
    ldi r18, 10
    rcall delay ; kör 10 varv

Re: Hur mycket går det att slakta i denna kod?

Postat: 15 oktober 2012, 23:38:09
av 1802
Har du missat denna tråd? http://elektronikforumet.com/forum/view ... =7&t=62007 Tex raden alfa: .DB 0,1,"01234567",0,0,0 börjar den med en label?

Att göra loopiloop till en subrutin där man sätter registerna och sen anropar tillhör planerna. Jag vill nog inte låsa den inre loopen till 255. Liksom att välja rätt register. De 2 sista skall man undvika märkte jag. Samma som X och Y.