Armando pic Inserito: 8 dicembre 2004 Segnala Share Inserito: 8 dicembre 2004 hO SCRITTO UN BANALISSIMO PROGRAMMA CON UN PIC16F84A, IN PRATICA QUANDO SI GENERA UN FRONTE DI DISCESA SUL PIN RB0( ABILITATO COME INTERRUPT ) PARTE UN'INTERRUPT CHE INVIA UNA SEQUENZA DI BIT SULLA PORTA RB1 IN MODO SERIALE.L'IMPULSO CHE DOVREBBE GENERARE L'INTERR. DURA CIRCA 600 MICROSECONDI """l'IMPULSO E' PULITO!!! GENERATO DA UN ST6260 ED IN TEST HO USATO ANCHE UN GENERATORE DI FUNZIONI, L' ALIMENTAZIONE DEL CIRCUITO E' A BATTERIA O PROVATO ANCHE CON ALIMENTATORE DA LABORATORIO, IL RISULTATO NON CMBIA HO ASSEMBLATO IL CIRCUITO SU PCB E SU BREAD BOARD, NIENTE """ RISULTATO: L'INTERRUPT NON VIENE ESEGUITO DAL PIC , RIESCO A FAR PARTIRE L'INT. SOLO GENERANDO CON IL G.F. UNA SERIE DI IMPULSI RIPETUTI A BREVE DURATA FRA LORO. PREMETTO IL PROGRAMMA SIMULATO CON MPLAB FUNZIONA REGOLARMENTE.lE HO PROVATE TUTTE NON SO PIU' DA CHE PARTE RIGIRARLO.VI ALLEGO IL PROGRAMMINO SE TROVATE IL BACO EVITO DI PASSARE AD UN MICRO DI ALTRO PRODUTTORE.GRAZIE ANTICIPATAMENTE. TITLE 'PROG01: Countdown da 15,0 Secondi con disp. 7seg. list F=INHX8M,P=16f84A INCLUDE "P16F84A.INC" __CONFIG _CP_ON & _WDT_OFF & _PWRTE_OFF & _HS_OSC ORG 0 goto START ;Reset vector nop nop nop ; ================================= LABEL ======================================== ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> INTERRUPT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ORG 4 MOVWF WTEMP; SALVO W IN WTEMP SWAPF STATUS,W ; SALVO I REGISTRI DI STATO BCF STATUS,5; ATTIVO IL BANCO 0 MOVWF STEMP; SALVO IL REGISTRO DI STATO "SWAPPATO" BTFSS INTCON, T0IF; VERIFICO SE L'INTERR. E DEL TIMER0 GOTO BINT BCF INTCON, T0IF MOVLW .100 MOVWF TMR0 DECF TEMP, F; RUTIN DEL TIME0 GOTO ENDERR BINT BTFSS INTCON, INTF; ineterrupt rb0 GOTO ENDERR ASSURDO MOVF LPOWER,W MOVWF RAM4 MOVLW .20 MOVWF ERRORE CALL DECOBIT;1 CALL ATT102us RRF RAM4,F CALL DECOBIT;2 CALL ATT102us RRF RAM4,F CALL DECOBIT;3 CALL ATT102us RRF RAM4,F CALL DECOBIT;4 CALL ATT102us RRF RAM4,F ; BYTE POWER LAMP CALL DECOBIT;5 CALL ATT102us RRF RAM4,F CALL DECOBIT;6 CALL ATT102us RRF RAM4,F CALL DECOBIT;7 CALL ATT102us RRF RAM4,F CALL DECOBIT;8 CALL ATT102us ENDERR BCF INTCON, INTF ; AZZERO BIT INT FLEG SWAPF STEMP, W MOVWF STATUS SWAPF WTEMP, F SWAPF WTEMP, W RETFIE ; esce dalla rutin e riabbilita il GIE ;--------------------------------------------------------------------------- ; START PROGRAM ;--------------------------------------------------------------------------- START ; ++++++++++++++++++++++++++++ RAM SETTING ASSIGN ++++++++++++++++++++ TEMP equ 0x20 ; CONTIENE IL VALORE MOMENTANEO DEL CONTEG. UNITA equ 0x21 ; CONTIENE IL VALORE DECIMALE DELLE UNITA' DECINE equ 0x22 ; CONTIENE IL VALORE DECIMALE DELLE DECINE CENTIN equ 0x23 ; CONTIENE IL VALORE DECIMALE DELLE CENTIN. STATO equ 0x24 ; TEMPM equ 0x25 ; CONTIENE IL VALE TEMPO X ELAB. MOMENTANEO VCODEC equ 0x26 ; CONTIENE LA CODIFICA DIP. LED. X LA PORTB DISPV equ 0x27 ; CONTIENE IL RISULTATO DELLA CODIFICA LED DLED1 equ 0x28 ; DLED2 equ 0x29 DLED3 equ 0x2a WAIT1 equ 0x2b WAIT2 equ 0x2c WAIT3 equ 0x2d WAIT4 equ 0x2e WTEMP equ 0x2f STEMP equ 0x30 TON equ 0x31 RUNON equ 0x32 LPOWER equ 0x33 LSTATUS equ 0x34 LEDBAR equ 0x35 SERV1 equ 0x36 SERV2 equ 0x37 SERV3 equ 0x38 SERV4 equ 0x39 RAM1 equ 0x3a RAM2 equ 0x3b RAM3 equ 0x3c RAM4 equ 0x3F INCFST equ 0x3d DECFST equ 0x3e ERRORE equ 0x40 ; ******************************** Setto tutte le porte ************************* BSF STATUS,5 ; Banco 1 movlw b'00011110' ; RA1,RA2,RA3,RA4 INPUT - RA0 OUT movwf TRISA ; movlw b'00000001' ; RB1...RB6 out 25 mA RB0 in movwf TRISB ; movlw b'00000111' ; pull up 'on' / INT up /TIMER Osc movwf OPTION_REG ; TIMER up / PSA for TIMER0/ PRESC 256 bcf STATUS,5 ; Seleziona SRAM banco 0 clrf PORTA ; Uscite della porta A tutte a 0 clrf PORTB ; Uscite della porta B tutte a 0 bsf STATUS,5 ; Seleziona SRAM banco 1 movlw b'00010000' ; INT GLOB off / INT EEP off / INT TIMER0 off movwf INTCON ; INT RB0 on /INT RB7-4 off / RES ALL flags bcf STATUS,5 ; Seleziona SRAM banco 0 ; ;---------------------- main program ---------------------------- MAIN CLRF RUNON CLRF LPOWER CLRF LSTATUS CLRF LEDBAR MOVLW .170 MOVWF LPOWER ;azzera tutte le variabili e setta a 200 la V LPOWER ; BSF INTCON,GIE; abilito interrupt potra B MAIN2 BSF PORTB,1 ; ho eliminato tutto il resto del programma solo per ; poter escludere dei possibili erroriho lasciato solo ; questa stupidissima rutin in interrupt che chiramente ; non funziona. goto MAIN2 ;start del programma ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ;|||||||||||||||||||||||||| RUTIN DI RITARDO |||||||||||||||||||||||||||||||| ATT451us MOVLW .59 MOVWF WAIT1 MOVWF WAIT2 ATTL00 MOVLW .1 MOVWF WAIT1 ATTL11 DECFSZ WAIT1, F GOTO ATTL11 DECFSZ WAIT2, F GOTO ATTL00 RETURN ATT102us MOVLW .4 MOVWF WAIT1 MOVWF WAIT2 ATTL000 MOVLW .5 MOVWF WAIT1 ATTL111 DECFSZ WAIT1, F GOTO ATTL111 DECFSZ WAIT2, F GOTO ATTL000 NOP NOP NOP NOP RETURN ATTESAL MOVLW .1 MOVWF WAIT1 MOVWF WAIT2 ATTL0 MOVLW .1 MOVWF WAIT1 ATTL1 DECFSZ WAIT1, F GOTO ATTL1 DECFSZ WAIT2, F GOTO ATTL0 RETURN ATTESA1 MOVLW .50 MOVWF WAIT1 MOVWF WAIT2 ATT0 MOVLW .20 MOVWF WAIT1 ATT1 DECFSZ WAIT1, F GOTO ATT1 DECFSZ WAIT2, F GOTO ATT0 RETURN ATTESA2 MOVLW .255 MOVWF WAIT1 MOVWF WAIT2 ATT20 MOVLW .255 MOVWF WAIT1 ATT21 DECFSZ WAIT1, F GOTO ATT21 DECFSZ WAIT2, F GOTO ATT20 RETURN ATTESA3 MOVLW .100 MOVWF WAIT1 MOVWF WAIT2 ATTT0 MOVLW .20 MOVWF WAIT1 ATTT1 DECFSZ WAIT1, F GOTO ATTT1 DECFSZ WAIT2, F GOTO ATTT0 RETURN ;===================================== SUBRUTIN DECO BIT =========================== DECOBIT ; RBO è ELTO BTFSS RAM4,0;I GOTO BTD4;I BSF PORTB,1;I BIT2 GOTO BTD5;I BTD4 BCF PORTB,1;I BTD5 RETURN goto MAIN ; ;---------------------------------------------------------------- END Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 8 dicembre 2004 Segnala Share Inserita: 8 dicembre 2004 Sei sicuro di aver usato un PIC16F84A? I registri di uso generale iniziano da 0CH e non da 20H.Ciao. Link al commento Condividi su altri siti More sharing options...
Gariel Inserita: 8 dicembre 2004 Segnala Share Inserita: 8 dicembre 2004 Come fai a scatenare l'interrupt solo sul fronte di discesa del segnale su RB0? A me risulta che l'interrupt su RB0 avviene tutte le volte che lo stato logico della porta cambia.Se è cosi ogni 600 microsecondi hai un altro interrupt che potrebbe interferire con le routine che per la verità non ho bene inquadrato. E' una ipotesi, spero ti possa servire.Ciao.Gariel Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 8 dicembre 2004 Segnala Share Inserita: 8 dicembre 2004 Il fronte è selezionabile tramite il bit 6 di OPTION_REG.Per quanto riguarda il programma postato l'istruzione ; BSF INTCON,GIE; abilito interrupt potra Bè commentata quindi le interruzioni non sono abilitate.Ciao. Link al commento Condividi su altri siti More sharing options...
Gariel Inserita: 8 dicembre 2004 Segnala Share Inserita: 8 dicembre 2004 Giacomo 56, non mi ero mai accorto che si potesse selezionare il fronte dal quale scatenare l'interrupt.Ciao e grazie per la segnalazione.Gariel Link al commento Condividi su altri siti More sharing options...
Armando pic Inserita: 9 dicembre 2004 Autore Segnala Share Inserita: 9 dicembre 2004 "Per GIACOMO" osservazione corretta ma il punto e virgola sopra è capitato per caso nel programma in cui ho INSERITO tutti li ho eseguiti con il sottostante programma. TITLE 'PROG01: INVIO IN SERIALE UN BYTE CON INTERRUPT RB0 list F=INHX8M,P=16f84A INCLUDE "P16F84A.INC" __CONFIG _CP_ON & _WDT_OFF & _PWRTE_OFF & _HS_OSC ORG 0 goto START ;Reset vector nop ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> INTERRUPT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ORG 4 MOVWF WTEMP ; SALVO W IN WTEMP SWAPF STATUS,W ; SALVO I REGISTRI DI STATO BCF STATUS,5 ; ATTIVO IL BANCO 0 MOVWF STEMP ; SALVO IL REGISTRO DI STATO "SWAPPATO" BTFSS INTCON, T0IF ; VERIFICO SE L'INTERR. E DEL TIMER0 GOTO BINT BCF INTCON, T0IF MOVLW .100 MOVWF TMR0 DECF TEMP, F ; RUTIN DEL TIME0 GOTO ENDERRBINT BTFSS INTCON, INTF ; ineterrupt rb0 GOTO ENDERR ASSURDO MOVF LPOWER,W MOVWF RAM4 MOVLW .20 MOVWF ERRORE CALL DECOBIT ;1 CALL ATT102us RRF RAM4,F CALL DECOBIT ;2 CALL ATT102us RRF RAM4,F CALL DECOBIT ;3 CALL ATT102us RRF RAM4,F CALL DECOBIT ;4 CALL ATT102us RRF RAM4,F ; BYTE POWER LAMP CALL DECOBIT ;5 CALL ATT102us RRF RAM4,F CALL DECOBIT ;6 CALL ATT102us RRF RAM4,F CALL DECOBIT ;7 CALL ATT102us RRF RAM4,F CALL DECOBIT ;8 CALL ATT102usENDERR BCF INTCON, INTF ; AZZERO BIT INT FLEG SWAPF STEMP, W MOVWF STATUS SWAPF WTEMP, F SWAPF WTEMP, W RETFIE ; esce dalla rutin e riabbilita il GIE;---------------------------------------------------------------------------; START PROGRAM;---------------------------------------------------------------------------START; ++++++++++++++++++++++++++++ RAM SETTING ASSIGN ++++++++++++++++++++TEMP equ 0x20 UNITA equ 0x21 DECINE equ 0x22 CENTIN equ 0x23 STATO equ 0x24 TEMPM equ 0x25 VCODEC equ 0x26 DISPV equ 0x27 DLED1 equ 0x28 DLED2 equ 0x29DLED3 equ 0x2aWAIT1 equ 0x2bWAIT2 equ 0x2cWAIT3 equ 0x2dWAIT4 equ 0x2eWTEMP equ 0x2fSTEMP equ 0x30TON equ 0x31RUNON equ 0x32LPOWER equ 0x33LSTATUS equ 0x34LEDBAR equ 0x35SERV1 equ 0x36SERV2 equ 0x37SERV3 equ 0x38SERV4 equ 0x39RAM1 equ 0x3aRAM2 equ 0x3bRAM3 equ 0x3cRAM4 equ 0x3FINCFST equ 0x3dDECFST equ 0x3eERRORE equ 0x40; ******************************** Setto tutte le porte ************************* BSF STATUS,5 ; Banco 1 movlw b'00011110' ; RA1,RA2,RA3,RA4 INPUT - RA0 OUT movwf TRISA ; movlw b'00000001' ; RB1...RB6 out 25 mA RB0 in movwf TRISB ; movlw b'00000111' ; pull up 'on' / INT up /TIMER Osc movwf OPTION_REG ; TIMER up / PSA for TIMER0/ PRESC 256 bcf STATUS,5 ; Seleziona SRAM banco 0 clrf PORTA ; Uscite della porta A tutte a 0 clrf PORTB ; Uscite della porta B tutte a 0 bsf STATUS,5 ; Seleziona SRAM banco 1 movlw b'00010000' ; INT GLOB off / INT EEP off / INT TIMER0 off movwf INTCON ; INT RB0 on /INT RB7-4 off / RES ALL flags bcf STATUS,5 ; Seleziona SRAM banco 0;;---------------------- main program ----------------------------MAIN CLRF RUNON CLRF LPOWER CLRF LSTATUS CLRF LEDBAR MOVLW .170 MOVWF LPOWER ;azzera tutte le variabili e setta a 200 la V LPOWER BSF INTCON,GIE ; abilito interrupt potra BMAIN2 BSF PORTB,1; ho eliminato tutto il resto del programma solo per; poter escludere dei possibili erroriho lasciato solo; questa stupidissima rutin in interrupt che chiramente; non funziona. goto MAIN2 ;start del programma;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||;|||||||||||||||||||||||||| RUTIN DI RITARDO ||||||||||||||||||||||||||||||||ATT102us MOVLW .4 MOVWF WAIT1 MOVWF WAIT2ATTL000 MOVLW .5 MOVWF WAIT1ATTL111 DECFSZ WAIT1, F GOTO ATTL111 DECFSZ WAIT2, F GOTO ATTL000 NOP NOP NOP NOP RETURN;===================================== SUBRUTIN DECO BIT ===========================DECOBIT ; RBO è ELTO BTFSS RAM4,0 ;I GOTO BTD4 ;I BSF PORTB,1 ;I BIT2 GOTO BTD5 ;IBTD4 BCF PORTB,1 ;IBTD5 RETURN goto MAIN ;;---------------------------------------------------------------- END Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 9 dicembre 2004 Segnala Share Inserita: 9 dicembre 2004 L'interruzione sul pin RB0 funziona se nella routine d'interruzione porti basso il pin RB1 e poi esci.Devi guardare bene le istruzioni che hai scritto, io purtroppo non riesco a vedere cosa c'è che non và.Ciao. Link al commento Condividi su altri siti More sharing options...
Cesco Inserita: 16 dicembre 2004 Segnala Share Inserita: 16 dicembre 2004 Ciao a tutti,sono passato per caso di qua e questa discussione mi ha incuriosito parecchio.Armando, 6 riuscito a risolvere il tuo problema?Ciao a tutti! Link al commento Condividi su altri siti More sharing options...
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