Newsgroup: it.hobby.elettronica.digitale
Titolo: Interrupt PIC16F876A

Ho un problemino: ho fatto questo semplice programma per spiegarmi meglio:
l'interrupt è abilitato dal TMR0 che è impostato a 1Hz.Nell'interrupt non
faccio altro che accendere e spengere un led su A1.
Problema: il programmino qui sotto funziona solo eliminando la chiamata
della sub "attendi" che risiede nel banco 2 del pic. Se lascio la chiamata
non lampeggia più.
Come mai?Cosa sbaglio?
Ho provato anche a spostare la SUB su un altro banco ma niente.
Gaetà
PROCESSOR 16F876a
RADIX DEC
INCLUDE "P16F876a.INC"
__config 3f32h
ERRORLEVEL -302
ORG 20H
count res 1
copia res 1
ORG 120h
contatore res 2
ORG 00H
goto start
ORG 04H
movlw 6
movwf TMR0
movlw 0
xorwf count,0
btfss STATUS,Z
goto out
movlw 125
movwf count
btfss copia,0 ;accende o spegne led su A1 a 1Hz
goto ledon
bcf copia,0
bcf PORTA,1
goto out1
ledon bsf copia,0
bsf PORTA,1
out1 bcf INTCON,T0IF
retfie
out decf count,1
goto out1
start
bcf STATUS,RP1
bsf STATUS,RP0
movlw 6
movwf ADCON1
movlw 11111100b
movwf TRISA
movlw 00000010b
movwf TRISB
movlw 11111111b
movwf TRISC
movlw 6 ; 1Mhz/32/250/125= 1 Hz
movlw TMR0
movlw 125
movwf count
movlw 0000100b ;abilita TMR0 con prescaler a 32
movwf OPTION_REG
bcf STATUS,RP0
;*******************************
;* INIZIO PROGRAMMA PRINCIPALE *
;*******************************
main
clrf PORTA
clrf PORTB
clrf copia
movlw 10100000b ;abilita Interrupt TMR0
movwf INTCON
movlw 200
loop goto loop
ORG 1000h
;*****************************
;* Subroutine Attendi *
;* W = Tempo di attesa in millisecondi (quarzo di 4MHz)*
;*****************************
attendi
movwf contatore+1
clrf contatore+0
ciclo
nop
decfsz contatore+0,F
goto ciclo
nop
decfsz contatore+1,F
goto ciclo
PAGESEL main
return
END 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 loop goto loop
Scusate avevo dimenticato l'istruzione incriminata
Gaetà


 ha scritto nel messaggio
news:ctttf6$5mg$1...@news.newsland.it...


 Lucio
Grazie
Gaetà



Si, hai ragione, ed ho anche visto che l'hai usata prima del return
dall'attesa, ma non l'hai inserita prima della call.
Praticamente hai fatto esattamente il contrario di ciò che devi fare :-)
La pagina la devi settare prima della call, il return carica automaticamente
dallo stack sia il Pcl che il Pch.
Eventualmente la devi riutilizzare dopo il return per reimpostare la pagina
corretta per eseguire le istruzioni successive:
esempio
main
    pagesel    ATTESA
    call    ATTESA
    pagesel    main
    goto    Routine nella stessa pagina di main
main
    pagesel    ATTESA
    call    ATTESA
    goto    Routine nella stessa pagina di ATTESA
Io generalmente uso settare soltanto il bit che mi serve per ottimizzare al
massimo il codice, infatti le direttive BANKSEL e PAGESEL impostano sempre e
comunque entrambi i bit, utilizzando sempre 2 istruzioni, anche quando ne
basta 1.
Comunque mi tocca farti una piccola tirata d'orecchi: queste cose ci sono
scritte sul manuale del pic!!! Anche quelle dell'interrupt ci sono!!!
Facci sapere
Ciao

 scritte sul manuale del pic!!! Anche quelle dell'interrupt ci sono!!!
Data sheet o meno....è regola generale che quando si esegue un interrupt
bisogna fare un bakup dell'accumulatore e compagnia bella:tirata d'orecchi
meritata.
Comunque ti confermo che funziona, ora il led lampeggia CVD
