begin process at 2012 05 25 12:21:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

Problème de timing


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de timing

mercredi 27 mai 2009 à 15:39:13 | Problème de timing

Haox85

Bonjour tout le monde,

Depuis mon dernier post où je demandais de l'aide pour afficher sur des 7 segments j'ai un peu avancé tant bien que mal...

Si mon code est correcte, mes 7 segments devraient afficher correctement mon information (je ne peux pas encore le tester, mon pic ayant rendu l'ame j'en ai recommandé un autre et je l'attends toujours)


    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 autorise?e
MASK_ADCON1        EQU        B'00001110'        ; Le voltage de re?fe?rence pour la conversion e?tant comme ;VSS et VDD
MASK_ADCON2        EQU        B'10001100'        ; de?finie la justification par la droite ou gauche

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

MASK_TRISC            EQU        B'01000000'        ; Toutes les pins PORTC sont configure?es en sortie sauf ;RC6 qui sera utilise? pour l'USART
                             

MASK_T0CONOFF        EQU        B'00000111'        ; le timer n'est pas enclenche?
MASK_T0CONON        EQU        B'10000111'        ; le timer est enclenche?

   
MASK_INTCONOFF        EQU        B'00000000'        ; interdire les interruptions
MASK_INTCONON        EQU        B'10100000'        ; autorise uniquement l'interruption du timer 0
   
   
           
;*********************************************************************
;                               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 unite?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 attribue?es             *
;respectivement a` 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 ne?cessaire a` la charge du convertisseur pour l'
                                               ; acquisition
        cmptac50    : 1                               
        cmptmoy        : 1                ; compteur permettant d'avoir 8 e?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 unite?s pour 7-segments
        tens        : 1                ; variables des dixaines pour 7-segments
        casel        : 1                ; permet de se?lectionner quel cadran allumer
       
        ENDC   

;*********************************************************************
;                             INITIALISATION                         *
;*********************************************************************
init
    movlw    MASK_ADCON1                ; ANO = entre?e analogique. Vref = Vss et Vdd
    movwf    ADCON1
   
    movlw    MASK_ADCON0                ; AN0 se?lectionne?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 entre?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 entre?e
    movwf    TRISC

    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 a` accumL et on laisse
                                    ; le re?sultat dans accumL jusqu'a` obtenir un ne?gatif
    movlw    0x0
    subwfb    accumH,1,0                ; sousraire le Report de soustraction si il y en a

    bn        NEGATIF                    ; si le re?sultat < 0 alors N du reg status vaut 1
                                    ; Donc on va direct a` NEGATIF. Si > 0
    incf    tens                    ; alors on incre?mente de 1 la variable tens

    BZ        FIN_CHIFFRE                ; si le re?sultat = 0 alors plus de reste donc termine?

    bra        DIXAINE                    ; Si le re?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 AFFICHAGE
       
;*********************************************************************
;                               AFFICHAGE                              *
;*********************************************************************

AFFICHAGE
   
    movlw     UPPER(tabl_segment)        ; charger bits 16 a` 21 de l'adresse
    movwf     TBLPTRU                 ; dans pointeur UPPER
    movlw     HIGH(tabl_segment)         ; charger bits 8 a` 15 de l'adresse
    movwf     TBLPTRH                 ; dans pointeur HIGH
    movlw     LOW(tabl_segment)         ; charger bits 0 a` 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 a` w, et sauter s'ils sont e?gaux
   
    bra        AFITENS                    ; si diffe?rent alors on va afficher les dixaines
   
    movf    ones,w,0                ; mettre le nombre d'unite? dans w
    addwf    TBLPTRL,1,0                ; ajouter ones dans le pointeur de la table L

    tblrd    *                        ; lire la table a` l'adresse du pointeur

    movf    TABLAT,w                ; mettre le re?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 unite?s

    BRA        NVCASEL                    ; aller a` NVCASEL de fac?on a` se?lectionner un nouveau cadran

AFITENS
    movlw    0x02                    ; charger 2 dans w
    cpfseq    casel,0                    ; comparer si casel est e?gal a` deux
                                    ; si oui alors sauter l'instruction suivante
    bra        NVCASEL                    ; sinon aller a` 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 a` 1
    cpfsgt    casel,0                    ; si = a` 2 alors retourner pour afficher les dixaines
    bra        AFITENS
   

    bra        MAIN

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

MAIN
   
CONVERSION

    clrf    accumL                                       
    clrf    accumH                    ; re?initialiser accum a` 0

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

    movlw    0xFA                    ; charger le registre W a` 250
    movwf    cmptac                    ; charger la variable cmpt1 pour obtenir un e?chantillon toutes les 25ms

    movlw    0x8                        ; charger le w a` 8 pour obtenir 8 e?chantillons
    movwf    cmptmoy                    ; charger cmptmoy a` 8



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

BOUCLE50MS   

    decfsz    cmptac                    ; de?cre?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 re?sultat
                                    ; vient se mettre dans deux registres : ADRESL et ADRESH   
    bra        BOUCLECONV                ; =/0 donc boucle2

    movlw    0x07                    ; simuler une acquisition
    movwf    ADRESL

    movlw    0x01                    ; 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 pre?ce?dente conversion avec la valeur de add8v0

    movf    ADRESH,w                ; charger la conversion ADRESH dans registre w
    addwfc    accumH                    ; additionner  la pre?ce?dente conversion avec la valeur de add8v1
   

;                      retour a` la prise d'e?chantillons
;*********************************************************************

BOUCLEMOY
    decfsz    cmptmoy                    ; de?cre?menter le registre cmptmoy de 1   
    bra        BOUCLE                    ; si =/ 0 alors retour a` BOUCLE 1


    bra        MOYENNE

    END


Seulement si je suis ma logique, mon PIC va faire toutes les 50ms une conversion au bout de 8 conversions il va faire la moyenne des 8 puis afficher cette moyenne sur les 7 segments. Et recommencer en boucle jusqu'à l'arrêt de l'alimentation.

Seulement un pb persiste, j'aimerai qu'il affiche également pendant 400ms. C'est à dire pendant que le PIC prépare la prochaine moyenne (fais les 8 conversions) j'aimerai qu'il affiche celle qu'il a calculé juste avant.

Or là si je comprends bien ma logique il va faire ça :

Lancer la conversion --> Calculer la moyenne --> Allumer les cadrans --> afficher la moyenne --> éteindre les cadrans --> nouvelle conversion etc...

Or je veux :

(1) Lancer la conversion --> (2)  calculer la moyenne --> (3) allumer les cadrans --> afficher la moyenne pendant 400ms

Et pendant ces 400 ms d'affichage refaire (1)(2)(3) (sachant que 1 - 2 - 3 dure environ 400ms)


Quelq'un aurai une idée ?

Je tiens à préciser que je touche à la programmation depuis moins d'un mois et que tout ce travail a été fait grâce au cours de Bigonoff... Donc soyez indulgent avec moi

Merci de votre aide


Cette discussion est classée dans : conversion, moyenne, movlw, movwf, bra


Répondre à ce message

Sujets en rapport avec ce message

texte en memoire dans pic [ par yalein ] Bonjour a tous, je suis débutant dans la programmation en assembleur et la je coince sur un probleme. J'utilise un pic 16f877 avec un afficheur et je Liaison RS232 Pic 18F2620 vers PC [ par fun_olivier ] Bonjour je dois faire un programme qui permet de relier un Pic 128F2620 avec un Pc via une liaison USART . Le Pic envoi un caractere, puis reçoit une PB PIC18F2525 [ par Haox85 ] Bonsoir tout le monde... Comme vous pouvez le constater, je n'ai toujours pas réussi a faire ma programmation de PIC... Bon mon programme fonctionne petit probleme [ par wessleyclark ] bonjour tous le monde, voila j`ai un petit soucis avec mon code.[^^mad5] ce que je voulais faire , c`est de lire les donnee d`une telecomande transme programmation du PIC 16f876 [ par essahlaouifouad ] salut j'ai un problème de programmation du PIC 16f876 pour contrôle la charge et la décharge du batteri pour un système photovoltaïque pour ne pas end Avoir de l'aide pour défiler dans les deux sences inverses un texte sur une matrice à leds de 5x7 [ par fer13 ] je demande aux experts du forum de me montrer qu'est-ce qu'il faut changer dans ce code pour qu'il defile dans les deux sences....: ;Program for P Problème entre la simulation et la réalité [ par bibou1234 ] Bonjour, (j'avais commencé une programmation en C de se programme, mais trop compliqué, et j'ai perdu trop de temps, donc je le fais maintenant en ass turbo assembleur 5.0 [ par andromida ] S.V.P aidez moi a écrire un code tasm qui fait: *saisir 20 [b]entiers[/b] comme etant des ages dans un tableau *determiner en un seul parcou


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,061 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales