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

Goto , call pile sur pic 16f
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#31 Message par Temps-x » jeu. 17 mai 2018 22:17

Bonsoir,

Bon avec tous ce que tu nous à donner on va pouvoir travailler, j'ai vu le schéma ça me suffit largement pour commencer.

Quand tu fais un call il faut impérativement un retour, par l'instruction return, mais ça je suppose que tu le sais.

Coté gestion affichage, c'est bien sur du multiplexage, je commence un bout de code, et je te le mets ici.

Et je fais le ménage dans tout ton code.

PS: il est possible que ton programme plante, par dépassement de ton tableau, on y reviendra.

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Goto , call pile sur pic 16f
Guigui02
Débutant
Débutant
Messages : 42
Enregistré en : mars 2017

#32 Message par Guigui02 » jeu. 17 mai 2018 22:22

Merci beaucoup temp-x pour le temps que tu m’accorde :-) pour le debordement du tableau je ne vois pas comment il peu deborder ??!? Mais tu y reviendras lol sinon oui pour les returb je l’ai nté en bas du message

Goto , call pile sur pic 16f
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#33 Message par Temps-x » jeu. 17 mai 2018 22:33

Quelle est la fréquence de ton quartz ?
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Goto , call pile sur pic 16f
Guigui02
Débutant
Débutant
Messages : 42
Enregistré en : mars 2017

#34 Message par Guigui02 » jeu. 17 mai 2018 22:35

20 mhz

Goto , call pile sur pic 16f
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#35 Message par Temps-x » jeu. 17 mai 2018 22:39

Merci, c'est pour adapter mes temporisations

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Goto , call pile sur pic 16f
Guigui02
Débutant
Débutant
Messages : 42
Enregistré en : mars 2017

#36 Message par Guigui02 » jeu. 17 mai 2018 22:40

Merci a toi temp-x bonne soiree

Goto , call pile sur pic 16f
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#37 Message par Temps-x » ven. 18 mai 2018 03:52

Bonjour Guigui02, et tout le forum,

écrit une table en eeprom, ça se fait quand on manque de place, mais là tu n'as pas besoin, donc on fait un tableau.

Bon j'ai fait le ménage, reste la gestion des boutons, l'affichage, le décodage, je vois le reste demain.

Code : Tout sélectionner

;*****************************************************************************

    Errorlevel-302                        ; Supprime le message "Ensure that bank bits are correct" 

    LIST      p
=16F876            ; Définition de processeur
    
#include <p16F876.inc>        ; fichier include

    __CONFIG   _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC 

;*************************************** assignations ***************************************** 

#DEFINE   segment             PORTB       ; segment : RA0 = A, RA1 = B, RA2 = C, RA3 = D, RA4 = E, RA5 = F, RA6 = G, RA7 = H                                

#DEFINE   anode1              PORTA,0     ; anode afficheur1  premier à droite
#DEFINE   anode2              PORTA,1     ; anode afficheur2  deuxième à droite
#DEFINE   anode3              PORTA,2     ; anode afficheur3  deuxième à gauche
#DEFINE   anode4              PORTA,3     ; anode afficheur4  premier à gauche 

;**********************************************************************************************
;******************************
 déclaration des variables *************************************
;**********************************************************************************************
  

 CBLOCK H
'20'                             ; bank0
      loop1       
:
      loop2       
:
      loop3       
:

      afficheur1  
:1                      
      afficheur2  
:1                      
      afficheur3  
:1                      
      afficheur4  
:1  

      secondes   
: 1
      minutes    
: 1
      heures     
: 1

      scdu       
: 1
      scdd       
: 1

      minu       
: 1
      mind       
: 1

      calcul     
: 1
      flag1      
: 1
      adra       
: 1

 ENDC 
;**************************** adresse de depart après reset **********************************

    ORG H'0'
      goto debut      

;******************************** lieu des interruptions **************************************

    ORG  H'4'           
      retfie    

;**********************************************************************************************       
debut

;***********************************************************************************************

      BANKSEL SSPSTAT                     ; passer en bank 1 

;************************ configuration du registre SSPSTAT en bank 1 ************************** 

      movlw B
'11000000'                   ; SMP = 1 : fréquence de l'horloge du bus I2C = 100 kHz 
      movwf SSPSTAT                       ; CKE = 0 : Disable SMBus specific inputs
                                          
;************************ configuration du registre SSPADD en bank 1 *************************** 
     
      movlw B'
00110001'
      movwf SSPADD                        ; (SSPADD) = (FOSC / (4*f SCL)) - 1 = B'
00110001'

;************************ configuration du registre OPTION_REG en bank 1 *********************** 

      movlw B'
10000000'                   ; 
      movwf OPTION_REG                    ; résistances hors service                                            
                                                     
;************************* configuration du registre ADCON1 en bank 1 ***************************  

      movlw B'
00000110'
      movwf ADCON1                        ; PORTA en mode digital

;**************** configuration des registres TRISA & TRISB & TRISC en bank 1 ******************

      movlw B'
00000000'                   ; 
      movwf TRISA                         ; configure les pattes dans TRISA
                                          ; 2(RA0), 3(RA1), 4(RA2), 5(RA3), 6(RA4), 7(RA5), 9(OSC1), 10(OSC2)                         
      movlw B'
00000000'                   ; 
      movwf TRISB                         ; configure les pattes dans TRISB
                                          ; 21(RB0), 22(RB1), 23(RB2), 24(RB3), 25(RB4), 26(RB5), 27(RB6), 28(RB7)                                                                                                                                              

      movlw B'
01111111'                   ; configure les pattes dans TRISC 
      movwf TRISC                         ; 11(RC0), 12(RC1), 13(RC2), 14(RC3), 15(RC4), 16(RC5), 17(RC6), 18(RC7)                                        


;********************* configuration du registre INTCON en bank 0,1,2,3 ************************

      clrf INTCON                         ; interruption hors service 

;************************ configuration du registre SSPCON en bank 0 ***************************

      BANKSEL SSPCON                      ; passer en bank0  

;***********************************************************************************************

      movlw B'
00101000'
      movwf SSPCON

;**************************** "pour ne pas avoir des surprisses" ******************************

      clrf PORTA                          ; PORTA à 0       
      clrf PORTB                          ; PORTB à 0
      clrf PORTC                          ; PORTC à 0








;***********************************************************************************************
;                                     ROUTINE i2c                                              *
;***********************************************************************************************

I2C_start

      call I2C_idle                       ; on attend que le bus I2C soit libre

      bsf STATUS,RP0                      ; passage en banque 1
      bcf STATUS ,RP1                     ; passage en banque 1
      bsf SSPCON2,SEN                     ; SEN = 1 (lancement d'
une opération Start)
      bcf STATUS,RP0                      ; passage en banque 0
      bcf STATUS
,RP1                      ; passage en banque 0

      return

I2C_idle
      bsf STATUS
,RP0                      ; passage en banque 1
      bcf STATUS
,RP1                      ; passage en banque 1

I2C_idle0
      btfsc SSPCON2
,ACKEN
      goto I2C_idle0                      
; le bit ACKEN n'est pas nul
      btfsc SSPCON2,RCEN
      goto I2C_idle0                      ; le bit RCEN n'
est pas nul
      btfsc SSPCON2
,PEN
      goto I2C_idle0                      
; le bit PEN n'est pas nul
      btfsc SSPCON2,RSEN
      goto I2C_idle0                      ; le bit RSEN n'
est pas nul
      btfsc SSPCON2
,SEN
      goto I2C_idle0                      
; le bit SEN n'est pas nul
      btfsc SSPSTAT,R_W
      goto I2C_idle0                      ; le bit R_W n'
est pas nul
      bcf STATUS
,RP0                      ; passage en banque 0
      bcf STATUS
,RP1                      ; passage en banque 0

      return

                                          
; WRITE (movlw xxxx ; I2C_write)

I2C_write
      call I2C_idle                       
; on attend que le bus I2C soit prêt
      movwf SSPBUF

    return

                                          
; accusé de reception slave vers master

I2C_ack_slave_to_master
      call I2C_idle                       
; on attend que le bus I2C soit prêt
      bsf STATUS
,RP0                      ; passage en banque 1
      bcf STATUS
,RP1                      ; passage en banque 1


I2C_ACK_slave_to_master0
      btfsc SSPCON2 
, ACKSTAT
      goto I2C_ACK_slave_to_master0       
; on attend la réception du bit ACK
      bcf STATUS
,RP0                      ; passage en banque 0
      bcf STATUS
,RP1                      ; passage en banque 0

    return

                                          
; repeated start
I2C_repeated_start
      call I2C_idle                       
; on attend que le bus I2C soit prêt
      bsf STATUS
,RP0                      ; passage en banque 1
      bcf STATUS
,RP1                      ; passage en banque 1
      bsf SSPCON2
,RSEN                    ; RSEN = 1 (lancement d'une opération Repeated Start)
      bcf STATUS,RP0                      ; passage en banque 0
      bcf STATUS,RP1                      ; passage en banque 0

      return

                                          ; lecture (call i2c_read ; movwf variable )
I2C_read
      call I2C_idle                       ; on attend que le bus I2C soit prêt
      bsf STATUS,RP0                      ; passage en banque 1
      bcf STATUS,RP1                      ; passage en banque 1
      bsf SSPCON2,RCEN                    ; on lance la réception

I2C_read0
      btfsc SSPCON2 , RCEN
      goto I2C_read0                      ; on attend la fin de la réception
      bcf STATUS,RP0                      ; passage en banque 0
      bcf STATUS,RP1                      ; passage en banque 0
      movf SSPBUF,W

      return

                                          ; accusé de reception du maitre vers esclave
I2C_ack_master_to_slave
      call I2C_idle                       ; on attend que le bus I2C soit prêt
      bsf STATUS,RP0                      ; passage en banque 1
      bcf STATUS ,RP1                     ; passage en banque 1
      bcf SSPCON2,ACKDT                   ; ACKDT = 0
      bsf SSPCON2,ACKEN                   ; ACKEN = 1 (lancement d'
une opération Acknowledge)
      bcf STATUS,RP0                      ; passage en banque 0
      bcf STATUS
,RP1                      ; passage en banque 0

    return

                                          
; non accusé de reception
I2C_noack
    call I2C_idle                         
; on attend que le bus I2C soit prêt
    bsf STATUS
,RP0                        ; passage en banque 1
    bcf STATUS 
,RP1                       ; passage en banque 1
    bsf SSPCON2
,ACKDT                     ; ACKDT = 1
    bsf SSPCON2
,ACKEN                     ; ACKEN = 1 (lancement d'une opération Not Acknowledge)
    bcf STATUS,RP0                        ; passage en banque 0
    bcf STATUS,RP1                        ; passage en banque 0

    return

                                          ; pour stopper l'
esclave
I2C_stop
    call I2C_idle                         
; on attend que le bus I2C soit prêt
    bsf STATUS
,RP0                        ; passage en banque 1
    bcf STATUS
,RP1                        ; passage en banque 1
    bsf SSPCON2
,PEN                       ; PEN = 1 (lancement d'une opération Stop)
    bcf STATUS,RP0                        ; passage en banque 0
    bcf STATUS,RP1                        ; passage en banque 0

    return

;***********************************************************************************************
;********************************* "tableau de conversion" ************************************ 
;***********************************************************************************************

      ORG H'
600'       

tab_bcd
      addwf  PCL,F

      retlw B'
10011100'
      retlw B'
01001000'                   ;0
      retlw B'
11111001'                   ;1
      retlw B'
00101100'                   ;2
      retlw B'
00111000'                   ;3
      retlw B'
10011001'                   ;4
      retlw B'
00011010'                   ;5
      retlw B'
00001010'                   ;6
      retlw B'
11111000'                   ;7
      retlw B'
00001000'                   ;8
      retlw B'
00011000'                   ;9

      End             




==> A+
Modifié en dernier par Temps-x le ven. 18 mai 2018 13:15, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Goto , call pile sur pic 16f
Guigui02
Débutant
Débutant
Messages : 42
Enregistré en : mars 2017

#38 Message par Guigui02 » ven. 18 mai 2018 08:42

La vache tu ne dort jamais toi lol. Super effectivement ton debut de prog est deja bien plus épuré que le mien lol.
C’est vrai que j’ai jamais pris le temp de virer tous ce qui ne me servais pas en debut de prog j’ai juste repris le prog de base de boigonoff et je rajouter ou configurer ce que j’avais besoin .... les define pareil je ne m’en sevais pas trop et pourtant on gagne en lisibilité ... enfin bref merci pour le leçon temp-x :wink:

Goto , call pile sur pic 16f
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#39 Message par Temps-x » ven. 18 mai 2018 16:43

Bonjour Guigui02, et tout le forum,

Guigui02 a écrit :
Source du message La vache tu ne dort jamais


A si je dors, mais très tard, car la nuit sans aucun bruit je suis plus lucide que le jour pour la programmation, je suis un noctambule.

La directive #DEFINE est très utile quand tu veux changer de PORTX

Une autre directive qui est utile BANKSEL : non de ton registre ou variable, et tu te retrouves dans la banque approprier
du registre ou variable sur laquelle tu veux écrire.

Bon ça fait la même chose qu'une macro que tu aurais fait, mais certain n'aime pas trop ce genre de directive.

J'ai bien vu que tu as repris les exemples du cours de Monsieur Bigonoff, et c'est très bien, car ça prouve que tu as la
volonté d'apprendre.

Pour ma part, je suis toujours un débutant, mais qui a de l'expérience, et ça serait prétentieux de dire je sais.

Guigui02 a écrit :
Source du message bref merci pour la leçon temp-x :wink:


C'est pas une leçon, c'est de l'organisation de programme, car je vois que tu maitrises le langage ASM mieux que moi.

Ce qui te manque c'est de structurer ton programme, un simple organigramme écrit suffit, pas besoin d'un schéma.

Enfin si tu veux remercier quelle qu'un, remercie Jérémy qui a eu l'idée de créer le forum pour réunir les passionnés,
et ceux qui ont des problèmes à écrire un code. :wink:

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Goto , call pile sur pic 16f
Guigui02
Débutant
Débutant
Messages : 42
Enregistré en : mars 2017

#40 Message par Guigui02 » ven. 18 mai 2018 17:30

Hehe merci a jeremy alors ;-) pour banksel effectivement je ne conaissais pas en plus jai etait pas mal embeté avec les bank donc ce banksel pourras me servir ... sinon oui la volonté dapprendre je lai cest le temp qui me manque je me remet dans lelectronique de temps en temps mais cest impressionant comment les journee passe vite quand on proggrame mais jadore. En fait quand je tai dit merci pour la lecon cest de voir comment tu arrive a organiser le proggrame jai vraiment beaucoup de mal avec sa ya qua voir mon atelier cest le bordel lol mais cest comme tout faut que je me force a y arriver ...


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Roger et 43 invités