Interruprion RB0 sur 16F84A
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Interruprion RB0 sur 16F84A



  1. #1
    narakphysics

    Interruprion RB0 sur 16F84A


    ------

    Bonjour tout le monde
    j'aimerai réaliser un programme en assembleur : un compteur modulo 100.
    le rôle du programme principale est l'affichage. dés qu'il y a une variation au niveau du RB0, on ajoute 1 et on met 1 à RB1.
    j'ai réaliser le schéma sur isis: le programme m'affiche juste "00", même si j'appuie sur le bouton poussoirs.!! j'ai besoin de votre aide
    merci d'avance
    Nom : affich.png
Affichages : 196
Taille : 24,2 Ko
    le code en assembleur:
    #include <p16F84A.inc>
    unit equ 0x0C
    diz equ 0x0D
    compt equ 0x0E
    temp1 equ 0x0A
    temp2 equ 0x0B
    cmpt1 equ 0x0F
    cmpt2 equ 0x10
    cmpt3 equ 0x11
    bank1 macro ; passage en banque 1
    bsf STATUS,RP0
    endm

    bank0 macro ; passage en banque 0
    bcf STATUS,RP0
    endm
    CBLOCK 0x12 ; début de la zone des registres d'usage général du 16F84A

    STATUS_TEMP : 1 ; sauvegarde du registre STATUS (routine d'interruption)
    W_TEMP : 1 ; sauvegarde du registre W (routine d'interruption)
    valeur_de : 1 ; 1 à 6

    ENDC

    org H'0000'
    goto initialisation

    org H'0004' ; vecteur d'interruption

    movwf W_TEMP
    swapf STATUS,W
    movwf STATUS_TEMP ; sauvegarde du registre W puis du registre STATUS


    btfsc INTCON,1
    goto inter1 ; on teste qu'il s'agit bien d'une interruption RB0/INT
    goto restauration




    inter1


    bsf PortB,1
    incf unit,1
    movlw 0x0A
    xorwf unit,0
    btfss STATUS,Z
    goto loop
    incf diz,1
    movlw 0x0A
    xorwf diz,0
    btfss STATUS,Z
    goto loop1
    goto loop2
    loop1
    movlw 0x00
    movlw unit
    goto loop
    loop2
    movlw 0x00
    movwf diz
    goto loop

    loop
    call tempo1
    bcf PORTB,1
    bcf INTCON,INTF ; on efface le flag 'RB0/INT'
    goto restauration
    tempo1
    nop
    movlw d'127'
    movwf cmpt3
    _b3tempo_3000000µs
    movlw d'98'
    movwf cmpt2
    _b2tempo_3000000µs
    movlw d'79'
    movwf cmpt1
    _b1tempo_3000000µs
    movf diz,0
    movwf PORTA
    bsf PORTB,7
    call tempo
    movf unit,0
    movwf PORTA
    bsf PORTB,6
    decfsz cmpt1,f
    goto _b1tempo_3000000µs
    decfsz cmpt2,f
    goto _b2tempo_3000000µs
    decfsz cmpt3,f
    goto _b3tempo_3000000µs
    return

    restauration

    swapf STATUS_TEMP,W ; restauration des registres STATUS puis W
    movwf STATUS
    swapf W_TEMP,f
    swapf W_TEMP,W

    retfie ; retour d'interruption




    ;--------------------
    initialisation

    bank0
    clrf PORTA ; mise à 0 des sorties du port A
    clrf PORTB ; mise à 0 des sorties du port B
    b1
    movlw 0x00
    movwf diz
    b2
    movlw 0x00
    movwf unit

    bank1
    movlw B'00101011'
    movwf OPTION_REG
    ; bit 7 (/RBPU) = 0 : activation des résistances de pull-up du port B
    ; (ce qui permet de faire l'économie d'une résistance externe sur RB0)
    ; bit 6 (INTEDG)= 0 : Interrupt on falling edge of RB0/INT pin
    ; bit 5 (T0CS) = 0 : Timer0 Clock Source Select = CLKOUT
    ; bit 3 (PSA) = 0 : Prescaler attribué au TMR0
    ; bit 2 (PS2)= 0
    ; bit 1 (PS1) = 1
    ; bit 0 (PS0) = 1 : Facteur de division du prescaler = 1:16
    ; bit 4 : ici, option non utilisée (= 0, par exemple)

    clrf TRISA
    ; bits 0 à 4 du port A (RA0 à RA4) = 1 : non utilisés (configuration en entrée, par exemple)

    movlw B'00000001'
    movwf TRISB
    ; bit 0 du port B (RB0) = 1 : configuration en entrée (bouton poussoir)
    ; bit 1 du port B (RB1) = 0 : configuration en sortie (LED segment g de l'afficheur)
    ; bit 2 du port B (RB2) = 0 : configuration en sortie (LED segment f)
    ; bit 3 du port B (RB3) = 0 : configuration en sortie (LED segment e)
    ; bit 4 du port B (RB4) = 0 : configuration en sortie (LED segment d)
    ; bit 5 du port B (RB5) = 0 : configuration en sortie (LED segment c)
    ; bit 6 du port B (RB6) = 0 : configuration en sortie (LED segment b)
    ; bit 7 du port B (RB7) = 0 : configuration en sortie (LED segment a)

    bank0
    movlw B'10010000'
    movwf INTCON
    ; bit 7 (GIE) = 1 : autorisation globale des interruptions
    ; bit 5 (T0IE)= 0 : inhibition de l'interruption de débordement du Timer0
    ; bit 4 (INTE) = 1 : Enables the RB0/INT external interrupt
    ; bit 2 (T0IF) = 0 : on efface le flag 'TMR0 Overflow Interrupt'
    ; bit 1 (INTF)= 0 : on efface le flag 'RB0/INT External Interrupt'
    ; les autres bits sont inutilisés (valeur par défaut = 0)

    goto debut_programme
    ;--------------------
    debut_programme
    movf diz,0
    movwf PORTA
    bsf PORTB,7
    call tempo
    bcf PORTB,7
    movf unit,0
    movwf PORTA
    bsf PORTB,6
    call tempo
    bcf PORTB,6
    goto debut_programme
    tempo
    movlw D'1'
    movwf temp2
    movlw D'1'
    movwf temp1
    l1
    decfsz temp1,1
    goto l1
    decfsz temp2,1
    goto l1
    bsf PORTB,0
    return
    end

    -----

  2. #2
    narakphysics

    Re : Interruprion RB0 sur 16F84A

    Pour le rendre un peu lisible :
    #include <p16F84A.inc>
    unit equ 0x0C
    diz equ 0x0D
    compt equ 0x0E
    temp1 equ 0x0A
    temp2 equ 0x0B
    cmpt1 equ 0x0F
    cmpt2 equ 0x10
    cmpt3 equ 0x11
    bank1 macro ; passage en banque 1
    bsf STATUS,RP0
    endm

    bank0 macro ; passage en banque 0
    bcf STATUS,RP0
    endm
    CBLOCK 0x12 ; début de la zone des registres d'usage général du 16F84A

    STATUS_TEMP : 1 ; sauvegarde du registre STATUS (routine d'interruption)
    W_TEMP : 1 ; sauvegarde du registre W (routine d'interruption)
    valeur_de : 1 ; 1 à 6

    ENDC

    org H'0000'
    goto initialisation

    org H'0004' ; vecteur d'interruption

    movwf W_TEMP
    swapf STATUS,W
    movwf STATUS_TEMP ; sauvegarde du registre W puis du registre STATUS


    btfsc INTCON,1
    goto inter1 ; on teste qu'il s'agit bien d'une interruption RB0/INT
    goto restauration
    inter1

    bsf PortB,1
    incf unit,1
    movlw 0x0A
    xorwf unit,0
    btfss STATUS,Z
    goto loop
    incf diz,1
    movlw 0x0A
    xorwf diz,0
    btfss STATUS,Z
    goto loop1
    goto loop2
    loop1
    movlw 0x00
    movlw unit
    goto loop
    loop2
    movlw 0x00
    movwf diz
    goto loop

    loop
    call tempo1
    bcf PORTB,1
    bcf INTCON,INTF ; on efface le flag 'RB0/INT'
    goto restauration
    tempo1
    nop
    movlw d'127'
    movwf cmpt3
    _b3tempo_3000000µs
    movlw d'98'
    movwf cmpt2
    _b2tempo_3000000µs
    movlw d'79'
    movwf cmpt1
    _b1tempo_3000000µs
    movf diz,0
    movwf PORTA
    bsf PORTB,7
    call tempo
    movf unit,0
    movwf PORTA
    bsf PORTB,6
    decfsz cmpt1,f
    goto _b1tempo_3000000µs
    decfsz cmpt2,f
    goto _b2tempo_3000000µs
    decfsz cmpt3,f
    goto _b3tempo_3000000µs
    return

    restauration

    swapf STATUS_TEMP,W ; restauration des registres STATUS puis W
    movwf STATUS
    swapf W_TEMP,f
    swapf W_TEMP,W

    retfie ; retour d'interruption
    ;--------------------
    initialisation

    bank0
    clrf PORTA ; mise à 0 des sorties du port A
    clrf PORTB ; mise à 0 des sorties du port B
    b1
    movlw 0x00
    movwf diz
    b2
    movlw 0x00
    movwf unit
    bank1
    movlw B'00101011'
    movwf OPTION_REG
    clrf TRISA
    movlw B'00000001'
    movwf TRISB
    bank0
    movlw B'10010000'
    movwf INTCON
    goto debut_programme
    ;--------------------
    debut_programme
    movf diz,0
    movwf PORTA
    bsf PORTB,7
    call tempo
    bcf PORTB,7
    movf unit,0
    movwf PORTA
    bsf PORTB,6
    call tempo
    bcf PORTB,6
    goto debut_programme
    tempo
    movlw D'1'
    movwf temp2
    movlw D'1'
    movwf temp1
    l1
    decfsz temp1,1
    goto l1
    decfsz temp2,1
    goto l1
    bsf PORTB,0
    return
    end

Discussions similaires

  1. Interruption INT0/RB0 sur pic18f2550 compilateur C18 marche pas
    Par frankie dans le forum Électronique
    Réponses: 11
    Dernier message: 19/10/2011, 23h48
  2. comment configurer RB0 comme entré analogique sur basic proton
    Par just-a-man-but dans le forum Électronique
    Réponses: 1
    Dernier message: 07/09/2011, 11h06
  3. cette serrure est elle realisé avec un 16f84A-04 ou 16f84A-10?
    Par badr-MOB dans le forum Électronique
    Réponses: 24
    Dernier message: 23/07/2011, 16h34
  4. interruption RB0 sur pic16f877
    Par invite7acd1074 dans le forum Électronique
    Réponses: 2
    Dernier message: 19/05/2011, 15h20
  5. aide sur les pic 16F84A
    Par invite7228a0be dans le forum Électronique
    Réponses: 3
    Dernier message: 24/05/2008, 23h20
Découvrez nos comparatifs produits sur l'informatique et les technologies.