Elenet.net
0 voti
quesito posto 6 Giugno 2017 in Sistemi Automatici da Gia70x (33 punti)
  

2 Risposte

+1 voto
Guarda questo: https://drive.google.com/open?id=0BxvY-c0NTuhPdVNETEJZOUN1TlU

Quindi per attivare l'interrupt del timer 0 devi porre a 1 il GIE (pin 7 di INTCON ) ed il TOIE (pin 5 di INTCON).

A questo punto programma il TMR0 con il tempo che ti serve e ricordati che questo si avvierà non appena avrai inserito la costante di tempo. Quando il conteggio arriva a zero viene generato un interrupt, il flag di segnalzione TOIF (pin 1 di INTCON) va alto, il programma principale si interrompe e viene eseguita la routine di servizio che è caricata a partire dall'indirizzo 04h.

Se stai lavorando in assembler all'indirizzo di reset (00h) è opportuno prevedere un' istruzione di salto. L'indirizzo di destinazione lo potrai avere dopo che hai scritto la tua routine di servizio che va chiusa con l'istruzione RTI (ReTurn from Interrupt) e che all'interno deve prevedere il reset del flag TOIF (per poter avere altri interrupt provenienti dal TMR0). L'indirizzo di destinazione può essere il primo indirizzo libero dopo la routine di servizio.
risposta inviata 6 Giugno 2017 da Mimmo Corsista (49 punti)
+1 voto

L'interrupt del timer è uno delle quattro sorgenti di interrupt; le altre tre sono l'interrupt esterno (pin RB0/INT), l'interrupt associato ai cambiamenti dei pin RB4-RB8 e l'interrupt associato alla EEPROM per il completamento della scrittura dati.

Il registro del PIC16F84 coinvolto nella festione del'interrupt è il registro INTCON

Per abilitare l'interrupt del timer occorre porre a 1 il bit 5 di INTCON (istruzione BSF INTCON,5).  Poi si deve porre a 1 il bit 7 dello stesso registro (BSF INTCON,7) per rendere effettiva l'azione di interrupt; fino a quando il bit 7 è a zero l'interrupt non è abilitato.

Il bit 2 del registro INTCON, denominato T0IF (Timer 0 Interrupt Flag) è un bit di flag che diventa 1 quando il timer va in overflow, coiè quando arriva al suo massimo valore (255) e diventa 0. Tale bit deve essere azzerato dal programmatore dopo ogni evento.

Il registro del timer incrementa il suo valore in seguito agli impulsi legati alla frequenza di clock, quindo dopo l'overflow riparte e, dopo un certo tempo, si verificherà un altro overflow.

Se l'interrupt del timer è abilitato (con le modalità di cui sopra) ad ogni overflow verrà interrotto il normale svolgimento del programma per andare ad eseguire una routine di interrupt (gruppo di istruzioni poste a partire dall'indirizzo 004 della memoria programma).

In questo gruppo di istruzioni il programmatore farà le sue operazioni,sapendo che è trascorso un tempo ben preciso.

All'interno di questo blocco di deve ricordare di azzerare il flag T0IF (BCF INTCON,2)

L'ultima istruzione del blocco è la retfie, con la quale si riprende la normale esecuzione del programma principale dal punto in cui era stata interrotta. Un esempio di routine di interrupt:

INIT     ORG 0000H
    GOTO    START

    ORG 0004        ;GESTIONE INTERRUPT TMR0=0
    movlw  00010000b           ;decrementa ncont... se è 0 salta la successiva  4
    movwf TMR0        ;riparte il timer
    bsf swt,0        ;bit 0 a 1
    decf ncont,1
    bcf intcon,2        ;azzera il flag interrupt
    retfie

START     ORG    0010H     ; inizio programma

In grassetto il blocco di istruzioni che vengono eseguite ad ogni overflow del timer, in modo automatico.

All'avviamento la routine di interrupt non viene eseguita perchè bypassata da GOTO START.

In questo modo il programmatore fa svolgere altri compiti al micro senza ocuparsi della temporizzazione.

risposta inviata 6 Giugno 2017 da cosimomacaluso Corsista (44 punti)

Domande correlate

+2 voti
1 risposta
quesito posto 29 Marzo 2017 in Triennio da nascaivan (31 punti) | 260 visite
+2 voti
2 risposte
quesito posto 14 Maggio 2013 in Triennio da domenico blando Corsista (71 punti) | 267 visite
0 voti
1 risposta
778 domande
1,565 risposte
639 commenti
1,445 utenti