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

Assembleur Discussion :

Horloge numérique


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Horloge numérique
    Salut
    Est-ce que je peux savoir les étapes necessaires pour faire" horloge numérique en CMOS"
    Je veux taper un programme DATE qui donne la date à 24h! :
    J'ai 3 var : jours, mois, année

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    ;------------------------------------------------
    ram16_CMOS_GetTime PROC
    ; Synopsis: Retourne l'heure en BCD
    ; Attend :  rien
    ; Retourne :    eax -> heure
    ;                  0- 7 -> hours
    ;                  8-15 -> minutes
    ;                 16-23 -> seconds
    ;------------------------------------------------
     
    push cx
    push edx
    xor edx,edx
    in al,70h
    mov cl,al
    ; seconds
    xor al,al
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    ; minutes
    mov al,2
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    ; hours
    mov al,4
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    mov al,cl
    out 70h,al
    mov eax,edx
    pop edx
    pop cx
    ret
    ram16_CMOS_GetTime ENDP
    On commence par sauvegarder le contenu du port 70h.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ; sauvegarde
    in al,70h
    mov cl,al
    ; ...
    ; du code ici
    ; ...
    ; restauration
    mov al,cl
    out 70h,al
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    ;------------------------------------------------
    ram16_CMOS_GetDate PROC
    ; Synopsis: Retourne la date en BCD
    ; Attend :  rien
    ; Retourne :    eax -> heure
    ;                  0- 7 -> year
    ;                  8-15 -> month
    ;                 16-23 -> date of month
    ;                 24_31 -> day of week
    ;------------------------------------------------
     
    push cx
    push edx
    xor edx,edx
    in al,70h
    mov cl,al
    ; day of week
    mov al,6
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    ; date of month
    mov al,7
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    ; month
    mov al,8
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    ; year
    mov al,9
    out 70h,al
    in al,71h
    shl edx,8
    mov dl,al
    mov al,cl
    out 70h,al
    mov eax,edx
    pop edx
    pop cx
    ret
    ram16_CMOS_GetDate ENDP
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    ;------------------------------------------------
    ram16_CMOS_GetSecondsToday PROC
    ; Synopsis: Retourne le nombre de secondes écoulées
    ;           depuis le début de la journée
    ; Retourne: eax -> nbr de secondes
    ;------------------------------------------------
     
    push ebx
    push ecx
    push edx
    call ram16_CMOS_GetTime
    mov ecx,eax
    xor eax,eax
    mov al,cl
    shr al,4
    mov ebx,10
    mul ebx
    xor ebx,ebx
    mov bl,cl
    and bl,0Fh
    add eax,ebx
    mov ebx,6
    mul ebx
    shr ecx,8
    xor ebx,ebx
    mov bl,cl
    shr bl,4
    add eax,ebx
    mov ebx,10
    mul ebx
    xor ebx,ebx
    mov bl,cl
    and bl,0Fh
    add eax,ebx
    mov ebx,6
    mul ebx
    shr ecx,8
    xor ebx,ebx
    mov bl,cl
    shr bl,4
    add eax,ebx
    mov ebx,10
    mul ebx
    xor ebx,ebx
    mov bl,cl
    and bl,0Fh
    add eax,ebx
    pop edx
    pop ecx
    pop ebx
    ret
    ram16_CMOS_GetSecondsToday ENDP
    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
    ;------------------------------------------------
    ram16_CMOS_WriteTime PROC
    ; Synopsis: Affiche l'heure
    ; Attend :  rien
    ;------------------------------------------------
     
    push eax
    call ram16_CMOS_GetTime
    call ram16_WriteHex08
    shr eax,8
    push ax
    mov al,':'
    call ram16_WriteChar
    pop ax
    call ram16_WriteHex08
    shr eax,8
    push ax
    mov al,':'
    call ram16_WriteChar
    pop ax
    call ram16_WriteHex08
    pop eax
    ret
    ram16_CMOS_WriteTime ENDP

    CMOS RAM/RTC
    PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK)
    Note :
    the real-time clock may be either a discrete MC146814, MC146818, or an emulation thereof built into the motherboard chipset
    0070 -W CMOS RAM index register port (ISA, EISA)
    bit 7 = 1 NMI disabled from reaching CPU
    = 0 NMI enabled
    bit 6-0 CMOS RAM index
    (64 bytes in early systems, now usually 128 bytes)
    Note: any write to PORT 0070h should be followed by an action to
    PORT 0071h or the RTC wil be left in an unknown state.
    0071 RW CMOS RAM data port (ISA, EISA)
    Organization of CMOS Memory - Clock
    The format of the ten clock data registers (bytes 00h-09h) is:
    ----------R00--------------------------------
    CMOS 00h - RTC - SECONDS
    Desc: (BCD 00-59, Hex 00-3B)
    Note: Bit 7 is read only
    SeeAlso: CMOS 01h,CMOS 02h,CMOS 04h
    ----------R01--------------------------------
    CMOS 01h - RTC - SECOND ALARM
    Desc: (BCD 00-59, Hex 00-3B; "don't care" if C0-FF)
    SeeAlso: CMOS 00h,CMOS 03h,CMOS 05h,CMOS 7Dh
    ----------R02--------------------------------
    CMOS 02h - RTC - MINUTES
    Desc: (BCD 00-59, Hex 00-3B)
    SeeAlso: CMOS 00h,CMOS 03h,CMOS 04h
    ----------R03--------------------------------
    CMOS 03h - RTC - MINUTE ALARM
    Desc: (BCD 00-59, Hex 00-3B; "don't care" if C0-FF))
    SeeAlso: CMOS 00h,CMOS 02h,CMOS 05h,CMOS 7Dh,CMOS 7Eh"AMD-645"
    ----------R04--------------------------------
    CMOS 04h - RTC - HOURS
    Desc: (BCD 00-23, Hex 00-17 if 24 hr mode)
    (BCD 01-12, Hex 01-0C if 12 hr am)
    (BCD 81-92. Hex 81-8C if 12 hr pm)
    SeeAlso: CMOS 00h,CMOS 02h,CMOS 05h
    ----------R05--------------------------------
    CMOS 05h - RTC - HOUR ALARM
    Desc: (same as hours; "don't care" if C0-FF))
    SeeAlso: CMOS 01h,CMOS 03h,CMOS 04h
    ----------R06--------------------------------
    CMOS 06h - RTC - DAY OF WEEK
    Desc: (01-07 Sunday=1)
    SeeAlso: CMOS 07h,CMOS 08h,CMOS 09h
    ----------R07--------------------------------
    CMOS 07h - RTC - DATE OF MONTH
    Desc: (BCD 01-31, Hex 01-1F)
    SeeAlso: CMOS 06h,CMOS 08h,CMOS 09h
    ----------R08--------------------------------
    CMOS 08h - RTC - MONTH
    Desc: (BCD 01-12, Hex 01-0C)
    SeeAlso: CMOS 06h,CMOS 07h,CMOS 09h
    ----------R09--------------------------------
    CMOS 09h - RTC - YEAR
    Desc: (BCD 00-99, Hex 00-63)
    Notes: BCD/Hex selection depends on Bit 2 of register B (0Bh)
    12/24 Hr selection depends on Bit 1 of register B (0Bh)
    Alarm will trigger when contents of all three Alarm byte registers
    match their companions.
    SeeAlso: CMOS 06h,CMOS 07h,CMOS 08h

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    merci pour votre réponse ,mais j'ai pas bien compris le code veuillez expliquer un petit peu
    merci

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Pour lire un élément de la RAM CMOS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ;- tu tindique quel élément tu veux lire
    mov al,4 ; n° de l'élément (4 correspond à l'heure)
    out 70h,al
    ;- tu lit la valeur sur le port 71h
    in al,71h
    Tu trouvera le n° de chaque élément dans la table "Organization of CMOS Memory - Clock" du précédent message.

    Comme le port 70h ne sert pas qu'à indiquer le n° d'élément (il sert également à activer ou désactiver les NMIs), je sauvegarde le contenu du port 70h au début de chaque fonction pour restaurer la valeur à la fin de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ; sauvegarde
    in al,70h 
    mov cl,al ; valeur dans CL
    ; ... 
    ; du code ici 
    ; ... 
    ; restauration 
    mov al,cl ; valeur dans CL
    out 70h,al
    Pour sauvegarder, je lit le port et place le contenu dans CL.
    Pour restaurer le contenu, j'utilise la valeur stockée dans CL lors de la sauvegarde.


    exemple : Lire l'heure
    Cette fonction lit plusieurs éléments (heures,minutes,secondes) et retourne ces éléments dans EAX.
    Comme AL sert pour lire un élément, après chaque lecture, je place la valeur de AL dans DL en décalant le contenu de EDX d'1 octet à chaque fois.
    A la fin de la procédure, je déplace le contenu de EDX vers EAX.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    ;------------------------------------------------ 
    ram16_CMOS_GetTime PROC 
    ; Synopsis: Retourne l'heure en BCD 
    ; Attend :  rien 
    ; Retourne :    eax -> heure 
    ;                  0- 7 -> hours 
    ;                  8-15 -> minutes 
    ;                 16-23 -> seconds 
    ;------------------------------------------------ 
    ;---
    ; la procédure préserve la valeurs des registres CX et EDX
    ; seul le registre EAX est modifié
    push cx 
    push edx
    ;---
     
    xor edx,edx ;* EDX=0|0|0|0
     
    in al,70h ;** sauvegarde du port 70h
    mov cl,al ;**
     
    ; lecture des secondes 
    xor al,al ; 0=seconds
    out 70h,al 
    in al,71h 
    shl edx,8 
    mov dl,al ;* EDX=0|0|0|seconds
     
    ; lecture des minutes 
    mov al,2 ; 2=minutes
    out 70h,al 
    in al,71h 
    shl edx,8 
    mov dl,al ;* EDX=0|0|seconds|minutes
     
    ; lecture des heures 
    mov al,4 ; 4=hours
    out 70h,al 
    in al,71h 
    shl edx,8 
    mov dl,al ;* EDX=0|seconds|minutes|hours
     
    mov al,cl ;** restauration du port 70h
    out 70h,al ;**
     
    mov eax,edx ;* EAX=0|seconds|minutes|hours
     
    ;---
    ; la procédure préserve la valeurs des registres CX et EDX
    ; seul le registre EAX est modifié
    pop edx 
    pop cx 
    ;---
    ret 
    ram16_CMOS_GetTime ENDP
    Pour utiliser cette fonction,faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    call ram16_CMOS_GetTime
    ;l'heure courante est contenue dans EAX
    Je peux vous aider si vous avez des problèmes ou s'il y a des éléments que vous ne comprenez pas.
    Si vous avez besoin d'aide,dîtes simplement quels éléments vous ne comprenez pas. (ne dîtes pas "je n'ai rien compris", soyez plus précis).

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci infiniment. Encore une fois, premiére chose je suis encore une débutante en assembleur, la deuxiéme chose on utilise pas les registres al, dl.. .ou les instructions push..., on utilise clr, bne (boucle), ld, cmp (comparaison) les registres A,B,D,X,PC...

    Voilà un exemple : carré d'un nb se touvant à l'adresse $1000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LDA $1000
    LDB $1000
    MUL
    STD $1100
    c'est pas le même micropros n'est-ce pas
    (soyez patient avec moi je suis encore débutante car peut-être je n'ai pas bien présenté le problème dès le début).

    merciiiiiiii

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Pourrait-tu me dire quel langage assembleur tu utilise et quel type de processeurs.
    Cela peut m'aider à te fournir du code dans le même langage assembleur que toi tu utilise.

    Pour info, le code que j'ai founi est écrit en assembleur x86 et fonctionne sur les processeurs x86 fonctionnant en mode réel 16 bits.

  7. #7
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    salut
    le microprocesseur qu'on est en train d'étudier est le 6809 (ancien)
    merci

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Points : 30
    Points
    30

Discussions similaires

  1. [VB2005] Horloge numérique
    Par IronLionZion dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/12/2007, 20h08
  2. [68HC11] Réalisation d'une horloge numérique
    Par david2312 dans le forum Autres architectures
    Réponses: 2
    Dernier message: 04/04/2007, 15h40
  3. Comment réaliser une horloge numérique grâce au timer 8254 ?
    Par jojo_ol76 dans le forum Autres architectures
    Réponses: 1
    Dernier message: 29/03/2007, 19h56
  4. [16F676] Horloge numérique
    Par toutou85 dans le forum Autres architectures
    Réponses: 5
    Dernier message: 25/10/2006, 15h38
  5. [LCD] Contrôle horloge numérique
    Par fredtheman dans le forum Composants VCL
    Réponses: 13
    Dernier message: 27/12/2004, 18h00

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