Pb interruption PIC18f2525
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Pb interruption PIC18f2525



  1. #1
    Haox

    Pb interruption PIC18f2525


    ------

    Bonjour à tous,

    J'ai un petit pb dans mon projet. Avant tout je tiens à dire que je suis débutant en programmation (ça fait 1 mois que j'y touche) donc soyez indulgent svp. Tout ce qui suit, a été fait en partie grâce au cours de Bigonoff (je n'ai pas tout lu non plus) que je remercie...

    Je traduit en mot ce que j'ai programmé :

    J'ai demandé à mon PIC de faire 8 conversions analogique/digitale et d'en faire la moyenne. Cette moyenne je veux l'afficher sur des 7 segments. Pour l'afficher j'ai programmé un TIMER qui toutes les 20 ms renvoie à l'adresse 0x08 de l'interruption. L'interruption consiste donc à afficher la valeur tens et ones sur les 7 segments. Donc toutes les 20 ms les cadrans des dixaines et des unités s'allumeront pour afficher les valeurs stockées dans ones et tens. Seulement quand je fais "watch" dans MPLAB, je ne vois pas le PORTB ni le PORTA changer... Les deux restent à 0 et je comprends pas pourquoi...

    Pouvez vous m'aider?

    Merci

    Voilà mon code:


    LIST p=18F2525
    #include <p18F2525.inc>

    CONFIG OSC = INTIO67
    CONFIG FCMEN = OFF
    CONFIG IESO = OFF
    CONFIG PWRT = OFF
    CONFIG BOREN = OFF
    CONFIG WDT = OFF
    CONFIG MCLRE = OFF
    CONFIG LPT1OSC = OFF
    CONFIG PBADEN = OFF
    CONFIG DEBUG = OFF

    ;***************************** ******************** ********************
    ; Masques *
    ; *
    ;***************************** ******************** ********************

    MASK_ADCON0 EQU B'00000000' ; la conversion analogique n'est pas autorisée
    MASK_ADCON1 EQU B'00001110' ; Le voltage de référence pour la conversion étant comme VSS et VDD
    MASK_ADCON2 EQU B'10001100' ; définie la justification par la droite ou gauche

    MASK_TRISA EQU B'00000011' ; les pins 2 et 3 sont configurées comme des entrées
    ; et 4,5,6,7,9 et 10 comme des sorties
    MASK_TRISB EQU B'00000000' ; Toutes les pins PORTB sont configurées comme des sorties

    MASK_TRISC EQU B'01000000' ; Toutes les pins PORTC sont configurées en sortie sauf RC6 qui sera utilisé
    ; pour l'USART

    MASK_T0CONOFF EQU B'00000111' ; le timer n'est pas enclenché
    MASK_T0CONON EQU B'10000111' ; le timer est enclenché


    MASK_INTCONOFF EQU B'00000000' ; interdire les interruptions
    MASK_INTCONON EQU B'10100000' ; autorise uniquement l'interruption du timer 0
    MASK_TIMER0ON EQU B'10000111' ; lancer le timer


    ;***************************** ******************** ********************
    ; DEFINITION *
    ;***************************** ******************** ********************

    #DEFINE bouton PORTA,2 ; Bouton permettant de mettre sous tension

    #DEFINE a PORTB,0 ; Afficheur de la barre a
    #DEFINE b PORTB,1 ; Afficheur de la barre b
    #DEFINE c PORTB,2 ; Afficheur de la barre c
    #DEFINE d PORTB,3 ; Afficheur de la barre d
    #DEFINE e PORTB,4 ; Afficheur de la barre e
    #DEFINE f PORTB,5 ; Afficheur de la barre f
    #DEFINE g PORTB,6 ; Afficheur de la barre g
    #DEFINE dp PORTB,7 ; Afficheur de la barre dp

    #DEFINE Ones PORTC,0 ; Allume le 7 segments des unités
    #DEFINE Tens PORTC,1 ; allume le 7 segments des dixaines

    ;***************************** ******************** ********************
    ; TABLE 7 segments *
    ;Cette table permet le stockage d'informations concernant l'affichage*
    ; des 7 segments. Elle contient les adresses qui permettent d'affiher*
    ;tel ou tel chiffre. Les adresses suivantes sont attribuées *
    ;respectivement à 0,1,2,3,4,5,6,7,8,9,10 *
    ;***************************** ******************** ********************
    tabl_segment EQU 0x0001000

    org tabl_segment

    db 0x3F,0x06,0x5B,0X4F
    db 0x26,0x6D,0x7D,0x07
    db 0x7F,0x6F,0x00

    ;***************************** ******************** ********************
    ; VARIABLES *
    ;***************************** ******************** ********************

    CBLOCK 0x000
    cmptac : 1 ; Temps nécessaire à la charge du convertisseur pour l'
    ; acquisition
    cmptac50 : 1
    cmptmoy : 1 ; compteur permettant d'avoir 8 échantillons et d'en faire
    ; la moyenne
    accumL : 1
    accumH : 1

    moyenneL : 1 ; 8 premiers octets de la moyenne
    moyenneH : 1 ; 8 derniers octets de la moyenne

    ones : 1 ; variables des unités pour 7-segments
    tens : 1 ; variables des dixaines pour 7-segments
    casel : 1 ; permet de sélectionner quel cadran allumer

    ENDC
    ;***************************** ******************** ********************
    ; INTERRUPTION *
    ;***************************** ******************** ********************

    ; AFFICHAGE ;
    ; Cette interruption sert à afficher toutes ;
    ; les 20ms sur les cadrans 7 segments les ;
    ; données stockées dans les registres ones ;
    ; et tens ;
    ;***************************** *****************

    org 0x08

    AFFICHAGE

    movlw UPPER(tabl_segment) ; charger bits 16 à 21 de l’adresse
    movwf TBLPTRU ; dans pointeur UPPER
    movlw HIGH(tabl_segment) ; charger bits 8 à 15 de l’adresse
    movwf TBLPTRH ; dans pointeur HIGH
    movlw LOW(tabl_segment) ; charger bits 0 à 7 de l’adresse
    movwf TBLPTRL ; dans pointeur LOW

    BCF PORTC,0 ; On configure RC0 et RC1 en sortie
    BCF PORTC,1

    movlw 0x01 ; on met 1 dans w
    movwf casel ; on charge 1 dans casel

    cpfseq casel,0 ; comparer casel à w, et sauter s'ils sont égaux

    bra AFITENS ; si différent alors on va afficher les dixaines

    movf ones,w,0 ; mettre le nombre d'unité dans w
    addwf TBLPTRL,1,0 ; ajouter ones dans le pointeur de la table L

    tblrd * ; lire la table à l'adresse du pointeur

    movf TABLAT,w ; mettre le résultat de la table dans w
    movwf PORTB ; envoyer la valeur de la table vers l'afficheur 7 segments

    BSF PORTC,0,0 ; allumer uniquement le cadran des unités

    BRA NVCASEL ; aller à NVCASEL de façon à sélectionner un nouveau cadran

    AFITENS

    movlw 0x02 ; charger 2 dans w
    cpfseq casel,0 ; comparer si casel est égal à deux
    ; si oui alors sauter l'instruction suivante
    bra NVCASEL ; sinon aller à NVCASEL

    movf tens,w,0 ; charger les tens dans w
    addwf TBLPTRL,1,0 ; Ajouter les tens dans le pointeur de la table

    tblrd * ; lire la table

    movf TABLAT,w ; charger la valeur de la table pointer dans w
    movwf PORTB ; envoyer la valeur vers l'afficheur

    BSF PORTC,1,0 ; allumer uniquement le cadran des dixaines

    NVCASEL

    RLNCF casel,1,0 ; faire une rotation de bit vers la gauche
    movlw 0x02 ; si casel > 2 alors le remettre à 1
    cpfsgt casel,0 ; si = à 2 alors retourner pour afficher les dixaines
    bra AFITENS


    movlw 0x63 ; charger w pour le timer low
    movwf TMR0L ; charger le registre low du timer
    movlw 0xFF ; charger w pour le timer high
    movwf TMR0H ; charger le registre high du timer

    movlw MASK_INTCONON ; Autoriser les interruptions
    movwf INTCON,0

    ;***************************** ******************** ********************
    ; INITIALISATION *
    ;***************************** ******************** ********************
    init
    movlw MASK_ADCON1 ; ANO = entrée analogique. Vref = Vss et Vdd
    movwf ADCON1

    movlw MASK_ADCON0 ; AN0 sélectionnée, pas de conversion en cours
    movwf ADCON0

    movlw MASK_ADCON2 ; Justification par la droite, Acquisition time = 2Tad
    movwf ADCON2

    movlw MASK_TRISA ; Configurer Pin 2 et 3 comme des entrées
    movwf TRISA

    clrf PORTB
    movlw MASK_TRISB ; Configurer toutes les pins PORTB comme des sorties
    movwf TRISB

    clrf PORTC
    movlw MASK_TRISC ; configurer les pins 11,12,13,14,15,16,18 en sortie et 17 en entrée
    movwf TRISC

    movlw MASK_TIMER0ON ; Lancer le timer0
    movwf T0CON,0

    bra MAIN

    ;ATTENTION JE NE COMPRENDS PAS CE QU'A FAIT A-S
    ;***************************** ******************** ********************
    ; SOUS ROUTINE *
    ;***************************** ******************** ********************



    ; calculer la moyenne
    ;***************************** ******************** *********************

    MOYENNE

    RRCF accumH ; divise RRNCF et RRCF par 2
    RRNCF accumL
    RRCF accumH ; Divise encore par 2
    RRNCF accumL
    RRCF accumH ; divise encore par 2 donc finalement on a par 8
    RRNCF accumL




    bra CHIFFRE

    ;***************************** ******************** ********************
    ; CHIFFRES *
    ;***************************** ******************** ********************
    CHIFFRE

    clrf ones ; Effacer "ones" et "tens"
    clrf tens

    DIXAINE

    movlw 0xA ; Charger 10 dans w pour savoir
    ; combien de dixaine il y a dans notre moyenne
    subwf accumL,1,0 ; pour se faire, on soustrait 10 à accumL et on laisse
    ; le résultat dans accumL jusqu'à obtenir un négatif
    movlw 0x0
    subwfb accumH,1,0 ; sousraire le Report de soustraction si il y en a

    bn NEGATIF ; si le résultat < 0 alors N du reg status vaut 1
    ; Donc on va direct à NEGATIF. Si > 0
    incf tens ; alors on incrémente de 1 la variable tens

    BZ FIN_CHIFFRE ; si le résultat = 0 alors plus de reste donc terminé

    bra DIXAINE ; Si le résultat est possitif alors on recommence.

    NEGATIF

    movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif
    addwf accumL,1,0 ; et les passer dans la variable ones

    UNITE

    movff accumL,ones

    FIN_CHIFFRE


    bra MAIN
    ;***************************** ******************** ********************
    ; PROGRAMME PRINCIPALE *
    ;***************************** ******************** ********************

    MAIN

    movlw 0x63 ; l'interruption aura lieu toutes les 20msec
    movwf TMR0L

    movlw 0xFF
    movwf TMR0H

    ;movlw MASK_INTCONON ; autoriser les interruptions du timer
    ; movwf INTCON,0


    CONVERSION

    clrf accumL
    clrf accumH ; réinitialiser accum à 0

    movlw MASK_INTCONOFF ; Interdire les interruptions
    movwf INTCON,0
    bsf ADCON0,ADON ; autoriser la conversion analogique

    movlw 0xFA ; charger le registre W à 250
    movwf cmptac ; charger la variable cmpt1 pour obtenir un échantillon toutes les 25ms

    movlw 0x8 ; charger le w à 8 pour obtenir 8 échantillons
    movwf cmptmoy ; charger cmptmoy à 8



    BOUCLE
    ; toutes les 50ms prendre un échantillon
    movlw 0x02 ; charger 2 dans w
    movwf cmptac50

    BOUCLE50MS

    decfsz cmptac ; décrémenter cmptac

    bra BOUCLE50MS ; =/ 0 boucle1

    bsf ADCON0,GO_DONE ; lancer la conversion analogique/digitale

    decfsz cmptac50
    bra BOUCLE50MS

    BOUCLECONV

    btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie
    ; une fois la conversion finie, le résultat
    ; vient se mettre dans deux registres : ADRESL et ADRESH
    bra BOUCLECONV ; =/0 donc boucle2

    movlw 0x01 ; simuler une acquisition
    movwf ADRESL

    movlw 0x00 ; simuler une acquisition
    movwf ADRESH
    ; STOCKER LES ECHANTILLONS POUR FAIRE LA MOYENNE
    ;***************************** ******************** ********************

    movf ADRESL,w ; charger la conversion ADRESL dans registre w
    addwf accumL ; additionner la précédente conversion avec la valeur de accumL

    movf ADRESH,w ; charger la conversion ADRESH dans registre w
    addwfc accumH ; additionner la précédente conversion avec la valeur de accumH


    ; retour à la prise d'échantillons
    ;***************************** ******************** ********************

    BOUCLEMOY
    decfsz cmptmoy ; décrémenter le registre cmptmoy de 1
    bra BOUCLE ; si =/ 0 alors retour à BOUCLE 1

    bra MOYENNE


    END

    -----

  2. #2
    Haox

    Re : Pb interruption PIC18f2525

    up...........

  3. #3
    invite1c20f11a

    Re : Pb interruption PIC18f2525

    Bonsoir, je cite <
    BCF PORTC,0 ; On configure RC0 et RC1 en sortie
    BCF PORTC,1 >
    Je ne vois pas que cela mette ces deux broches en sortie, il faudrait agir sur TRISC, non?
    Et BRA est une instruction de PIC? Je ne vois que CALL et GOTO dans le genre?
    Et en essayant en pas à pas avec l'émulateur, vous ne voyez pas où cela ne marche pas?
    pont

  4. #4
    invite1c20f11a

    Re : Pb interruption PIC18f2525

    Je constate que le MPLAB est d'accord, BUILD SUCCEDED, mais pour aller plus loin il faudrait avoir la carte d'application avec le PIC18F2525, cela nous est difficile de voir quelque chose.
    pont

  5. A voir en vidéo sur Futura
  6. #5
    Haox

    Re : Pb interruption PIC18f2525

    Après réflexion et relecture des cours sur les interruptions je me suis rendu compte qu'il manquait les instructions de l'interruption...
    Cependant, ça ne marche toujours pas... En émulation Mon PORTB et PORTC ne varie toujours pas ce qui montre que l'interruption ne fonctionne toujours pas... Alors deux questions me viennent : Est ce que les interruptions se lancent dans MPLAB ?

    Si oui, AU SECOURRRRRR aidez moi :'(

    Mon nouveau code est :

  7. #6
    Haox

    Re : Pb interruption PIC18f2525

    LIST p=18F2525
    #include <p18F2525.inc>

    CONFIG OSC = INTIO67
    CONFIG FCMEN = OFF
    CONFIG IESO = OFF
    CONFIG PWRT = OFF
    CONFIG BOREN = OFF
    CONFIG WDT = OFF
    CONFIG MCLRE = OFF
    CONFIG LPT1OSC = OFF
    CONFIG PBADEN = OFF
    CONFIG DEBUG = ON

    ;***************************** ******************** ********************
    ; Masques *
    ; *
    ;***************************** ******************** ********************

    MASK_ADCON0 EQU B'00000000' ; la conversion analogique n'est pas autorisÈe
    MASK_ADCON1 EQU B'00001110' ; Le voltage de rÈfÈrence pour la conversion Ètant comme VSS et VDD
    MASK_ADCON2 EQU B'10001100' ; dÈfinie la justification par la droite ou gauche

    MASK_TRISA EQU B'00000011' ; les pins 2 et 3 sont configurÈes comme des entrÈes
    ; et 4,5,6,7,9 et 10 comme des sorties
    MASK_TRISB EQU B'00000000' ; Toutes les pins PORTB sont configurÈes comme des sorties

    MASK_TRISC EQU B'01000000' ; Toutes les pins PORTC sont configurÈes en sortie sauf RC6 qui sera utilisÈ
    ; pour l'USART

    MASK_T0CONOFF EQU B'00000111' ; le timer n'est pas enclenchÈ
    MASK_T0CONON EQU B'10000111' ; le timer est enclenchÈ


    MASK_INTCONOFF EQU B'00000000' ; interdire les interruptions
    MASK_INTCONON EQU B'10100000' ; autorise uniquement l'interruption du timer 0
    MASK_TIMER0ON EQU B'10000111' ; lancer le timer


    ;***************************** ******************** ********************
    ; DEFINITION *
    ;***************************** ******************** ********************

    #DEFINE bouton PORTA,2 ; Bouton permettant de mettre sous tension

    #DEFINE a PORTB,0 ; Afficheur de la barre a
    #DEFINE b PORTB,1 ; Afficheur de la barre b
    #DEFINE c PORTB,2 ; Afficheur de la barre c
    #DEFINE d PORTB,3 ; Afficheur de la barre d
    #DEFINE e PORTB,4 ; Afficheur de la barre e
    #DEFINE f PORTB,5 ; Afficheur de la barre f
    #DEFINE g PORTB,6 ; Afficheur de la barre g
    #DEFINE dp PORTB,7 ; Afficheur de la barre dp

    #DEFINE Ones PORTC,0 ; Allume le 7 segments des unitÈs
    #DEFINE Tens PORTC,1 ; allume le 7 segments des dixaines

    ;***************************** ******************** ********************
    ; TABLE 7 segments *
    ;Cette table permet le stockage d'informations concernant l'affichage*
    ; des 7 segments. Elle contient les adresses qui permettent d'affiher*
    ;tel ou tel chiffre. Les adresses suivantes sont attribuÈes *
    ;respectivement ‡ 0,1,2,3,4,5,6,7,8,9,10 *
    ;***************************** ******************** ********************
    tabl_segment EQU 0x0001000

    org tabl_segment

    db 0x3F,0x06,0x5B,0X4F
    db 0x26,0x6D,0x7D,0x07
    db 0x7F,0x6F,0x00

    ;***************************** ******************** ********************
    ; VARIABLES *
    ;***************************** ******************** ********************

    CBLOCK 0x000
    cmptac : 1 ; Temps nÈcessaire ‡ la charge du convertisseur pour l'
    ; acquisition
    cmptac50 : 1
    cmptmoy : 1 ; compteur permettant d'avoir 8 Èchantillons et d'en faire
    ; la moyenne
    accumL : 1
    accumH : 1

    moyenneL : 1 ; 8 premiers octets de la moyenne
    moyenneH : 1 ; 8 derniers octets de la moyenne

    ones : 1 ; variables des unitÈs pour 7-segments
    tens : 1 ; variables des dixaines pour 7-segments
    casel : 1 ; permet de sÈlectionner quel cadran allumer

    ENDC

    org 0x000
    bra init

    ;***************************** ******************** ********************
    ; INTERRUPTION *
    ;***************************** ******************** ********************

    ; AFFICHAGE ;
    ; Cette interruption sert ‡ afficher toutes ;
    ; les 20ms sur les cadrans 7 segments les ;
    ; donnÈes stockÈes dans les registres ones ;
    ; et tens ;
    ;***************************** *****************

    org 0x008


    movlw MASK_INTCONOFF
    movwf INTCON,0

    AFFICHAGE

    movlw UPPER(tabl_segment) ; charger bits 16 ‡ 21 de líadresse
    movwf TBLPTRU ; dans pointeur UPPER
    movlw HIGH(tabl_segment) ; charger bits 8 ‡ 15 de líadresse
    movwf TBLPTRH ; dans pointeur HIGH
    movlw LOW(tabl_segment) ; charger bits 0 ‡ 7 de líadresse
    movwf TBLPTRL ; dans pointeur LOW

    BCF PORTC,0 ; On configure RC0 et RC1 en sortie
    BCF PORTC,1

    movlw 0x01 ; on met 1 dans w
    movwf casel ; on charge 1 dans casel

    cpfseq casel,0 ; comparer casel ‡ w, et sauter s'ils sont Ègaux

    bra AFITENS ; si diffÈrent alors on va afficher les dixaines

    movf ones,w,0 ; mettre le nombre d'unitÈ dans w
    addwf TBLPTRL,1,0 ; ajouter ones dans le pointeur de la table L

    tblrd * ; lire la table ‡ l'adresse du pointeur

    movf TABLAT,w ; mettre le rÈsultat de la table dans w
    movwf PORTB ; envoyer la valeur de la table vers l'afficheur 7 segments

    BSF PORTC,0,0 ; allumer uniquement le cadran des unitÈs

    BRA NVCASEL ; aller ‡ NVCASEL de faÁon ‡ sÈlectionner un nouveau cadran

    AFITENS

    movlw 0x02 ; charger 2 dans w
    cpfseq casel,0 ; comparer si casel est Ègal ‡ deux
    ; si oui alors sauter l'instruction suivante
    bra NVCASEL ; sinon aller ‡ NVCASEL

    movf tens,w,0 ; charger les tens dans w
    addwf TBLPTRL,1,0 ; Ajouter les tens dans le pointeur de la table

    tblrd * ; lire la table

    movf TABLAT,w ; charger la valeur de la table pointer dans w
    movwf PORTB ; envoyer la valeur vers l'afficheur

    BSF PORTC,1,0 ; allumer uniquement le cadran des dixaines

    NVCASEL

    RLNCF casel,1,0 ; faire une rotation de bit vers la gauche
    movlw 0x02 ; si casel > 2 alors le remettre ‡ 1
    cpfsgt casel,0 ; si = ‡ 2 alors retourner pour afficher les dixaines
    bra AFITENS

    bcf INTCON,TMR0IF ; enlever le flag de l'interruption

    movlw 0x63 ; charger w pour le timer low
    movwf TMR0L ; charger le registre low du timer
    movlw 0xFF ; charger w pour le timer high
    movwf TMR0H ; charger le registre high du timer

    movlw MASK_INTCONON ; Autoriser les interruptions
    movwf INTCON,0

    retfie FAST

    ;***************************** ******************** ********************
    ; INITIALISATION *
    ;***************************** ******************** ********************
    init
    movlw MASK_ADCON1 ; ANO = entrÈe analogique. Vref = Vss et Vdd
    movwf ADCON1

    movlw MASK_ADCON0 ; AN0 sÈlectionnÈe, pas de conversion en cours
    movwf ADCON0

    movlw MASK_ADCON2 ; Justification par la droite, Acquisition time = 2Tad
    movwf ADCON2

    movlw MASK_TRISA ; Configurer Pin 2 et 3 comme des entrÈes
    movwf TRISA

    clrf PORTB
    movlw MASK_TRISB ; Configurer toutes les pins PORTB comme des sorties
    movwf TRISB

    clrf PORTC
    movlw MASK_TRISC ; configurer les pins 11,12,13,14,15,16,18 en sortie et 17 en entrÈe
    movwf TRISC

    movlw MASK_TIMER0ON ; Lancer le timer0
    movwf T0CON,0
    movlw 0x63 ; l'interruption aura lieu toutes les 20msec
    movwf TMR0L

    movlw 0xFF
    movwf TMR0H

    movlw MASK_INTCONON ; autoriser les interruptions du timer
    movwf INTCON,0

  8. #7
    Haox

    Re : Pb interruption PIC18f2525

    ;***************************** ******************** ********************
    ; PROGRAMME PRINCIPALE *
    ;***************************** ******************** ********************

    MAIN

    ;movlw MASK_TIMER0ON ; Lancer le timer0
    ;movwf T0CON,0
    ;movlw 0x63 ; l'interruption aura lieu toutes les 20msec
    ;movwf TMR0L

    ;movlw 0xFF
    ;movwf TMR0H

    ;movlw MASK_INTCONON ; autoriser les interruptions du timer
    ;movwf INTCON,0

    CONVERSION

    clrf accumL
    clrf accumH ; rÈinitialiser accum ‡ 0

    movlw MASK_INTCONOFF ; Interdire les interruptions
    movwf INTCON,0
    bsf ADCON0,ADON ; autoriser la conversion analogique

    movlw 0xFA ; charger le registre W ‡ 250
    movwf cmptac ; charger la variable cmpt1 pour obtenir un Èchantillon toutes les 25ms

    movlw 0x8 ; charger le w ‡ 8 pour obtenir 8 Èchantillons
    movwf cmptmoy ; charger cmptmoy ‡ 8



    BOUCLE
    ; toutes les 50ms prendre un Èchantillon
    movlw 0x02 ; charger 2 dans w
    movwf cmptac50

    BOUCLE50MS

    decfsz cmptac ; dÈcrÈmenter cmptac

    bra BOUCLE50MS ; =/ 0 boucle1

    bsf ADCON0,GO_DONE ; lancer la conversion analogique/digitale

    decfsz cmptac50
    bra BOUCLE50MS

    BOUCLECONV

    btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie
    ; une fois la conversion finie, le rÈsultat
    ; vient se mettre dans deux registres : ADRESL et ADRESH
    bra BOUCLECONV ; =/0 donc boucle2

    movlw 0x01 ; simuler une acquisition
    movwf ADRESL

    movlw 0x00 ; simuler une acquisition
    movwf ADRESH

    ; STOCKER LES ECHANTILLONS POUR FAIRE LA MOYENNE
    ;***************************** ******************** ********************

    movf ADRESL,w ; charger la conversion ADRESL dans registre w
    addwf accumL ; additionner la prÈcÈdente conversion avec la valeur de add8v0

    movf ADRESH,w ; charger la conversion ADRESH dans registre w
    addwfc accumH ; additionner la prÈcÈdente conversion avec la valeur de add8v1


    ; retour ‡ la prise d'Èchantillons
    ;***************************** ******************** ********************

    BOUCLEMOY
    decfsz cmptmoy ; dÈcrÈmenter le registre cmptmoy de 1
    bra BOUCLE ; si =/ 0 alors retour ‡ BOUCLE 1



    ; calculer la moyenne
    ;***************************** ******************** *********************


    MOYENNE

    RRCF accumH ; divise RRNCF et RRCF par 2
    RRNCF accumL
    RRCF accumH ; Divise encore par 2
    RRNCF accumL
    RRCF accumH ; divise encore par 2 donc finalement on a par 8
    RRNCF accumL



    ; CHIFFRES
    ;***************************** ******************** ********************
    CHIFFRE

    clrf ones ; Effacer "ones" et "tens"
    clrf tens

    DIXAINE

    movlw 0xA ; Charger 10 dans w pour savoir
    ; combien de dixaine il y a dans notre moyenne
    subwf accumL,1,0 ; pour se faire, on soustrait 10 ‡ accumL et on laisse
    ; le rÈsultat dans accumL jusqu'‡ obtenir un nÈgatif
    movlw 0x0
    subwfb accumH,1,0 ; sousraire le Report de soustraction si il y en a

    bn NEGATIF ; si le rÈsultat < 0 alors N du reg status vaut 1
    ; Donc on va direct ‡ NEGATIF. Si > 0
    incf tens ; alors on incrÈmente de 1 la variable tens

    BZ FIN_CHIFFRE ; si le rÈsultat = 0 alors plus de reste donc terminÈ

    bra DIXAINE ; Si le rÈsultat est possitif alors on recommence.

    NEGATIF

    movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif
    addwf accumL,1,0 ; et les passer dans la variable ones

    UNITE

    movff accumL,ones

    FIN_CHIFFRE


    bra MAIN
    END

  9. #8
    Haox

    Re : Pb interruption PIC18f2525

    C'est bon j'ai trouvé mon erreur... Mon timer0 était tellement chargé que mon simulateur n'avait pas le temps d'aller jusqu'à 0 et de déclencher l'interruption.

    Merci beaucoup de ton aide Pont2

Discussions similaires

  1. Microcontroleur PIC18F2525
    Par Haox dans le forum Électronique
    Réponses: 2
    Dernier message: 16/02/2009, 17h08
  2. Interruption
    Par invite28559ad9 dans le forum Électronique
    Réponses: 4
    Dernier message: 06/01/2009, 21h07
  3. Problème adresse EEPROM pic18f2525
    Par invite8bf80359 dans le forum Électronique
    Réponses: 2
    Dernier message: 29/11/2008, 15h36
  4. problème RS232 pic18f2525
    Par invite8bf80359 dans le forum Électronique
    Réponses: 0
    Dernier message: 27/11/2008, 21h04
  5. Interruption
    Par scls19fr dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2008, 14h05
Découvrez nos comparatifs produits sur l'informatique et les technologies.