Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

up/down counter BCD 0-99 sur 16f628 ?
elektrax
Débutant
Débutant
Messages : 77
Enregistré en : septembre 2015

#1 Message par elektrax » dim. 16 juil. 2023 05:02

Bonjour,

pour faire un compteur /decompteur 0 a 99 : 2 boutons poussoirs up et down une variable "count" est incrémentée/décrémentée : on envoie la valeur de
count en mode bcd/binaire 8 bits (0-7) sur le portB
exemple
count = 1 portB=b'00000001'
count = 12 portB=b'00001100'

ce que j'ai trouvé sur le net : un asm qui pilote 2 afficheurs 7 segments en multiplexage
je dois faire sans multiplexage : c'est pour 2 afficheurs qui ont un decodeur genre 7447 intégré avec entrées ABCD
Merci pour aide

code pour 7 seg multiplexés : ici la variable que j'ai nommée count précédement est constituée de units et tens pour les unités et les dizaines a tour de role

Code : Tout sélectionner

;****************************************************************
;* 
2 Digit UP Down Counter    17/6/2009    
;Port B drives two 7 segment displays
;Up Sw on RA2   Down Sw on RA3
;"Units" drive on RA0   "Tens" drive on RA1            
;*                                 *
;****************************************************************

    list 
16F628A    ;microcontroller 
    
include <P16F628A.inc>        ;registers for F628A


    __Config _cp_off 
_lvp_off _pwrte_on _wdt_off _intRC_osc_noclkout _mclre_off
    
;code protection off
;low-voltage programming off
;power-up timer -  on
;watchdog timer off
;use internal RC for 4MHz all pins for in-out


;****************************************************************
variables names and files
;****************************************************************


        ;
Files for F628A start at 20h  
                                     
temp1        equ     20h    
;for delay
temp2        equ     21h    
;for delay
SwUp        equ     22h    
;
SwDwn        equ    23h    ;
units        equ    24h    ;
tens        equ    25h    ;
Sw_Flag        equ    26h    ;
FastCount    equ    27h    ;counts loops fast incrementing

;****************************************************************
;
Equates
;****************************************************************
status        equ    0x03
cmcon        equ    0x1F
rp1        equ    0x06
rp0        equ    0x05
portA        equ    0x05
portB        equ    0x06
trisA              equ     0x85
trisB           equ     0x86


;****************************************************************
;
Beginning of program
;****************************************************************
reset    org    00    ;reset vector address    
    
goto    SetUp    
            
table    addwf   PCL
,F           ;02h,1  add W to program counter 
        retlw   
b'00111111'     "0"   -|F|E|D|C|B|A
        retlw   
b'00000110'     "1"   -|-|-|-|C|B|-
        
retlw   b'01011011'     "2"   G|-|E|D|-|B|A
        retlw   
b'01001111'     "3"   G|-|-|D|C|B|
        retlw   
b'01100110'     "4"   G|F|-|-|C|B|-
        
retlw   b'01101101'     "5"   G|F|-|D|C|-|A
        retlw   
b'01111101'     "6"   G|F|E|D|C|-|A
        retlw   
b'00000111'     "7"   -|-|-|-|C|B|A
        retlw   
b'01111111'     "8"   G|F|E|D|C|B|A
        retlw   
b'01101111'     "9"   G|F|-|D|C|B|A


;****************************************************************
;* 
port A and B initialisation                    *
;****************************************************************

SetUp    bsf    status,rp0    
    movlw    
b'00011100'    ;Make RA0,1 out   RA2,3 in
    
remplacez ligne si mclre comme reset
    
;movlw    b'00011100'            ;Make RA0,1 out   RA2,34 in
    movwf    05h        
;trisA    
    clrf    06h        
;trisB Make all RB output
    bcf    status
,rp0    ;select programming area bank0 
    movlw    
b'10000000'    ;Turn off T0CKI
    movwf    option_reg        
    clrf     portB        
;Clear Port B of junk 
    clrf    units        
;zero the units file        
    clrf    tens        
;zero the tens file        
    clrf    Sw_Flag
    movlw    07h        
;turn comparators off and enable
    movwf    cmcon        
;    pins for I/O functions        
    
goto     Main                        

   
;Delay 10mS         10 x 1,000uS

D_10mS    movlw    0Ah
    movwf    temp2
D_a    nop
    decfsz     temp1
,f
    
goto     D_a
    decfsz     temp2
,f
    
goto     D_a    
    retlw     00
        
Up    btfsc    Sw_Flag
,2
    retlw    00
    bsf    Sw_Flag
,2
    incf    units
,f
    movlw    0Ah        
;put 10 into w
    xorwf    units
,w        ;compare units file with 10
    btfss    status
,2    ;zero flag in status fileSet if units is 10
    retlw    00
    clrf    units
    incf    tens
,f
    movlw    0Ah        
;put 10 into w
    xorwf    tens
,w        ;compare units file with 10
    btfsc    status
,2    ;zero flag in status fileSet if tens is 10
    clrf    tens                
    retlw    00        
;display passes 99 but not below 0
        
        
Dwn    btfsc    Sw_Flag
,3
    retlw    00
    bsf    Sw_Flag
,3
    decf    units
,f
    movlw    0FFh        
;put FFh into w
    xorwf    units
,w        ;compare units file with FFh
    btfss    status
,2    ;zero flag in status fileSet if units is 10
    retlw    00
    movlw    09
    movwf    units        
;put 9 into units file
    decf    tens
,f
    movlw    0FFh        
;put 0FFh into w
    xorwf    tens
,w        ;compare tens file with 0FFh
    btfsc    status
,2    ;zero flag status file). Set if tens is 0FFh
    
goto    $+2        ;tens file is 0FFh  Jump down 2 instructions
    retlw    00                        
    clrf    tens
    clrf    units
    retlw    00        
;display  not below 0        
                            

Main    btfss    portA
,2        ;test switch-press for UP
    call    Up        
;UP switch pressed
    btfss    portA
,3        ;test switch-press for Down
    call    Dwn        
;Down switch pressed
    movlw    
b'00000001'    ;Make RA0 HIGH for units drive     
    movwf    portA    
    movf    units
,f        ;copy unit value into w
    call    table        
;unit display value will return in w
    movwf    portB        
;output units value
    call    D_10mS        
;call delay
    clrf    portB        
;clear display
    movlw    
b'00000010'    ;Make RA1 HIGH for tens drive     
    movwf    portA            
    movf    tens
,f        ;copy tens value into w        
    call    table        
;tens display value will return in w
    movwf    portB        
;output tens value
    call    D_10mS        
;call delay
    clrf    portB        
;clear display
    btfsc    portA
,2        ;bit will be zero when sw is pressed
    bcf    Sw_Flag
,2
    btfsc    portA
,3        ;bit will be zero when sw is pressed
    bcf    Sw_Flag
,3    

        
pour mlcre comme reset decommentez
    
bcf    Sw_Flag,2    ;button not pressedClear Up flag
    
;bcf    Sw_Flag,7    ;Clear Up repeat flag
    
;clrf    FastCount   
    
;btfss    portA,4        ;test reset 
     
;   goto    SetUp
    
goto    Main        
        
        END

up/down counter BCD 0-99 sur 16f628 ?
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2620
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » dim. 16 juil. 2023 13:24

Bonjour,

Voici un exemple de ce que j'ai compris, mais avec 2 afficheurs, la.... il y en a que 1

main-qimg-96e58bf8c29f14f4b655e5d1e3318641-2228858850.png


Pas compliqué à faire, mais il faudrait avoir les codes ABCD, de plus avec un schéma ça serait mieux, écrire un code sans schéma je ne sais pas ou je vais.

Tu veux utiliser que le PORTB pour affichage des 2 afficheurs, car si c'est le cas faut faire comme ci-dessous

1 bits à 4 bits (ABCD) = afficheur 1
5 bits à 8 bits (ABCD) = afficheur 2

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

up/down counter BCD 0-99 sur 16f628 ?
elektrax
Débutant
Débutant
Messages : 77
Enregistré en : septembre 2015

#3 Message par elektrax » lun. 17 juil. 2023 04:57

bonjour,

c' est bien cela

il faut diviser en 2 quartets

puisque 10 decimal en binaire : 0000 1010
alors que pour 2 decodeurs Binaire codé décimal il faut : 0001 (dizaines = chiffre 1 sur afficheur dizaines ) + 0000 (unités)

Merci

up/down counter BCD 0-99 sur 16f628 ?
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1662
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#4 Message par Gérard » lun. 17 juil. 2023 21:46

Je suppose qu'au départ tu as un compteur binaire limité à 99.
Tu dois faire une conversion binaire/BCD pour attaquer 2 décodeurs type 7447 ou 74247 (le 247 affichera la segment "a" du 6 et le segment "d" du 9)
https://www.ti.com/lit/ds/symlink/sn74l ... e.com%252F
voir page 2

Conversion :
X : nombre binaire de départ, Y nombre en BCD

While X > 9
X = X - 10
Y = Y + 16
Wend
Y = Y + X

Si tu ne souhaites pas perdre la valeur de la variable de départ (X), tu passes par une variable intermédiaire.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

up/down counter BCD 0-99 sur 16f628 ?
elektrax
Débutant
Débutant
Messages : 77
Enregistré en : septembre 2015

#5 Message par elektrax » mar. 18 juil. 2023 05:22

bonjour,

je fais une table bcd 00 a 99

Code : Tout sélectionner

table bcd  8bits 

table    addwf   PCL
,F           ;02h,1  add W to program counter 
        retlw   
b'00000000'     "0"   
        
retlw   b'00000001'     "1"   01
        retlw   
b'00000010'     "2"   02
        retlw   
b'00000011'     "3"    03
        retlw   
b'00000100'     "4"   
        
retlw   b'00000101'     "5"   
        
retlw   b'00000110'     "6"   
        
retlw   b'00000111'     "7"   
        
retlw   b'00001000'     "8"   
        
retlw   b'00001001'     "9"   09
        retlw   
b'00010000'     "10"
        
retlw   b'00010001'     "11"
        
retlw   b'00010010'     "12"
        
retlw   b'00010011'     "13"
        
retlw   b'00010100'     "14"
        
retlw   b'00010101'     "15"
        
retlw   b'00010110'     "16"
        
retlw   b'00010111'     "17"
        
retlw   b'00001000'     "18"   
        
retlw   b'00001001'     "19" 
        
retlw   b'00100000'     "20"  
                
                
|
                |
                |
                
        
retlw   b'10010000'     "90"   
        
retlw   b'10010001'     ;   
        
retlw   b'10010010'     ;    
        
retlw   b'10010011'     ;     
        
retlw   b'10010100'     ;    
        
retlw   b'10010101'     ;   
        
retlw   b'10010110'     
        
retlw   b'10010111'     
        
retlw   b'10011000'     ;   
        
retlw   b'10011001'     ;     99
        
        


le programme main "surveille" l'appui sur les boutons et envoye sur portB

Code : Tout sélectionner



Main    btfss    portA
,2        ;test switch-press for UP
    call    Up        
;UP switch pressed
    btfss    portA
,3        ;test switch-press for Down
    call    Dwn        
;Down switch pressed
    
    movf    COUNT
,f        ;copy COUNT value into w
    call    table        
;COUNT  value will return in w
    movwf    portB        
;  envoye   sur portB
    call    D_10mS        
;call delay
    
    
;clrf    portB        ;clear display

    btfsc    portA
,2        ;bit will be zero when sw is pressed
    bcf    Sw_Flag
,2
    btfsc    portA
,3        ;bit will be zero when sw is pressed
    bcf    Sw_Flag
,3    

    
goto    Main



les souspgm up et down des boutons qui reste a coder

incremente / decremente la variable COUNT
dans UP doit remettre COUNT a zero si >99 (ou egal 100)

dans DWN doit remettre COUNT a 99 si inférieur a zero

up/down counter BCD 0-99 sur 16f628 ?
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1662
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#6 Message par Gérard » mar. 18 juil. 2023 09:20

C'est quoi ta question ?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

up/down counter BCD 0-99 sur 16f628 ?
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2620
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » mar. 18 juil. 2023 15:09

Bonjour Gérard, elektrax, et tout le forum,

Voila j'ai fini son programme, je le mettrais ce soir.... avec schéma, si j'ai le temps

elektrax a écrit :Source du message je fais une table bcd 00 a 99

Pas besoin de faire une table jusqu'à 99, seulement 0 à 9, et encore..... je crois qu'on n'ont n'a pas besoin, faut que je contrôle.

Gérard a écrit :Source du message C'est quoi ta question ?


Son programme consiste à faire un comptage, décomptage avec deux boutons, tout en restant dans le standard abcd pour envoyer sur le 7447

1) Si tu appuies sur le bouton Moins, tu retires une unité, si il est à zéro, au prochain appuie du bouton Moins, il repasse à 99
2) Si tu appuies sur le bouton Plus, tu ajoutes une unité, si il est à 99, au prochain appuie du bouton Plus, il repasse à 0

PORTA,2 = bouton up

PORTA,3 = bouton down

PORTB,0, PORTB,1, PORTB,2, PORTB,3, = afficheur des unités

PORTB,4, PORTB,5, PORTB,6, PORTB,7, = afficheur des dizaines

Il revient fort ce Gérard, :+1: il se mets à l'asm :bravo: heureusement qu'il est là :-D


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

up/down counter BCD 0-99 sur 16f628 ?
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1662
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#8 Message par Gérard » mar. 18 juil. 2023 17:04

Une idée :

INIT
count = 0
définir count comme variable pouvant aller de -128 à +127
var et count_BCD : Byte

Prog_Principal

; pull up donc actif à 0

if UP = 0 then count = count + 1
if count = 100 then count = 0

if DOWN = 0 then count = count - 1
if count = -1 then count = 99
gosub BIN_BCD ; gosub = go to subroutine en Basic
gosub AFFICHE

GOTO Prog_Principal

BIN_BCD :

count_BCD = 0
count = var
while var > 9
var = var - 10
count_BCD = count_BCD + 16
wend
count_BCD = count_BCD + var

Return

AFFICHE :

PortB = count_BCD

Return


Je ne tiens pas compte des anti-rebond des contacts.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

up/down counter BCD 0-99 sur 16f628 ?
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2620
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » mar. 18 juil. 2023 23:08

Bonsoir,

Et voilà le schéma

Compte99.jpg



Et voila le code+le fichier à mettre dans le pic Compte99.zip

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

up/down counter BCD 0-99 sur 16f628 ?
elektrax
Débutant
Débutant
Messages : 77
Enregistré en : septembre 2015

#10 Message par elektrax » mer. 19 juil. 2023 06:21

bonjour,

TempsX, merci pour le schéma, comme j'ai dit j utilise des hp5082-73xx de recup j'ai des hexa et des decimaux, la seule différence entre les 2 c'est la pin 4 qui est blanking pour les 7340hexa et pt decimal pour les 7300, consomme 50mA ......par afficheur

disphp50827340.jpg


merci pour l'asm :
si c'est pour me donner le HEX vous auriez pu l'écrire avec MikroC(ou autres) :-D , je n'ai pas de compilateur C pour PIC c'est pour cela que je regardais l'asm pour utiliser un de mes 40 628a en stock, erreur de cde à mes débuts de commandes chinoises : je pensais cder 4 16f628a mais c'était des lots de 10.....
me reste plus qu'à tester le hardware,

Merci énormément

PS :
avec IDE arduino : hardware ok testé sur uno a quartz 16Mhz

Code : Tout sélectionner



#include "simpleBouton.h" ; biblio gestion boutons

simpleBouton bouton_plus(11);
simpleBouton bouton_moins(12);

int a1=2;
int a2=3;
int a3=4;
int a4=5;
int b1=6;
int b2=7;
int b3=8;
int b4=9;

int countPos=0;
int d1;
int d2;

void setup() {
     
pinMode (a1OUTPUT);
    
pinMode (a2OUTPUT);
      
pinMode (a3OUTPUT);
        
pinMode (a4OUTPUT);
         
pinMode (b1OUTPUT);
    
pinMode (b2OUTPUT);
      
pinMode (b3OUTPUT);
        
pinMode (b4OUTPUT);

 
DisplayON();
}

void loop() {

   
bouton_plus.actualiser();
  
bouton_moins.actualiser();

  if (
bouton_plus.vientDEtreEnfonce())
  {
    
countUP();
    
DisplayON();
  }
 if (
bouton_moins.vientDEtreEnfonce())
  {
    
countDWN();
    
DisplayON();

  }

      } 
// endloop

void countUP()
{
  
countPos++;
  if (
countPos 99)
  {
    
countPos 0;
  }
}

void countDWN()
{
  
countPos--;
  if (
countPos 0)
  {
    
countPos 99;
  }
}

void DisplayON()

{
   
d1=countPos%10// This will divide n by 10 and the remainder will be stored in d1, 
 // d1 de 0 a 9
 
d2=countPos/10// This will divide n by 10 and the value before decimal will be stored in d2, 
 // d2 de 0 a 9
 
disp1(d1);
 
disp2(d2);
 
}
// utilisation bitRead

void disp1(int num)
    {
   
digitalWrite(a1bitRead(num0));
  
digitalWrite(a2bitRead(num1));
  
digitalWrite(a3bitRead(num2));
  
digitalWrite(a4bitRead(num3));
  
    }

void disp2(int num//same as above
{  
     
digitalWrite(b1bitRead(num0));
  
digitalWrite(b2bitRead(num1));
  
digitalWrite(b3bitRead(num2));
  
digitalWrite(b4bitRead(num3));
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités