Étape 3: Breadboarding & Code Micro
Tout d’abord, j’ai testé une seule LED 7 segments à l’aide de code initial. Ceci confirmé 3 choses ;
1) câblage de l’IC a été vérifiée bien !
2) m’a amené à optimiser et finaliser mon code.
3) m’a fait réaliser que je n’avait pas besoin les résistances de limites actuelles !
1 câblage
Comme indiqué, ma conception schématique s’est avérée pour fonctionner avec mon code, comme la LED aurait successivement les nombres à l’aide d’un bouton-poussoir, afin que vérifié mon code et la mise en page. Pas grand chose il fallait mais breadboarding confirmé que j’étais en bonne forme.
2 CODE
Initialement, j’ai eu mon code sertie d’une routine principale de scanner pour les boutons et l’affichage de l’ISR (Interrupt Service Routine) les numéros. Après breadboarding des tests, j’ai inversé les routines, donc la plupart du temps a été constamment affichage des nombres et l’ISR pour vérifier les boutons. La raison pour laquelle j’ai fait cela, était juste d’avoir un affichage constant, depuis le PIC s’exécute avec une horloge interne de 4Mhz, je perds très peu de temps pour les boutons de numérisation. Pas grand chose... tout dépend de comment vous voulez faire le code et ce qui fait le plus de sens pour chaque application. Pour ce faire, l’affichage est important, alors j’ai mis que dans la routine principale.
L’arrivée de mes premières parties (tous les 6 écrans!), j’ai terminé le câblage de la maquette et trouvé une autre question. Lorsque vous appuyez sur le bouton mon code avait certains registres bâclés qui n’ont pas été innocentés et l’ISR causait quelques problèmes d’affichage mineurs.
;===============================================================================
; Tourner le compteur
;
; -----------
; Dsply3 <---A2 |1 18| A1---> Dsply2
; Dsply4 <---A3 |2 17| A0---> Dsply1
; LED1 <---A4 |3 16| A7---> DEL3
; A5 |4 15| A6---> Led2
; VSS |5 14| DMV
; Button1 -> B0 |6 13| B7
; B1 |7 12| B6
; B2 |8 11| B5
; B3 |9 10| B4
; -----------
;
; LED1-3---> BCD-dec IC---> LEDSeg's1-6
; Dsply1-3---> BCD-7seg IC---> Dsply #1-9
;
;===============================================================================
; Historique des révisions & Notes :
; En-tête Initial v1.0, Code 30/03/09
;
;
; (C) 5 / 2009
; Ce code peut être utilisé pour les personnels d’apprentissage/demande/modification.
; Toute utilisation de ce code dans les produits commerciaux viole cette version freeware.
; Pour questions ou commentaires, contactez circuit dot mage at yahoo dot com..
;-------------------------------------------------------------------------------
#include P16F627A. INC
;===============================================================================
; Définit
;-------------------------------------------------------------------------------
;===============================================================================
; Données
;-------------------------------------------------------------------------------
; Variables de maintien fois
count1 equ 20
count2 equ 21
DIS1 equ 22
dis2 equ 23
DIS3 equ 24
dis4 equ 25
DIS5 equ 26
dis6 equ 27
w_temp equ 28
status_temp equ 29
ISRCNTR equ 2 a
;===============================================================================
; Réinitialiser les vecteurs
;
; VÉRIFIER LA CONFIG. BITS AVANT LA GRAVURE!!!
; INTOSC
; MCLR : ACTIVÉ
; PWRUP : ACTIVÉ
; TOUS LES AUTRES : DÉSACTIVER!!
;
;-------------------------------------------------------------------------------
RESET_ADDR EQU 0 X 00
ISR_ADDR EQU 0 X 04
org RESET_ADDR
Goto début
;===============================================================================
; RAPPORT DE RECHERCHE INTERNATIONALE
;
;-------------------------------------------------------------------------------
org ISR_ADDR
movwf w_temp
swapf statut, w
movwf status_temp ;
; RAPPORT DE RECHERCHE INTERNATIONALE ICI
; Vérifiez les commutateurs PB0-PB5
btfsc PORTB, 0 ; Vérifiez SW1
appel sw1debounce
btfsc PORTB, 1 ; Vérifiez SW1
appel sw2debounce
btfsc PORTB, 2 ; Vérifiez SW1
appel sw3debounce
btfsc PORTB, 3 ; Vérifiez SW1
appel sw4debounce
btfsc PORTB, 4 ; Vérifiez SW1
appel sw5debounce
btfsc PORTB, 5 ; Vérifiez SW1
appel sw6debounce
Goto endisr
sw1debounce
appel debounce ; Attendre 0,2 sec
appel debounce
RIFC dis1 ; Compteur de mise à jour
movf dis1, W ; Vérification de dépassement de capacité
xorlw 0x1A ; 10 sur 7-seg ?
btfss STATUS, Z
retour ; Non, reprendre le scan.
movlw h « 10 » ; Oui, remettre affichage.
movwf dis1
retour
sw2debounce
appel debounce ; Attendre 0,2 sec
appel debounce
RIFC dis2 ; Compteur de mise à jour
movf dis2, W ; Vérification de dépassement de capacité
xorlw 0x4A ; 10 sur 7-seg ?
btfss STATUS, Z
retour ; Non, reprendre le scan.
movlw h « 40 » ; Oui, remettre affichage.
movwf dis2
retour
sw3debounce
appel debounce ; Attendre 0,2 sec
appel debounce
RIFC dis3 ; Compteur de mise à jour
movf dis3, W ; Vérification de dépassement de capacité
xorlw 0x5A ; 10 sur 7-seg ?
btfss STATUS, Z
retour ; Non, reprendre le scan.
movlw h « 50 » ; Oui, remettre affichage.
movwf dis3
retour
sw4debounce
appel debounce ; Attendre 0,2 sec
appel debounce
RIFC dis4 ; Compteur de mise à jour
movf dis4, W ; Vérification de dépassement de capacité
xorlw 0x8A ; 10 sur 7-seg ?
btfss STATUS, Z
retour ; Non, reprendre le scan.
movlw h « 80 » ; Oui, remettre affichage.
movwf dis4
retour
sw5debounce
appel debounce ; Attendre 0,2 sec
appel debounce
RIFC dis5 ; Compteur de mise à jour
movf dis5, W ; Vérification de dépassement de capacité
xorlw 0x9A ; 10 sur 7-seg ?
btfss STATUS, Z
retour ; Non, reprendre le scan.
movlw h « 90 » ; Oui, remettre affichage.
movwf dis5
retour
sw6debounce
appel debounce ; Attendre 0,2 sec
appel debounce
RIFC dis6 ; Compteur de mise à jour
movf dis6, W ; Vérification de dépassement de capacité
xorlw 0xCA ; 10 sur 7-seg ?
btfss STATUS, Z
retour ; Non, reprendre le scan.
movlw h « C0 » ; Oui, remettre affichage.
movwf dis6
retour
endisr
BCF INTCON, T0IF
swapf status_temp, w
movwf statut
swapf w_temp, f
swapf w_temp, w
retfie
;===============================================================================
; Commencez ici !
;-------------------------------------------------------------------------------
début
; Ports e/s de config
CLRF PORTA
movlw 0 x 07
movwf CMCON
BCF STATUS, RP1
BSF STATUS, RP0
movlw h « 00 » ; RA < 0-7 > sorties, sortie N° RA5
movwf TRISA
BCF STATUS, RP0
CLRF PORTB
BSF STATUS, RP0
movlw h'FF' ; RB < 0-7 > entrées
movwf TRISB
; Réglez le minuteur interne
BSF PCON, 3 ; Affectez à 4Mhz.
movlw h'CF' ; Source interne Tmr0, prescale TMR0 1: 256
movwf OPTION_REG
movlw h « A0 »
movwf INTCON ; Activer les interruptions TMR0,
BCF STATUS, RP0
; Initialiser des registres
CLRF PORTA ; Claire PortA
CLRF PORTB ; Claire PortB sorties
CLRF count1
CLRF count2
movlw h « 10 »
movwf dis1
movlw h « 40 »
movwf dis2
movlw h « 50 »
movwf dis3
movlw h « 80 »
movwf dis4
movlw h « 90 »
movwf dis5
movlw h « C0 »
movwf dis6
appel debounce ; 0,2 sec
; test de diodes, affichage 8???
;===============================================================================
; Principal
; Extrait entrées affiche commutateurs, debounces et incriments.
;
; Cela met à jour les affichages, TMR0 Rémy 1:4, à un taux de 1Khz.
Affichage 0 est utilisée pour allouer à un affichage inutilisé. Affichage 1 à 6 sont câblés.
; Tout d’abord, IC BCD-7Seg est chargé avec la valeur d’affichage, et IC BCD-Dec est activé pour
; Afficher sélection.
; Deuxièmement, une attente de ms est tenue pour l’affichage.
; En troisième lieu, IC BCD-Dec est désactivé... display0 est sélectionné pour mettre hors tension de l’affichage
;
; Cela est répété pour chacun des 6 écrans et en boucle.
Rapport de recherche internationale poignées interrupteur de détection à la fréquence de 15Hz.
;-------------------------------------------------------------------------------
principal
Disp1
movf dis1, 0
movwf PORTA
appel ledon
Goto principal
;===============================================================================
; Ledon
; Rodage pour LED power sur.
; 6 écrans -> rapport cyclique 1/6 à 1 Khz = 166 cycles
;-------------------------------------------------------------------------------
Ledon
movlw.54
movwf count1
ledloop
decfsz count1, F
Goto ledloop
retour
;===============================================================================
; Debounce signal
; 4 cycles de charge et d’appeler, 2 cycles pour retourner.
; 4 Tc Mhz:: count2 = 255 -> 0,2 s
;-------------------------------------------------------------------------------
Debounce
movlw.255 ; Délai pour debounce 1/5e de seconde.
movwf count2
appel pon_wait
retour
;-------------------------------------------------------------------------------
; count1 = 255 d:: 775 cycles à 0, + 3 cycles à retourner.
;-------------------------------------------------------------------------------
pon_wait
big_loopS
movlw.255
movwf count1
short_loopS
decfsz count1, F
Goto short_loopS
decfsz count2, F
Goto big_loopS
retour
fin
3 CIRCUIT
J’avais initialement résistances 470 Ohm de chaque ligne de conducteur d’affichage de la 74LS47 et CD4028 permettent de ligne. Cependant, j’ai testé un appel de courant de mon circuit et trouvé il tirait seulement ~ 31mA. Et puisque le pilote réel pour les affichages fait directement à partir de la 74LS47 et enable provient d’un autre IC, un rapide couler de la moyenne et de pointe et les fiches techniques respectives... J’ai tiré les résistances au large de la maquette et constaté une différence de 1mA ! Il semble que directement en venant la ligne CA le 4028 tandis que la conduite directement tous les segments est OK ! .. .sort de. :)
J’ai eu un petit problème dans mon code que ne comprenait pas mes registres lorsqu’une touche a été enfoncée, provoquant l’affichage dernier d’avoir 2 segments très brillamment allumé quand un bouton a été activé. C’était mauvais. Cependant, le registre de compensation fixe ce problème et contrôles de puissance continue de confirmer que c’est constamment autour de 30mA tirage au sort. Cela devrait me donner (basé sur l’expérience acquise avec des circuits similaires) ~ 20 hrs d’exécution à l’aide de 1 pile 9V (500mAH/30mAH sous 5V Règlement)... J'espère!
J’ai décidé de garder les LED directement entraîné, mais mettez-les dans prises dans le cas où quelque chose s’est passé, à long terme.