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

GPIO sur PIC 12F675
JJE
Amateur
Amateur
Messages : 160
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » ven. 17 nov. 2017 19:08 lien vers la Data-Sheet : Cliquez ici

Bonjour à chacun,
Le programme ci-dessous devrait armer puis faire basculer la broche GPIO5 (broche 2) d'un PIC 12F675. Or rien ne se passe, même dans le simulateur de MPLAB, l'instruction

Code : Tout sélectionner


    bsf PTDI

où PTDI est défini par

Code : Tout sélectionner

#DEFINE     PTDI        GPIO,5            ; commande du point décimal
 

est sans effet sur GPIO
Si quelqu'un peut me mettre sur la voie, merci d'avance

Code : Tout sélectionner

;**********************************************************************
;   
PROGRAMME DE CLIGNOTEMENT DU POINT DECIMAL D'UN TDS03160          *
;   COMMANDE PAR UN PIC16F84.                                                   *  
;                                                                     *
;**********************************************************************
;                                                                     *
;    NOM:      Test1                                                  *
;    Date:     15/11/2017                                             *
;    Version:  1.0                                                    *
;    Circuit:  Platine d'
essais                                       *
;    
Auteur:   JJE                                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Fichier requisp12F675.inc                                       *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
NotesCe petit programme permet de faire clignoter une LED      *
;           
sur le port A.2 à une fréquence de 1Hz                    *
;           
Ce programme fait partie de la leçon 6 des cours          *
;                                                                     *
;**********************************************************************


    LIST          
p=PIC12F675         Définition du processeur
    
#INCLUDE     <p12F675.inc>         ; Définitions des constantes

    
__CONFIG   _CP_OFF _WDT_OFF _PWRTE_ON ; & _HS_OSC

'__CONFIG' précise les paramètres encodés dans le processeur au moment de
la programmationLes définitions sont dans le fichier include.
Voici les valeurs et leurs définitions :
;    
_CP_ON                Code protection ON impossible de relire
;    _CP_OFF                Code protection OFF
;    _PWRTE_ON            Timer reset sur power on en service
;    _PWRTE_OFF            Timer reset hors-service
;    _WDT_ON                Watch-dog en service
;    _WDT_OFF            Watch-dog hors service
;    _LP_OSC                Oscillateur quartz basse vitesse
;    _XT_OSC                Oscillateur quartz moyenne vitesse
;    _HS_OSC                Oscillateur quartz grande vitesse
;    _RC_OSC                Oscillateur à réseau RC

;*********************************************************************
;                              
ASSIGNATIONS                          *
;*********************************************************************

OPTIONVAL    EQU    H'81'            bit 7 :GPIO pull-ups disabled
                                
bit 6 sans objet
                                
bit 5 internal cycle clock
                                
bit 4 sans objet
                                
bit 3 prescaler is assiogned to 
                                
TIMER0 module
                                
bit 2-001 prescaler rate 1:4
                                
cf page 14 du DataSheet
ANSELVAL    EQU H
'00'            ADCS<2:0> = 000 sans objet
                                
ANS3ANS0 000 pas d'entrée analogique
                                ; cf page 46 du DataSheet
INTCONVAL    EQU    H'
80'             ; bit 7 = 1 : Enables unlasked interrupts
                                ; bit 6 = 0 : disables all peripheral interrupts
                                ; bit 5 = 0 : disables TMR0 interrupt 
                                ; bit 4 = 0 : disables GPIO port change interrupt
                                ; bit 3-0 = 0 sans objet
                                ; cf page 15 du DataSheet
TIMER0VAL    EQU .9                ; valeur initial de TIMER0 pour obtenir
                                ;  une IT toutes les 10ms avec un
                                ; prescaler à 4 et une fréquence de 4MH
Nb_ITVAL    EQU .10                ; pour simuler unr IT toutes les 10ms
cmpt50VAL     EQU .50                ; pour simuler une IT toutes les 500ms
                                
;*********************************************************************
;                             DEFINE                                 *
;*********************************************************************

#DEFINE     PTDI        GPIO,5            ; commande du point décimal
#DEFINE     T0ITE        INTCON,T0IE    ; @ bit T0IE Timer 0 IT Enable bit


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

BANK1 macro
    bsf        STATUS,RP0
    endm

BANK0 macro
    bcf        STATUS,RP0
    endm

PTDION     macro    
    bsf    PTDI
    endm

PTDIOFF macro
    bcf    PTDI
    endm

;*********************************************************************
;                   DECLARATIONS DE VARIABLES                        *
;*********************************************************************

    CBLOCK 0x020                   ; Début de la zone des variables  
    
; sauvegardes pour l'
IT
    w_temp 
1                    W
    status_temp 
1                STATUS
    
    Nb_IT    
1                    compteur d'IT pour 10 ms
    cmpt50    : 1                    ; compteur pour 50 ms

    ENDC                        ; Fin de la zone                        

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

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

;**********************************************************************
;                     ROUTINE INTERRUPTION                            *
;**********************************************************************

            ;sauvegarder registres    
            ;---------------------
    ORG     0x004                ; adresse d'
interruption
    
interruption reçue toutes les 1ms
    movwf    w_temp              
1 sauver registre W
    swapf    STATUS
,w            2 swap status avec résultat dans w
    movwf    status_temp            
3 sauver status swappé

    BANK0
    btfsc    INTCON
,T0IE            4/5 tester si interrupt timer autorisée
    btfss    INTCON
,T0IF            5/6 ouitester si interrupt timer en cours
    
goto     int2                7 nonc'est une autre interrupt
    goto $+1                    ; 9
    bcf        INTCON,T0IF            ; 10 effacer flag interrupt timer
    movlw    TIMER0VAL            ; 11        
    movwf    TMR0                ; 12
    ; à ce moment, TIMER0 va compter 986 micro-cycles et reviendra au début de 
    ; ce sous-programme de gestion des IT ce qui compte tenu des instructions 
    ; qui précèdent et des deux non décomptées après l'
initialisation de TMR0
    
ammène bien à 1000 micro-cyclessoit 1000 microsecondes
    call    inttimer            
traiter interrupt timer
    
goto restorereg

int2                            
traitement éventuel des autres interruptions
    nop
                
restaurer registres
                
restorereg
    swapf    status_temp
,w        2 swap ancien statusrésultat dans w
    movwf   STATUS                
3 restaurer status
    swapf   w_temp
,f            4 Inversion L et H de l'ancien W
                                   ; sans modifier Z
    swapf   w_temp,w              ; 5 Réinversion de L et H dans W
                                ; W restauré sans modifier status
    retfie                      ; 7 return from interrupt

;**********************************************************************
;                     INTERRUPTION TIMER 0    
;**********************************************************************
; Cette routine est appelée toute le 1ms
inttimer
    decfsz     Nb_IT, f
    return
; ici, on passe toutes les 10ms
; on réinitialise le compteur d'
IT
    movlw     Nb_ITVAL
    movwf    Nb_IT
on décrémente le compteur de passages
    decfsz     cmpt50
f
    
return
ici on passe toutes les 500ms
cette routine est appelée toutes les 500ms
on réinitialise le compteur de passages
    movlw    cmpt50VAL
    movwf    cmpt50
et on bascule l'état de GPIO5
    movlw    B'
00100000'
    xorwf    GPIO,f
    return                            ; 13

;*********************************************************************
;                       PROGRAMME PRINCIPAL                          *
;*********************************************************************
                    ; Initialisations
                    ; ---------------
init
    clrf    GPIO                ; Sorties à 0
    BANK1                        ; sélectionner banque 1
    movlw    OPTIONVAL            ; charger masque
    movwf    OPTION_REG            ; initialiser registre option
    clrf    TRISIO                  ; GPIO tous les ports en sortie
    movlw    ANSELVAL                
    movwf    ANSEL                ; initialise ANSEL
    BANK0
    movlw     INTCONVAL
    movwf    INTCON                ; initialise INTCON

                    ; Effacer RAM
                    ; ------------
    movlw    0x020                ; initialisation pointeur
    movwf    FSR                    ; pointeur d'
adressage indirec
init1
    clrf    INDF                
effacer ram
    incf    FSR
,f                pointer sur suivant
    btfss    FSR
,6                tester si fin zone atteinte (>=40)
    goto    
init1                nonboucler
    btfss    FSR
,5                tester si fin zone atteinte (>=50)
    goto    
init1                nonboucler

                    
initialisations spécifiques
                    
; ---------------------------
    
bsf     PTDI                Allume le point décimal
    movlw    Nb_ITVAL
    movwf    Nb_IT
    movlw    cmpt50VAL
    movwf    cmpt50
    movlw    TIMER0VAL
    movwf    TMR0
    bsf        INTCON
,PEIE
    bsf        INTCON
,T0IE            autoriser l'IT Timer0

start    
    goto    start                ; boucle sans fin, le travail est fait sous IT

    END             ; directive fin de programme

Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

GPIO sur PIC 12F675
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » ven. 17 nov. 2017 19:16 lien vers la Data-Sheet : Cliquez ici

 ! Message de modération :
Bonsoir JJE,

Je te souhaites la bienvenue sur Fantas-PIC. J’espère que tu y trouveras tout ce que tu es venu cherché et que peut-être tu apporteras ta pierre à l 'édifice :wink:
Je tiens aussi à te féliciter,car de mémoire, tu es le premier a avoir mis le lien de ta Data-Sheet dans son premier post ! :bravo: . En espérant que d'autre te suive, car cette fonctionnalité à demandé pas mal de temps et de codage.


Pour ta question désolé je fais du "C" oops

Bienvenue encore !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

GPIO sur PIC 12F675
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1007
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » ven. 17 nov. 2017 19:22 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, et et tous le forum,


Bonjour JJE,et bienvenue sur le forum de Fantas - Pic.

Je vois que tu es débutant, JMarc va être content de t'aider,

Utilises tu un Quartz ?

Personnellement, je trouve cette routine affreuse, c'est la seule façon de dégouter quelqu'un qui veux apprendre.

On peu faire beaucoup plus court. :wink:

A+
Modifié en dernier par Temps-x le sam. 18 nov. 2017 09:24, modifié 2 fois.
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

GPIO sur PIC 12F675
JJE
Amateur
Amateur
Messages : 160
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#4 Message par JJE » sam. 18 nov. 2017 05:16 lien vers la Data-Sheet : Cliquez ici

à Jérémy, je ne désespère pas de me mettre au C que j'ai déjà pratiqué sur PC mais en assembleur, on est plus près du PIC :wink:
à Temps-x, j'espère faire la connaissance prochaine de JMarc. Comme 4MH me suffit, je n'ai pas prévu de Quartz externe. Je pense être perfectible et un exemple de "beau code" beaucoup plus court m'aurait bien satisfait. Tu dois en avoir plein dans tes archives.
merci à vous deux pour vos réponses rapides
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

GPIO sur PIC 12F675
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1007
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » sam. 18 nov. 2017 09:31 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, Jérémy, et et tous le forum,

Comme 4MH me suffit, je n'ai pas prévu de Quartz externe.


j’aurais dû deviner avec une utilisation de GP5

Code : Tout sélectionner

   
   LIST      p
=12F675                    ; Définition de processeur
    
#include <p12F675.inc>                ; Définitions de variables

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
   

      BANKSEL OSCCAL                      
; passer en bank 1 
                                                                                             
      call 3FFh     
      movwf OSCCAL





ça devrait fonctionner maintenant, quand on mets pas de de Quartz, on déclare comme ceci.

Précise exactement ce que tu veux faire, et on le feras avec tous le forum, hum ... en ASM on n'est pas beaucoup :lol:


Bon je vois cela ce soir, car la je suis pressé. :wink:

A+
Modifié en dernier par Temps-x le dim. 19 nov. 2017 00:29, modifié 1 fois.
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

GPIO sur PIC 12F675
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#6 Message par satinas » sam. 18 nov. 2017 11:19 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous, je confirme et ajoute :
Le bit PEIE n'est pas nécessaire pour utiliser le timer0, par contre il est nécessaire pour le timer1
btfss FSR,5 ; tester si fin zone atteinte (>=0x50)
c'est plutôt >= 0x60

GPIO sur PIC 12F675
JJE
Amateur
Amateur
Messages : 160
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#7 Message par JJE » sam. 18 nov. 2017 12:32 lien vers la Data-Sheet : Cliquez ici

merci à vous deux pour ces réponses,
à Jérémy : effectivement ça marche mais je ne vois pas lequel de ces flags est utile :?:
C'est vrai que j'ai oublié OSCAL :?
à satinas : PEIE n'est pas grisé dans la table des registres associés à TIMER0 (page 29 du DS), c'est pourquoi je l'ai armé.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

GPIO sur PIC 12F675
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#8 Message par satinas » sam. 18 nov. 2017 13:13 lien vers la Data-Sheet : Cliquez ici

regarde le schéma de la page 62. GIE et TOIE doivent être à 1 pour l'interruption timer0, PEIE n'intervient pas.

GPIO sur PIC 12F675
JJE
Amateur
Amateur
Messages : 160
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#9 Message par JJE » sam. 18 nov. 2017 14:08 lien vers la Data-Sheet : Cliquez ici

complément de réponse à stanislas : c'est dommage que les compilateurs ne signalent pas les erreurs dans les commentaires, ça nous mettrait à l'abris de commentaires foireux et trompeurs
C'est bien vrai mais alors la case PEIE de la page 29 devrait être grisée. Ces documentations sont pourtant vraiment bien faites.{funcName:"updateLocation","toolbarScreenTop":200}
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

GPIO sur PIC 12F675
JMarc
Confirmé
Confirmé
Messages : 552
Enregistré en : août 2016
Localisation : Dans le Sud...

#10 Message par JMarc » sam. 18 nov. 2017 18:54 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous

JJE a écrit :à Temps-x, j'espère faire la connaissance prochaine de JMarc.


Bonjour à toi, c'est très volontiers mais il te faudra traverser toute la France car je suis à l'autre bout de la France, côté d'où il fait chaud, très chaud :langue:

Ma première question, pourquoi ce modèle de pic ?
Temps-x a fait un tuto sur le 16f88 qui fait ce que tu souhaites avoir.
J'ai fait un tuto sur la transmission avec le uart pour la transmission de données sur ce même pic et je vais pouvoir le terminer car j'ai reçu le 16f88 pour faire les essais.

Donc je te suggère, si tu souhaite que je t'aide, c'est soit tu prends un 16f84 ou bien un 16f88, un 16f877 ou un 18f4525. Je les ai en stock et pourrai faire les essais car je suis debutant

Attention au virus de l'assembleur :+1:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 2 invités