- 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
J'ai fais un tableau, en le déclarant org 0x300
mis la ligne addwf PCL,f
chargé PCLATH avec 0x03 dans la partie innitialisations
et ca fonctionne
Code : Tout sélectionner
org 0x0300
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0 63
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
Code : Tout sélectionner
movlw 0x03
movwf PCLATH
J'attaque la partie timer puis je prendrai ta trame
Jean-Marc trop content
Je reconnais que sans le débuguer je n'y serai pas arrivé.
J'ai réduis le fichier source comme tu me la conseillé, viré les routines eeprom et compagnie. je sais que l'on peut réduire encore
J'ai compris mes pics hs, il y a 16F877 pour l'ancien et les nouveaux que j'ai commandé 16F877A, c'est écrit tellement petit j'ai changé dans MPLAB et cela fonctionne.
Maintenant je suis preneur pour des idées de rajout de fonction de cette base de programme pour me forcer a réfléchir; heu mollo dans les demandes, faut resté a mon niveau débutant
Code : Tout sélectionner
;*****************************************************************************
; *
; Compteur pour 4 afficheurs 7 segments *
;*****************************************************************************
; *
; NOM: JMarc *
; Date: 20/9/2016 *
; Version: 1 *
; Circuit: *
; Auteur: Bigonoff pour la base *
; tavernier pour le prog et modifié par JMarc *
;*****************************************************************************
; *
; Fichier requis: P16F877.inc *
; *
; *
; *
;*****************************************************************************
; *
; Notes: Les segments des afficheurs sont commandés par les huit lignes *
; du port B et le port A commande les cathodes communes des
; afficheurs *
; *
; *
; *
;*****************************************************************************
LIST p=16F877A ; Définition de processeur
#include <p16F877.inc> ; fichier include
radix dec ; on travaille en décimal par défaut
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
; '__CONFIG' précise les paramètres encodés dans le processeur au moment de
; la programmation. Les définitions sont dans le fichier include.
; Choisir une valeur par groupe.
; Voici les valeurs et leurs définitions :
; Protection du programme
; -----------------------
;_CP_ALL protection totale
;_CP_HALF protection de 1000 à 1FFF
;_CP_UPPER_256 protection de 1F00 à 1FFF
;_CP_OFF Pas de protection
; Debuggage
; ---------
;_DEBUG_ON RB6 et RB7 utilisées pour debugger
;_DEBUG_OFF RB6 et RB7 en utilisation normale
; Accès à la flash programme
; --------------------------
;_WRT_ENABLE_ON Le programme peut écrire dans la flash
;_WRT_ENABLE_OFF Le programme ne peut pas écrire dans la flash
; Protection de la EEprom
; -----------------------
;_CPD_ON Mémoire EEprom protégée
;_CPD_OFF Mémoire EEprom déprotégée
; Programmation sur circuit
; -------------------------
;_LVP_ON RB3 permet la programmation série de la PIC
;_LVP_OFF RB3 en utilisation normale
; Reset de la PIC si tension <4V
; ------------------------------
; _BODEN_ON Reset tension en service
; Valide PWRTE_ON automatiquement
; _BODEN_OFF Reset tension hors service
; Retard à la mise sous tension
; -----------------------------
;_PWRTE_OFF Démarrage rapide
;_PWRTE_ON Démarrage temporisé
; Watchdog
; --------
;_WDT_ON Watchdog en service
;_WDT_OFF Watchdog hors service
; Oscillateur
; -----------
;_LP_OSC Oscillateur basse vitesse (32<F<200Khz)
;_XT_OSC Oscilateur moyenne vitesse (200Khz<F<4Mhz)
;_HS_OSC Oscillateur haute vitesse (4Mhz<F<20Mhz)
;_RC_OSC Oscillateur à réseau RC
;*****************************************************************************
; ASSIGNATIONS SYSTEME *
;*****************************************************************************
; REGISTRE OPTION_REG (configuration)
; -----------------------------------
OPTIONVAL EQU B'10000000'
; RBPU b7 : 1= Résistance rappel +5V hors service
; INTEDG b6 : 1= Interrupt sur flanc montant de RB0
; 0= Interrupt sur flanc descend. de RB0
; TOCS b5 : 1= source clock = transition sur RA4
; 0= horloge interne
; TOSE b4 : 1= Sélection flanc montant RA4(si B5=1)
; 0= Sélection flanc descendant RA4
; PSA b3 : 1= Assignation prédiviseur sur Watchdog
; 0= Assignation prédiviseur sur Tmr0
; PS2/PS0 b2/b0 valeur du prédiviseur
; 000 = 1/1 (watchdog) ou 1/2 (tmr0)
; 001 = 1/2 1/4
; 010 = 1/4 1/8
; 011 = 1/8 1/16
; 100 = 1/16 1/32
; 101 = 1/32 1/64
; 110 = 1/64 1/128
; 111 = 1/128 1/256
; REGISTRE INTCON (contrôle interruptions standard)
; -------------------------------------------------
INTCONVAL EQU B'00100000'
; GIE b7 : masque autorisation générale interrupt
; ne pas mettre ce bit à 1 ici
; sera mis en temps utile
; PEIE b6 : masque autorisation générale périphériques
; T0IE b5 : masque interruption tmr0
; INTE b4 : masque interuption RB0/Int
; RBIE b3 : masque interruption RB4/RB7
; T0IF b2 : flag tmr0
; INTF b1 : flag RB0/Int
; RBIF b0 : flag interruption RB4/RB7
; REGISTRE PIE1 (contrôle interruptions périphériques)
; ----------------------------------------------------
PIE1VAL EQU B'00000000'
; PSPIE b7 : Toujours 0 sur PIC 16F786
; ADIE b6 : masque interrupt convertisseur A/D
; RCIE b5 : masque interrupt réception USART
; TXIE b4 : masque interrupt transmission USART
; SSPIE b3 : masque interrupt port série synchrone
; CCP1IE b2 : masque interrupt CCP1
; TMR2IE b1 : masque interrupt TMR2 = PR2
; TMR1IE b0 : masque interrupt débordement tmr1
; REGISTRE PIE2 (contrôle interruptions particulières)
; ----------------------------------------------------
PIE2VAL EQU B'00000000'
; UNUSED b7 : inutilisé, laisser à 0
; RESERVED b6 : réservé, laisser à 0
; UNUSED b5 : inutilisé, laisser à 0
; EEIE b4 : masque interrupt écriture EEPROM
; BCLIE b3 : masque interrupt collision bus
; UNUSED b2 : inutilisé, laisser à 0
; UNUSED b1 : inutilisé, laisser à 0
; CCP2IE b0 : masque interrupt CCP2
; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
; ------------------------------------
ADCON1VAL EQU B'00000110' ; PORTA en mode digital
; DIRECTION DES PORTS I/O
; -----------------------
DIRPORTA EQU B'00000000' ; Direction PORTA (1=entrée)
DIRPORTB EQU B'00000000' ; Direction PORTB
DIRPORTC EQU B'11111111' ; Direction PORTC
DIRPORTD EQU B'11111111' ; Direction PORTD
DIRPORTE EQU B'00000111' ; Direction PORTE
;*****************************************************************************
MASQUE EQU H'00FF'
;*****************************************************************************
; ASSIGNATIONS DES GLOBALES *
;*****************************************************************************
GLOBAL Count
GLOBAL TempC
GLOBAL MsdTime
GLOBAL LsdTime
UDATA
Count res 1
TempC res 1
MsdTime res 1
LsdTime res 1
;*****************************************************************************
; MACRO *
;*****************************************************************************
BANK0 macro ; passer en banque0
bcf STATUS,RP0
bcf STATUS,RP1
endm
BANK1 macro ; passer en banque1
bsf STATUS,RP0
bcf STATUS,RP1
endm
BANK2 macro ; passer en banque2
bcf STATUS,RP0
bsf STATUS,RP1
endm
BANK3 macro ; passer en banque3
bsf STATUS,RP0
bsf STATUS,RP1
endm
; Sauts inter-pages
; -----------------
GOTOX macro ADRESSE ; saut inter-page
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI ; adresse courante
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
PCLAX macro ADRESSE ; positionne PCLATH pour
; les sauts sans le saut
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
endm
GOTSX macro ADRESSE ; saut inter-page sans
; sélection de PCLATH
local ICI ; adresse courante
local PICI = (ICI & 0x1800) ; page du saut
ICI
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
; Sous-routines inter-pages
; -------------------------
CALLX macro ADRESSE ; call inter-page
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI ; adresse courante
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
local BIT4 = ((ICI+5) & 0x1000) ; voir bit 12
local BIT3 = ((ICI+5) & 0x0800) ; voir bit 11
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
endm
CALLSX macro ADRESSE ; sous-routine inter-page sans
; sélection de PCLATH
local ICI ; adresse courante
local PICI = (ICI & 0x1800) ; page du saut
ICI
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
; Sous-routines eeprom
; --------------------
REEPROM macro ; lire eeprom(adresse & résultat en w)
clrwdt ; reset watchdog
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEADR ; pointer sur adresse eeprom
bsf STATUS,RP0 ; passer en banque3
bcf EECON1,EEPGD ; pointer sur eeprom
bsf EECON1,RD ; ordre de lecture
bcf STATUS,RP0 ; passer en banque2
movf EEDATA,w ; charger valeur lue
bcf STATUS,RP1 ; passer en banque0
endm
WEEPROM macro addwrite ; la donnée se trouve dans W
LOCAL loop
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEDATA ; placer data dans registre
movlw addwrite ; charger adresse d'écriture
movwf EEADR ; placer dans registre
bsf STATUS,RP0 ; passer en banque3
bcf EECON1 , EEPGD ; pointer sur mémoire data
bsf EECON1 , WREN ; autoriser accès écriture
bcf INTCON , GIE ; interdire interruptions
movlw 0x55 ; charger 0x55
movwf EECON2 ; envoyer commande
movlw 0xAA ; charger 0xAA
movwf EECON2 ; envoyer commande
bsf EECON1 , WR ; lancer cycle d'écriture
bsf INTCON , GIE ; réautoriser interruptions
loop
clrwdt ; effacer watchdog
btfsc EECON1 , WR ; tester si écriture terminée
goto loop ; non, attendre
bcf EECON1 , WREN ; verrouiller prochaine écriture
bcf STATUS , RP0 ; passer en banque0
bcf STATUS , RP1
endm
;*****************************************************************************
; VARIABLES BANQUE 0 *
;*****************************************************************************
; Zone de 80 bytes
; ----------------
CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F)
ENDC ; Fin de la zone
var1 EQU H'006E' ; adresse imposée
;*****************************************************************************
; VARIABLES ZONE COMMUNE *
;*****************************************************************************
; Zone de 16 bytes
; ----------------
CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
ENDC
;*****************************************************************************
; VARIABLES BANQUE 3 *
;*****************************************************************************
; Zone de 96 bytes
; ----------------
CBLOCK 0x190 ; Début de la zone (0x190 à 0x1EF)
ENDC ; Fin de la zone
;*****************************************************************************
; DEMARRAGE SUR RESET *
;*****************************************************************************
org 0x000 ; Adresse de départ après reset
clrf PCLATH ; Effacer sélecteur de pages
goto init ; Initialiser
; ////////////////////////////////////////////////////////////////////////////
; I N T E R R U P T I O N S
; ////////////////////////////////////////////////////////////////////////////
;*****************************************************************************
; ROUTINE INTERRUPTION *
;*****************************************************************************
;-----------------------------------------------------------------------------
; Si on n'utilise pas l'adressage indirect dans les interrupts, on se passera
; de sauvegarder FSR
; Si le programme ne fait pas plus de 2K, on se passera de la gestion de
; PCLATH
;-----------------------------------------------------------------------------
;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR
movf PCLATH , w ; charger PCLATH
movwf PCLATH_temp ; le sauver
clrf PCLATH ; on est en page 0
BANK0 ; passer en banque0
; switch vers différentes interrupts
; inverser ordre pour modifier priorités
; mais attention alors au test PEIE
; effacer les inutiles
;----------------------------------------
; Interruption TMR0
; -----------------
btfsc INTCON,T0IE ; tester si interrupt timer autorisée
btfss INTCON,T0IF ; oui, tester si interrupt timer en cours
; goto intsw1 ; non test suivant
goto restorereg ; fin des test d'interruption modifié par JM
call inttmr0 ; oui, traiter interrupt tmr0
bcf INTCON,T0IF ; effacer flag interrupt tmr0
goto restorereg ; et fin d'interruption
; SUPPRIMER CETTE LIGNE POUR
; TRAITER PLUSIEURS INTERRUPT
; EN 1 SEULE FOIS
; --------------------
;restaurer registres
;-------------------
restorereg
movf PCLATH_temp , w ; recharger ancien PCLATH
movwf PCLATH ; le restaurer
movf FSR_temp , w ; charger FSR sauvé
movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie ; return from interrupt
;*****************************************************************************
; INTERRUPTION TIMER 0 *
;*****************************************************************************
inttmr0
goto ServiceRTCC
return ; fin d'interruption timer
; peut être remplacé par
; retlw pour retour code d'erreur
; ////////////////////////////////////////////////////////////////////////////
; P R O G R A M M E
; ////////////////////////////////////////////////////////////////////////////
;*****************************************************************************
; INITIALISATIONS *
;*****************************************************************************
init
; initialisation PORTS (banque 0 et 1)
; ------------------------------------
BANK0 ; sélectionner banque0
clrf PORTA ; Sorties PORTA à 0
clrf PORTB ; sorties PORTB à 0
clrf PORTC ; sorties PORTC à 0
clrf PORTD ; sorties PORTD à 0
clrf PORTE ; sorties PORTE à 0
bsf STATUS,RP0 ; passer en banque1
movlw ADCON1VAL ; PORTA en mode digital/analogique
movwf ADCON1 ; écriture dans contrôle A/D
movlw DIRPORTA ; Direction PORTA
movwf TRISA ; écriture dans registre direction
movlw DIRPORTB ; Direction PORTB
movwf TRISB ; écriture dans registre direction
movlw DIRPORTC ; Direction PORTC
movwf TRISC ; écriture dans registre direction
movlw DIRPORTD ; Direction PORTD
movwf TRISD ; écriture dans registre direction
movlw DIRPORTE ; Direction PORTE
movwf TRISE ; écriture dans registre direction
; Registre d'options (banque 1)
; -----------------------------
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; registres interruptions (banque 1)
; ----------------------------------
movlw INTCONVAL ; charger valeur registre interruption
movwf INTCON ; initialiser interruptions
movlw PIE1VAL ; Initialiser registre
movwf PIE1 ; interruptions périphériques 1
movlw PIE2VAL ; initialiser registre
movwf PIE2 ; interruptions périphériques 2
; Effacer RAM banque 0
; ---------------------
bcf STATUS,RP0 ; sélectionner banque 0
movlw 0x20 ; initialisation pointeur
movwf FSR ; d'adressage indirect
init1
clrf INDF ; effacer ram
incf FSR,f ; pointer sur suivant
btfss FSR,7 ; tester si fin zone atteinte (>7F)
goto init1 ; non, boucler
; autoriser interruptions (banque 0)
; ----------------------------------
clrf PIR1 ; effacer flags 1
clrf PIR2 ; effacer flags 2
bsf INTCON,GIE ; valider interruptions
BANK0
clrf PORTA
clrf PORTB
bsf PORTA,3
clrf MsdTime ; raz timers J'ai modifié ici
clrf LsdTime ; /
movlw .93 ; pr?chargement RTCC
movwf TMR0 ;RTCC ; d?part comptage
goto start ; programme principal
;*****************************************************************************
; PROGRAMME PRINCIPAL *
;*****************************************************************************
ServiceRTCC
bcf INTCON,T0IF ; raz drapeau d'it Bit2
movlw 0x03 ; charge 0x03 pour le tableau
movwf PCLATH
call IncTimer ; incr?mentation timer
call UpdateDisplay ; mise ? jour affichage
retfie
;L'affichage est augment? de un toutes les 200 x 5 ms
IncTimer
incf Count,w ; incr?mentation de count
xorlw .200 ; = 200?
btfsc STATUS,Z ; non, alors saut (z=0 alors saut)
goto DoIncTime ; oui, incr?mentation de time
incf Count
return
DoIncTime
clrf Count ; raz de count
incf LsdTime,w ; lecture Lsd
andlw 0x0F ; masque quartet haut
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
goto IncSecondLsd ; incr?mentation Lsd suivant
incf LsdTime ; incr?mentation timer
return
IncSecondLsd
swapf LsdTime,w
andlw 0x0F ; masque quartet haut
addlw 1 ; incr?mentation
movwf LsdTime
swapf LsdTime
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
goto IncThirdLsd ; incr?mentation Lsd suivant
return
IncThirdLsd
clrf LsdTime
incf MsdTime,w ; lecture 3?me Lsd
andlw 0x0F ; masque quartet haut
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
goto IncMsd ; oui alors Msd
incf MsdTime ; incr?mentation timer
return
IncMsd
swapf MsdTime,w
andlw 0x0F ; masque quartet haut
addlw 1 ; incr?mentation timer
movwf MsdTime
swapf MsdTime
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
clrf MsdTime ; raz Msd
return
UpdateDisplay
movf PORTA,w
clrf PORTA ; Invalidation tous chiffres
andlw 0x0f
movwf TempC ; Sauvegarde nø de chiffre ds tempC
bsf TempC,4 ; Pr?paration validation Lsd
rrf TempC ; Determine chiffre suivant
btfss STATUS,C ; c=1? alors saut
bcf TempC,3 ; non alors raz Lsd
btfsc TempC,0 ; si 0 alors saut
goto UpdateMsd
btfsc TempC,1
goto Update3rdLsd
btfsc TempC,2 ; si 0 alors saut
goto Update2ndLsd
UpdateLsd
movf LsdTime,w ; Lecture Lsd dans W
andlw 0x0f ; /
goto DisplayOut ; Validation affichage
Update2ndLsd
call Chk2LsdZero ; Msd = 0 & 2 Lsd 0?
btfss STATUS,Z ; oui alors saut
swapf LsdTime,w ; lecture 2ø Lsd dans W
andlw 0x0f ; masque quartet bas
goto DisplayOut ; validation affichage
Update3rdLsd
call ChkMsdZero ; Msd = 0?
btfss STATUS,Z ; oui alors saut
movf MsdTime,w ; lecture 3ø Lsd dans W
andlw 0x0f ; masque quartet bas
goto DisplayOut ; validation affichage
UpdateMsd
swapf MsdTime,w ; lecture Msd dans W
andlw 0x0f ; masque quartet bas
btfsc STATUS,Z ; Msd != 0 puis saut
movlw 0x0a
DisplayOut
call LedTable ; lecture chiffres
movwf PORTB ; commande des LED
movf TempC,w
movwf PORTA
return
Chk2LsdZero
call ChkMsdZero ; Msd = 0?
btfss STATUS,Z ; oui alors saut
return ; sinon retour
swapf LsdTime,w ; lecture 2ø Lsd
andlw 0x0f ; masque quartet bas
btfss STATUS,Z ; 0? alors saut
return
retlw .10 ; sinon retour avec 10
ChkMsdZero
movf MsdTime,w ; lecture Msd dans W
btfss STATUS,Z ; = 0? alors pas de saut
return ; sinon retour
retlw .10 ; retour avec 10
start
nop
nop
nop
goto start ; boucler
org 0x0300
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0 63
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
END ; directive fin de programme
il y a quelques problèmes mais un notamment et de plus important, c'est le traitement de int du timer0
voici comment se traite cette int
Code : Tout sélectionner
ORG 0x4
MOVWF Sauv ;sauve W
SWAPF STATUS, 0 ;
MOVWF Sauv1 ;sauve status
MOVLW TIMER1L ;oui
MOVWF TMR1L
MOVLW TIMER1H ;on recharge le timer1
MOVWF TMR1H
BCF PIR1,TMR1IF ;RAZ du drapeau de TMR1
INCF Temp,F ; à 10 cela fera 1s
SWAPF Sauv1,0
MOVWF STATUS ;restaure status
SWAPF Sauv, 1
SWAPF Sauv, 0 ;restaure W
RETFIE ; retour int
on ne fait pas appel dans une int de call, le drapeau se traite dans l'int ,si l'on doit faire un test c'est uniquement sur la variable ou les variables ici Temp, dans la boucle principale ou dans une boucle secondaire l'int doit-etre la plus courte possible
voila ce que tu fais c'est pas bon
Code : Tout sélectionner
;*****************************************************************************
; PROGRAMME PRINCIPAL *
;*****************************************************************************
ServiceRTCC
bcf INTCON,T0IF ; raz drapeau d'it Bit2
movlw 0x03 ; charge 0x03 pour le tableau
movwf PCLATH
call IncTimer ; incr?mentation timer
call UpdateDisplay ; mise ? jour affichage
retfie
tu ne fais pas de restauration, de plus tu empiles encore et encore .il y a une limite sur le NB de call imbriqué, c'est 8 c'est un joli cas de plantage et de plus difficile a trouver, car aucune erreur de complilation.
tu ne recharges jamais ton timer0 si une seule fois ici
Code : Tout sélectionner
clrf MsdTime ; raz timers J'ai modifié ici
clrf LsdTime ; /
movlw .93 ; pr?chargement RTCC
movwf TMR0 ;RTCC ; d?part comptage
donc si tu peux revoir cela
allez A+
Code : Tout sélectionner
; Interruption TMR0
; -----------------
btfsc INTCON,T0IE ; tester si interrupt timer autorisée
btfss INTCON,T0IF ; oui, tester si interrupt timer en cours
goto restorereg ; fin des test d'interruption modifié par JM
movlw .96 ; Je recharge mon timer apres l'interuption
movwf TMR0
call IncTimer ; incr?mentation timer
call UpdateDisplay ; mise ? jour affichage
bcf INTCON,T0IF ; effacer flag interrupt tmr0
goto restorereg ; et fin d'interruption
; SUPPRIMER CETTE LIGNE POUR
Les sauvegardes de pclath ? j'ai rajouté une sauvegarde avant la lecture du tableau avec une restoration apres ecriture sur portC (oui j'ai changé de port car je souhaite utilisé portb en entré pour les résistances et aussi les intéruptions
je remet le code entier
Code : Tout sélectionner
;*****************************************************************************
; *
; Compteur pour 4 afficheurs 7 segments *
;*****************************************************************************
; *
; NOM: JMarc *
; Date: 20/9/2016 *
; Version: 1 *
; Circuit: *
; Auteur: Bigonoff pour la base *
; tavernier pour le prog et modifié par JMarc *
;*****************************************************************************
; *
; Fichier requis: P16F877.inc *
; *
; *
; *
;*****************************************************************************
; *
; Notes: Les segments des afficheurs sont commandés par les huit lignes *
; du port C et le port A commande les cathodes communes des
; afficheurs *
; *
; *
; *
;*****************************************************************************
LIST p=16F877A ; Définition de processeur
#include <p16F877.inc> ; fichier include
radix dec ; on travaille en décimal par défaut
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
; '__CONFIG' précise les paramètres encodés dans le processeur au moment de
; la programmation. Les définitions sont dans le fichier include.
; Choisir une valeur par groupe.
; Voici les valeurs et leurs définitions :
; Protection du programme
; -----------------------
;_CP_ALL protection totale
;_CP_HALF protection de 1000 à 1FFF
;_CP_UPPER_256 protection de 1F00 à 1FFF
;_CP_OFF Pas de protection
; Debuggage
; ---------
;_DEBUG_ON RB6 et RB7 utilisées pour debugger
;_DEBUG_OFF RB6 et RB7 en utilisation normale
; Accès à la flash programme
; --------------------------
;_WRT_ENABLE_ON Le programme peut écrire dans la flash
;_WRT_ENABLE_OFF Le programme ne peut pas écrire dans la flash
; Protection de la EEprom
; -----------------------
;_CPD_ON Mémoire EEprom protégée
;_CPD_OFF Mémoire EEprom déprotégée
; Programmation sur circuit
; -------------------------
;_LVP_ON RB3 permet la programmation série de la PIC
;_LVP_OFF RB3 en utilisation normale
; Reset de la PIC si tension <4V
; ------------------------------
; _BODEN_ON Reset tension en service
; Valide PWRTE_ON automatiquement
; _BODEN_OFF Reset tension hors service
; Retard à la mise sous tension
; -----------------------------
;_PWRTE_OFF Démarrage rapide
;_PWRTE_ON Démarrage temporisé
; Watchdog
; --------
;_WDT_ON Watchdog en service
;_WDT_OFF Watchdog hors service
; Oscillateur
; -----------
;_LP_OSC Oscillateur basse vitesse (32<F<200Khz)
;_XT_OSC Oscilateur moyenne vitesse (200Khz<F<4Mhz)
;_HS_OSC Oscillateur haute vitesse (4Mhz<F<20Mhz)
;_RC_OSC Oscillateur à réseau RC
;*****************************************************************************
; ASSIGNATIONS SYSTEME *
;*****************************************************************************
; REGISTRE OPTION_REG (configuration)
; -----------------------------------
OPTIONVAL EQU B'10000000'
; RBPU b7 : 1= Résistance rappel +5V hors service
; INTEDG b6 : 1= Interrupt sur flanc montant de RB0
; 0= Interrupt sur flanc descend. de RB0
; TOCS b5 : 1= source clock = transition sur RA4
; 0= horloge interne
; TOSE b4 : 1= Sélection flanc montant RA4(si B5=1)
; 0= Sélection flanc descendant RA4
; PSA b3 : 1= Assignation prédiviseur sur Watchdog
; 0= Assignation prédiviseur sur Tmr0
; PS2/PS0 b2/b0 valeur du prédiviseur
; 000 = 1/1 (watchdog) ou 1/2 (tmr0)
; 001 = 1/2 1/4
; 010 = 1/4 1/8
; 011 = 1/8 1/16
; 100 = 1/16 1/32
; 101 = 1/32 1/64
; 110 = 1/64 1/128
; 111 = 1/128 1/256
; REGISTRE INTCON (contrôle interruptions standard)
; -------------------------------------------------
INTCONVAL EQU B'00100000'
; GIE b7 : masque autorisation générale interrupt
; ne pas mettre ce bit à 1 ici
; sera mis en temps utile
; PEIE b6 : masque autorisation générale périphériques
; T0IE b5 : masque interruption tmr0
; INTE b4 : masque interuption RB0/Int
; RBIE b3 : masque interruption RB4/RB7
; T0IF b2 : flag tmr0
; INTF b1 : flag RB0/Int
; RBIF b0 : flag interruption RB4/RB7
; REGISTRE PIE1 (contrôle interruptions périphériques)
; ----------------------------------------------------
PIE1VAL EQU B'00000000'
; PSPIE b7 : Toujours 0 sur PIC 16F786
; ADIE b6 : masque interrupt convertisseur A/D
; RCIE b5 : masque interrupt réception USART
; TXIE b4 : masque interrupt transmission USART
; SSPIE b3 : masque interrupt port série synchrone
; CCP1IE b2 : masque interrupt CCP1
; TMR2IE b1 : masque interrupt TMR2 = PR2
; TMR1IE b0 : masque interrupt débordement tmr1
; REGISTRE PIE2 (contrôle interruptions particulières)
; ----------------------------------------------------
PIE2VAL EQU B'00000000'
; UNUSED b7 : inutilisé, laisser à 0
; RESERVED b6 : réservé, laisser à 0
; UNUSED b5 : inutilisé, laisser à 0
; EEIE b4 : masque interrupt écriture EEPROM
; BCLIE b3 : masque interrupt collision bus
; UNUSED b2 : inutilisé, laisser à 0
; UNUSED b1 : inutilisé, laisser à 0
; CCP2IE b0 : masque interrupt CCP2
; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
; ------------------------------------
ADCON1VAL EQU B'00000110' ; PORTA en mode digital
; DIRECTION DES PORTS I/O
; -----------------------
DIRPORTA EQU B'00000000' ; Direction PORTA (1=entrée)
DIRPORTB EQU B'00000000' ; Direction PORTB
DIRPORTC EQU B'00000000' ; Direction PORTC
DIRPORTD EQU B'11111111' ; Direction PORTD
DIRPORTE EQU B'00000111' ; Direction PORTE
;*****************************************************************************
MASQUE EQU H'00FF'
;*****************************************************************************
; ASSIGNATIONS DES GLOBALES *
;*****************************************************************************
GLOBAL Count
GLOBAL TempC
GLOBAL MsdTime
GLOBAL LsdTime
UDATA
Count res 1
TempC res 1
MsdTime res 1
LsdTime res 1
;*****************************************************************************
; MACRO *
;*****************************************************************************
BANK0 macro ; passer en banque0
bcf STATUS,RP0
bcf STATUS,RP1
endm
BANK1 macro ; passer en banque1
bsf STATUS,RP0
bcf STATUS,RP1
endm
BANK2 macro ; passer en banque2
bcf STATUS,RP0
bsf STATUS,RP1
endm
BANK3 macro ; passer en banque3
bsf STATUS,RP0
bsf STATUS,RP1
endm
; Sauts inter-pages
; -----------------
GOTOX macro ADRESSE ; saut inter-page
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI ; adresse courante
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
PCLAX macro ADRESSE ; positionne PCLATH pour
; les sauts sans le saut
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
endm
GOTSX macro ADRESSE ; saut inter-page sans
; sélection de PCLATH
local ICI ; adresse courante
local PICI = (ICI & 0x1800) ; page du saut
ICI
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
; Sous-routines inter-pages
; -------------------------
CALLX macro ADRESSE ; call inter-page
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI ; adresse courante
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
local BIT4 = ((ICI+5) & 0x1000) ; voir bit 12
local BIT3 = ((ICI+5) & 0x0800) ; voir bit 11
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
endm
CALLSX macro ADRESSE ; sous-routine inter-page sans
; sélection de PCLATH
local ICI ; adresse courante
local PICI = (ICI & 0x1800) ; page du saut
ICI
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
; Sous-routines eeprom
; --------------------
REEPROM macro ; lire eeprom(adresse & résultat en w)
clrwdt ; reset watchdog
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEADR ; pointer sur adresse eeprom
bsf STATUS,RP0 ; passer en banque3
bcf EECON1,EEPGD ; pointer sur eeprom
bsf EECON1,RD ; ordre de lecture
bcf STATUS,RP0 ; passer en banque2
movf EEDATA,w ; charger valeur lue
bcf STATUS,RP1 ; passer en banque0
endm
WEEPROM macro addwrite ; la donnée se trouve dans W
LOCAL loop
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEDATA ; placer data dans registre
movlw addwrite ; charger adresse d'écriture
movwf EEADR ; placer dans registre
bsf STATUS,RP0 ; passer en banque3
bcf EECON1 , EEPGD ; pointer sur mémoire data
bsf EECON1 , WREN ; autoriser accès écriture
bcf INTCON , GIE ; interdire interruptions
movlw 0x55 ; charger 0x55
movwf EECON2 ; envoyer commande
movlw 0xAA ; charger 0xAA
movwf EECON2 ; envoyer commande
bsf EECON1 , WR ; lancer cycle d'écriture
bsf INTCON , GIE ; réautoriser interruptions
loop
clrwdt ; effacer watchdog
btfsc EECON1 , WR ; tester si écriture terminée
goto loop ; non, attendre
bcf EECON1 , WREN ; verrouiller prochaine écriture
bcf STATUS , RP0 ; passer en banque0
bcf STATUS , RP1
endm
;*****************************************************************************
; VARIABLES BANQUE 0 *
;*****************************************************************************
; Zone de 80 bytes
; ----------------
CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F)
ENDC ; Fin de la zone
var1 EQU H'006E' ; adresse imposée
;*****************************************************************************
; VARIABLES ZONE COMMUNE *
;*****************************************************************************
; Zone de 16 bytes
; ----------------
CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
ENDC
;*****************************************************************************
; VARIABLES BANQUE 3 *
;*****************************************************************************
; Zone de 96 bytes
; ----------------
CBLOCK 0x190 ; Début de la zone (0x190 à 0x1EF)
ENDC ; Fin de la zone
;*****************************************************************************
; DEMARRAGE SUR RESET *
;*****************************************************************************
org 0x000 ; Adresse de départ après reset
clrf PCLATH ; Effacer sélecteur de pages
goto init ; Initialiser
; ////////////////////////////////////////////////////////////////////////////
; I N T E R R U P T I O N S
; ////////////////////////////////////////////////////////////////////////////
;*****************************************************************************
; ROUTINE INTERRUPTION *
;*****************************************************************************
;-----------------------------------------------------------------------------
; Si on n'utilise pas l'adressage indirect dans les interrupts, on se passera
; de sauvegarder FSR
; Si le programme ne fait pas plus de 2K, on se passera de la gestion de
; PCLATH
;-----------------------------------------------------------------------------
;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR
movf PCLATH , w ; charger PCLATH
movwf PCLATH_temp ; le sauver
clrf PCLATH ; on est en page 0
BANK0 ; passer en banque0
; switch vers différentes interrupts
; inverser ordre pour modifier priorités
; mais attention alors au test PEIE
; effacer les inutiles
;----------------------------------------
; Interruption TMR0
; -----------------
btfsc INTCON,T0IE ; tester si interrupt timer autorisée
btfss INTCON,T0IF ; oui, tester si interrupt timer en cours
goto restorereg ; fin des test d'interruption modifié par JM
movlw .96 ; Je recharge mon timer apres l'interuption
movwf TMR0
call IncTimer ; incr?mentation timer
call UpdateDisplay ; mise ? jour affichage
bcf INTCON,T0IF ; effacer flag interrupt tmr0
goto restorereg ; et fin d'interruption
; SUPPRIMER CETTE LIGNE POUR
; TRAITER PLUSIEURS INTERRUPT
; EN 1 SEULE FOIS
; --------------------
;restaurer registres
;-------------------
restorereg
movf PCLATH_temp , w ; recharger ancien PCLATH
movwf PCLATH ; le restaurer
movf FSR_temp , w ; charger FSR sauvé
movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie ; return from interrupt
;*****************************************************************************
; INTERRUPTION TIMER 0 *
;*****************************************************************************
inttmr0
goto ServiceRTCC
return ; fin d'interruption timer
; peut être remplacé par
; retlw pour retour code d'erreur
; ////////////////////////////////////////////////////////////////////////////
; P R O G R A M M E
; ////////////////////////////////////////////////////////////////////////////
;*****************************************************************************
; INITIALISATIONS *
;*****************************************************************************
init
; initialisation PORTS (banque 0 et 1)
; ------------------------------------
BANK0 ; sélectionner banque0
clrf PORTA ; Sorties PORTA à 0
clrf PORTB ; sorties PORTB à 0
clrf PORTC ; sorties PORTC à 0
clrf PORTD ; sorties PORTD à 0
clrf PORTE ; sorties PORTE à 0
bsf STATUS,RP0 ; passer en banque1
movlw ADCON1VAL ; PORTA en mode digital/analogique
movwf ADCON1 ; écriture dans contrôle A/D
movlw DIRPORTA ; Direction PORTA
movwf TRISA ; écriture dans registre direction
movlw DIRPORTB ; Direction PORTB
movwf TRISB ; écriture dans registre direction
movlw DIRPORTC ; Direction PORTC
movwf TRISC ; écriture dans registre direction
movlw DIRPORTD ; Direction PORTD
movwf TRISD ; écriture dans registre direction
movlw DIRPORTE ; Direction PORTE
movwf TRISE ; écriture dans registre direction
; Registre d'options (banque 1)
; -----------------------------
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; registres interruptions (banque 1)
; ----------------------------------
movlw INTCONVAL ; charger valeur registre interruption
movwf INTCON ; initialiser interruptions
movlw PIE1VAL ; Initialiser registre
movwf PIE1 ; interruptions périphériques 1
movlw PIE2VAL ; initialiser registre
movwf PIE2 ; interruptions périphériques 2
; Effacer RAM banque 0
; ---------------------
bcf STATUS,RP0 ; sélectionner banque 0
movlw 0x20 ; initialisation pointeur
movwf FSR ; d'adressage indirect
init1
clrf INDF ; effacer ram
incf FSR,f ; pointer sur suivant
btfss FSR,7 ; tester si fin zone atteinte (>7F)
goto init1 ; non, boucler
; autoriser interruptions (banque 0)
; ----------------------------------
clrf PIR1 ; effacer flags 1
clrf PIR2 ; effacer flags 2
bsf INTCON,GIE ; valider interruptions
BANK0
clrf PORTA
clrf PORTB
clrf PORTC
bsf PORTA,3
clrf MsdTime ; raz timers J'ai modifié ici
clrf LsdTime ; /
movlw .93 ; pr?chargement RTCC
movwf TMR0 ;RTCC ; d?part comptage
goto start ; programme principal
;*****************************************************************************
; PROGRAMME PRINCIPAL *
;*****************************************************************************
ServiceRTCC
retfie
;L'affichage est augment? de un toutes les 200 x 5 ms
IncTimer
incf Count,w ; incr?mentation de count
xorlw .200 ; = 200?
btfsc STATUS,Z ; non, alors saut (z=0 alors saut)
goto DoIncTime ; oui, incr?mentation de time
incf Count
return
DoIncTime
clrf Count ; raz de count
incf LsdTime,w ; lecture Lsd
andlw 0x0F ; masque quartet haut
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
goto IncSecondLsd ; incr?mentation Lsd suivant
incf LsdTime ; incr?mentation timer
return
IncSecondLsd
swapf LsdTime,w
andlw 0x0F ; masque quartet haut
addlw 1 ; incr?mentation
movwf LsdTime
swapf LsdTime
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
goto IncThirdLsd ; incr?mentation Lsd suivant
return
IncThirdLsd
clrf LsdTime
incf MsdTime,w ; lecture 3?me Lsd
andlw 0x0F ; masque quartet haut
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
goto IncMsd ; oui alors Msd
incf MsdTime ; incr?mentation timer
return
IncMsd
swapf MsdTime,w
andlw 0x0F ; masque quartet haut
addlw 1 ; incr?mentation timer
movwf MsdTime
swapf MsdTime
xorlw 0x0a ; = 10?
btfsc STATUS,Z ; non alors saut
clrf MsdTime ; raz Msd
return
UpdateDisplay
movf PCLATH , w ; charger PCLATH
movwf PCLATH_temp ; le sauver
movlw 0x03 ; charge 0x03 pour le tableau
movwf PCLATH
movf PORTA,w
clrf PORTA ; Invalidation tous chiffres
andlw 0x0f
movwf TempC ; Sauvegarde nø de chiffre ds tempC
bsf TempC,4 ; Pr?paration validation Lsd
rrf TempC ; Determine chiffre suivant
btfss STATUS,C ; c=1? alors saut
bcf TempC,3 ; non alors raz Lsd
btfsc TempC,0 ; si 0 alors saut
goto UpdateMsd
btfsc TempC,1
goto Update3rdLsd
btfsc TempC,2 ; si 0 alors saut
goto Update2ndLsd
UpdateLsd
movf LsdTime,w ; Lecture Lsd dans W
andlw 0x0f ; /
goto DisplayOut ; Validation affichage
Update2ndLsd
call Chk2LsdZero ; Msd = 0 & 2 Lsd 0?
btfss STATUS,Z ; oui alors saut
swapf LsdTime,w ; lecture 2ø Lsd dans W
andlw 0x0f ; masque quartet bas
goto DisplayOut ; validation affichage
Update3rdLsd
call ChkMsdZero ; Msd = 0?
btfss STATUS,Z ; oui alors saut
movf MsdTime,w ; lecture 3ø Lsd dans W
andlw 0x0f ; masque quartet bas
goto DisplayOut ; validation affichage
UpdateMsd
swapf MsdTime,w ; lecture Msd dans W
andlw 0x0f ; masque quartet bas
btfsc STATUS,Z ; Msd != 0 puis saut
movlw 0x0a
DisplayOut
call LedTable ; lecture chiffres
movwf PORTC ; commande des LED
movf TempC,w
movwf PORTA
movf PCLATH_temp , w ; recharger ancien PCLATH
movwf PCLATH ; le restaurer
return
Chk2LsdZero
call ChkMsdZero ; Msd = 0?
btfss STATUS,Z ; oui alors saut
return ; sinon retour
swapf LsdTime,w ; lecture 2ø Lsd
andlw 0x0f ; masque quartet bas
btfss STATUS,Z ; 0? alors saut
return
retlw .10 ; sinon retour avec 10
ChkMsdZero
movf MsdTime,w ; lecture Msd dans W
btfss STATUS,Z ; = 0? alors pas de saut
return ; sinon retour
retlw .10 ; retour avec 10
start
nop
nop
nop
goto start ; boucler
org 0x0300
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0 63
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
END ; directive fin de programme
Tient regarde ultra court, c'est le timer1 peu importe pas mis l'affichage tu peux prendre le tient, pas encore bien regarde le code .
Cela compte de 0 a 59s le digit unite c'est ComptSu, le digits dizaine c'est CompSd.
cela compli sans problème, plus vite et plus rapide et de plus super précis precision celle du quartz
Code : Tout sélectionner
;*******************************************************************
;
;********************************************************************
; Note:PIC 16F877_04
;********************************************************************
ERRORLEVEL-302
list p=16f877 ;liste directive du 16F877
#include "p16f877.inc"
; CONFIG
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;*********************** Déclarations des définitions ***************
;*********************** Assignations *******************************
DRAM EQU 0x20 ;début Mémoire Ram banque0
FRAM EQU 0X7F ;fin Mémoire Ram banque0
QUARTZ EQU .20 ;Valeur du quartz en MHz
DIVISEUR1 equ .8 ;ici 8 du TMR
TEMPS EQU .100000 ;Valeur en µs
TIMER1 EQU .65535-((QUARTZ*TEMPS)/(.4*DIVISEUR1)-2);les-2 pour temps chargement timer1
TIMER1L EQU LOW TIMER1 ;valeur
TIMER1H EQU HIGH TIMER1 ;pour 100 ms qu'il faudra incorporer dans le timer 1
;*********************** Définitions variables en RAM PAGE0 *********
CBLOCK 0x20
Sauv,Sauv1,Temp
ComptSu
ComptSd
ENDC
;*********************** Macro **************************************
Banque0 MACRO
BCF STATUS,RP0 ;Acces bank0
BCF STATUS,RP1
ENDM
Banque1 MACRO
BSF STATUS,RP0 ;Acces bank1
BCF STATUS,RP1
ENDM
Banque2 MACRO
BCF STATUS,RP0 ;acces bank2
BSF STATUS,RP1
ENDM
Banque3 MACRO
BSF STATUS,RP0 ;Acces bank4
BSF STATUS,RP1
ENDM
;********************************************************************
ORG 0x00
GOTO Principale
;****************** Gestion des interruptions ***********************
ORG 0x04
MOVWF Sauv ;sauve W
SWAPF STATUS, 0 ;
MOVWF Sauv1 ;sauve status
MOVLW TIMER1L ;oui
MOVWF TMR1L
MOVLW TIMER1H ;on recharge le timer1
MOVWF TMR1H
BCF PIR1,TMR1IF ;RAZ du drapeau de TMR1
INCF Temp,F ; à 10 cela fera 1s
SWAPF Sauv1,0
MOVWF STATUS ;restaure status
SWAPF Sauv, 1
SWAPF Sauv, 0 ;restaure W
RETFIE ; retour int
;*******************************************************************
; Début du Programme
;*******************************************************************
Principale
;*********************** Mise a zéro de la mémoire RAM banque0 ******
MOVLW DRAM
MOVWF FSR
Effa CLRF INDF
INCF FSR,F ;RAZ RAM
BTFSS FSR,7
GOTO Effa
;*********************** Initialisation des ports *******************
CLRF PORTA
CLRF PORTB
Banque1 ;accés bank1
CLRF TRISA ;PortA en sortie
CLRF TRISB ;Broches RB0 à RB7 en sortie
MOVLW B'00000110' ;PORTA digitale
MOVWF ADCON1 ;
;*********************** validation des INT ************************
BSF INTCON,GIE ;validation des INT
BSF INTCON,PEIE
BSF PIE1,TMR1IE ;valide le TMR1
Banque0
;******************* Initialisation des timers/compteurs *************
; ici on va travailler avec le TIMER1
;*********************************************************************
MOVLW (0)|(0)|(1<<T1CKPS1)|(1<<T1CKPS0)|(0<<T1OSCEN)|(0<<T1SYNC)|(0<<TMR1CS)|(0<<TMR1ON)
MOVWF T1CON
MOVLW TIMER1H ;on charge le TIMER1
MOVWF TMR1H
MOVLW TIMER1L ;voir son calcul dans
MOVWF TMR1L ;assignation
BSF T1CON,TMR1ON ;marche TMR1
;********************** Boucle principale *************************************
BouP1 CALL AFFICHE ;afficheur 7 segments
BouP MOVLW 0X0A ;on test si 10fois 100mS
SUBWF Temp,W
BTFSS STATUS,Z
GOTO BouP ;NON on retourne dans la boucle P
INCF ComptSu ; oui compteur seconde +1
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptSu,W
BTFSS STATUS,C
GOTO Compt
INCF ComptSd
CLRF ComptSu
Compt MOVLW 0X06 ;ici on test si compteur =60S
SUBWF ComptSd,W
BTFSS STATUS,Z
GOTO BouP1 ; NON on retourne dans boucle P
CLRF ComptSu ;RAZ du compteur
CLRF ComptSd
GOTO BouP1
;*********************** AFFICHAGE des SECONDES *******************************
;poids fort ComptSd ;poid faible ComptSu
;******************************************************************************
AFFICHE
RETURN
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
;*********************** Allez c'est partie *************************
END
Doit même, rentré sur une page, pas besoin de : 0RG 0X300, ce qui pour un code aussi simple n'est pas normal de faire appel ?????? en sommes que du bonheur
A+
Tout comme la gestion des entrées sorties, ludique leurs façon de faire .Mais bien plus rapide la mienne si le port est en sortie un simple CLRF TRISX suffit plus court et rapide.
la finale
Code : Tout sélectionner
*******************************************************************
;
;********************************************************************
; Note:PIC 16F876A_04
;********************************************************************
ERRORLEVEL-302
list p=16f877 ;liste directive du 16F876a
#include "p16f877.inc"
; CONFIG
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;*********************** Déclarations des définitions ***************
;*********************** Assignations *******************************
DRAM EQU 0x20 ;début Mémoire Ram banque0
FRAM EQU 0X7F ;fin Mémoire Ram banque0
QUARTZ EQU .20 ;Valeur du quartz en MHz
DIVISEUR1 equ .8 ;ici 8 du TMR
TEMPS EQU .100000 ;Valeur en µs
TIMER1 EQU .65535-((QUARTZ*TEMPS)/(.4*DIVISEUR1)-2);les-2 pour temps chargement timer1
TIMER1L EQU LOW TIMER1 ;valeur
TIMER1H EQU HIGH TIMER1 ;pour 100 ms qu'il faudra incorporer dans le timer 1
;*********************** Définitions variables en RAM PAGE0 *********
CBLOCK 0x20
Sauv,Sauv1,Temp
ComptSu
ComptSd
ENDC
;*********************** Macro **************************************
Banque0 MACRO
BCF STATUS,RP0 ;Acces bank0
BCF STATUS,RP1
ENDM
Banque1 MACRO
BSF STATUS,RP0 ;Acces bank1
BCF STATUS,RP1
ENDM
Banque2 MACRO
BCF STATUS,RP0 ;acces bank2
BSF STATUS,RP1
ENDM
Banque3 MACRO
BSF STATUS,RP0 ;Acces bank4
BSF STATUS,RP1
ENDM
;********************************************************************
ORG 0x00
GOTO Principale
;****************** Gestion des interruptions ***********************
ORG 0x04
MOVWF Sauv ;sauve W
SWAPF STATUS, 0 ;
MOVWF Sauv1 ;sauve status
MOVLW TIMER1L ;oui
MOVWF TMR1L
MOVLW TIMER1H ;on recharge le timer1
MOVWF TMR1H
BCF PIR1,TMR1IF ;RAZ du drapeau de TMR1
INCF Temp,F ; à 10 cela fera 1s
SWAPF Sauv1,0
MOVWF STATUS ;restaure status
SWAPF Sauv, 1
SWAPF Sauv, 0 ;restaure W
RETFIE ; retour int
;*******************************************************************
; Début du Programme
;*******************************************************************
Principale
;*********************** Mise a zéro de la mémoire RAM banque0 ******
MOVLW DRAM
MOVWF FSR
Effa CLRF INDF
INCF FSR,F ;RAZ RAM
BTFSS FSR,7
GOTO Effa
;*********************** Initialisation des ports *******************
CLRF PORTA
CLRF PORTB
CLRF PORTC
Banque1 ;accés bank1
CLRF TRISA ;PortA en sortie
CLRF TRISB ;Broches RB0:RB7 en sortie
CLRF TRISC ;Broches RC0:RC7 en sortie
MOVLW B'00000110' ;PORTA digitale
MOVWF ADCON1 ;
;*********************** validation des INT ************************
BSF INTCON,GIE ;validation des INT
BSF INTCON,PEIE
BSF PIE1,TMR1IE ;valide le TMR1
Banque0
;******************* Initialisation des timers/compteurs *************
; ici on va travailler avec le TIMER1
;*********************************************************************
MOVLW (0)|(0)|(1<<T1CKPS1)|(1<<T1CKPS0)|(0<<T1OSCEN)|(0<<T1SYNC)|(0<<TMR1CS)|(0<<TMR1ON)
MOVWF T1CON
MOVLW TIMER1H ;on charge le TIMER1
MOVWF TMR1H
MOVLW TIMER1L ;voir son calcul dans
MOVWF TMR1L ;assignation
BSF T1CON,TMR1ON ;arrêt TMR1
;********************** Boucle principale *************************************
AFFI
MOVFW ComptSu
CALL LedTable
MOVWF PORTB
MOVFW ComptSd
CALL LedTable
MOVWF PORTC
BouP MOVLW 0X0A ;on test si 10fois 100mS
SUBWF Temp,W
BTFSS STATUS,Z
GOTO BouP ;NON on retourne dans la boucle P
INCF ComptSu ; oui compteur seconde +1
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptSu,W
BTFSS STATUS,C
GOTO Compt
INCF ComptSd
CLRF ComptSu
Compt MOVLW 0X06 ;ici on test si compteur =60S
SUBWF ComptSd,W
BTFSS STATUS,Z
GOTO AFFI ; NON on retourne dans boucle P
CLRF ComptSu ;RAZ du compteur
CLRF ComptSd
GOTO AFFI
;*********************** AFFICHAGE des SECONDES *******************************
;poids fort ComptSd ;poid faible ComptSu
;******************************************************************************
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
;*********************** Allez c'est partie *************************
END
Bonne soirée
A+
Code : Tout sélectionner
make[2]: Leaving directory 'C:/jmp/pic/fantaspicmai/afficheur/fantaspicmai.X'
nbproject/Makefile-default.mk:84: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/jmp/pic/fantaspicmai/afficheur/fantaspicmai.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
BUILD FAILED (exit value 2, total time: 1s)
si erreur ici peut-être
Code : Tout sélectionner
ERRORLEVEL-302
list p=16f877 ;liste directive du 16F877
#include "p16f877.inc"
; CONFIG
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
je suis sous un 16F877 avec un quartz 20MHz
A+
PS donne moi tout de la construction comme ici le résultat de mon exemple
Code : Tout sélectionner
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory '/home/moi/MPLABXProjects/16_ASM/TEST_16A.X'
make -f nbproject/Makefile-default.mk dist/default/debug/TEST_16A.X.debug.cof
make[2]: Entering directory '/home/moi/MPLABXProjects/16_ASM/TEST_16A.X'
"/opt/microchip/mplabx/v3.26/mpasmx/mpasmx" -d__DEBUG -d__MPLAB_DEBUGGER_SIMULATOR=1 -q -p16f877 -u -l\"build/default/debug/7segments.lst\" -e\"build/default/debug/7segments.err\" -o\"build/default/debug/7segments.o\" \"7segments.asm\"
Message[305] /home/moi/MPLABXProjects/16_ASM/TEST_16A.X/7segments.asm 155 : Using default destination of 1 (file).
Message[305] /home/moi/MPLABXProjects/16_ASM/TEST_16A.X/7segments.asm 162 : Using default destination of 1 (file).
"/opt/microchip/mplabx/v3.26/mpasmx/mplink" -p16f877 -w -x -u_DEBUG -z__ICD2RAM=1 -m"dist/default/debug/TEST_16A.X.debug.map" -z__MPLAB_BUILD=1 -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_SIMULATOR=1 -odist/default/debug/TEST_16A.X.debug.cof build/default/debug/7segments.o
MPLINK 5.08, LINKER
Device Database Version 1.29
Copyright (c) 1998-2011 Microchip Technology Inc.
Errors : 0
make[2]: Leaving directory '/home/moi/MPLABXProjects/16_ASM/TEST_16A.X'
make[1]: Leaving directory '/home/moi/MPLABXProjects/16_ASM/TEST_16A.X'
BUILD SUCCESSFUL (total time: 706ms)
Loading symbols from /home/moi/MPLABXProjects/16_ASM/TEST_16A.X/dist/default/debug/TEST_16A.X.debug.cof...
Loading code from /home/moi/MPLABXProjects/16_ASM/TEST_16A.X/dist/default/debug/TEST_16A.X.debug.cof...
Loading completed
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 45 invités