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

base pour 18F4525
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#1 Message par JMarc » ven. 19 mai 2017 08:52

Bonjour a tous

Voici la base pour un 18F4525 qui utilise TMR0 en interruption toute les 100 milliseconde, incrémente une variable qui sera testé dans la boucle principale pour inverser le bit 1 du portB avec pour effet une led qui clignote :lol:

Code : Tout sélectionner

;                descriptif du projet:
;********************************************************************
essai de programation pic 18f4525
led clignotante avec timer 0
;
;;********************************************************************
;
;                
Auteur    :    JMarc 
;                Version    :   1.0
;                Date    :      2017
;
;*******************************************************************************
;            
Note:PIC 18F4525 par exemple 
;             led sur portB,1
;             timer 0 toute les 100 ms si quartz 4 mega hertz
;                   
;*******************************************************************************
    
ERRORLEVEL-302
    
   
list       p=18f4525        ;liste directive 
   
#include    "p18f4525.inc"
 

;=============================================================================
;-----------------------------------------------------------------------------
Définissez vos choix ici
Les commandes seront traitées par assemblage conditionnel
;-----------------------------------------------------------------------------

TYPEINT EQU 0                    0 pour interruptions classiques
                                
1 pour interruptions avec priorité

;=============================================================================
;                          
CONFIGURATIONS EN MODE NORMAL                     =
;=============================================================================
;-----------------------------------------------------------------------------
Remplacer les paramètres proposés par une des alternatives possibles
proposées entre parenthèses
A partir de MPLAB7la directive "CONFIG" remplace la directive "__CONFIG"
;-----------------------------------------------------------------------------

 
CONFIG    OSC HS        Oscillateur principal (LP,XT,HS,RC,EC,ECIO,HSPLL,RCIO)
CONFIG    OSCS OFF        Oscillateur secondaire refusé (ON/OFF)

 
IFNDEF DEBUG
 CONFIG PWRT 
OFF        Délai au démarrage (ON/OFF)

CONFIG BOR ON        Reset si chute de tension (ON/OFF)
CONFIG BORV 42        Tension de reset en 1/10ème Volts (20,27,42,45)

 
CONFIG WDT OFF        Mise en service watchdog (ON/OFF)
 
CONFIG WDTPS 128        Postdiviseur du watchdog (1,2,4,8,16,32,64,128)

CONFIG STVR ON        Reset sur débordement de pile (ON/OFF)

 
CONFIG LVP OFF        Programmation basse tension autorisée (ON/OFF)

 
CONFIG DEBUG OFF        Debugger hors service (laisser sur OFF)

 
CONFIG CP0 OFF        code protection sur block 0 (ON/OFF)
 
CONFIG CP1 OFF        code protection sur block 1 (ON/OFF)
 
CONFIG CP2 OFF        code protection sur block 2 (ON/OFF)
CONFIG CP3 OFF        code protection sur block 3 (ON/OFF)
 
CONFIG CPB OFF        code protection sur bootblock  (ON/OFF)
 
CONFIG CPD OFF        Code protection sur eeprom (ON/OFF)

 
CONFIG WRT0 OFF        Protection écriture block 0 (ON/OFF)
 
CONFIG WRT1 OFF        Protection écriture block 1 (ON/OFF)
 
CONFIG WRT2 OFF        Protection écriture block 2 (ON/OFF)
CONFIG WRT3 OFF        Protection écriture block 3 (ON/OFF)
 
CONFIG WRTB OFF        Protection écriture bootblock (ON/OFF)
 
CONFIG WRTC OFF        Protection écriture configurations (ON/OFF)
 
CONFIG WRTD OFF        Protection écriture zone eeprom (ON/OFF)

 
CONFIG EBTR0 OFF        protectlecture de table block 0 (ON/OFF)
 
CONFIG EBTR1 OFF        protectlecture de table block 1 (ON/OFF)
 
CONFIG EBTR2 OFF        protectlecture de table block 2 (ON/OFF)
CONFIG EBTR3 OFF        protectlecture de table block 3 (ON/OFF)
 
CONFIG EBTRB OFF        protectlecture de table bootblock (ON/OFF)
 ENDIF



;=============================================================================
;                         
VARIABLES ACCESS RAM                               =
;=============================================================================

zone de 96 octets
; -----------------
 
CBLOCK    0x00                    zone access ram de la banque 0
    flags 
1                    flags divers
                                
;  b0 1erreur de vérification

    local01 
1                    variable locale 1 (multi-usage)
    
local02 1                    variable locale 2 (multi-usage)
    
local03 1                    variable locale 3 (multi-usage)
;*********************************************************************
;                   
DECLARATIONS DE VARIABLES                        *
;*********************************************************************
    
cmpt1 1                    compteur de boucles 1
    cmpt2 
1                    compteur de boucles 2
    cmpt3 
1                    compteur de boucles 3
    temptmr0 
1                compteur TMR0

 ENDC
;=============================================================================
;                        
VARIABLES BANQUE 0                                  =
;=============================================================================
zone de 160 octetssuite de l'access RAM
; -----------------------------------------
 CBLOCK    0x60
    fsr0_temp : 2                ; sauvegarde de FSR0 (2 registres)

 ENDC


 #DEFINE ERR_EEP flags,0        ; flag d'
erreur de vérification eeprom
 
#DEFINE ERR_FLASH flags,0        ; flag d'erreur vérif flash (même)


;=============================================================================
;                               
PROGRAMME                                    =
;=============================================================================

                            ; 
vecteur de reset
                            
; ----------------

    
ORG    0x00
    nop                            
pour debugger
    
goto    init                sauter initialisation


;=============================================================================
;                          
INTERRUPTION SIMPLE                               =
;=============================================================================
    
ORG 0x08                    point de départ des interruptions simples

                        
sauvegardes supplémentaires
                        
; ---------------------------
    
movff    FSR0L,fsr0_temp        sauver FSR0L (exemple)
    
movff    FSR0H,fsr0_temp+1    et FSR0H

                        
;traitement de l'interruption
                        ;-----------------------------
    btfss    INTCON,TMR0IE        ; tester si interrupts INT0 en service
    bra        inter2                ; non, test suivant

    btfss    INTCON,TMR0IF        ; tester si flag INT0IF positionné
    bra        inter2                ; non, test suivant
    incf    temptmr0            ; +1 toute les 100 ms

    bcf        INTCON,TMR0IF        ; effacer le flag (ou le faire dans traitinit0)
    bra        interrest            ; et terminer par restauration
    retfie    FAST                ; si pas de restauration, on peut sortir ici 
                                ; dans ce cas, effacer la ligne précédente    
inter2

 ; mettre ici les interuptions a tester


                        ; restaurations
                        ; -------------
interrest
    movff    fsr0_temp,FSR0L        ; restaurer FSR0L
    movff    fsr0_temp+1,FSR0H    ; et FSR0H
    retfie     FAST                ; retour avec restauration de
                                ; WREG, BSR, et STATUS

;=============================================================================
;                           INITIALISATIONS                                  =
;=============================================================================
;-----------------------------------------------------------------------------
; contient les initialisations exécutées lors d'
un reset
; ----------------------------------------------------------------------------
init
                    
traiter mise sous tension du pic
                    
; --------------------------------
initpor                        par exemple on efface la RAM banque 0
    lfsr    FSR0
,0x00        pointer sur l'adresse 0
initpor1
    clrf    POSTINC0        ; effacer emplacement pointé, et incrément pointeur
    btfss    FSR0H,0            ; banque 0 terminée?
    bra        initpor1        ; poursuivre traitement


    movlw     0x06                ; port A en mode numérique
    movwf    ADCON1                ; dans registre de contrôle

    clrf    PORTA               ; effacement des ports
    clrf    PORTB

    clrf    TRISA               ; ports en sortie
    clrf    TRISB
 
    bsf     PORTB,1             ; allumage de la led

                ; initialisation à toujours faire
                    ; --------------------------------
    ; PLACER VOS INITIALISATIONS INITIALES ICI
                        ; initialiser les interruptions
                        ; ------------------------------
    bsf        INTCON2,INTEDG0        ; interrupt sur flanc montant (exemple)
    bsf     RCON,IPEN
    bsf     INTCON2,TMR0IP      ; haute priorité
    bcf     INTCON,RBIF         ; RB7 RB4
    ; xxxx                        ; initialiser les autres interruptions
    bsf        INTCON,GIE            ; mettre toutes les interruptions en service.
    bsf     T0CON,T0PS2         ; TMR0 prédiviseur sur 256
    bsf     T0CON,T0PS1
    bsf     T0CON,T0PS0
    BCF     T0CON,T0CS          ; tmr0 internal clock
    bcf     T0CON,PSA           ; prescaler on
    bsf     T0CON,T0SE
    bcf        INTCON,INT0IF            ; par sécurité
    bsf     INTCON,TMR0IE           ; Interruptions TMR0 en service
    bsf        T0CON,TMR0ON            ; mettre interrupts INT0 en service


;=============================================================================
;                           PROGRAMME PRINCIPAL                              =
;=============================================================================
main
    MOVLW   0X0A            ;on test si 10fois 100mS
    SUBWF   temptmr0,W
    BTFSS   STATUS,Z
    bra     main            ;NON
    CLRF    temptmr0        ;OUI RAZ compteur temps et on decompte
    movlw   b'
00000010'     ; bit a inverser
    xorwf   PORTB,f     
    

    bra        main            ; fin du programme
    END


la suite dans le prochain épisode :sifflotte:

base pour 18F4525
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » ven. 19 mai 2017 10:34

bonjour JMarc et à tous,


Belle presentation ..
ça donne envie de se remettre à l'assembleur.
+1
Aide toi, le ciel ou FantasPic t'aidera

base pour 18F4525
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » ven. 19 mai 2017 18:26

Bonsoir à tous ,

Je reste admiratif, devant le courage qu'il faut pour faire clignoter une LED en assembleur ! A ceux qui font de l'ASM vous avez mon respect car c'est impressionnant ! Et la on ne parle que d'une LED !

Quid d'un protocole UART en ASM ou I2C .... et toute autre fonctions un peu pechues !

Courage à toi et bravo !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

base pour 18F4525
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#4 Message par JMarc » ven. 19 mai 2017 20:50

Merci Paulfjujo et Jérémy

Je bloque pour l'afficheur lcd, je vais repasser au 7 segments pour me faire la main

base pour 18F4525
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#5 Message par venom » ven. 19 mai 2017 21:29

Tout a fait d'accord a Jérémy. :shock:

Depuis que je connais la programmation en général, l'assembleur ma toujours fait peur la syntaxe me "pique les yeux". :?

Doc bravo a ceux qui code tous les jours dessus, et aux nouveaux adepte. 8-) :bravo:






@++
Mon site web
Mon discord : venom#4888

base pour 18F4525
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#6 Message par Gérard » sam. 20 mai 2017 11:32

Moi aussi je retire mon chapeau. Surtout que je trouve l'asm PIC assez déroutant.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

base pour 18F4525
Guigui02
Débutant
Débutant
Messages : 42
Enregistré en : mars 2017

#7 Message par Guigui02 » sam. 20 mai 2017 15:20

Coucou
apres cest comme tout suffit de sy mettre moi jai appris en asm grace a bigonoff ,) et je trouve que le langage C est tres complex moi perso je ny comprend rien mais je ne my suis jamais interessé non plus je programme en asm et sa ne me pose pas trop de problémes apres je ne suis que debutant ;)

base pour 18F4525
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#8 Message par Gérard » sam. 20 mai 2017 16:32

Guigui02 a écrit :Coucou
apres cest comme tout suffit de sy mettre moi jai appris en asm grace a bigonoff ,) et je trouve que le langage C est tres complex moi perso je ny comprend rien mais je ne my suis jamais interessé non plus je programme en asm et sa ne me pose pas trop de problémes apres je ne suis que debutant ;)


Tu as raison, l'important est d'arriver à ses fins. Le meilleur langage est celui dont on sait se servir. Perso, je préfère le Basic. :-D
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

base pour 18F4525
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#9 Message par JMarc » dim. 4 juin 2017 11:53

Bonjour a tous

voici pour la gestion de l'afficheur LCD, sur le 16F877, nous utilisons le registre EEADR pour l’accès memoire.
sur le 18F4525, j'ai pris le registre TBLPTR et cela fonctionne :langue:

voici la parti modifié



Code : Tout sélectionner

;**********************************************************************
;
Fonction Printf %s
avec en parametre W le numero du printf a afficher (defini par des EQU)
Definitions des printfs en fin de programmes
;
;**********************************************************************
LCD_PRINTF

    MOVWF    LCD_CMP_PRINTF    
on met W dans LCD_AFF_PRINTF qui contient le printf a afficher

    
initialisation de EEADRH et de EEADR
    MOVLW    High Printf_START    
;    MOVWF    EEADRH        MSBytes of Program address to read    
    movwf    TBLPTRH
    MOVLW    Low Printf_START
;    MOVWF    EEADR        LSByte of program address to read
    movwf   TBLPTRL


LCD_PRINTF_boucle
;    BSF    EECON1EEPGD    Point to PROGRAM memory
;    BSF    EECON1RD    EEPROM read
;    NOP
;    NOP            Memory is read in the next 2 cycles

;    MOVF     EEDATAW    LSByte of Program EEDATA
;    MOVF     EEDATHW    MSByte of Program EEDATA -> pas utile ici

    tblrd
*+             ; lecture de l'octet en memoire 
    movf    TABLAT,w    ; transfert de l'
octet dans w
    tblrd
*+             ; octet poid fort inutile
    

    BTFSC    STATUS
Z    Si W 0 va en LCD_PRINTF_Null
    bra    LCD_PRINTF_Null

    DECFSZ    LCD_CMP_PRINTF
on decremente LCD_CMP_PRINTF
    bra     LCD_PRINTF_Next_add  
si il est different de 0donc de 1 avant decrementationon va en LCD_PRINTF_Next_add
                  
sinon il faut afficher le caractere qui est toujours dans W

    RCALL    LCD_SEND_CHAR    
    bra     LCD_PRINTF_Next_add

LCD_PRINTF_Null
    DECFSZ    LCD_CMP_PRINTF
F
    bra       LCD_PRINTF_Next
    
RETURN

LCD_PRINTF_Next_add
    INCF    LCD_CMP_PRINTF
on reajoute 1 a LCD_CMP_PRINTF
        
LCD_PRINTF_Next
;    INCF     EEADRF    ajoute 1 a l'adresse de lecture
;    BTFSC    STATUS, Z
;    INCF     EEADRH, F    ; si = 0, on ajoute 1 au poid fort

    MOVLW    High Printf_STOP
    SUBWF    TBLPTRH,W
    BTFSS    STATUS, Z
    bra      LCD_PRINTF_Next2 ; si EEADRH != High Printf_STOP on continue
    
    MOVLW    low Printf_STOP
    SUBWF    TBLPTRL,W
    BTFSS    STATUS, Z
    bra      LCD_PRINTF_Next2 ; si EEADR != low Printf_STOP on continue
    RETURN
    


Retourner vers « Langage ASM »

Qui est en ligne

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