Newsgroup: it.hobby.elettronica.digitale
Titolo: ASM per Atmel

Ciao a tutto il NG!
Visto che mi sono deciso di studiare un po' i MC Atmel (in questo
momento sto leggendo il DS dell'AtTiny13), anche se, per il momento, non
voglio assolutamente abbandonare i PIC - diciamo che voglio avere più
alternative, chiedevo se qualcuno di voi mi sa consigliare un bel
manuale di ASM per principianti (quale sono io), se in PDF è ancora
meglio, soprattutto al momento non mi risulta chiara la questione dei
puntatori X, Y e Z.
Mi date una mano, please?
Grassie!
Ciao!
-- 
Stefano M. (Italy)
WEB: 
http://www.lemming.it
Solo due cose sono infinite: l'universo e la stupidità umana
e non sono sicuro della prima.  (A. Einstein)

 puntatori X, Y e Z.
Perché usare l'assembly quando c'č il C che si smazza registri, indici e
quant'altro?

puntatori X, Y e Z.
Sono registri puntatori che agiscono a coppie:
R26:R27  = X
R28:R29  = Y
R30:R31  = Z
e servono per puntare una locazione di ram e leggere o scrivere le locazioni e i
registri.
Es:
	Ld	R15,x+	;legge R15 dalla locazione RAM puntata da R26:R27
	St	y+,R15	;scrive R15 nella ocazione RAM puntata da R28:R29
Il registro Z può puntare anche la Flash e leggere, e in determinati casi anche
scrivere, dei registri.
	Lpm	R15,z+	;legge R15 dalla locazione FLASH puntata da R30:R31
--
ciao
  Stefano

Es:
	Ldi	R30,Low(ADDR)
	Ldi	R31,High(ADDR)
Meglio se ti fai una macro, io uso una macro LdiW per caricare una coppia di
registri:
	Ld	R15,x+	;legge R15 dalla locazione RAM puntata da R27:R26
; e incrementa il registro a 16 bits
	St	y+,R15	;scrive R15 nella ocazione RAM puntata da R29:R28
; e incrementa il registro a 16 bits
Il registro Z può puntare anche la Flash e leggere, e in determinati casi anche
scrivere, dei registri.
	Lpm	R15,z+	;legge R15 dalla locazione FLASH puntata da R31:R30
; e incrementa il registro a 16 bits
--
ciao
  Stefano


Ciao!
Prima di tutto grazie, sei stato molto chiaro, vedo di studiarmi più
approfonditamente la cosa. Leggendo il manuale che mi hai postato, sono
arrivato alla pagina che parla delle tabelle e c'è questo esempio:
MyTable:
.DW 0x1234,0x2345,0x3456,0x4568,0x5678 ; The table values, word wise
.DW 0x6789,0x789A,0x89AB,0x9ABC,0xABCD ; organized
Read5: LDI ZH,HIGH(MyTable*2) ; address of table to pointer Z
LDI ZL,LOW(MyTable*2) ; multiplied by 2 for bytewise access
ADIW ZL,10 ; Point to fifth value in table
LPM ; Read least significant byte from program memory
MOV R24,R0 ; Copy LSB to 16-bit register
ADIW ZL,1 ; Point to MSB in program memory
LPM ; Read MSB of table value
MOV R25,R0 ; Copy MSB to 16-bit register
ora, viene letto l'indirizzo di mytable e viene spostato avanti di 10
locazioni per leggere l'LSB, che dovrebbe essere 0x78, e fin qui ok, poi
deve leggere l'MSB, e per farlo lui aggiunge 1, e non capisco perché,
secondo me dovrebbe SOTTRARRE 1, in modo da leggere 0x56. Sono io che
non ho capito la situazione (probabilmente sì) o è un errore del
manuale?
Ciao, grazie ancora.


 quant'altro? 
Ciao!
Sì, è vero, hai ragione! In effetti il C è ENORMEMENTE più semplice da
usare, ma a mio modesto parere ci sono dei vantaggi anche con l'ASM:
1) studiando l'ASM hai una idea molto più precisa di come è fatto
l'hardware del microcontroller, e credo che questa sia una cosa molto
importante.
2) il codice viene molto più ottimizzato, più breve, e per i micro
"piccoli" quale quello che sto usando io è preferibile stare un po'
stretti, anche se per il codice che per il momento ho scritto potevo
starci comodo anche con il C
3) sono di "scuola" PIC, per cui sono "affezionato" all'ASM.
Però, visto che mi devo allenare, quasi quasi provo anche con il C a
fare lo stesso softwarino, così vedo le differenze di dimensioni e di
"semplicità d'uso"... Anzi mi sa che questo fine settimana ci provo ;-) 


manuale?
Dipende dal fatto che la .DW o DefineWord scrive in memoria prima LSB e poi MSB,
quindi è corretto l'esempio del manuale.
--
ciao
  Stefano

 quindi è corretto l'esempio del manuale. 
Scusami, ma c'è ancora qualcosa che non mi "sconfinfera": se scrive
prima LSB e poi MSB, quindi praticamente legge così:
      2  1    4  3    6  5   8   7   10  9
DW 0x12 34,0x23 45,0x34 56,0x45 68,0x56 78
Allora l'istruzione precedente dovrebbe essere 
ADIW ZL,9
non
ADIW ZL,10
ma mi sa che non capisco io :-((
Ciaoooo


ADIW ZL,10
La memoria flash degi AVR è a 16 bit (in Word), mentre i registri sono a 8 bits.
L'istruzione LPM legge un BYTE da un WORD puntato
Nel tuo esempio:
.DW 0x1234,0x2345,0x3456,0x4568,0x5678, 0x6789,0x789A,0x89AB,0x9ABC,0xABCD  
la memoria in word sarà
3412	;+0,1
4523	;+2
5634	;+4
6845	;+6
7856	;+8
8967	;+10,11
9A78
AB89
BC9A
CDAB  
Quindi per leggere il quinto byte dovrai puntare all'inizio della tabella +10 e
la successiva +11 per leggere LSB = 89H e MSB = 67H 
Se ti scarichi AvrStudio e provi a simulare la cosa, hai la possibilità di
vedere nelle varie finestre la memoria, la flash ed i programmi e puoi eseguire
le istruzioni passo-passo e vedere l'effetto.
E' più facile da capire un fenomeno se lo vedi con i tuoi occhi, molto meglio di
una spiegazioni teorica.
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
AvrStudio integra oltre al simulatore-debugger anche un assembler, puoi provare
ad assemblare il tuo programmino e a simularlo, così vedrai come si comportano i
registri X, Y e Z.
--
ciao
  Stefano

 
Grazie!
Ho fatto come mi hai suggerito tu, installando AVR Studio (non senza
qualche difficoltà, visto che uso Ubuntu, non Windows), ed ho capito
come funziona la cosa.
Ti ringrazio ancora
Ciao!


 come funziona la cosa.
mi confermi AVR Studio funziona con wine?

 mi confermi AVR Studio funziona con wine?
Anche la versione 5?
Ciao!
Marco

 mi confermi AVR Studio funziona con wine?
Ciao!
Io ho installato la versione 4 e, diciamo, che "funzionicchia", nel
senso che a volte fa qualche cosa un po' strana, ma in linea di massima
è usabile.
Se lo vuoi installare ti consiglio di:
1) Installare la versione più recente di Wine (io al momento ho la
versione 1.3.16), la puoi aggiornare dal sito ufficiale
http://www.winehq.org/
)
2) Installare la versione un po' più recente delle librerie del C di
Microsoft
3) NON installare, nella maniera più assoluta il driver per USB del
programma, perché fa un sacco di casini
Se non dovessi riuscire a selezionare il MC dalla sezione Debug, Clicca
sulla prima piattaforma: AVRDragon, poi selezioni AVRSimulator e
selezioni il MC che ti interessa.


 Anche la versione 5?
Non te lo so dire, io uso la versione 4, e come dicevo nell'altro post è
usabile, a parte qualche cosa di strano che fa.
Ciao
