Vai al contenuto
PLC Forum


Int. Rb0 Veramente Da Impazzire? - CHI HA MAI AVUTO UN PROBLEMA SIMILE?


Armando pic

Messaggi consigliati

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


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

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

"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 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

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 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 ||||||||||||||||||||||||||||||||

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

;===================================== 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

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

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...