Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Settaggio SP AVR e Interrupt table

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Settaggio SP AVR e Interrupt table

Messaggioda Foto Utentepeppe1992 » 16 feb 2018, 11:58

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
Avatar utente
Foto Utentepeppe1992
50 1 4
New entry
New entry
 
Messaggi: 75
Iscritto il: 17 mag 2011, 22:54

3
voti

[2] Re: Settaggio SP AVR e Interrupt table

Messaggioda Foto Utentexyz » 16 feb 2018, 14:21

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.
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

1
voti

[3] Re: Settaggio SP AVR e Interrupt table

Messaggioda Foto Utentetunderace » 18 feb 2018, 13:21

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ù
Avatar utente
Foto Utentetunderace
10 1 3
 
Messaggi: 26
Iscritto il: 23 ago 2011, 16:04

1
voti

[4] Re: Settaggio SP AVR e Interrupt table

Messaggioda Foto Utentexyz » 18 feb 2018, 15:01

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.
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

[5] Re: Settaggio SP AVR e Interrupt table

Messaggioda Foto Utentepeppe1992 » 19 feb 2018, 15:41

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
Avatar utente
Foto Utentepeppe1992
50 1 4
New entry
New entry
 
Messaggi: 75
Iscritto il: 17 mag 2011, 22:54

1
voti

[6] Re: Settaggio SP AVR e Interrupt table

Messaggioda Foto Utentexyz » 19 feb 2018, 16:33

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.
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


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite