wpe1.jpg (21303 byte)

Nuovo sito su http://digilander.iol.it/bitblitbit/

Se trovate cose interessanti, che vi fanno risparmiare tempo e vi facilitano la vita...
vi saremmo grati se a vostra volta voleste facilitare la vita (magari con una piccola donazione) agli amici di...

http://web.tiscali.it/CasaFamigliaLP/

SITO IN SVILUPPO CONTINUO !!!

E-MAIL bitblit@tiscalinet.it

 

Su

 

ST7 Interrupts (vedere manuale di STM, ST7 USER GUIDE sezione 2.5)

Un microcontrollore normalmente esegue una istruzione alla volta nella esatta sequenza in cui le incrontra. Spesso pero' e' comodo poter uscire dalla sequenza del programma per gestire degli eventi dovuti ad ingressi (I/O) o a periferiche del micro. Per questi motivi tutti i microcontrollori di un certo livello hanno implementato al loro interno la possibilita' di gestire degli interrupt.

Gli interrupt sono un meccanismo per cui l'esecuzione del programma viene sospesa per gestire un evento ad esso esterno. Il microcontrollore sospende il programma principale per eseguire una parte diversa di programma in cui gestisce la richiesta di intervento arrivata da una delle sue periferiche (timer, A/D, ecc) o I/O. Quando questa parte di programma e' terminata il microcontrollore ritorna ad eseguire il programma principale dalla riga successiva a quella a cui si era fermato.

Va detto che le diversi sorgenti di interrupt hanno priorita' di gestione differenti a secondo della periferica che li ha generati.

Naturalmente tutti i microcontrollori prima di gestire un interrupt salvano il PC, i registri di stato e altri registri di sistema nello stack.

Di seguito e' riportato lo schema di pricipio che evidenzia come la famiglia ST7 gestisce gli interrupts.

In generale, come si vede dal diagramma sopra riportato, si puo' decidere se abilitare o meno la risposta ad un'interrupt. L'unico interrupt in genere sempre abilitato e' il NON MASKABLE INTERRUPT,

GLOBAL INTERRUPT ENABLE BIT detto I bit, quando questo bit e' settato (1) nessun interrupt verra' generato ma eventuali interrupt non vengono persi.

In altre parole... quando si abilita (0) questo bit gli interrupt che erano sopraggiunti vengono gestiti in base alle rispettive priorita'.

SOFTWARE INTERRUPT oltre agli inter. HW vi e' anche una istruzione SW (TRAP) che ha lo stesso effetto di un'interrupt esterno con la differenza che e' il SW a generarlo. Questa possibilita' viene usata per le fasi di debug del SW.

Quando un INTERRUPT TRIGGER viene generato il CORE del microcontrollore dopo aver completato l'istruzione in esecuzione, salva i registri, il program counter e i flags, gestisce l'interrupt e poi riposiziona i registri, il PC e i flags per proseguire nella normale esecuzione del programma.

ATTENZIONE: ST7 salva in automatico...

Program Counter (PC), X register, Accumulatore e i Flags

Il registro Y non viene salvato perche' e' stata mantenuta la compatibilita' con i primi micro della famiglia (HC05). Se serve salvare il registro Y cio' deve essere fatto via SW tramite PUSH e POP.

Quando il micro risponde ad una richiesta di inter. automaticamente setta a 1 il I bit (Global Interrupt Enable Bit) disabilitando altri interrupt che potrebbero sopraggiungere.

IRET (e' sempre l'ultima istruzione di una subroutine di interrupt) riposiziona anche l'I bit... se gli interrupt erano abilitati verranno riabilitati.

Ad ogni sorgente di interrupt e' associato un indirizzo specifico del programma, in altre parole esiste una Interrupt Vector Table (IVT) che contiene gli indirizzi di inizio delle varie routine di servizio agli interrupt.

Il micro andra' all'indirizzo specificato al quale tipicamente trova un nuovo indirizzo (rimando) alla subroutine che dovra' gestire l'interrupt.

la IVT e' tipicamente posizionata alla fine della memoria indirizzabile dal micro.

Di seguito e' riportata la IVT riferita al ST72251

FFE0                                 Lower Priority

                not used                    

FFE4                                        

                I2C bus interface        

FFE6

                not used

FFEE

                Timer B

FFF0

                not used

FFF2

                Timer A

FFF4

                SPI

FFF6

                not used

FFF8

                Port B and C

FFFA

                Port A

FFFC

                TRAP

FFFE

                Reset Vector        Higher Priority

 

SUGGERIMENTI sulla risposta ad un Interrupt

E' buona norma salvare il registro Y alla risposta ad una routine di interr. e ripristinarlo alla uscita della routine stessa (PUSH e POP).

Resettare il bit della periferica che ha generato l'interr.

Va infatti tenuto presente che alcune periferiche quando generano un interr. e vengono servite automaticamente resettano il loro bit di interr.

Altre periferiche, come i TIMER, anche se asservite NON resettano il bit di interr. In questo caso bisogna all'interno della routine che asservisce l'interr. della periferica resettare il flag di interr. della periferica stessa.

Abilitazione di un nuovo interr. all'interno di una routine di interr.

In alcuni casi, come nei sistemi multi task, nasce la necessita' di abilitare all'interno di una routine di interr. il Global Interrupt Enable Bit I. Cio' e' possibile semplicemente da SW (SET-BIT di I) ma si tenga presente che lo STACK non e' infinito.

Ricordatevi che lo STACK e' posizionato nella RAM del micro per cui se dovete usare la tecnica sopra descritta usate ST7 con molta RAM.

APPENDICI

I flag o Conditional Code Register (CC) sono:

H half carry bit

questo bit viene messo a 1 quando c'e' un riporto tra il bit 3 e il bit 4 dell'alu durante un'operazione di ADD o ADC.

I global interrupt masck bit

questo bit se e' settato a 1 tutti gli interr. sono disabilitati se e' resettato a 0 tutti gli interr. sono abilitati.

N negative bit

quando questo bit e' a 1 significa che l'ultima istruzione matematica o logica ha dato un valore negativo.

Z zero

quando questo bit e' a 1 significa che l'ultima istruzione matematica o logica ha dato risultato 0.

C carry/borrow (riporto)

Quando e' settato indica che l'ultima operazione matematica del micro ha causato un riporto (MSB). Il C e' anche settato durante le operazioni di bit test, branch, shift, rotate e load (vedere ADD, ADC, SUB, SBC, BTJF, BTJT). Durante le operazioni di shift il C e' aggiornato (vedere RRC, RCL, SRL, SLL, SRA).

Il C e' settato/resettato via SW... per esempio:

$B5 + $94 = "C" + $49 = $149

        C     7                  0

        0     10110101      B5

+      0     10010100      94

=      1     01001001      149     (100 + 49)

 

Siete appassionati di elettronica, modellismo, automazione, home automation ecc, se la risposta è si cliccate qui sotto