Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC 16F84 E INTERRUPT

Salve a tutti, volevo sapere come funziona la gestione degli interrupt
nel pic16f84,  devo fare in modo che quando premo un pulsante, e come
se il pic si spegnesse, e al ripremere del pulsante va nella parte
iniziale del programma. il codice che ho fatto e questo:
int
                     btfss   conto,0
                     goto    accensione
                     goto dormi
end_hi
                      bcf INTCON,RBIF
                      btfsc   conto,0
                      goto    MainLoop
                      retfie
dormi
                     bcf     PORTB,LEDV
                     BCF     PORTB,P
                     movlw   D'0'
                     movwf   conto
                     bcf INTCON,RBIF
giro
                     goto  giro
                     goto end_hi
accensione
                      movlw   D'1'
                      movwf   conto
                      goto end_hi
all'inizo funziona infatti la prima volta che premo si mette a
"dormire", ma poi non reagisce più.
grazie a chi vuole rispondere o può suggerirmi altre strade.

 iniziale del programma. il codice che ho fatto e questo:
[...]
Sai che il codice dell'interrupt deve partire dalla locazione di indirizzo
0x0004? Probabilmente ti manca, proprio all'inizio, questo:
ORG 0
GOTO accensione
ORG 4
o qualcosa di simile

pozz ha scritto:

si questo lo so, infatti ho messo:
org4
goto int  ; mi va a richiamare il programma scritto sopra
ovviamente ho attivato i bit che permettono l'interrupt ecc

 ha scritto nel messaggio 
news:1157115303.5...@p79g2000cwp.googlegroups.com...

Se posti un codice che non funziona in ricerca di aiuto, lo devi postare 
completo.
Altrimenti chi potrebbe essere tentato di aiutarti non riesce ad intuire 
cosa tu abbia tralasciato e cosa invece no.
Cmq mi sembra che il tuo codice sia errato alla label 'giro', visto che 
rimane in loop non eseguendo mai la retfie che consentirebbe di scaricare lo 
stack.
In paratica quando vuoi gestire un interrupt:
- come prime istruzioni dei mettere quelle che ti consentono di salvare lo 
stato in cui tit trovi (registri W,S,e tutti quelli che utilizzi all'interno 
dell'interrupt e che quindi all'uscite devi ripristinare subito prima della 
retfie).
- devi quindi verificare se sei entrato in interrupt per il tuo evento 
(timer, uart, INTx,...) e cancellare il bit corrispondente in INTCON (o 
INTCON1)
- esegui la tua routine di gestione interrupt
- ripristini i registri che avevi precedentemente salvato
- esegui il retfie
Mi sembra quindi che nel tuo programma manchi il ciclo principale fuori 
dall'interrupt.
Qualcosa del tipo:
ORG 0
GOTO start
ORG 4
int:
    btfss   conto,0
    goto    accensione
dormi:
    bcf     PORTB,LEDV
    bcf     PORTB,P
    clrf     conto
    goto   end_hi
accensione:
    movlw   D'1'
    movwf   conto
end_hi:
    bcf INTCON,RBIF
    retfie
start:
   ... qui devi mettere l'inizializzazione dell'interrupt
   ... e dello stato delle porte
    movlw   D'1'
    movwf   conto
MainLoop:
   clrwdt
   goto      MainLoop
Anche se in nel prg cosě com'č non ti accorgi della variazione dello stato 
in quanto sul port B hai solo operazioni che mandano basse delle uscite e 
non le comandi mai alte (forme dovresti mettere un bsf  portb,ledv 
all'interno di 'accensione').
Inoltre se l'interrup č generato dalla chiusure di un pulsante dovresti 
anche gestire una sorta di antirimbalzo.
Roberto 

 Roberto
ciao, allora alla fine, il programma mi deve gestire dei galleggianti
che si trovano in una vasca, e questi si attivano in qualunque momento,
ora un vero e proprio programma principale non ci sta, ma funziona
tutto con interrupt, tutto il programma e questo:
PROCESSOR       16F84A
                __CONFIG 3FF1H
                RADIX           DEC
                INCLUDE         "P16F84A.INC"
                ERRORLEVEL      -302
G             equ    4
P             equ    0
S             equ    5
LEDR          equ    1
LEDG          equ    2
CounterB      EQU   0X0D
CounterA      EQU   0X0C
CounterD      EQU   0X0E
CounterC      EQU   0X0F
CounterE      EQU   0X10
CounterF      EQU   0X11
conto         equ   0x12
              ORG     00H
               goto  Start
               ORG 04H
interrupt
              BTFSC  PORTB,G
              goto  POMPA1
              btfsc  PORTB,S
              goto   PULSANTE
FINE           bcf     INTCON,RBIF
               RETFIE
Start
              bsf STATUS,RP0
              movlw B'00110000'          ;setta gli ingressi e le
uscite di B
              movwf TRISB
              movlw   B'00000'      ;setta le uscite e gli ingressi di
A
              movwf   TRISA
              bcf STATUS,RP0
              movlw   B'10001000'    ;attiva l'interrupt sulle porte
rb4/7
              movwf   INTCON
              movlw   D'1'
              movwf   conto
              BCF  PORTA,P
              BCF  PORTA,LEDG
              bsf   PORTA,LEDR
              btfsc  PORTB,G
              goto ACCENDI
MAINLOOP
                GOTO   MAINLOOP
ritardo
;PIC Time Delay = 0,1000020 s with Osc = 4 MHz
          	     movlw	D'130'
          	     movwf	CounterB
                 Movlw	D'221'
         	     movwf	CounterA
loop    	     decfsz	CounterA,1
        	     goto	loop
        	     decfsz	CounterB,1
	             goto	loop
         	     return
POMPA1
                 BTFSC  PORTB,G
                 GOTO   ACCENDI
                 GOTO   SPEGNIMENTO
ACCENDI
                 movlw   D'35'                   ;mette 0 in conto
                 movwf   CounterF
ACC              CALL ritardo
                 BTFSS  PORTB,G
                 GOTO FINE
                 decfsz  CounterF,1
                 GOTO ACC
                 BSF  PORTA,P
                 GOTO MINUTO
                 GOTO  FINE
SPEGNIMENTO
                 movlw   D'35'                   ;mette 0 in conto
                 movwf   CounterC
SPEGNI           CALL ritardo
                 BTFSC  PORTB,G
                 RETURN
                 decfsz  CounterC,1
                 GOTO SPEGNI
                 BCF   PORTA,P
                 GOTO  FINE
MINUTO
                     bcf     INTCON,RBIF
                     movlw   D'100'      ;mette 100 in counterD
                     movwf   CounterD      ;
                     movlw   D'3'
                     movwf  CounterE
ciclo
                     call ritardo          ;ritardo di 0,1s
                     btfss  PORTB,G        ;controlla g=1?
                     CALL   SPEGNIMENTO       ;no, vai a spegnimento
                     decfsz  CounterD,1      ;si decrementa counterD e
skip se è 0
                     goto     ciclo           ;counterD diverso 0 vai a
ciclo12
                     decfsz  CounterE,1
                     goto    ciclo
                     BCF     PORTA,P       ; disattiva P
CICLO1
                     bsf     PORTA,LEDG
                     GOTO  CICLO1
                     GOTO    FINE          ; vai a fine
PULSANTE
                    BTFSS  conto,0
                    goto SVEGLIA
                    GOTO DORMI
DORMI
                     BCF     PORTA,LEDR
                     movlw   B'10001000'
                     movwf   INTCON
                     BCF     PORTA,P
                     movlw   D'0'
                     movwf   conto
                     sleep
                     bcf     INTCON,RBIF
                     goto  DORMI
SVEGLIA
                      bsf   PORTA,LEDR
                      movlw   B'10001000'
                      movwf   INTCON
                      movlw   D'1'
                      movwf   conto
                      goto  FINE
               END
è possibile che ci sia qualche errore, lo stavo modificando un 
po.il
galleggiante è un pulsante normalmente aperto, il funzionamento è
questo: normalmente la porta del galleggiante sta a 0, quando va ad 1,
deve attivare il pin P, dopo 3-4s che il galleggiante e rimasto ad 1,
dopo aver fatto questo, il pin P controlla l'accensione di una pompa,
che riempe la vasca, durante il riempimento la pompa si deve spegnere
se il galleggiante torna a 0, oppure se passato un minuto dopo
l'attivazione della pompa accendendo un led giallo(segnalazione
errore). all'accensione del led giallo, non deve effettuare più il
controllo, e bisogna solo o resettare, oppure scrivere il programma in
modo che quando premo il pulsante di accensione si resetti. ora il
pulsante di accensione e spegnimento mi serve per "spegnere" il pic,
senza levare la tensione.

p.c...@fastwebnet.it
 ha scritto:

c'è qualcuno che mi da una mano??