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

Migrer 16F vers 18F
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 416
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#1 Message par F6FCO » ven. 1 juin 2018 13:41

Bonjour tous,
J'essaie de mettre un pied dans les 18F. Comme aide pour les configs je me sers du code qu'a posté Temps-X dans le sujet 'Soft Commande CNC'.
Par contre je manque cruellement d'infos sur les interrupt et j'ai le nez dans le datasheet mais pas simple avec mon anglais primaire :roll:

Première question:
Temps-X, un truc me chiffonne, la première zone des variables commence à H'0' et le départ après reset également. Normal ? il me semble qu'il y a conflit, la première ligne 'goto début' va écraser les premières variables loop1, loop2, etc. ?

Autre question:
Pour faire simple au début je compte ne pas mettre de priorités aux interruptions, donc registre RCON --> IPEN=0 si j'ai bien pigé. Mais du coup ou commencent les interrupt ? à H'8' ou bien H'18' ?

Code : Tout sélectionner

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

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


    list        p
=18f4525                ; processeur utilisé 
    
#include    <p18f4525.inc>            ; Définitions des constantes

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

 CONFIG    OSC = XT                        ; Oscillateur ext 4MHz 
 CONFIG    IESO 
= OFF                        ; Oscillateur secondaire refusé (ON/OFF)
 CONFIG PWRT = ON                        ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                        ; Reset si chute de tension (ON/OFF)
 CONFIG BORV = 0                        ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                        ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                    ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                    ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= OFF                        ; Mclr configuré comme entrée
 CONFIG STVREN 
= ON                        ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                        ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                        ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = OFF                        ; Debugger hors service
 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 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 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                        ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                        ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                        ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                        ; Protection lecture de table bootblock (ON/OFF)

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

; #DEFINE 

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

 CBLOCK H'
0
      loop1         
      loop2         
      loop3         
      loop4         
      loop5         
 ENDC


 CBLOCK    H'
80'
        wreg_temps
        status_temps
        bsr_temps
 ENDC


;**************************** adresse de depart après reset ******************************
    ORG H'
0'
      goto debut      

;*************************** interruption haute priorité *********************************

    ORG    H'
8'
      retfie 

;*************************** interruption basse priorité *********************************

    ORG     H'
18'                                  

      movff        STATUS,status_temps            ; sauve STATUS register
      movff        WREG,wreg_temps                ; sauve registe de travaille
      movff        BSR,bsr_temps                ; sauve le BSR registe

      movff        bsr_temps,BSR                ; restore BSR 
      movff        wreg_temps,WREG                ; restore registe de travail
      movff        status_temps,STATUS            ; restore STATUS 
      retfie   
         
;********************************************************************************************** 
debut
      movlw     B'
01110011'
      movwf     OSCCON                        ; oscillateur à 8 Mhz 
      movlw     B'
00001111'
      movwf     ADCON1                        ; mode analogique
      clrf         TRISA

clignote
      call _1s
      bsf PORTA,0
      call _1s
      bcf PORTA,0
      bra clignote       
  
;************************** tempo de 1 seconde ****************************************
_1s
      movlw D'
93'
      movwf loop1
      movlw D'
38'
      movwf loop2
      movlw D'
11'
      movwf loop3
      decfsz loop1
      bra $-D'
2'
      decfsz loop2,F
      bra $-D'
6'
      decfsz loop3,F
      bra $-D'
10'
      return        

          
      end
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Migrer 16F vers 18F
satinas
Passioné
Passioné
Messages : 267
Enregistré en : novembre 2015

#2 Message par satinas » ven. 1 juin 2018 14:13

Bonjour, je devance Temps-x, et je luis dis que la bibliothèque arrive :)

Les pic 16F et 18F possèdent une architecture Harvard. Les mémoires programme et données sont distinctes et démarrent toutes les 2 à 0.

Flash 16F, adresses en dur :
0x0000 reset
0x0004 interruption

Flash 18F (en mode compatible 16F, un seul niveau d'interruption, IPEN = 0)
0x0000 reset
0x0008 interruption

Flash 18F (à 2 niveaux d'interruption, IPEN = 1)
0x0000 reset
0x0008 interruption high level
0x0018 interruption low level

Ram 16F877
0x000 à 0x01F bank0, registres
0x020 à 0x07F bank0, ram disponible (96)
0x080 à 0x0FF bank1, registres + ram disponible (80)
0x100 à 0x17F bank2, registres + ram disponible (80)
0x180 à 0x1FF bank3, registres + ram disponible (80)

Ram 18F4525
0x000 à 0x0FF bank0, ram disponible (256)
0x100 à 0x1FF bank1, ram disponible (256)
0x200 à 0x2FF bank2, ram disponible (256)
0x300 à 0x3FF bank3, ram disponible (256)
0x400 à 0x4FF bank4, ram disponible (256)
0x500 à 0x5FF bank5, ram disponible (256)
0x600 à 0x6FF bank6, ram disponible (256)
0x700 à 0x7FF bank7, ram disponible (256)
0x800 à 0x8FF bank8, ram disponible (256)
0x900 à 0x9FF bank9, ram disponible (256)
0xA00 à 0xAFF bank10, ram disponible (256)
0xB00 à 0xBFF bank11, ram disponible (256)
0xC00 à 0xCFF bank12, ram disponible (256)
0xD00 à 0xDFF bank13, ram disponible (256)
0xE00 à 0xEFF bank14, ram disponible (256)
0xF00 à 0xF7F bank15, ram disponible (128)
0xF80 à 0xFFF bank15, registres

Les registres du 18F sont en fin de ram, ceux du 16F en début de ram. Dans les 2 cas, c'est indépendant de la mémoire programme qui est ailleurs. Les 16F877 et 18F4525 ont toutes les banks ram pleines, on peut pas faire plus gros. Je connais pas les derniers pic, il y a peut être mieux.

Migrer 16F vers 18F
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 416
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#3 Message par F6FCO » ven. 1 juin 2018 16:07

Bonjour Satinas,
et merci pour ta réponse. Entre ma question et ton post j'étais allé voir le fichier 18F4525TEMP fourni avec MPLAB et j'avais vu que c'était 0x0 aussi pour les deux, et je ne comprenais pas :mur:
C'est plus clair maintenant.
Mon autre question c'était si on est hors priorités à quelle adresse commence-t'on et tu y as répondu.

Je me suis fais un petit pense-bête:
1/ activer les interrutions INTCON/GIE=1
2/ priorités désactivées RCON/IPEN=0
3/ autoriser les interrupt EUSART PIE1/RCIE=1 et TXIE=1
4/ on ne s'occupe pas du registre IPR1 si priorités désactivées
5/ Réglage vitesse pour 9600 bauds avec un xtal de 4Mhz: SYNC=0, BRGH=1, BRG16=0, SPBRG=25

Je vais continuer mon apprentissage et essayer de faire tourner une liaison série sur le 4525, si je bloque je reviendrai quérir des infos (ce qui ne manquera pas d'arriver :wink:
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Migrer 16F vers 18F
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 416
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#4 Message par F6FCO » sam. 2 juin 2018 16:10

Je cale :sad:
J'ai beau lire et relire la partie usart de Bigonoff ainsi que la partie usart du datasheet 18F4525 je ne vois pas pourquoi çà ne touille pas. J'ai surement du omettre un truc propre aux 18F et ma liaison série ne fonctionne pas.
Entre autre je ne sais pas trop quoi faire avec RCIP et TXIP du registre IPR1 puisque les priorités sont désactivées.
Çà m'embête j'aurai bien voulu y arriver tout seul mais bon, voilà mon code,

Code : Tout sélectionner

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

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


    list        p
=18f4525                ; processeur utilisé 
    
#include    <p18f4525.inc>            ; Définitions des constantes

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

 CONFIG    OSC = XT                        ; Oscillateur ext 4MHz 
 CONFIG    IESO 
= OFF                        ; Oscillateur secondaire refusé (ON/OFF)
 CONFIG PWRT = ON                        ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                        ; Reset si chute de tension (ON/OFF)
 CONFIG BORV = 0                        ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                        ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                    ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                    ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= ON                        ; Mclr 
 CONFIG STVREN 
= ON                        ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                        ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                        ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = ON                        ; Debugger hors service
 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 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 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                        ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                        ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                        ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                        ; Protection lecture de table bootblock (ON/OFF)

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

; #DEFINE 

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

 CBLOCK H'
0
 ENDC


 CBLOCK    H'
80'
        W_TEMP
        STATUS_TEMP
        BSR_TEMP
        Tampon_REC                        ; tampon réception
        Tampon_EM                        ; tampon émission
        Reg_1                ; sert à la tempo
        Reg_2                ; sert à la tempo

 ENDC


;**************************** adresse de depart après reset ******************************
    ORG     H'
0'
    goto    init      

;************************************ interruptions  *********************************

    ORG        H'
08'
Sauvegarde_registres
            movwf    W_TEMP        
            movff    STATUS,STATUS_TEMP    
            movff    BSR,BSR_TEMP        
            btfsc    PIR1, RCIF
            goto    reception 
            btfsc    PIR1, TXIF
            goto    emission

restauration_registres
            movff    BSR_TEMP,BSR        
            movf    W_TEMP,w        
            movff    STATUS_TEMP,STATUS    
            retfie

reception
            movf    RCREG , W
            movwf    Tampon_REC            ; les 8 bits de données sont transférés dans un registre d'
usage général
            btfss    RCSTA 
, OERR        ; test d'une erreur d'overrun
            
; traitement de l'erreur d'overrun
            bcf        RCSTA 
, CREN        ; on efface le bit OERR
            bsf        RCSTA 
, CREN        ; on relance la réception
            goto    restauration_registres
    
emission
            
; les 8 bits de données à transmettre sont dans le registre d'usage général Tampon_EMISSION
            movf    Tampon_EM,w
            movwf    TXREG                                        
boucle_EM
            btfss    PIR1,TXIF            ; test du flag émission
            goto    boucle_EM
            goto     restauration_registres


         
;********************************************************************************************** 
init
            movlw     B'
11000000'            ; Rc6 et Rc7 en input
            movwf    TRISC
            bsf        INTCON,GIE            ; activation des interruptions
            bcf        RCON,IPEN            ; désactivation des priorités
            bsf        PIE1,TXIE            ; interrupt emission et reception usart activées
            bsf        PIE1,RCIE            

            ;-------------- init TXSTA
            movlw    b'
00100100'
            movwf    TXSTA
                                    ; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple)
                                    ; bit 6 (TX9) = 0   8 bits de transmission                                    
                                    ; bit 5 (TXEN) = 1  autorise la transmission
                                    ; bit 4 (SYNC) = 0  mode asynchrone
                                    ; bit 3 = 0         (non implémenté)
                                    ; bit 2 (BRGH) = 1  mode asynchrone haute vitesse
                                    ; bit 1 (TRMT) = 0  (en lecture seule)
                                    ; bit 0 (TX9D) = 0  (non utilisé : 0 par exemple)
            ;------------- init RCSTA
            Bank0
            movlw    b'
10010000'
            movwf    RCSTA
                                    ; bit 7 (SPEN) = 1  utilisation du port série
                                    ; bit 6 (RX9) = 0  8 bits reception
                                    ; bit 5 (SREN) = 0 (non utilisé : 0 par exemple)
                                    ; bit 4 (CREN) = 1  autorise la reception
                                    ; bit 3 (ADEN) = 0 (non utilisé : 0 par exemple)
                                    ; bit 2 (FERR) = 0 (non utilisé : 0 par exemple)
                                    ; bit 1 (OERR) = 0 (non utilisé : 0 par exemple)
                                    ; bit 0 (RX9D) = 0 (non utilisé : 0 par exemple)

            ; réglages vitesse
            movlw    d'
25'                ; réglages sur 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
            movwf    SPBRG
            bcf        BAUDCON,BRG16        ; réglé à 8bits        
            
main          
            movlw    0x46       ;F
            movwf    Tampon_EM
            call    tempo
            
            movlw    0x36       ;6
            movwf    Tampon_EM
            call    tempo

            movlw    0x46       ;F
            movwf    Tampon_EM
            call    tempo

            movlw    0x43       ;C
            movwf    Tampon_EM
            call    tempo

            movlw    0x4F       ;O
            movwf    Tampon_EM
            call    tempo
            
            movlw    0x20       ;espace
            movwf    Tampon_EM
            call    tempo
            
            goto    main

tempo
; Délai 1 000 Cycles de la machine
; Durée du délai 1 milliseconde
; Fréquence de l'
oscillateur 4 MHZ
            movlw       .75
            movwf       Reg_1
            movlw       .2
            movwf       Reg_2
            decfsz      Reg_1
,F
            goto        
$-1
            decfsz      Reg_2
,F
            goto        
$-3
            return
            

      end


Datasheet:
Datasheet 18F4525.pdf
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Migrer 16F vers 18F
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 981
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#5 Message par paulfjujo » sam. 2 juin 2018 16:38

bonjour F6FC0,

config Hardware OK ?
y aurait pas un ANSELX quelque part ?

Pourquoi utiliser l'interrupt sur TX , puisque dans l'interrupt on fait un pooling sur le bit TXIF

dans la boucle principale un simple test sur le bit buffer transmiter serait suffisant

Code : Tout sélectionner


   movlw    0x46       
;F
   btfss TXSTA1
,TRMT
   
goto $-2
   nop
   movwf TXREG1


et juste une tempo apres l'envoi des 5 caracteres, histoire de ne pas surcharger le terminal PC !
500mS , le temps de voir ce qui se passe.

Personnellement, je n'ai encore jamais utilisé l'interrupt sur TX.

Migrer 16F vers 18F
satinas
Passioné
Passioné
Messages : 267
Enregistré en : novembre 2015

#6 Message par satinas » sam. 2 juin 2018 17:04

Bonjour aux uartiens

Lors d'une interruption, le 18F sauvegarde automatiquement W, BSR et STATUS dans des registres de copie.
En sortant de l'interruption par "RETFIE 1" au lieu de RETFIE tout court, les 3 valeurs sauvegardées sont copiées dans les 3 registres. Il n'y a donc plus besoin de sauvegarde/restauration registres, c'est fait automatiquement.
C'est un fusil à un coup, il faut l'utiliser que pour l'int prioritaire si IPEN = 1.

Quand on utilise pas les priorités, on oublie les bits de registre correspondants, ils restent à leur valeur par défaut.

Migrer 16F vers 18F
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 416
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#7 Message par F6FCO » sam. 2 juin 2018 17:21

C'est bon çà marche :-D, je te remercie pour ton aide Paulfjujo.
J'ai ensuite procédé à quelques modifs pour comprendre et c'est le passage par ma variable d'émission Tampon_EM qui faisait le blocage, comme tu le dis en chargeant directement TXREG à partir du main c'est bien plus simple.
Modifié en dernier par F6FCO le sam. 2 juin 2018 17:31, modifié 1 fois.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Migrer 16F vers 18F
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 416
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#8 Message par F6FCO » sam. 2 juin 2018 17:31

Bonjour Satinas,
j'ai effectué les sauvegardes comme indiqué à la page 121 du datasheet.
Si je comprends bien ce que tu dis on effectue normalement les sauvegardes quand on a les priorités désactivées et on utilise Refie1 que pour les prioritaires.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Migrer 16F vers 18F
satinas
Passioné
Passioné
Messages : 267
Enregistré en : novembre 2015

#9 Message par satinas » sam. 2 juin 2018 17:46

Tu as IPEN = 0, il n'y a qu'une seule routine d'interruption en 0x0008. Tu n'as pas à sauvegarder, c'est fait automatiquement, et "RETFIE 1" restitue aussi automatiquement les 3 registres.

Avec 2 interruptions basse et haute priorité, lors de l'appel de la routine basse priorité, les registres sont sauvegardés automatiquement. Si cette int est interrompue par l'int haute priorité, il y a à nouveau sauvegarde auto, et les premières valeurs de sauvegarde sont écrasées.
Donc, il faut faire sauvegarde/restauration manuelles pour l'int basse priorité avec un "RETFIE" , et réserver le "RETFIE 1" pour l'int haute priorité, qui elle ne sera jamais interrompue.
Modifié en dernier par satinas le sam. 2 juin 2018 18:04, modifié 1 fois.

Migrer 16F vers 18F
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 416
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#10 Message par F6FCO » sam. 2 juin 2018 18:04

Merci pour l'info, je viens de modifier le code qui est ainsi simplifié :wink: . Je poste ce code de liaison série pour 18F qui fonctionne ci-dessous, çà pourra peut-être servir à quelqu'un.
Par contre, un petit bug de MPlab que j'ai laissé volontairement: dans la partie init de RCSTA j'avais oublié d'enlever l'appel à une macro de changement de banque qui me servait pour les 16F (Bank0 ligne 121). Dans ce code pour 18F les macros ne sont pas déclarées et MPlab ne me signale aucune erreur malgré l'appel.

Code : Tout sélectionner

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

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


    list        p
=18f4525                ; processeur utilisé 
    
#include    <p18f4525.inc>            ; Définitions des constantes

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

 CONFIG    OSC = XT                        ; Oscillateur ext 4MHz 
 CONFIG    IESO 
= OFF                        ; Oscillateur secondaire refusé (ON/OFF)
 CONFIG PWRT = ON                        ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                        ; Reset si chute de tension (ON/OFF)
 CONFIG BORV = 0                        ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                        ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                    ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                    ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= ON                        ; Mclr 
 CONFIG STVREN 
= ON                        ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                        ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                        ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = ON                        ; Debugger hors service
 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 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 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                        ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                        ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                        ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                        ; Protection lecture de table bootblock (ON/OFF)

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

; #DEFINE 

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

 CBLOCK H'
0
 ENDC


 CBLOCK    H'
80'
        W_TEMP
        STATUS_TEMP
        BSR_TEMP
        Tampon_REC                        ; tampon réception
        Tampon_EM                        ; tampon émission
        Reg_1
        Reg_2
        Reg_3

 ENDC


;**************************** adresse de depart après reset ******************************
    ORG     H'
0'
    goto    init      

;********************************** interruptions ***************************************

    ORG        H'
08'
entrée_interrupt
            btfsc    PIR1, RCIF
            bra        reception 
            btfsc    PIR1, TXIF
            bra        emission

sortie_interrupt
            retfie 1

reception
            movf    RCREG , W
            movwf    Tampon_REC            ; les 8 bits de données sont transférés dans un registre d'
usage général
            btfss    RCSTA 
, OERR        ; test d'une erreur d'overrun
            
; traitement de l'erreur d'overrun
            bcf        RCSTA 
, CREN        ; on efface le bit OERR
            bsf        RCSTA 
, CREN        ; on relance la réception
            bra        sortie_interrupt
    
emission
            
; les 8 bits de données à transmettre sont dans le registre d'usage général Tampon_EMISSION
            movf    Tampon_EM,w
            movwf    TXREG                                        
boucle_EM
            btfss    PIR1,TXIF            ; test du flag émission
            bra        boucle_EM
            bra     sortie_interrupt


         
;********************************************************************************************** 
init
            movlw     B'
11000000'            ; Rc6 et Rc7 en input
            movwf    TRISC
            bsf        INTCON,GIE            ; activation des interruptions
            bcf        RCON,IPEN            ; désactivation des priorités
            bsf        PIE1,TXIE            ; interrupt emission et reception usart activées
            bsf        PIE1,RCIE            

            ;-------------- init TXSTA
            movlw    b'
00100100'
            movwf    TXSTA
                                    ; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple)
                                    ; bit 6 (TX9) = 0   8 bits de transmission                                    
                                    ; bit 5 (TXEN) = 1  autorise la transmission
                                    ; bit 4 (SYNC) = 0  mode asynchrone
                                    ; bit 3 = 0         (non implémenté)
                                    ; bit 2 (BRGH) = 1  mode asynchrone haute vitesse
                                    ; bit 1 (TRMT) = 0  (en lecture seule)
                                    ; bit 0 (TX9D) = 0  (non utilisé : 0 par exemple)
            ;------------- init RCSTA
            Bank0
            movlw    b'
10010000'
            movwf    RCSTA
                                    ; bit 7 (SPEN) = 1  utilisation du port série
                                    ; bit 6 (RX9) = 0  8 bits reception
                                    ; bit 5 (SREN) = 0 (non utilisé : 0 par exemple)
                                    ; bit 4 (CREN) = 1  autorise la reception
                                    ; bit 3 (ADEN) = 0 (non utilisé : 0 par exemple)
                                    ; bit 2 (FERR) = 0 (non utilisé : 0 par exemple)
                                    ; bit 1 (OERR) = 0 (non utilisé : 0 par exemple)
                                    ; bit 0 (RX9D) = 0 (non utilisé : 0 par exemple)

            ; réglages vitesse
            movlw    d'
25'                ; réglages sur 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
            movwf    SPBRG
            bcf        BAUDCON,BRG16        ; réglé à 8bits        
            
main          
               movlw    0x46       ;F
               btfss TXSTA,TRMT
               bra $-2
               nop
               movwf TXREG
               
               movlw    0x36       ;6
               btfss TXSTA,TRMT
               bra $-2
               nop
               movwf TXREG
               
               movlw    0x46       ;F
               btfss TXSTA,TRMT
               bra $-2
               nop
               movwf TXREG
               
               movlw    0x43       ;C
               btfss TXSTA,TRMT
               bra $-2
               nop
               movwf TXREG
               
               movlw    0x4F       ;0
               btfss TXSTA,TRMT
               bra $-2
               nop
               movwf TXREG
               
               movlw    0x20       ;espace
               btfss TXSTA,TRMT
               bra      $-2
               nop
               movwf TXREG
               
               call     tempo
            bra      main

tempo
; Délai 10 000 000 Cycles de la machine
; Durée du délai 10 seconde
; Fréquence de l'
oscillateur 4 MHZ

            movlw       .223
            movwf       Reg_1
            movlw       .187
            movwf       Reg_2
            movlw       .51
            movwf       Reg_3
            decfsz      Reg_1
,F
            goto        
$-1
            decfsz      Reg_2
,F
            goto        
$-3
            decfsz      Reg_3
,F
            goto        
$-5
            nop
            nop
            return
            

      end
Quand Chuck Norris dit « Hein ? », personne ne dit 2…


Retourner vers « Langage ASM »

Qui est en ligne

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