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
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#11 Message par satinas » sam. 2 juin 2018 18:27

Tu as mis TX en input, mais le pic ça le gêne pas car il pilote automatiquement les TRIS de l'uart. C'est propre à l'uart, pour le port SPI, il faut les régler à la main.

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

#12 Message par F6FCO » sam. 2 juin 2018 19:59

Ok, il y a quand même pas mal de nouvelles choses à assimiler quand on migre :wink: mais après avoir relu les nouvelles instructions disponibles çà vaut le coup .
Bon je me suis réjoui trop vite, l'émission fonctionnant j'ai pu tester la réception en renvoyant la valeur reçue vers Teraterm et j'ai constaté que çà ne fonctionne pas. le registre Tampon_REC reste vide. Avec l'analyseur logique je ne peux tester qu'à l'entrée de la pin Rx et çà arrive bien. On est un peu démuni pour faire des tests, impossible de tester la liaison en pas à pas. Je replonge dans le datasheet pour la nième fois :geek:
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Migrer 16F vers 18F
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » lun. 4 juin 2018 15:41

bonjour,

ton PIC , est-il en entree ANA par defaut ?

J'ai fais une adaptation de ton programme pour un 18F26K22 ( j'ai pas de 18F4525 !)
pour voir que moi aussi, je n'avais aucun declenchement d'interrupt sur Reception de char ..
j'ai utilisé le mode AVEC traitement des priorité .. :mur: car pas réussi SANS traitement niveau de priorité

question subsidiaire :
ne faut-il pas au moins une IT en haute priorité pour pouvoir faire la distinction Haute et basse priorité ?

sur ce PIC, il y a des ENTREES ANALOGIQUES PAR DEFAUT
il faut donc faire ANSELC=0 avec la bonne banque SFR..

j'avais un autre souci..
pas de quartz sur mon montage, donc utilisation de FOSC interne =4MHZ
avec dans la config bit Oscillateur interne avec sortie FOSC/4 sur RA6 pour tester avec l'oscilo.
J'avais beau mettre dans config bit

Code : Tout sélectionner

[b]300001      29   FOSC  [/b]        Oscillator Selection bits              Internal oscillator block, CLKOUT function on OSC2

La compilation me ramenait à chaque fois 0X28 au lieu 0x29 dans la Configuration du Pickit3 au moment de charger le Hex compilé !
:mur: et bien sur , pas de signal FOSC/4 sur pin RA6

d'ou j'ai appliqué aussi
ANSELA =0 mais s'avere inutile pour RA6 !

De plus, il faut bien faire un File export .. qui genere un fichier hex de 183Ko ( qui contient la config,eeprom..etc) au moins 1 fois ( si on a modifié cette config), ensuite ce n'est plus necessaire et
le fichier de taille normale <= 2ko habituellement recompilé, peut etre utilisé par pickiT3)
et là, j'ai bien 0x29 dans la config bits sur Pickit3
et de rechef ... un beau signal carré de 4V at 1MHz sur RA6 .. :sifflotte: OK

un petit temoin sert à ça..

Code : Tout sélectionner


Traite_IT_High 
          
; pour verifier si on entre dans une interruption quelconque ,High Level
           movlw 
'*'
        movwf TXREG1   


et un code qui marche .. (mais surement perfectible!)
ici je bloque la reception apres 1 seul char,
car il n'y a pas de buffer de reception ... c'est pour une prochaine etape .
Un flag armé dans l'interrupt RX
dans la boucle main, ralentie par 200mS
je teste le flag pour faire un echo sur le terminal du caractere reçu
et rearme l'interrupt RCIE..

le code

Code : Tout sélectionner

; 04-06-2018
; probleme RX interrupt et sortie FOSC/4 RA6 resolu par ANSEL (et banques associées)
;
 300001      29   FOSC   Oscillator Selection bits   Internal oscillator block, CLKOUT function on OSC2 
; 03-06-2018 rajout RX 
; rev TEMPO 200mS et Tempo 1sec

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

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

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

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

 ; config  FOSC   = INTIO67   ; intosc 8MHz
 
; config    WDTEN   = OFF
 
; config    MCLRE = EXTMCLR
 
; config    LVP   = OFF


; *************************************************
;
;
  voir Config_18F26K22_Uart_Fosc_interne_4MHz.txt
;
;**************************************************


xtal EQU 4000000    




 CBLOCK    H
'80'
        Tampon_RX
        Flag_RX
        Reg_1                
; sert a  la tempo
        Reg_2                
; sert a la tempo

        cnt1   
; tempo 200mS et 1sec   
        cnt2   
        cnt3  

 ENDC

SendL macro car
   movlw car
   call Put_char
    endm


;******** vector  reset *******
    ORG     H'0'
    goto    init      


;************* Vector High IT *******************

    ORG        H'08'
      call  Traite_IT_High
      retfie


;******** Vecteur Low IT    **********************
         
    ORG        H
'18'
      ; call Traite_IT_Low
        retfie


;**************************************************
Traite_IT_High 
 
          
; pour verifier si on entre dans une interruption 
           movlw 
'*'
            movwf TXREG1   
     
            btfsc    PIR1
,RC1IF
            goto    reception 
             retfie



reception   
            movf    RCREG1
,W
            movwf   Tampon_RX  
            bsf    Flag_RX
,0
             bsf   PIE1
,RC1IE    ; stop interrupt 1 char à la fois

; test si erreur Overrun
            btfss   RCSTA1 
, OERR       
            goto No_OERR
       
          
; traitement de l'erreur d'overrun
            bcf        RCSTA1 
, OERR        ; on efface le bit OERR
            nop
            bcf        RCSTA1 
, CREN      
            nop
            bsf        RCSTA1 
, CREN        ; on relance la reception
            nop
No_OERR
; test si erreur Frame
            btfss    RCSTA1 
, FERR
            goto No_FERR
             movf    RCREG1 
, W
            movwf   Tampon_RX  

No_FERR
     
            return   


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

  


         
;********************************************************************************************** 
init
          
; FOSC Interne 4MHz
        

        BCF         OSCCON
, 7 ; entre en mode Sleep sur instruction SLEEP
        BSF         OSCCON
, 6 ;    OSCCON.IRCF2=1;    / 101 =4MHz
        BCF         OSCCON
, 5 ;    OSCCON.IRCF1=0;
        BSF         OSCCON, 4 ;    OSCCON.IRCF0=1;

        BSF         OSCCON, 1 ; OSCCON.SCS1=1; // Oscillateur INTERNE
        BCF         OSCCON, 0 ;    OSCCON.SCS0=0;
        
    

         BCF         OSCTUNE
,; PLLEN=0

        BCF         PMD1
+0, 6 ; // active peripherique UART1
        
    
        banksel ANSELC
        Clrf      ANSELC 

    
; necessaire pour pouvoir utiliser, ckecker  FOSC/4 en sortie sur RA6
;300001   29   FOSC    Oscillator Selection bits   Internal oscillator block, CLKOUT function on OSC2                               
        banksel ANSELA
        clrf ANSELA
    


        Banksel   TRISC
        movlw     B
'11000000'  ; Rc6 Rc7 en input ,init UART reconfigure RC6 en sortie
        movwf     TRISC
        
        banksel    0
        CLRF        CM2CON0
        CLRF        CM1CON0 

        Banksel TRISA
        movlw     B
'11111111'  ; Rc6 Rc7 en input ,init UART reconfigure RC6 en sortie
        movwf    TRISA


        
      
          banksel    0
      
; Init UART1 Hardwazre;-------------- init TXSTA
        movlw    b
'00100100'
        movwf    TXSTA1
                                    
; bit 7 (CSRC) = 0 (non utilise : 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 implemente)
                                    ; bit 2 (BRGH) = 1  mode asynchrone haute vitesse
                                    
; bit 1 (TRMT) = 0  (en lecture seule)
                                    ; bit 0 (TX9D) = 0  (non utilise : 0 par exemple)
        ;------------- init RCSTA
      
        movlw    b
'10010000'
        movwf    RCSTA1
                                    
; bit 7 (SPEN) = 1  utilisation du port serie
                                    
; bit 6 (RX9)  = 0  8 bits reception
                                    
; bit 5 (SREN) = 0 (non utilise : 0 par exemple)
                                    ; bit 4 (CREN) = 1  autorise la reception
                                    
; bit 3 (ADEN) = 0 (non utilise : 0 par exemple)
                                    ; bit 2 (FERR) = 0 (non utilise : 0 par exemple)
                                    ; bit 1 (OERR) = 0 (non utilise : 0 par exemple)
                                    ; bit 0 (RX9D) = 0 (non utilise : 0 par exemple)

        
       
; reglages vitesse
        movlw    d
'25' ; reglages sur 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
        movwf    SPBRG1
        bcf      BAUDCON1
,BRG16  

        BCF Flag_RX
,
        clrf Tampon_RX

      

       
; vidage tampon UART  
        CLRF TXREG1 
        call Tempo_200mS 
        CLRF TXREG1  
        SendL .13
        SendL .10  


 
; Interrupt !
        clrf  PIE1
; avec niveau d'interrupt
        bsf   RCON,IPEN        ; Activation des priorites
        bsf   RCON,PEIE        ; activation des IT Peripheriques
        bsf   IPR1,RC1IP       ; High priority

        bcf   PIE1,TX1IE       ; desactiv interrupt emission 
        bsf   PIE1,RC1IE       ; activ IT RX UART 
        bsf   INTCON,GIE       ; activation des interruptions    

      


    ; test tempo 200mS
       SendL '
T'
      SendL '
0'
      SendL '
.'
       SendL '
2'
       SendL .13
       SendL .10 
ici: 
    call Tempo_200mS
    call Tempo_200mS
    call Tempo_200mS
    call Tempo_200mS
    call Tempo_200mS
  
       SendL .13
       SendL .10  
    SendL '
$'


    SendL .13
       SendL .10  
           
main          
           
      SendL '
P'
    SendL '
A'
    SendL '
U'
    SendL '
L'
    SendL '
F'
    SendL '
J'
    SendL '
U'
    SendL '
J'
    SendL '
O'
    SendL .13
    SendL .10

Encore:

    btfss Flag_RX,0
    goto Suite
    SendL '
R'
    SendL '
X'
    SendL '
='
    SendL '
 '
    movf Tampon_RX,w
     btfss TXSTA1,TRMT
    goto $-2
    nop
    movwf TXREG1
    SendL .13
    SendL .10
    BCF Flag_RX,0
     bsf   PIE1,RC1IE 
     
 Suite        

    call Tempo_200mS
    goto    Encore


Put_char
    btfss TXSTA1,TRMT
    goto $-2
    nop
    movwf TXREG1
       return            


Tempo_200mS:
    movlw    .200
    movwf    cnt1
    movlw    .4
    movwf    cnt2
    movlw    .2
    movwf    cnt3
Tempo2:
    decfsz    cnt1, f
    bra    Tempo2
    decfsz    cnt2, f
    bra    Tempo2
    decfsz    cnt3, f
    bra Tempo2    ;3 cycles
    nop
    nop
    nop
    return



Tempo_1S        ;999 997 cycles
    movlw    .172
    movwf    cnt1
    movlw    .19
    movwf    cnt2
    movlw    .6
    movwf    cnt3
Tempo1:
    decfsz    cnt1, f
    bra    Tempo1
    decfsz    cnt2, f
    bra    Tempo1
    decfsz    cnt3, f
    bra Tempo1    ;3 cycles
    nop
    nop
    nop
    return


      end

/*



T0.2

$
PAULFJUJO
*RX= H
*RX= E
*RX= L
*RX= L
*RX= O


----------------------------------------------------------------------
----------------------------------------------------------------------
Release build of project `C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_F6FC0_Test.mcp'
 started.
Language tool versions: MPASMWIN.exe v5.51, mplink.exe v4.49, mplib.exe v4.49
Mon Jun 04 15
:31:07 2018
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_Uart_Test_F6FCO_180604.o".
Clean: Deleted file "C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_Uart_Test_F6FCO_180604.err".
Clean: Deleted file "C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_Uart_Test_F6FCO_180604.hex".
Clean: Deleted file "C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_Uart_Test_F6FCO_180604.lst".
Clean: Deleted file "C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_Uart_Test_F6FCO_180604.cof".
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\MPASMWIN.exe" //p18F26K22 "18F26K22_Uart_Test_F6FCO_180604.asm" /l"18F26K22_Uart_Test_F6FCO_180604.lst" /e"18F26K22_Uart_Test_F6FCO_180604.err"
Warning[207] C:\MPLAB8\_MESPROJETS_ASM\_18F4525_UART\18F26K22_UART_TEST_F6FCO_180604.ASM 281 : Found label after column 1. (Suite)
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\mplink.exe" /p18F26K22 "18F26K22_Uart_Test_F6FCO_180604.o" /z__MPLAB_BUILD=/o"18F26K22_Uart_Test_F6FCO_180604.cof" /M"18F26K22_Uart_Test_F6FCO_180604.map" //x
MPLINK 4.49
, Linker
Device Database Version 1.14
Copyright 
(c) 1998-2011 Microchip Technology Inc.
Errors    : 0

Loaded C
:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_Uart_Test_F6FCO_180604.cof.
----------------------------------------------------------------------
Release build of project `C:\Mplab8\_Mesprojets_ASM\_18F4525_Uart\18F26K22_F6FC0_Test.mcp' succeeded.
Language tool versions: MPASMWIN.exe v5.51, mplink.exe v4.49, mplib.exe v4.49
Mon Jun 04 15:31:09 2018
----------------------------------------------------------------------
BUILD SUCCEEDED


*/


Aide toi, le ciel ou FantasPic t'aidera

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

#14 Message par F6FCO » jeu. 7 juin 2018 20:14

Bonjour Päulfjujo,
Désolé pour le retard de ma réponse, j'étais absent.
Bah, tu me parles de plein de trucs que je ne connais pas encore :lol:
Banksel... je suppose que c'est une fonction qui veut dire Bank sélection; il n'y en a plus de banques dans les 18F non ?
ANSELC, ANSELA... certainement analogique/numérique sélection ? connais pas encore non plus.
Pour passer tout le port A en digital ne suffit-il pas de charger 0xFF dans PCFG3 du registre ADCON1 ? je ne l'ai pas fait dans mon programme ne voyant pas le rapport avec l'usart.

Je travaille avec un quartz extérieur de 4Mhz.
Ce qui est frustrant c'est que l'émission/réception fonctionne parfaitement sur les 16F et que je ne vois pas pourquoi çà ne touille pas sur 18F.
Merci pour ton code, je vais le tester et j'ai vu qu'il y a plein de choses à prendre :wink:
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Migrer 16F vers 18F
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#15 Message par paulfjujo » ven. 8 juin 2018 09:12

bonjour à tous,

F6FCO a écrit :Pour passer tout le port A en digital ne suffit-il pas de charger 0xFF dans PCFG3 du registre ADCON1 ?
je ne l'ai pas fait dans mon programme ne voyant pas le rapport avec l'usart.


tu as tout à fait raison.
Il n'y a pas de registre ANSEL (selection voie analogique) sur ton PIC, donc c'est ADCON1 qui en fait office.
et le port C n'a aucun lien avec un port ANALOGIQUE sur ce PIC.
je pense qu'il te manque RCIP à 1 ...

Image1.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

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

#16 Message par F6FCO » ven. 8 juin 2018 12:25

Je ne l'avais pas traité parce que j'avais désactivé les priorités (IPEN=0) pour passer en mode compatible 16F et aussi pour aborder les 18F le plus simplement possible dans un premier temps.
Une difficulté à la fois quand on découvre :wink:
Au vu de tes expériences je vais faire un essai en réactivant les priorités et en validant IPEN, RCIP et TXIP. Merci pour l'info et je vous tiens au courant.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

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

#17 Message par F6FCO » ven. 8 juin 2018 15:59

Re,
C'est bon, çà marche enfin :-D . Bizarre que çà n'ait pas voulu sans les priorités mais bon, faut pas que je sois trop difficile. Il me reste à peaufiner la chose car le dernier caractère de mon message continue d'être transmis tant que je n'ai pas envoyé un nouveau message, me reste à trouver pourquoi.
Pour l'instant je me contente de charger TXREG avec le contenu de RCREG au sein de l'interruption.

tera F6FCO.JPG

LA1010 F6FCO.JPG
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

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

#18 Message par F6FCO » sam. 9 juin 2018 14:33

Bonjour tous,
Paul, pourrais-tu m'expliquer pourquoi tu mets une tempo de 200ms entre deux vidages du tampon UART ? un seul CLRF TXREG n'aurait-il pas suffit ?

Code : Tout sélectionner

       vidage tampon UART  
        CLRF TXREG1 
        call Tempo_200mS 
        CLRF TXREG1  
        SendL .13
        SendL .10  
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Migrer 16F vers 18F
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#19 Message par paulfjujo » sam. 9 juin 2018 17:05

bonjour à tous..

Code : Tout sélectionner

un seul CLRF TXREG n'aurait-il pas suffit ?


OUI, MAIS
le but de cette manoeuvre est de chronometrer ma tempo de 200mS !
avec VBRAY Terminal et l'option TIME cochée
à chaque CRLF, il mets l' heure et millisecondes
il suffit alors de regarder l'ecart lu sur le terminal entre les 2 sauts de lignes.


Ca peut servir aussi à chronometrer la duree d'une boucle principale de programme ou un morceau de programme..
mais attention, à +-50mS pret ( duree d'un TIC PC )..
pour les duree plus courtes .. SQA Analyser ..

sur VBRAY terminal,
on peut aussi faire un effacement de l'ecran en envoyant le code 12 (Form Feed)
option RX Clear =12
mais il faut > 300mS pour qu'il le fasse proprement
donc à faire suivre d'une tempo
je mets carrement 500mS

UART1_Init(19200);
UART1_Write(12);
Delay_ms(500);

et on a un debut d'affichage possible sur un ecran bien propre ..
Aide toi, le ciel ou FantasPic t'aidera

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

#20 Message par F6FCO » sam. 9 juin 2018 18:22

Ok, compris ton explication même si je ne connais pas VBRAY :wink:

J'ai bien épluché ton code, et je t'en ai même piqué des parties, notamment la macro.
Deux choses:
- Si je peux me permettre, ton retfie n'est pas utilisé car placé juste en dessous du goto reception, tes interruptions sont terminées par le return après No-FERR. Je pense que tu as pensé 'call' et écris 'goto' , je fais çà assez souvent moi aussi :wink:
- dans mon code je ne peux rien envoyer à partir de la partie main, par contre je fais bien le job si je place les macros au sein de l'interrupt. A partir de là tout fonctionne (emission/reception) mais j'essaie de régler ce petit problème. Merci pour ton aide, j'ai bien avancé et avec Satinas vous m'avez tiré une fière chandelle du pied :-D

Code : Tout sélectionner

;----------------------------------------------------------------------------------------------
;
                                Liaison série asynchrone sur 18F4525
;----------------------------------------------------------------------------------------------

    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

; ---------------------------------------- macros --------------------------------------------

send    macro car
        movlw    car
        btfss    TXSTA,TRMT
        goto     $-2
        nop
        movwf    TXREG
        endm
        
;--------------------------------- adresse de depart après reset -----------------------------
    ORG     H'
0'
    goto    init      

;--------------------------------------- interruptions ---------------------------------------

    ORG        H'
08'
            ; ----------- test pour savoir si on a reçu un caractère
            btfss    PIR1,RCIF            ; registre plein ? si oui on saute à réception
            goto    int1                ; sinon on saute au test emission         

reception
            movff    RCREG,Tampon_REC    ; lecture de RCREG           
            btfss    RCSTA,OERR            ; test d'
une erreur d'overrun
            goto    int1
            ; traitement de l'
erreur d'overrun
            bcf        RCSTA,CREN            ; on efface le bit OERR
            bsf        RCSTA,CREN            ; on relance la réception
            

            ; ----------- on passe ensuite au test pour émission    
int1        btfss    PIR1,TXIF            ; TXREG plein ?    si oui on saute à emission    
            goto    int2                ; sinon on termine
    
emission
            ; D'
ici je peux envoyer mes caractéres alors que çà ne veut pas le faire dans le main
            send     
'F'
            send    '6'
            send    'F'
            send    'C'    
            send    
'O'
            send    ' '
            send    .10
            send    .13

boucle_EM
            btfss    PIR1
,TXIF
            goto    boucle_EM

int2        
; traitement des autres interruptions
            
            retfie
            

         
;----------------------------------- Initialisations -------------------------------------------------
init
            
            
; ------------- ADCON0 et ADCON1(convertisseur ana/digital)
            bcf    ADCON0,ADON            ; convertisseur a/n dévalidé
            movlw    0xFF
            movwf    ADCON1
,PCFG3    ; on passe tout en digital (pas logique puisque ADON=0 mais je préfère)
            
            
; ------------- INTCON (controle des interruptions)
            movlw    b'11000000'
            movwf    INTCON
                                    
; bit 7 (GIE/GIEH) = 1  activation des interruptions
                                    
; bit 6 (PEIE/GIEL) = 1 Peripheral interrupt enable bit
                                    
; bit 5 (TMROIE) = 0 
                                    
; bit 4    (INTOIE) = 0 
                                    
; bit 3 (RBIE) = 0
                                    
; bit 2 (TMROIF) = 0
                                    
; bit 1 (INTOIF) = 0
                                    
; bit 0 (RBIF) = 0
                                    
            
; ------------- RCON (reset control register)
            movlw    b'10000000'
            movwf    RCON
                                    
; bit 7 (IPEN) =1 Priorités activées
                                    
; bit 6 (SBOREN) = 0
                                    
; bit 5 (nc) = 0 non implémenté
                                    
; bit 4 (not RI) = 0 reset instructions flag bit
                                    
; bit 3 (not TO) = 0 watchdog timer time-ourt flag bit
                                    
; bit 2 (not PD) = 0 Power-down detection flag bit
                                    
; bit 1 (not POR) = 0 Power-on reset status bit
                                    
; bit 0    (not BOR) = 0 Brown-out reset status bit

            
; ------------- IPR1 (priorités interruptions)
            movlw    b'00110000'
            movwf    IPR1
                                    
; bit 7 (PSPIP) = 0 priorité port //
                                    ; bit 6 (ADIP) = 0 priorité Convertisseur A/D
                                    
; bit 5 (RCIP) = 1 haute priorité réception EUSART
                                    
; bit 4 (TXIP) = 1 haute priorité transmission EUSART
                                    
; bit 3 (SSPIP) = 0 liaison asynchrone
                                    
; bit 2 (CCP1IP) = 0 priorité CCP1
                                    
; bit 1 (TMR2IP) = 0 priorité Timer2
                                    
; bit 0 (TMR1IP) = 0 priorité Timer1
            
            
; ------------- PIE1 (validations interruptions)
            movlw    b'00110000'
            movwf    PIE1
                                    
; bit 7 (PSPIE) = 0 Port parallèle
                                    
; bit 6    (ADIE) = 0 A/D converter
                                    
; bit 5 (RCIE) = 1 interrupt reception activée
                                    
; bit 4 (TXIE) = 1 interrupt emission activée
                                    
; bit 3 (SSPIE) =  0  Master synchronous port
                                    
; bit 2 (CCP1IE) = 0 CCP1
                                    
; bit 1 (TMR2IE) = 0 TMR2    
                                    
; bit 0 (TMR1IE) = 0 TMR1

            
;-------------- TXSTA (Transmission EUSART)
            movlw    b'00100100'
            movwf    TXSTA
                                    
; bit 7 (CSRC) = 0 (non utilisé)
                                    ; bit 6 (TX9) = 0   8 bits de transmission                                    
                                    
; bit 5 (TXEN) = 1  autorise la transmission
                                    
; bit 4 (SYNC) = 0  mode asynchrone
                                    
; bit 3 (nc) = 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é)
                                    
            
;------------- RCSTA (Reception EUSART)
            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 don't care = on s'en tape
                                    
; bit 4 (CREN) = 1  autorise la reception
                                    
; bit 3 (ADDEN) = 0 non utilisé en 8 bits
                                    
; bit 2 (FERR) = 0 no framing error
                                    
; bit 1 (OERR) = 0 no overrun error
                                    
; bit 0 (RX9D) = 0 mode 8 bits
                                    
            
; ------------- vitesse de transmission
            movlw    d
'25'                ; réglages sur 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
            movwf    SPBRG
            bcf        BAUDCON
,BRG16        ; réglé à 8bits    
            
            bcf        PORTC
,4                ; reset led témoin de réception    connectée sur Rc5
            
            
; ------------ PORT C
            movlw     B
'11000000'            ; Rc6 et Rc7 en input    
            movwf    TRISC
            clrf    PORTD
            goto     main

            
; -------------------------------------- Programme principal --------------------------------------
main      
            
; d'ici rien n'est envoyé, pas encore trouvé pourquoi
            send     
'F'
            send    'A'
            send    'N'
            send    'T'    
            send    
'A'
            send     'S'
            send    'P'
            send    'I'
            send    'C'
            send    ' '
            send    .10
            send    .13
            goto main
        
        
          END
      


Ce code est sensé envoyer 'F6FCO' à partir de l'interrupt emission et 'FANTASPIC' à partir du main, voici le résultat:

1t.JPG
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:


Retourner vers « Langage ASM »

Qui est en ligne

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