Newsgroup: it.hobby.elettronica.digitale
Titolo: AVR, istruzione Call - Novizio

Buon Giorno a Tutti
Sto lavorando al mio primo programma Assembler ma ho un (magari!) problemino
ho le seguenti istruzioni ho compilato tutto ma in fase di debugging si
comporta non come vorrei, ovvero, chiama la sub "iniz", ma quando arriva a
ret invece di tornare e chiamare "leggi" mi richiama la "iniz".. dove
sbaglio?
Grazie
Sergio
mloop:
  call iniz
  call leggi
  ..............
  rjmp mloop
;---------------------------------
iniz:
  ser T
  out DDRB,T
  ldi T,0b0010000
  out DDRA,T
  clr T
  out PORTA,T
  out PORTB,T
  clr pu
ret
;----------------------------------
leggi:
  sbi porta,sel
....................
....................
  brne l1
  ret
;--------------------------


wrote:

Il programma sembra scritto correttamente, quindi il ret deve tornare
dopo iniz
Che micro hai scelto?
Hai settato lo stack pointer prima di fare la call?
es.
	ldi	A,high(RamEnd)	;prepara stack
	out	SPH,A
	ldi	A,low(RamEnd)
	out	SPL,A
solo l'AT1200 non ha la RAM e lo stack, tutti gli altri si
ciao
  Stefano

 ha scritto nel messaggio
news:1dgk80djgnavn55ot...@4ax.com...


poco (e in inglese!)
Se hai problemi con l'inglese la vedo dura con l'elettronica in
generale, comunque il datasheet AVR AtMega32  (doc2503.pdf) contiene
una spiegazione del funzionamento del micro, dei 32 registri, della
memoria e in fondo ci sono due pagine con le istruzioni, altrimenti si
puň scaricare il dettaglio anche su AvrFreaks.net.
Comunque una volta che hai imparato a conoscere l'architettura del
micro, ad aggirare le sue limitazioni (per esempio non ha la ADDI,
somma Reg+ valore immediato, ma la puoi facilmente sostituire con
SBCI	r0,-V sottraendo il valore negato col- ), andrai via
velocissimo.
La cosa piů ostica usando gli Avr č la configurazione dei fuse bits,
perchč č facile incasinarsi e a volte č difficile uscirne.
ciao
  Stefano

posizione indietro... sembra che non incrementi di 1 il Program Counter...
Allora, mi sembra che non sia chiara la funzione di stack pointer,
comune in tutti i micro dall'8080 in poi.
Lo stack punta una zona di memoria e va inizializzato in genere una
sola volta all'inizio.
Es.
	org	60H
Init:	ldi	A,high(RamEnd)	;prepara stack
	out	SPH,A
	ldi	A,low(RamEnd)
	out	SPL,A
Main:	CALL	100h
Pippo:	rjmp	Main
	org	100H
	ret
Quando fai la Call 100H nelle locazioni puntate dallo stack viene
scritto l'indirizzo di Pippo e decrementato lo stack, in maniera che
quando esegue RET lui salta all'indirizzo salvato e rimette a posto il
puntatore.
Lo stesso quando esegui un interrupt, è lo stack che si ricorda il
punto da dove è partito e ritorna lì.
In più con le istruzioni 
	PUSH	r0
e
	POP	r0
puoi usare la memoria puntata dallo stack per salvare e riprendere i
registri, funzione indispensabile se devi usare gli interrupts.
Questo lo rende molto potente, spesso il compilatore C utilizza lo
stack per passare le variabili alle routines.
 ciao
   Stefano

 ha scritto nel messaggio
news:3cmk80djr9f3livke...@4ax.com...


 dovrebbe significare che fanno di più e meglio...non peggio
Ogni microprocessore degno di questo nome ha uno stack in ram posizionabile
in qualsiasi punto di essa e che consente di fare mooolte cose in piu' del
misero stack hardware di un microcontroller, l'unica attenzione e' appunto
quella di inizializzare lo stack pointer all'inizio del programma. Gli atmel
sono una via di mezzo tra un puro (e limitato) microcontroller e un potente
microprocessore, di cui hanno fortunatamente tra altre cose anche questa
lodevole caratteristica. Un vero stack infatti non serve solo a memorizzare
gli indirizzi di ritorno, ma anche per salvare/conservare/recuperare
rapidamente valori di registri o risultati intermedi, o a passare valori tra
punti diversi del programma... per esempio java e' basato pesantemente sullo
stack, nel senso che quasi tutta l'elaborazione avviene su valori inseriti e
rimossi da esso. Lo stack permette le chiamate ricorsive, il calcolo in
notazione polacca inversa (una gran comodita' per i calcoli con parentesi
multiple e priorita'), e anche la realizzazione di un vero multitasking
preempitive... tutte queste meraviglie senza di esso si possono scordare;)
Claudio F

 ha scritto nel messaggio
news:PQuic.138062$rM4.5...@news4.tin.it...


 automatica del PC...
Beh? Questo e' vero.

mi risultava essere proprio la memorizzazione automatica del PC...
Quello che hai detto è vero, l'unica differenza è che in ASM lo stack
lo devi inizializzare tu ad un valore, che dipende dall' uso che ne
fai.
Io in genere scelgo di usare 16 o32 bytes di stack, (cioè lo metto
alla fine della ram e lascio liberi 32 bytes sotto) cosa che mi
permette di usare gli interrupts anche durante le subroutines e
salvare i registri principali sullo stack durante queste ultime.
                     _______________
Per quanto concerne i fusibili, vero, è abbastanza incasinata la cosa,
ma basta muoversi con i piedi di piombo per evitare problemi.
Ponyprog, che ti ho già suggerito di scaricare, ha una bella finestra
con i fusibili per ogni micro. Il datasheet ti aiuta nella scelta
della configurazione.
ciao
  Stefano

 ha scritto nel messaggio
news:qahp80lruo1nj9gsj...@4ax.com...
