Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Direttiva .org AVR assembly (atmega8535)

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[31] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto Utentesimo85 » 27 mag 2013, 12:08

Rabeluk ha scritto:cioè hai preso 6 voti per un cazziatone?

Si, uno anche da parte mia. E non per simpatia ma per aver detto effettivamente qualcosa di giusto, quindi una forma di ringraziamento per quanto scritto.
cosa c'è di tecnico in questo?

Tecnico o no, come appena fatto notare, se viene detto qualcosa che si condidivide personalmente perché considerado qualcosa di giusto e di sensato (e ti assicuro che quello detto da Foto Utentexyz lo è), allora, si si vota.

Comunque questa non è una gara a chi ne ha di più o meno. E chi ne ha di più non è il più figo del forum.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[32] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 27 mag 2013, 12:19

simo85 ha scritto:
Comunque questa non è una gara a chi ne ha di più o meno. E chi ne ha di più non è il più figo del forum.

scusami ma a me non interessa tanto sta cosa :D il settimo gliel'ho dato io :ok:

fatto sta che Foto Utentexyz non mi ha aiutato :) io questi atteggiamenti non li capisco.. scusami tanto

mentre tu nonostante i miei errori ( non nego che ci siano stati errori) mi hai posto alcune domande in modo tale da riuscire a creare un punto d'incontro... non dico che l'utente Foto Utentexyz è costretto a venirmi incontro, dico solo che nonostante i vostri voti per quel commento, per me è come se non ci fosse... già dalle tue domande avevo capito di essermi espresso poco bene... pensa se ora viene un altro e dice che ho sbagliato ad espormi :mrgreen: :mrgreen:
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

2
voti

[33] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto Utentesimo85 » 27 mag 2013, 12:25

Guarda Foto UtenteRabeluk,

Evitiamo le polemiche e discussioni inutili.
La prossima volta quando apri un post, spiega tutto, dalla A alla Z. Prima di cliccare su Invia assicurati o fai di tutto per assicurarti che ci siano tutte le info necessarie per poterti aiutare..

Non puoi lasciare nel dubbio il tuo interlocutore, ossia chi ti vuole aiutare.

Se apri un post riguardo al codice Assembly di una certa MCU è naturale, obbligatorio che devi esporre architettura, assembler etc etc.

La risposta di Foto Utentexyz serve a farti capire anche certe cose.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[34] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 27 mag 2013, 12:28

pienamente d'accordo :ok:
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

0
voti

[35] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 2 giu 2013, 18:33

DirtyDeeds ha scritto:E' una direttiva che può essere usata per allocare codice o dati a partire da precise locazioni di memoria.


ritornando alla direttiva .org mi chiedevo se è possibile allocare quella parte di codice che voglio io in qualsiasi parte della program memory oppure c'è qualche vincolo??? ......

ad esempio io vorrei creare una specie di look up table all'indirizzo 16 (decimale) della program memory...

posso scrivere .org 0x10 in qualsiasi punto del codice?

un probabile vettore degli interrupt va messo prima?
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

0
voti

[36] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto Utentexyz » 2 giu 2013, 19:16

Rabeluk ha scritto:ritornando alla direttiva .org mi chiedevo se è possibile allocare quella parte di codice che voglio io in qualsiasi parte della program memory oppure c'è qualche vincolo??? ......

Non puoi fare quello che vuoi senza rispettare i vincoli molto rigidi impostati da chi ha progetto e realizzato il microcalcolatore. Nel datasheet del microcontrollore c'è una dettagliata mappa della memoria o meglio delle memorie (plurale), l'architettura usata dagli AVR è Harvard quindi c'è una separazione netta tra la memoria usata dal codice (flash) rispetto alla memoria RAM e quella permanente (EEPROM).

In generale le LUT sono messe nella flash visto che sono a sola lettura, è possibile metterle nella RAM o nella EEPROM ma devono essere inizializzate. In generale, se possibile, nei microcontrollori con poca memoria se LUT è facilmente calcolabile si preferisce calcolarla, senza far uso della LUT.

P.S. Cambia il titolo del thread con uno più significativo.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[37] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 2 giu 2013, 19:37

grazie della risposta
xyz ha scritto:
P.S. Cambia il titolo del thread con uno più significativo.


spero che cosi vada bene. (pensavo di non poterlo fare io).. però vista l'insistenza mi sono detto mi sa che devo cambiarlo proprio io :D

comunque io lo devo fare per scopi didattici...quindi diciamo che più cose mostro di saper utilizzare più mostro di essere andato a fondo con lo studio... forse la cosa può sembrare strana me è meglio complicarmi la vita :D

quello che mi interessa approfondire ora è come lavorano la direttiva .org e l'istruzione lpm degli atmel

la direttiva .org ho capito cosa fa ma non ho ancora ben chiaro come collocarla all'interno del codice....

per l'istruzione lpm diciamo che sono un po' confuso in quanto sul libro su cui ho studiato (AVR an Introductory course di J.Morton)mi dice che siccome questa istruzione usa indirizzi di byte della program memory invece degli indirizzi di word (indirizzamento della program memory) , se io ho una look up table che metto all'indirizzo
30 della program memory( che rappresenta un indirizzo di word) usando la direttiva .org 0x1e
quando uso lpm,in Z (registro puntatore) devo avere salvato 60 se voglio leggere il primo byte della word e 61 se voglio leggere il secondo byte della word....

mentre qui mi dice http://www.atmel.com/images/doc0856.pdf
a pagina 97 che posso decidere quale byte leggere in base a come imposto il bit meno significativo, anche se non capisco l'esempio che fa e come usa questa proprietà,e non capisco se quest'uso di lpm è uguale per tutti i micro visto che sul libro ha operato in modo completamente diverso

Codice: Seleziona tutto
Example:
ldi ZH, high(Table_1<<1)  ; Initialize Z-pointer
ldi ZL, low(Table_1<<1)
lpm r16, Z                       ; Load constant from Program
                                      ; Memory pointed to by Z (r31:r30)
...
Table_1:
.dw 0x5876    ; 0x76 is addresses when ZLSB = 0
                     ; 0x58 is addresses when ZLSB = 1

...
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

2
voti

[38] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto Utentexyz » 2 giu 2013, 20:46

Bravo e grazie, finalmente il titolo è coerente :ok:

La direttiva ".org" serve per indicare l'origine del codice dal quel punto in poi, se è abilitato il segmento del codice, o l'origine dei successivi dati se è abilitato il segmento dati.

In pratica un codice in assembler per gi AVR parte così (io uso l'asemblatore "avra" per Linux):

Codice: Seleziona tutto
.include "m8def.inc"

.cseg
.org 0x0000
rjmp RESET
reti      ;External Interrupt0 Vector Address
reti      ;External Interrupt1 Vector Address
reti      ;Timer2 compare match Vector Address
reti      ;Timer2 overflow Vector Address
....

RESET:

   ;Initialize Stack Pointer

   ldi      temp,low(RAMEND)
   out      SPL,temp
   ldi      temp,high(RAMEND)
   out      SPH,temp

...

   ldi ZH,high(2*LUT) ; Load high part of byte address into ZH
   ldi ZL,low(2*LUT)  ; Load low part of byte address into ZL
   lpm                ; Load byte from program memory into r0

...

QUIT:
   rjmp QUIT

LUT:

.db "0123456789ABCDEF"



Viene abilitato il segmento di codice e posizionata l'origine alla locazione 0x0000, la prima locazione eseguita dopo il reset, in quella locazione è presente un lungo array con tutti i vettori usati dalla MCU, bisogna mettere quella del tuo esatto modello di MCU (nel mio caso un ATmega8, specificato nel include), cambiano in numero e in significato. Quanti e quali è descritto nel datasheet.

Sempre nel datasheet è spigato che la prima cosa da fare è inizializzare lo stack (SP). La locazione di memoria "RAMEND" è diversa per ogni MCU ed è specificata nell'include iniziale fornito dal assemblatore.

Per la "lpm" non sei obbligato a specificare la locazione nella flash, basta una label nel segmento di codice (come RESET o LUT nel codice precedente) e fare esattamente quello scritto nel datasheet, se moti esegue una moltiplicazione per 2 (shift a sinistra di un bit), il tuo libro (che non conosco) parte con l'indirizzo dimezzato imposto e poi ti dice di moltiplicarlo per 2, i preferisco sfruttare l'assemblatore per fare i calcoli come viene fatto nel datasheet.

Ti consiglio di partire con cose più semplici, l'uso della "lpm" non è argomento per principianti.

Oltre ai datasheet esistono anche gli application note:

http://www.atmel.com/Images/doc1233.pdf

buona lettura.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[39] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteDirtyDeeds » 2 giu 2013, 20:59

xyz ha scritto:Bravo e grazie, finalmente il titolo è coerente


Occhio che lui può solo modificare il titolo del suo messaggio corrente, non quello della discussione e dei messaggi già inviati: quello è un lavoro sporco che tocca a noi ;-)
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[40] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 2 giu 2013, 21:09

xyz ha scritto:
Per la "lpm" non sei obbligato a specificare la locazione nella flash, basta una label nel segmento di codice (come RESET o LUT nel codice precedente) e fare esattamente quello scritto nel datasheet


mmm quindi da quello che ho capito se voglio usare una LUT non mi serve usare .org per specificare l'indirizzo.
basta mettere in Z il nome della label dove inizia la LUT e poi fa da solo?

come mai nell'esempio che ho postato io mette il nome della label sia in ZH che in ZL?
non dovrebbe metterlo in tutto Z?
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti