Vai al contenuto
PLC Forum


Pic 16F876: Problemi con interrupt su TMR0


Del_User_165940

Messaggi consigliati

Del_User_165940

ciao sn nuovo e mi chiedevo se potevate aiutarmi con un problema k ho con un programma k ho scritto in assembler con il pic16F876

si tratta di fare una roulette solo k quando chiama la routine di interrupt al comando retfie ritorna non al programma principale ma alla routine di interrupt come faccio? potete aiutarmi a mettere apposto

grazie.

PS.: in questo programma volevo usare interrupt e TMR0

allego il programma


;**********************************************************************


ORG	 0x000			 ; vettore del reset


nop   ; nop richiesto per ICD (in circuit programming)

   goto	Inizio			; vail all'inizio del programma



ORG	 0x004			 ; indirizzo del vettore i interruzione


movwf   w_temp			; salva il contenuto attuale del registro accumulatore W

movf STATUS,w		  ; sposta il contenuto del registro STATUS nel registro W

movwf status_temp	   ; salva il contenuto del registro STATUS

movf PCLATH,w	  ; sposta il contenuto del registro PCLATH nel registro W

movwf pclath_temp	  ; salva il contenuto del registro PCLATH


; di seguito si scrivano le routines di interruzione

btfss INTCON,INTF

goto RB0_INT

btfsc INTCON,INTE

goto RB_INT

goto FINE_INT

; clrf PORTC

RB0_INT

bsf VIA,0 ; via = sì

call Ritardo

goto FINE_INT


RB_INT

bsf ALT,0 ;fermo il gioco

movlw NUMERO ;muovo numero in estratto

movwf ESTRATTO ;muovo numero in estratto

bcf INTCON,RBIF


FINE_INT

movf pclath_temp,w   ; recupera il contenuto della copia del registro PCLATH

movwf PCLATH	  ; ripristina il contenuto del registro PCLATH prima dell'interruziuone

movf	status_temp,w	 ; recupera il contenuto della copia del registro STATUS

movwf STATUS			; ripristina il contenuto del registro STATUS prima dell'interruziuone

swapf   w_temp,f	  ; recupera il contenuto della copia del registro W

swapf   w_temp,w		  ; ripristina il contenuto del registro W prima dell'interruziuone

retfie					; RITORNO DALL'INTERRUZIONE


;**********************************************************************

; il resto del programma inizia da qui

Inizio


	bsf	STATUS,RP0				;passa al banco 1(metti a 1 RP0)

	movlw  B'00000000'				

	movwf  TRISC				 ;pin 0 porta C output (RCO,RC1,RC2,RC3,RC4,RC5,RC6,RC7)	

	bcf	OPTION_REG,NOT_RBPU		  ;attiva R di pull-up nei pin della porta B

bcf OPTION_REG,INTEDG

	bcf	STATUS,RP0				   ;torna al banco 0

	bcf INTCON,INTF

	bcf INTCON,RBIF

	bsf INTCON,INTE

	bsf INTCON,RBIE

	bsf INTCON,GIE

	clrf PORTC

	movlw D'37'

	movwf NUMERO


Loop

btfss VIA,0

goto Loop

  movlw D'100'

movwf ESTRATTO

movlw D'16'

movwf DATO

movlw D'3'

movwf GIRI


Ruota

movf DATO,W

movwf PORTC

call Ritardo

incf DATO,F

movlw D'48'

xorwf DATO,W

btfsc STATUS,Z

goto Salta

movlw D'117'

xorwf DATO,W

btfss STATUS,Z

goto Ruota

goto Loop


Salta

movlw D'112'

movwf DATO


return



Ritardo

movlw N3

movwf   CONT3  ;CONT2=N2

RitLoop3

movlw N2

movwf CONT2

RitLoop2

movlw N1

movwf CONT1  ;CONT1=N1

RitLoop1

decfsz  CONT1,F  ;decrementa CONT1;salta l'istruzione successiva se vale 0

goto RitLoop1

decfsz CONT2,F  ;decrementa CONT2;salta l'istruzione successiva se vale 0

goto RitLoop2

decfsz CONT3,F  ;decrementa CONT2;salta l'istruzione successiva se vale 0

goto RitLoop3


return


END

Modificato: da Gabriele Riva
Inserito tag CODE
Link al commento
Condividi su altri siti


Non si capisce niente di quello che hai scritto!

Il regolamento vieta l'uso di abbreviazioni stile SMS e chat proprio perchè rendono i messaggi poco comprensibili!

Devi scrivere in Italiano standard, senza abbreviazioni "k" e altri simboli da SMS. Inoltre non essere telegrafico spiega esattamente il problema, anche senza inserire il codice.

la routine di interrupt al comando retfie ritorna non al programma principale ma alla routine di interrupt come faccio?

Cosa significa? Forse la routine di interrupt cicla su se stessa?

Se fosse così significa il tempo di esecuzione della routine è maggiore del tempo tra due interrupt successivi.

PS Anche il titolo della discussione non va bene. Ora l'ho modificato in modo che si intuisca il tipo di problema.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Del_User_165940

ok scusa riscrivo il messaggio in modo leggibile e mi spiego meglio.

Il mio problema avviene con il programma che ho postato;quando aziono RB0 va alla routine di INTERRUPT quando poi dove tornare al programma che stava eseguendo prima dell'INTERRUPT resta nella routine per l'interruzzione. Volevo sapere come faccio a far si che il programma continui dopo la routine senza che si blocchi li.

grazie mille

Link al commento
Condividi su altri siti

Anche sono anni che non uso più l'asm mi sembra che il problema sia qui:

movf pclath_temp,w   ; recupera il contenuto della copia del registro PCLATH

movwf PCLATH      ; ripristina il contenuto del registro PCLATH prima dell'interruziuone

Questo non devi farlo, la routine i servizio dell'interrupt salv in automatico l'indirizzo di ritorno, indirizzo che sarà poi usato dall'istruzione di ritorno dalll'interrupt.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...