Del_User_165940 Inserito: 3 aprile 2012 Segnala Inserito: 3 aprile 2012 (modificato) 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: 3 aprile 2012 da Gabriele Riva Inserito tag CODE
Livio Orsini Inserita: 3 aprile 2012 Segnala Inserita: 3 aprile 2012 (modificato) 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: 3 aprile 2012 da Livio Orsini
Del_User_165940 Inserita: 3 aprile 2012 Autore Segnala Inserita: 3 aprile 2012 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
Livio Orsini Inserita: 4 aprile 2012 Segnala Inserita: 4 aprile 2012 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora