Newsgroup: it.hobby.elettronica.digitale
Titolo: interrupt tmr0 overflow

Ciao a tutti,
sto provando a programmare un 16f84. Funziona tutto, tranne la gestione
dell'interrupt per il tmr0overflow. Sto usando un prescaler da 256, poi
un artificio software per fare che esegua la routine ogni 256^2
interrupt.
Avete voglia di dare un'occhiata all'assembler? Perchè non mi esegue mai
la routine?
Grazie ciao
Luigi
-------------------
 org 0x00  ;VETTORE RESET
 goto start
 org 0x04  ;VETTORE INTERRUPT
 bcf intcon,t0if
 decfsz count_i,1    ;COUNT_I e COUNT_I+1 sono due file dell'area dati
 retfie
 decfsz count_i+1,1
 retfie
;qui ci va la routine da fare. Ne ho messa una già collaudata, non la
riporto
retfie
start
 bsf status,rp0
 movlw B'00001100' ;imposta ingressi/uscite
 movwf trisa
 movlw B'00000000'
 movwf trisb
 movlw B'00000111' ;imposta tmr0 con prescaler 256
 movwf option_reg
 bcf status,rp0
 movlw B'10100000' ;imposta interrupt per tmr0
 movwf intcon
;qui c'è il programma principale. Questo funziona!

 retfie


-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 STATUS, per poi ripristinarli all'uscita.
anche a questo non avevo pensato! è il primo programma che scrivo e non
ho ancora imparato queste "astuzie"! Grazie mille
Adesso provo a fare così: visto che il programma principale funziona,
faccio un semplice interrupt con una routine minima, tipo
accendere-spegnere un led. Insomma, aggiungo il codice un po' alla
volta...
Grazie ancora e ciao
Luigi

 Luigi


 l'interrupt viene eseguito quando la routine non è ancora terminata!
Io uso il 16F628, non so se il 16F84 funziona in maniera differente,
però sul 16F628 quanto dici non succede:
quando viene lanciato un interrupt, il PIC fa queste operazioni:
1) Carica nello stack il PCL attuale
2) Disattiva il flag GIE di INTCON
3) Carica in PCL l'indirizzo 0004h
Grazie al fatto che GIE è stato resettato,
altre richieste di interrupt non verranno soddisfatte
finché la routine di servizio non ha terminato il suo lavoro.
L'istruzione RETFIE fa queste cose:
1) Carica PCL dallo Stack (come una return, e in più:)
2) Riattiva il flag GIE
Se la routine dura più di 256 cicli, oppure se ci si dimentica
di resettare il T0IF in uscita dalla routine di servizio,
appena verrà eseguita RETFIE,
e quindi riattivato automaticamente il GIE,
il PIC partirà nuovamente da 0004h
ad eseguire la routine di servizio per l'interrupt.
Il controllo non tornerà più al programma principale,
però la routine di servizio interrupt non verrà interrotta
prematuramente, piuttosto eseguita dall'inizio alla fine
tante volte, senza tornare al prog principale.
Ciao!
--
Il corpo non sopravvive senza la mente.
Morpheus insegna a Neo le regole di MATRIX

Aggiungo che il salvataggio di W e STATUS va eseguito con
una procedura particolare:
All'inizio dichiari due variabili per conservare W e status,
io le ho chiamate IW e IStatus.
Nel PIC che uso (PIC16F628) vanno messe alla locazione 70h e a seguire,
perché sono quelle le locazioni con i File-Register
indipendenti dal banco corrente. Cosě:
DICHIARAZIONI ALL'INIZIO DEL PROGRAMMA
 cblock 0x70
IW
IStatus
 endc
SALVATAGGIO (all'inizio della routine di interrupt)
org 0x0004
 movwf IW          ;Salva W (senza modificare STATUS :-)
 movf STATUS,W     ;Copia Status in W
 movwf IStatus     ;Salva Status
 bcf STATUS,RP0    ;Passi a Bank 0, se il tuo programma
 bcf STATUS,RP1    ;si sposta di banco anche una sola volta
RECUPERO W e STATUS (al termine della routine di interrupt)
 movf IStatus,W    ; Recupera Status (e automaticamente recupera il banco)
 movwf STATUS      ; e lo assegna
 swapf IW,F        ; Recupera W salvato, senza
 swapf IW,W        ; modificare i bit di status
                   ;(movwf potrebbe settare il flag Z in status,
                   ; e quindi non avresti il recupero corretto)
 retfie            ; ritorno dall'interrupt
CIAO!
--
Il meglio della musica non č nelle note
Gustav Mahler

 Gustav Mahler


Siamo Off-Topic (causa 16f628 anzichč 16f84)
ma anzichč salvare in 020 + 0A0,
puoi salvare in 070 che fa echo in tutti e quattro i banchi.
ciauz!
--
L'amicizia č il fiore del presente e il frutto del tempo.
August von Kotzebue