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 ---
- 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 ---
Modérateur : mazertoc
up/down counter BCD 0-99 sur 16f628 ?
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
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 P = 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|A
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,3, 4 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 file. Set 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 file. Set 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 file. Set 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 pressed. Clear 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 ?
Bonjour,
Voici un exemple de ce que j'ai compris, mais avec 2 afficheurs, la.... il y en a que 1
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+
Voici un exemple de ce que j'ai compris, mais avec 2 afficheurs, la.... il y en a que 1
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.
up/down counter BCD 0-99 sur 16f628 ?
up/down counter BCD 0-99 sur 16f628 ?
- Gérard
Expert- Messages : 1761
- Âge : 66
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
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.
up/down counter BCD 0-99 sur 16f628 ?
bonjour,
je fais une table bcd 00 a 99
le programme main "surveille" l'appui sur les boutons et envoye sur portB
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
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 ?
up/down counter BCD 0-99 sur 16f628 ?
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
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.
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, il se mets à l'asm heureusement qu'il est là
A+
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, il se mets à l'asm heureusement qu'il est là
A+
up/down counter BCD 0-99 sur 16f628 ?
- Gérard
Expert- Messages : 1761
- Âge : 66
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
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.
up/down counter BCD 0-99 sur 16f628 ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
up/down counter BCD 0-99 sur 16f628 ?
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
merci pour l'asm :
si c'est pour me donner le HEX vous auriez pu l'écrire avec MikroC(ou autres) , 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
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
merci pour l'asm :
si c'est pour me donner le HEX vous auriez pu l'écrire avec MikroC(ou autres) , 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 (a1, OUTPUT);
pinMode (a2, OUTPUT);
pinMode (a3, OUTPUT);
pinMode (a4, OUTPUT);
pinMode (b1, OUTPUT);
pinMode (b2, OUTPUT);
pinMode (b3, OUTPUT);
pinMode (b4, OUTPUT);
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(a1, bitRead(num, 0));
digitalWrite(a2, bitRead(num, 1));
digitalWrite(a3, bitRead(num, 2));
digitalWrite(a4, bitRead(num, 3));
}
void disp2(int num) //same as above
{
digitalWrite(b1, bitRead(num, 0));
digitalWrite(b2, bitRead(num, 1));
digitalWrite(b3, bitRead(num, 2));
digitalWrite(b4, bitRead(num, 3));
}
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 17 invités