IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

[16f84] Aide pour une interruption sur port B


Sujet :

Autres architectures Assembleur

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2007
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2007
    Messages : 105
    Points : 43
    Points
    43
    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 éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    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
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2007
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2007
    Messages : 105
    Points : 43
    Points
    43
    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 éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Aide pour une requête sur deux tables
    Par Andry dans le forum Développement
    Réponses: 2
    Dernier message: 05/11/2007, 08h14
  2. Aide pour une requête sur deux tables
    Par Andry dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/11/2007, 08h14
  3. Aide pour une requête sur Access
    Par psgkiki dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/05/2007, 12h34
  4. Aide pour une requête sur Access
    Par psgkiki dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/05/2007, 12h33
  5. Réponses: 2
    Dernier message: 21/12/2006, 21h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo