Vai al contenuto
PLC Forum


Interrupt


Messaggi consigliati

Inserito:

Salve a tutti,

volevo porvi una domanda, e' possibile cancellare o modificare (nella sub di interrupt) l'indirizzo di ripartenza all'uscita dell' Interrupt?

Grazie


Matteo Montanari
Inserita: (modificato)

noi siamo molto lieti di risponderti... ma di cosa stiamo parlando?

se non ti è troppo disturbo puoi fornire più dati

o

dobbiamo sottoporti alla sonda mentale, minacciarti con spada laser, ... (altre cose del genere)?

grazie a nome di tutti

Modificato: da keosmm
Inserita:

ciao!

dipende!!!

dal micro , dal programma ., da un mucchio di cose.

se l'indirizzo e' in eeprom o flash direi di no

a meno che non venga caricato in ram per poter essere usato.

sui micro che uso io cio' non e' possibile

(nel modo da te immaginato) nel mondo PC (dos)

invece e' possibile perche' si usava far puntare l'interrupt

su di un altra routin che una volta eseguita restituiva alla routin originale

(correva l'anno 1300 A.C.) ora con il modo windows

le cose son cambiate.

puoi dire che micro e' oppure il sist.operativo??

ciao

dario

Inserita:

Scusate, ma ho scritto il messaggio in fretta e son dovuto scappare.

IL Pic interessato è il 16f84a, e quello che mi chiedo è possibile modificare, una volta entrato in una sub di interrupt, l'indirizzo di ripresa del programma principale?

Spero di essere stato chiaro, sono un principiante in materia, scusatemi.

Inserita:

la routine di interrupt, quando viene lanciata, pusha automaticamente l'indirizzo di ritorno nello stack; quindi è possibile modificare l'indirizzo di ritorno agendo sull'indirizzo memorizzato, basta scrivere il nuovo indirizzo nello stack. Alcuni vecchi processori, come 8051, hanno anche un'struzione speifica che scambia il contenuto dei registri H-L con il contenuto del top dello stack.

Io comunque sconsiglio questa pratica, se non si fa molta, ma molta, attenzione sono solo guai:(

Inserita:

Ciao Livio,

stavo cercando di capire nei datasheet come fare a modificare l'indirizzo contenuto in uno degli 8 stack disponibili, ma forse non sono stato molto attento, o probabilmente non ci sono elementi utili per far capire questa cosa a un principiante come me.

Quindi ti chiedo, se ti e' possibile, farmi un esempio su come puntare uno di questi stack.

Saluti

Inserita:

No non ci sono 8 stacks (catasta) di satck ce ne è uno solo, anzi non è nel micro ma è nella ram, c'è un registo che punta al top dello stack (è detto stack pointer) è presente in tutti i controllori. Quello che stai chiedendo, l'esempio, to l'ho gia fatto nel post precedente. Nel tuo caso devi studiarti bene come lavora il tuo micro. Basta leggere cosa succede quando si esegue una call. Il manuale del PIC dice, testualmente, PC+1 --> TOS (Program counter + 1 nel top dello stack) e

k --> PC (indirizzo della routine nel PC). Quando avviene un interrupt esegue autoamticamente la chiamata a sounroutine di interupt.

Inserita:

Ok, ci sono riuscito.

Grazie mille per la disponibilita'.

Ciao

Rosario

  • 2 months later...
Inserita:

Salve a tutti

Anch'io ho lo stesso problema e, scusate l'ignoranza, ho fatto un po di prove sul pic 16f628 ma non sono riuscito a tornare da un interrup in un punto da me scelto.

per meglio dire caricando nel registro PCL il valore associato al mio punto di riferimento il programma esegue correttamente l'istruzione ma, non mi abbassa un livello di stack facendolo andare man mano in overflow. Chiedo se potete farmi un esempio di codice. Grazie :(

Inserita:

Il problema e' che nei PIC lo stack degli indirizzi di ritorno e' un'area di memoria distinta e inaccessibile al programma, e' gestita automaticamente dall'hardware del micro quando vengono eseguite certe istruzioni (call, return, retlw, retfie).

Sui microprocessori piu'evoluti lo stack si trova invece nella memoria dati principale e puo' contenere indifferentemente dati o indirizzi, e pertanto i suoi valori sono manipolabili come meglio si crede.

Concordo con Livio che se c'e' la necessita' di tornare da un interrupt saltando verso punti ben precisi (e quindi non riprendendo il lavoro che si stava eseguendo prima dell'interrupt) c'e' qualcosa di almeno un po'strano nella logica con cui e' strutturato il programma, anche se non e' detto che non funzioni.

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...