Pagina 1 di 1

Settaggio SP AVR e Interrupt table

MessaggioInviato: 16 feb 2018, 11:58
da peppe1992
Salve a tutti, ho da poco iniziato a studiare l'assembly AVR per at90s8535 e mi sorgono alcuni dubbi, ho due domande da porvi.

1)
Sto cercando di scrivere qualche programmino banale, per prendere dimestichezza con avr studio e ho notato
che in qualche programma già svolto vi è all'inizio del codice, oltre alle varie direttive vi è il settaggio dello stack pointer. Quello che non capisco è il motivo per cui per settarlo si fa uso del registro r16.
Ho notato che per l'istruzione LDI i registri utilizzabili sono da 16 a 31, ma vorrei capirne il motivo.

2)
Altra cosa che non mi è chiara è l'interrupt table. Ho capito cosa sono gli interrupt e che possono essere interni o esterni. Ma non ho capito come gestirli con l'interrupt table, mi servirebbe un esempio pratico prefiribilmente a parole che mi fa capire il funzionamento dell'inrettupt table ogni volta che avviene un interrupt.

Grazie in anticipo a tutti :D

Re: Settaggio SP AVR e Interrupt table

MessaggioInviato: 16 feb 2018, 14:21
da xyz
E' fondamentale impostare lo stack pointer altrimenti non puoi eseguire correttamente una "call" e in caso di interrupt, se abilitati, potrebbero corrompere la RAM in modo indesiderato..

Come specificato (chiaramente) nel datasheet il micro-controllore appena parte deve impostare il registro SP. Il registro SP è a 16 bit, la sua lunghezza dipende dal chi ha progettato l'architettura, visto che la RAM supera i 256 byte si devono usare 2 registri a 8 bit anche se non tutti i bit sono utilizzati, dipende dalla quantità di RAM disponibile.

Per impostare il registro SP non puoi scrivere direttamente il valore, si deve usare un registro di supporto, ad esempio r16.

Per convenzione i registri da r16 a r31 sono dei registri di working, di solito sono usati per memorizzare dati temporanei.

La tabelle degli interrupt è una cosa abbastanza complessa da spiegare, consiglio di non iniziare subito con questo argomento e di scrivere codice con gli interrupt disabilitati. Quando avrai una maggiore confidenza con l'architettura e il codice potrai iniziare a usarli. In parole molto semplici è un tabella con degli indirizzi, quando si scatena un evento associato alla posizione nella tabella il micro-controllore esegue un salvataggio dello stato, inizia ad eseguire il codice specificato dall'indirizzo presente nella tabella, al ritorno dell'interrupt lo stato viene ripristinato e continua l'esecuzione del codice nel punto in cui era stato interrotto.

Re: Settaggio SP AVR e Interrupt table

MessaggioInviato: 18 feb 2018, 13:21
da tunderace
per il punto 1 xyz è stato esaustivo.
Per il punto 2 vediamo se riesco ad aiutarti.

l'interrupt table, è l'elenco degli indirizzi dove una periferica "salta" quando avviene un'interruzione.
Esempio:
Supponiamo che tu usi l'uart del tuo micro.
Per abilitare l'interupt da ricezione devi settare il bit 7 di UCR (RXCIE).
Quando il micro riceverà un byte da seriale, salterà all'indirizzo 0x00B.
Siccome stai scrivendo in assembly e non in C, devi eseguire delle operazioni obbligatorie affinchè il firmware sia stabile:
1- fare un "jmp" a un'altra zona di memoria lontana dall'interrupt table.
2 - Salvare subito il registro SREG nello stack
Label:
push r16 ;salvo nello stack il registro r16 (può essere anche un altro ma l'r16 è quello che nei miei programmi è il principale)
lds r16,SREG
push r16
;qui fai il push di altri registri "r" che intendi usare per gestire l'interruzione

;Qui esegui il tuo codice

;qui fai il pop di altri registri "r" che hai usato per gestire l'interruzione, nell'ordine inverso rispetto ai pop
pop r16 ;ricarichi dallo stack il valore di SREG
sts SREG,r16 ;Ripristini SREG prima dell'interruzione
pop r16 ;ripristini r16 prima dell'interruzione
reti

Nell'AVR studio 4 c'è una directory dove ci sono i file di patenza .asm per tutti i microcontrollori. In questi file c'è già scritto il codice che gestisce sia il settaggio dello stack che la gestione dell'interupt table. In AVR studio 7.0 non ci sono più

Re: Settaggio SP AVR e Interrupt table

MessaggioInviato: 18 feb 2018, 15:01
da xyz
Aggiungo solo una cosa, per abilitare e disabilitare il Global Interrupt flag (il bit I di SREG) esistono 2 istruzioni, SEI e CLI. Di default alla partenza gli interrupt sono disabilitati.

Re: Settaggio SP AVR e Interrupt table

MessaggioInviato: 19 feb 2018, 15:41
da peppe1992
Grazie mille ad entrambi per le risposte. Adesso ho tutto più chiaro.
Per quanto riguarda le interrupt interne però non mi è chiara una cosa.
I timer fanno parte delle interrupt interne; se io volessi far partire un timer dopo aver inviato un impulso dall'esterno, quindi gli interrupt esterni, l'unico modo, è quello di utilizzare l'interrupt che vada a chiamare una subroutine che esegue l'abilitazione dell'interrupt interno e faccia partire il mio timer?

Grazie ancora per il tempo dedicatomi

Re: Settaggio SP AVR e Interrupt table

MessaggioInviato: 19 feb 2018, 16:33
da xyz
I timer sono timer, sono collegati al clock di sistema o alcuni ad un clock esterno, possono scatenare degli interrupt se sono soddisfatte certe condizioni descritte nel datasheet.

Alcuni pin di input possono scatenare un interrupt se cambiano stato, come descritto nel datasheet.

I timer interni possono essere abilitati o disabilitati una volta configurati come descritto nel datasheet.

Quello descritto può essere fatto con o senza interrupt. La versione che usa gli interrupt è la versione più efficiente senza bloccare il micrp-controllore a fare un solo compito. Come farlo bisogna conoscere bene come funziona internamente il microcontrollore come descritto nel datasheet.