Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Profil pro
    Inscrit en
    août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : août 2007
    Messages : 7
    Points : 2
    Points
    2

    Par défaut [16f84] Aide pour une interruption sur port B

    salut

    il y'a quelqun ici qui comprends vraiment l'assembleur ?
    "la croix et la bannière" pour essayé de comprendre ou est le problème !

    j'ais réaliser un petit programme avec interruption sur le portb (4...7)
    l'interruption est bien détecté , mais pourquoi lors de la deuxième détection il ne se passe rien ? j'ais bien mis en lieu et place retfie et rbif..
    pourtant l'interruption ne se fait qu'une fois lors d'un autre essaie ,j'avais créer une temporisation ou lors de l'interruption la led s'allume et s'éteint peux apres (cela fonctionne) , peux apres, si on veut exécuter une autre interruption ,rien ne se passera , si quelqun voit quelque chose ?...
    merci pour votre aide

    ;************ Directive d' assemblage pour MPLAB ***********

    list p=16f84A
    #include p16f84A.inc
    __Config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    ;.............................................................




    ;******************** Variables utilisées ****************

    var1 equ C



    ;********** Numero de version / données EEPROM ***********

    ORG h'2100'
    de "Version 1.0"


    ;***************** Programme principal *******************

    ORG 0
    GOTO init

    ;*********** Sous Programme d 'interruption **********

    ORG 4

    ;*********** IT sur RB4-RB7***********************************

    bsf PORTA,0 ; on allume la led connectée sur ra0

    bcf INTCON,RBIF ; on raz le flag RBIF

    retfie ; retour d 'interruption


    ; *********** Programme d' INIT ***********************

    init


    bsf INTCON,GIE ; autorise les Interruptions
    bsf INTCON,RBIE ; autorise l ' IT sur RB4-RB7
    bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder
    ; à la 2eme page mémoire ( pour trisa et trisb )
    MOVLW B'11110000' ; programmation de rb0-rb7
    MOVWF TRISB ; on met 11110000 dans le registre de direction du port B
    MOVLW B'00000' ; programmation de ra0-ra4
    MOVWF TRISA ; on met 00000 dans le registre de direction du port A
    bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder
    ; à la 1eme page mémoire
    clrf PORTA ; raz du port A
    clrf PORTB ; raz du port B

  2. #2
    Membre chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 623
    Points
    623

    Par défaut

    il manque un paquet de code.
    la partie eteindre le led manque aussi
    et la plus importante, la boucle inifinie manque. si le programme ne reboucle pas sur un point de passage obligatoire, alors il va planter car le CPU va continuer à lire les instructions suivantes, qui seront indeterminées, et donc, risques de plantage, voire cramagede circuits si le plantage fait un truc louche.

    il faut donc veiller à decouper le code en modules, appelés par une boucle principale.

    pour ce qui est des ports trisa et trisb, il existe une instruction non documentée:
    TRIS reg
    qui permet d'acceder aux registres de la seconde banque, quel que soit l'etat des selecteurs de banque.
    les valeurs 1, 5, 6 et 7 sont acceptées.
    5 et 6 correspondent à porta et portb, donc c'est parfait.
    cependant, microchip deconseille d'utiliser l'instruction tris. mais comme le CPU et le compilo la supportent, alors on s'en prive pas.

  3. #3
    Invité de passage
    Profil pro
    Inscrit en
    août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : août 2007
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    merci pour l'aide , alors , pour ce qui est de l'extinction de la led c'est fait
    mais je n'arrive pas a comprendre "boucle infinie" comment ecrire cela ?
    (détecter une deuxième fois l'interruption est toujours impossible)

    voici le programme modifié


    ;************ Directive d' assemblage pour MPLAB ***********

    list p=16f84A
    #include p16f84A.inc
    __Config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    ;.............................................................




    ;******************** Variables utilisées ****************

    var1 equ C
    #define bphaut
    #define bpbas
    #define fchaut
    #define fcbas


    ;********** Numero de version / données EEPROM ***********

    ORG h'2100'
    de "Version 1.0"

    ;************* definition des registres temporaires **********

    retard1 EQU 0X0C ;le registre temporaire retard1 se trouve a l'adresse 0C
    retard2 EQU 0X0F ;""""""""""""""""""""""""""""""""""""""""""""""""""""" 0F
    retard3 EQU 0x10 ;""""""""""""""""""""""""""""""""""""""""""""""""""""" 0X10

    ;***************** Programme principal *******************

    ORG 0
    GOTO init

    ;*********** Sous Programme d 'interruption **********

    ORG 4

    ;*********** IT sur RB4-RB7***********************************

    bsf PORTA,0 ; on allume la led connectée sur ra0
    call tempo
    bcf PORTA,0
    bcf INTCON,RBIF ; on raz le flag RBIF
    bcf INTCON,RBIE
    retfie ; retour d 'interruption


    ; *********** Programme d' INIT ***********************

    init


    bsf INTCON,GIE ; autorise les Interruptions
    bsf INTCON,RBIE ; autorise l ' IT sur RB4-RB7
    bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder
    ; à la 2eme page mémoire ( pour trisa et trisb )
    MOVLW B'11111100' ; programmation de rb0-rb7
    MOVWF TRISB ; on met 11110000 dans le registre de direction du port B
    MOVLW B'00110' ; programmation de ra0-ra4
    MOVWF TRISA ; on met 00000 dans le registre de direction du port A
    bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder
    ; à la 1eme page mémoire
    clrf PORTA ; raz du port A
    clrf PORTB ; raz du port B


    ; ***************** Début de votre Programme ***********************






    ;****************** Programme de temporisation ***********************


    ; modifier les valeurs dans retard1 retard2 et retard3 pour changer la temporisation

    tempo
    MOVLW 0xFF ; on met ff dans le registre W (selon la tempo souhaitée)
    MOVWF retard1 ; on met W dans le registre retard1
    MOVWF retard2 ; on met W dans le registre retard2
    MOVLW 0x12 ; on met 12 dans le registre W (selon la tempo souhaitée)
    MOVWF retard3 ; on met W dans le registre retard3
    attente
    DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction si
    GOTO attente ; le registre retard1 = 0 sinon retour à attente
    movlw 0xFF ; on recharge retard1 (selon la tempo souhaitée)
    movwf retard1
    DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine instruction si
    GOTO attente ; le registre retard2 = 0 sinon retour à attente
    movlw 0xFF ; on recharge retard2 (selon la tempo souhaitée)
    movwf retard2
    DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine instruction si
    GOTO attente ; le registre retard3 = 0 sinon retour à attente
    RETURN ; retour au programme principal après l 'instruction CALL

    end ; fin du programme

  4. #4
    Membre chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 623
    Points
    623

    Par défaut

    difficile d'attaquer la programmation assembleur sans notion de boucle infinie.

    il faut toujours un programme principal (souvent appelé kernel sur les PC) qui puisse tourner en permanence.

    pour ça, rien de compliqué:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    org 0
    reset:
    call init
    goto main
    align 4
    ;;;;;;;;;;;;
    irq:
    ;code pour l'interruption
    retfie
    ;;;;;;;;;;;;
    init:
    ;code d'initialisation
    return
    ;;;;;;;;;;;;
    main:
    ;code principal
    call routine1
    call routine2
    call routine3
    goto main
    ;;;;;;;;;;;;
    routine1:
    code de la routine1
    return
    ;;;;;;;;;;;;
    routine2:
    etc, etc....
    avec une structure de programme de ce genre, la lecture est simplifiée, et surtout, il ne faut pas hesiter à indenter les commentaires, parce que là, c'est illisible, à moins que tu n'utilise pas la bonne balise pour afficher ton code.

    ps: la syntaxe ici est celle de fasm, avec les macros pour compiler du pic.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •