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

debut avec le debuguer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#11 Message par JMarc » mar. 6 sept. 2016 08:07

Bonjour Maï

maï a écrit :Ne fonctionne pas sous 16F84 .


Merci, merci,merci



Ça fonctionne pour le 16f877, trop content.

I/O pins=> ne clignote plus mais je vais finir par trouver



Du coup la suite sera pour du 16f877

Jean-Marc

debut avec le debuguer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#12 Message par Guest » mar. 6 sept. 2016 12:27

Bonjour JMarc

Tres bien le 877 et de plus j'ai :wink:

A+ le plaisir de te lire

debut avec le debuguer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#13 Message par JMarc » mer. 7 sept. 2016 15:04

Bonjour amis du forum


Des nouvelles..... Pas bonne :roll:


J'ai trouvé le problème de l'affichage I/O pins.

Pour passé du 16f84, j'avais juste changé le fichier include pour choisir 16f877.inc. C'était l'erreur

J'ai repris le bon fichier asm du 16f876 du cours, j'ai mis en include le fichier 16f877, dit a mplab que c'était bien un 16f877.

Sous débug c'est parfait, mon voyant I/O pins => ra2 clignote

J'ai envoyé le tout sur pickit3 et échec

"Target dévice ID (0xe20) si valid device Id but does not match the expected device ID (0x9a0) as selected "


voici le nouveau code


Code : Tout sélectionner

;*****************************************************************************
;
                                                                            *
;
    Exercice de migration d'un programme de 16F84 vers le 16F877.           *
;    Clignotement d'
une LED à une fréquence de 1Hz en utilisant les          *
;
    interruptions du timer0.                                                *
;
                                                                            *
;*****************************************************************************
;
                                                                            *
;
    NOM:      Led_tmr0                                                      *
;
    Date:     07/04/2002                                                    *
;
    Version:  1.1                                                           *
;
    Circuit:  platine d'expérimentation                                     *
;    Auteur:   Bigonoff  modifié par JMarc pour fantaspic                                                    *
;                                                                            *
;*****************************************************************************
;                                                                            *
;    Fichier requis: P16F877.inc                                             *
;                                                                            *
;*****************************************************************************

    LIST      p=16F877            ; 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 du processeur. 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'
10000111'
            ; RBPU     b7 : 1= Résistance rappel +5V hors service
            ; PSA      b3 : 0= Assignation prédiviseur sur Tmr0
            ; PS2/PS0   b2/b0 valeur du prédiviseur
            ;           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
            ; T0IE      b5 : masque interruption tmr0

; 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'
00111011'    ; RA2 en sortie
DIRPORTB    EQU    B'
11111111'    ; Direction PORTB
DIRPORTC    EQU    B'
11111111'    ; Direction PORTC

;*****************************************************************************
;                                  DEFINE                                    *
;*****************************************************************************

#DEFINE LED    PORTA,2        ; LED de sortie
#DEFINE LEDMASK    B'
00000100'    ; Masque pour inversion de la LED (RA2)
#DEFINE CMPTVAL    D'
35'        ; valeur de recharge du compteur

;*****************************************************************************
;                             MACRO                                          *
;*****************************************************************************

            ; Changement de banques
            ; ----------------------

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-banques
            ; -------------------

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-banques
            ; ----------------------------

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
    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

            ; opérations en mémoire 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    0x9a0        ; Début de la zone (0x20 à 0x6F)
    cmpt : 1        ; compteur de passage
        ENDC            ; Fin de la zone                        

;*****************************************************************************
;                      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

; ////////////////////////////////////////////////////////////////////////////

;                         I N T E R R U P T I O N S

; ////////////////////////////////////////////////////////////////////////////


;*****************************************************************************
;                      DEMARRAGE SUR RESET                                   *
;*****************************************************************************

    org 0x000         ; Adresse de départ après reset
      goto    init        ; Initialiser

;*****************************************************************************
;                     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
    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

            ; Interruption RB0/INT
            ; --------------------
intsw1
    btfsc    INTCON,INTE    ; tester si interrupt RB0 autorisée
    btfss    INTCON,INTF    ; oui, tester si interrupt RB0 en cours
    goto     intsw2        ; non sauter au test suivant
    call    intrb0        ; oui, traiter interrupt RB0
    bcf    INTCON,INTF    ; effacer flag interupt RB0
    goto    restorereg    ; et fin d'
interruption
                
; SUPPRIMER CETTE LIGNE POUR
                
; TRAITER PLUSIEURS INTERRUPT
                
; EN 1 SEULE FOIS

            
; interruption RB4/RB7
            
; --------------------
intsw2
    btfsc    INTCON
,RBIE    ; tester si interrupt RB4/7 autorisée
    btfss    INTCON
,RBIF    ; oui, tester si interrupt RB4/7 en cours
    goto     intsw3        
; non sauter
    call    intrb4        
; oui, traiter interrupt RB4/7
    bcf    INTCON
,RBIF    ; effacer flag interupt RB4/7
    goto    restorereg    
; et fin d'interrupt

            ; détection interruptions périphériques
            ; le test peut être supprimé si une seule
            ; interrupt est traitée à la fois
            ; --------------------------------------
intsw3
    btfss    INTCON,PEIE    ; tester interruption périphérique autorisée
    goto    restorereg    ; non, fin d'
interruption

            
; Interruption convertisseur A/D
            
; ------------------------------

    bsf    STATUS,RP0    ; sélectionner banque1
    btfss    PIE1
,ADIE    ; tester si interrupt autorisée
    goto     intsw4        
; non sauter
    bcf    STATUS
,RP0    ; oui, sélectionner banque0
    btfss    PIR1
,ADIF    ; tester si interrupt en cours
    goto     intsw4        
; non sauter
    call    intad        
; oui, traiter interrupt
    bcf    PIR1
,ADIF    ; effacer flag interupt 
    goto    restorereg    
; et fin d'interrupt

            ; Interruption réception USART
            ; ----------------------------
intsw4
    bsf    STATUS,RP0    ; sélectionner banque1
    btfss    PIE1,RCIE    ; tester si interrupt autorisée
    goto     intsw5        ; non sauter
    bcf    STATUS,RP0    ; oui, sélectionner banque0
    btfss    PIR1,RCIF    ; oui, tester si interrupt en cours
    goto     intsw5        ; non sauter
    call    intrc        ; oui, traiter interrupt
                ; LE FLAG NE DOIT PAS ETRE REMIS A 0
                ; C'
EST LA LECTURE DE RCREG QUI LE PROVOQUE
    goto    restorereg    
; et fin d'interrupt

            ; Interruption transmission USART
            ; -------------------------------
intsw5
    bsf    STATUS,RP0    ; sélectionner banque1
    btfss    PIE1,TXIE    ; tester si interrupt autorisée
    goto     intsw6        ; non sauter
    bcf    STATUS,RP0    ; oui, sélectionner banque0
    btfss    PIR1,TXIF    ; oui, tester si interrupt en cours
    goto     intsw6        ; non sauter
    call    inttx        ; oui, traiter interrupt
    bcf    PIR1,TXIF    ; effacer flag interupt 
    goto    restorereg    ; et fin d'
interrupt

            
; Interruption SSP
            
; ----------------
intsw6
    bsf    STATUS
,RP0    ; sélectionner banque1
    btfss    PIE1
,SSPIE    ; tester si interrupt autorisée
    goto     intsw7        
; non sauter
    bcf    STATUS
,RP0    ; oui, sélectionner banque0
    btfss    PIR1
,SSPIF    ; oui, tester si interrupt en cours
    goto     intsw7        
; non sauter
    call    intssp        
; oui, traiter interrupt
    bcf    PIR1
,SSPIF    ; effacer flag interupt 
    goto    restorereg    
; et fin d'interrupt

            ; Interruption CCP1
            ; -----------------
intsw7
    bsf    STATUS,RP0    ; sélectionner banque1
    btfss    PIE1,CCP1IE    ; tester si interrupt autorisée
    goto     intsw8        ; non sauter
    bcf    STATUS,RP0    ; oui, sélectionner banque0
    btfss    PIR1,CCP1IF    ; oui, tester si interrupt en cours
    goto     intsw8        ; non sauter
    call    intccp1        ; oui, traiter interrupt
    bcf    PIR1,CCP1IF    ; effacer flag interupt 
    goto    restorereg    ; et fin d'
interrupt


            
; Interruption TMR2
            
; -----------------
intsw8
    bsf    STATUS
,RP0    ; sélectionner banque1
    btfss    PIE1
,TMR2IE    ; tester si interrupt autorisée
    goto     intsw9        
; non sauter
    bcf    STATUS
,RP0    ; oui, sélectionner banque0
    btfss    PIR1
,TMR2IF    ; oui, tester si interrupt en cours
    goto     intsw9        
; non sauter
    call    inttmr2        
; oui, traiter interrupt
    bcf    PIR1
,TMR2IF    ; effacer flag interupt 
    goto    restorereg    
; et fin d'interrupt

            ; Interruption TMR1
            ; -----------------
intsw9
    bsf    STATUS,RP0    ; sélectionner banque1
    btfss    PIE1,TMR1IE    ; tester si interrupt autorisée
    goto     intswA        ; non sauter
    bcf    STATUS,RP0    ; oui, sélectionner banque0
    btfss    PIR1,TMR1IF    ; oui, tester si interrupt en cours
    goto     intswA        ; non sauter
    call    inttmr1        ; oui, traiter interrupt
    bcf    PIR1,TMR1IF    ; effacer flag interupt 
    goto    restorereg    ; et fin d'
interrupt

            
; Interruption EEPROM
            
; -------------------
intswA
    bsf    STATUS
,RP0    ; sélectionner banque1
    btfss    PIE2
,EEIE    ; tester si interrupt autorisée
    goto     intswB        
; non sauter
    bcf    STATUS
,RP0    ; oui, sélectionner banque0
    btfss    PIR2
,EEIF    ; oui, tester si interrupt en cours
    goto     intswB        
; non sauter
    call    inteprom    
; oui, traiter interrupt
    bcf    PIR2
,EEIF    ; effacer flag interupt 
    goto    restorereg    
; et fin d'interrupt

            ; Interruption COLLISION
            ; ----------------------
intswB
    bsf    STATUS,RP0    ; sélectionner banque1
    btfss    PIE2,BCLIE    ; tester si interrupt autorisée
    goto     intswC        ; non sauter
    bcf    STATUS,RP0    ; oui, sélectionner banque0
    btfss    PIR2,BCLIF    ; oui, tester si interrupt en cours
    goto     intswC        ; non sauter
    call    intbc        ; oui, traiter interrupt
    bcf    PIR2,BCLIF    ; effacer flag interupt 
    goto    restorereg    ; et fin d'
interrupt

            
; interruption CCP2
            
; -----------------
intswC
    bcf    STATUS
,RP0    ; oui, sélectionner banque0
    call    intccp2        
; traiter interrupt
    bcf    PIR2
,CCP2IF    ; effacer flag interupt 

            
;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
    decfsz    cmpt , f    ; décrémenter compteur de passages
    return            ; pas 0, on ne fait rien
    movlw    LEDMASK        ; sélectionner bit à inverser
    xorwf    PORTA , f    ; inverser LED
    movlw    CMPTVAL        ; pour CMPTVAL nouveaux passages
    movwf    cmpt        ; dans compteur de passages
    return            ; fin d'
interruption timer


;*****************************************************************************
;
                        INTERRUPTION RB0/INT                                *
;*****************************************************************************
intrb0
    return            
; fin d'interruption RB0/INT
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                         INTERRUPTION RB4/RB7                               *
;*****************************************************************************
intrb4
    movf    PORTB
,w        ; indispensable pour pouvoir resetter RBIF
    return            
; fin d'interruption RB4/RB7
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION CONVERTISSEUR A/D                         *
;*****************************************************************************
intad
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION RECEPTION USART                           *
;*****************************************************************************
intrc
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION TRANSMISSION USART                        *
;*****************************************************************************
inttx
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                       INTERRUPTION SSP                                     *
;*****************************************************************************
intssp
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                       INTERRUPTION CCP1                                    *
;*****************************************************************************
intccp1
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION TIMER 2                                   *
;*****************************************************************************
inttmr2
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION TIMER 1                                   *
;*****************************************************************************
inttmr1
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION EEPROM                                    *
;*****************************************************************************
inteprom
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                     INTERRUPTION COLLISION                                 *
;*****************************************************************************
intbc
    return            
; fin d'interruption
                ; peut être remplacé par 
                ; retlw pour retour code d'
erreur

;*****************************************************************************
;
                        INTERRUPTION CCP2                                   *
;*****************************************************************************
intccp2
    return            
; fin d'interruption
                ; 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
    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

            
; 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

            
; initialiser variable
            
; --------------------
    movlw    CMPTVAL        ; charger valeur d'initialisation
    movwf    cmpt        ; initialiser compteur de passages

            ; autoriser interruptions (banque 0)
            ; ----------------------------------
    clrf    PIR1        ; effacer flags 1
    clrf    PIR2        ; effacer flags 2
    bsf    INTCON,GIE    ; valider interruptions
    goto    start        ; programme principal


;*****************************************************************************
;                      PROGRAMME PRINCIPAL                                   *
;*****************************************************************************

start
    goto start        ; boucler


    END             ; directive fin de programme

debut avec le debuguer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#14 Message par Guest » mer. 7 sept. 2016 17:36

bonjour

Fait comme cela

Code : Tout sélectionner

    list      p=16f876            ; Définition de processeur
    #include <p16f876.inc>        ; Définitions de variables

c'est des petits "f" c'est pas le meme compli :wink:
A+
PS: ton code plus fluide comme celui du maitre :wink:

debut avec le debuguer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#15 Message par JMarc » mer. 7 sept. 2016 19:40

Bonsoir Maï


J'ai acheté le pickit3 et un module de programmation avec tensions réglable que je découvre et ça ne fonctionne pas.

J'ai repris mon vieux ordi avec le port série et l'ancien programmateur et un vieux 16f877 et ça fonctionne donc le programme est ok. Avec les 16f877 neuf, deux ne fonctionnent pas. J'ai du les cramer :cry:

J'ai repris le pickit3, avec le voltmètre, j'ai réglé sur 3,3 volt, et réussi à programmer mon premier pic :-D

debut avec le debuguer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#16 Message par Guest » mer. 7 sept. 2016 19:46

c'est super tout cela

Pour les pic, perso quelques uns aussi ,de vie a trépas. C'est le jeu, c'est notre coté humain, droit a l’erreur que je revendique

Allez plaisir de te lire dans de nouvelle aventureSSSSSSS humour!!

A+

debut avec le debuguer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#17 Message par Guest » mer. 7 sept. 2016 19:49

oops j'ai zappé c'est quoi cette tension variable et pourquoi cela ???

Alors perso ,je programme in situ sur le PCB ou sur ma plaquette d'essai et j'alimente toujours mon pic avec une tension extérieur de 5V, car je n'ai que des séries de vieux PIC. Petit stock que je finirais avec

A+

debut avec le debuguer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#18 Message par JMarc » mer. 7 sept. 2016 20:22

J'ai acheté ce programmateur, le potentiomètre bleu de droite sert a régler la tention, j'ai mis 3,3 volt car lors de la programmation, une fenêtre parlait de cette tention. Mais je ne sais pas si c'est pour cela que cela fonctionne. Depuis deux jours d'essais, j'ai fait tout et surtout n'importe quoi :mur:

Je n'ai pas compris le potentiomètre de gauche


Image


Image
Modifié en dernier par JMarc le mer. 7 sept. 2016 22:10, modifié 1 fois.

debut avec le debuguer
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2596
Enregistré en : juillet 2016
Localisation : Terre

#19 Message par Temps-x » mer. 7 sept. 2016 20:41

Bonjour JMarc

Ben, je vois pas l'utilité de du support zip, si tu as une plaque d'essai, on peux faire un essai, si tu es d'accord .
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

debut avec le debuguer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#20 Message par JMarc » mer. 7 sept. 2016 21:00

J'ai essayé de raccorder le pickit3 seul mais j'ai une erreur sur vdd

Image


Retourner vers « Langage ASM »

Qui est en ligne

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