Liaison RS232 Pic 18F2620 vers PC

fun_olivier Messages postés 2 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 1 mars 2005 - 25 févr. 2005 à 11:42
phenojeff Messages postés 87 Date d'inscription jeudi 10 octobre 2002 Statut Membre Dernière intervention 4 avril 2008 - 1 mars 2005 à 18:11
Bonjour je dois faire un programme qui permet de relier un Pic 128F2620 avec un Pc via une liaison USART . Le Pic envoi un caractere, puis reçoit une valeur du Pc. Voici le code que j'ai réalisé:

---------------------------------------------------------------------------------------------

list p=18f2620 ; Définition de processeur
#include ; Fichier include


;__CONFIG _CP_OFF _HS_OSC_1H


; ------------Direction des ports I/O--------------


val_baud equ 25


DIRPORTA EQU B'11010100' ; RA6 & RA7 en entrées pour quartz
DIRPORTB EQU B'11111111'
DIRPORTC EQU B'10111111' ; RC7 en entrée & RC6 en sortie


org 0 ; le reset vector est placé en 0x00h
goto start


;***********************************************************************;
; ;
; PROGRAMME PRINCIPAL ;
; ;
;***********************************************************************;
org 0x20
start
call init


;***********************************************************************;
; TRANSMISSION ;
;***********************************************************************;
loop_1
btfss TXSTA,1,0
goto loop_1
movlw 0x15
movwf TXREG,0
; goto loop_1


;***********************************************************************;
; RECEPTION ;
;***********************************************************************;
loop_2
bsf RCSTA,CREN,0 ; On établi la reception permanente
btfss PIR1,RCIF,0 ; Test du flag dans PIR1 pour savoir si l'octet
goto loop_2 ; a été reçuet que le buffer est plein.Si le bit
movf RCREG,0,0 ; est à 1 on va récuperer l'octet dans RCREG


;***********************************************************************;
; ;
; INITIALISATIONS ;
; ;
;***********************************************************************;


init


;----Initialisation des ports


movlw 0x07
movwf ADCON1


clrf PORTA,0
clrf PORTB,0
clrf PORTC,0


movlw DIRPORTA
movwf TRISA,0


movlw DIRPORTB
movwf TRISB,0


movlw DIRPORTB
movwf TRISC,0


;--------Initialisation de la liaison serie--------


movlw b'10100110' ; Initialisation de la transmission
movwf TXSTA,0


movlw b'10010000' ; Initialisation de la reception
movwf RCSTA,0


movlw val_baud
movwf SPBRG,0 ; choix de la vitesse de transmission à 19200bauds


bsf BAUDCON,BRG16,0 ; Generateur de bauds sur 16bits


RETURN


END

---------------------------------------------------------------------------------------------

Pour ceux qui connaissent ce Pic, pensez - vous que ce code est correct?

De plus, je dois utilisé l'horlaoge interne du Pic et non un quartz externe, mais je ne sais pas comment le configurer! C'est avec "INTIO1", mais j'en sais pas plus...

Merci

4 réponses

phenojeff Messages postés 87 Date d'inscription jeudi 10 octobre 2002 Statut Membre Dernière intervention 4 avril 2008
1 mars 2005 à 07:23
Allo la reponse est non ca ne marchera pas, pour la question horloge interne sans quartz il doit etre comme celui ci pas sur mais verifie
un 1320 vire a 8 Mhz comme ca, ca doit pas faire longtemps que tu programme les 18F jai pas faite de test en mplab, ton bout de code va peu etre envoyer et recevoire mais regarde apres la reception
movf RCREG,0,0 ; est à 1 on va récuperer l'octet dans RCREG
il va repasser dans le init et la faire un return ca sera pas jolie il va faire un beau reset
il y aurait encore un peu d ouvrage a lui faire
autre chose que je viend de voire
DIRPORTA EQU B'11010100' ; RA6 & RA7 en entrées pour quartz
si tu mais un quartz oublie RA6 et RA7 des que tu mais _HS_OSC_1H tu perd le control des deux pin.
si tu est vraiment mal pris fait moi un signe et je vais te faire une code maquette du 18F2620

list p=18f1320
#include
__CONFIG _CONFIG1H, b'00001000'
__CONFIG _CONFIG2L, b'00001101'
__CONFIG _CONFIG2H, b'00011110'
__CONFIG _CONFIG3H, _MCLRE_ON_3H
__CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVR_OFF_4L ; b'10000001' ;
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H

Init_rc
; Active internal RC à 8 MHz
clrf OSCTUNE
movlw b'11111110' ;
movwf OSCCON

a++
Tu vas la faire clignoter cette led !!
0
fun_olivier Messages postés 2 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 1 mars 2005
1 mars 2005 à 14:38
Merci pour ton aide, j'ai essayé de modifier mon code et ça donne ça :

list p=18f2620 ; Définition de processeur
#include ; Fichier include


__CONFIG _CONFIG1H, _OSC_INTIO7_1H ; INT RC-CLKOUT on RA6, PORT on RA7
__CONFIG _CONFIG2L, _BOREN_OFF_2L&_PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H
__CONFIG _CONFIG4L, _DEBUG_OFF_4L&_STVREN_ON_4L&_LVP_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L&_CP1_OFF_5L&_CP2_OFF_5L&_CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H&_CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L&_WRT1_OFF_6L&_WRT2_OFF_6L&_WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTB_OFF_6H&_WRTC_OFF_6H&_WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L&_EBTR1_OFF_7L&_EBTR2_OFF_7L& _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H


; ------------Direction des ports I/O--------------


val_baud equ d'25'


DIRPORTA EQU B'11010100' ;
DIRPORTB EQU B'11111111'
DIRPORTC EQU B'10111111' ; RC7 en entrée & RC6 en sortie



org 0 ; le reset vector est placé en 0x00h
goto start


;***********************************************************************;
; ;
; PROGRAMME PRINCIPAL ;
; ;
;***********************************************************************;
org 0x20
start
call init


;***********************************************************************;
; TRANSMISSION ;
;***********************************************************************;


;loop ; Boucle de transmission et de réception
trans
bsf TXSTA,TXEN,0 ; Mets à 1 TXEN pour emettre
btfss TXSTA,TRMT,0 ; Test pour savoir si octet présent ds registre
goto trans ; de transfert (1 = vide)
movlw 0x50 ; Envoi de 0x50
movwf TXREG,0
bcf TXSTA,TXEN,0 ; Arret de la transmision
goto trans



;***********************************************************************;
; RECEPTION ;
;***********************************************************************;


;recep


;bsf RCSTA,CREN,0 ; On établi la reception permanente
;btfss PIR1,RCIF,0 ; tester si = 1 message recu
;goto recep ; non = 0 attendre
; movf RCREG,0,0 ; charger octet recu
; bcf RCSTA,CREN,0 ; On arrete la reception
;goto loop


;***********************************************************************;
; ;
; INITIALISATIONS ;
; ;
;***********************************************************************;


init


;----Initialisation des ports


movlw 0x07
movwf ADCON1,0


clrf PORTA,0
clrf PORTB,0
clrf PORTC,0


movlw DIRPORTA
movwf TRISA,0


movlw DIRPORTB
movwf TRISB,0


movlw DIRPORTC
movwf TRISC,0


;----- Initialisation Quartz 8Mhz------;


movlw b'01110000' ; Valeur pour 8Mhz
movwf OSCCON,0 ;
Stable btfss OSCCON,IOFS,0 ; Frequence stable?
bra Stable ; Non, donc boucle



;------- Initialisation liaison serie--------
;
INIT232 bcf PORTC,TX,0
bsf PORTC,RX,0
movlw b'10010000' ; SPEN=1, CREN=1
movwf RCSTA,0 ;
movlw b'00100100' ; TXEN=1, SYNC=0, BRGH=1
movwf TXSTA,0 ;
clrf BAUDCON,0 ; 8 bit SPBRG
movlw val_baud ; Valeur pour 19.2kb (8-mhz)
movwf SPBRG,0 ;
movf RCREG,W,0 ; Efface le buffer Rx


RETURN


END

Pour le moment j'ai désactivé la réception . Car la fonction de transmission toute seule ne marche pas ! Vous savez pourquoi? Pour le moment je voudrai juste envoyer en continu. Sinon est il necessaire de mettre le ",0" pour faire des operations dans les registres suivant les banques?

Merci
0
phenojeff Messages postés 87 Date d'inscription jeudi 10 octobre 2002 Statut Membre Dernière intervention 4 avril 2008
1 mars 2005 à 17:54
Allo
Reponse au sujet du ,0 pour le moment tu est pas oubliger rien si tu change le BSR de banque la il faut y penser mais la ca marchera pas ta encore des erreur dans les registre de CONFIG pour savoir si ton pic vire mais toi une led avec une resitance dison RC0 et fait la flacher.
a++
0
phenojeff Messages postés 87 Date d'inscription jeudi 10 octobre 2002 Statut Membre Dernière intervention 4 avril 2008
1 mars 2005 à 18:11
Regarde ca dans un nouveau projet je doit pas etre loin

list p=18f2620 ; Définition de processeur
#include ; Fichier include


__CONFIG _CONFIG1H, 0x38
__CONFIG _CONFIG2L, 0xF8
__CONFIG _CONFIG2H, 0xFE
__CONFIG _CONFIG4L, 0x81
__CONFIG _CONFIG5L, 0xBB
__CONFIG _CONFIG5H, 0xFF
__CONFIG _CONFIG6L, 0xFF
__CONFIG _CONFIG6H, 0xFF
__CONFIG _CONFIG7L, 0xFF
__CONFIG _CONFIG7H, 0xFF



;//////////////// CALCUL DE LA VITESSE DU PORT COMM //////////////////////
#define FOSC D'8000000' ; <<< frequence du quartz[Hz], max. 20 MHz
#define BAUD D'19200' ; <<< vitesse du port serie [bit/sec]
#define BAUD_REAL (FOSC/(D'16' * BAUD))-1 ;Haute Vitesse TXSTA Bit 2 =1


#define LED1 PORTC,RC0 ;Led sur RC0


; ------------Direction des ports I/O--------------
DIRPORTA EQU B'11010100' ;
DIRPORTB EQU B'11111111'
DIRPORTC EQU B'10111110' ; RC7 en entrée & RC6 en sortie,RC0 en sortie
;*******************************************************************
; VARIABLE
;*******************************************************************
CBLOCK 0x00
PDel0 :1
PDel1 :1
PDel2 :1
ENDC
;*******************************************************************
; VECTOR DU RESET
;*******************************************************************


ORG 0x0000
GOTO init
;*******************************************************************
; INTERUPTION HAUTE
;*******************************************************************
ORG 0x0008
GOTO HighInt
;*******************************************************************
; INTERUPTION BASE
;*******************************************************************
ORG 0x0018 ; vecteur d'interruption basse priorité
GOTO LowInt
;*****************************************************************
; INTERUPTION HAUTE
;*****************************************************************
HighInt:


retfie FAST

;*****************************************************************
; INTERUPTION BASE
;*****************************************************************
LowInt:

retfie FAST ; retour avec restauration automatique


;***********************************************************************;
; PROGRAMME PRINCIPAL ;
;***********************************************************************;
Main
movlw 0x41 ;envoyer un "A"
call transmet_rs232
Main_P
call PDelay
BTG LED1 ;inverse la led
bra Main_P
;***********************************************************************;
; TRANSMISSION ;
;***********************************************************************;


transmet_rs232
movwf TXREG
bsf TXSTA,TXEN
attend_fin_octet
btfss TXSTA,TRMT
goto attend_fin_octet
return



;***********************************************************************;
; RECEPTION ;
;***********************************************************************;
Rx_Rs232_Sans_Int
btfss PIR1,RCIF ; on attend ce bit soit a 1 , ce qui signale une reception
bra Rx_Rs232_Sans_Int
movf RCREG,W
return


;***********************************************************************;
; INITIALISATIONS ;
;***********************************************************************;
init
;----Initialisation des ports


movlw 0x0F ;Configure toute les pins en digital i/o
movwf ADCON1


clrf PORTA
clrf PORTB
clrf PORTC
movlw DIRPORTA
movwf TRISA
movlw DIRPORTB
movwf TRISB
movlw DIRPORTC
movwf TRISC


;----- Initialisation Quartz 8Mhz------;
clrf OSCTUNE
movlw b'11111110' ;
movwf OSCCON
Stable
btfss OSCCON,IOFS ; Frequence stable?
bra Stable ; Non, donc boucle



;------- Initialisation liaison serie--------
;
; initialiser USART
; -----------------
bcf IPR1,RCIP ;Interruption basse priorité
bcf IPR1,TXIP ;Interruption basse priorité
movlw B'00000000' ;
movwf TXSTA ; dans registre de contrôle
movlw B'10000000' ; module USART en service
movwf RCSTA ; dans registre de contrôle


movlw BAUD_REAL
movwf SPBRG ; Vitesse du Port Comm
bsf TXSTA,BRGH

; lancer la réception
; --------------------
bsf TXSTA,TXEN ; émission en service.
bsf RCSTA,CREN ; lancer la réception
bcf PIE1,RCIE ; interdire interruption réception


bra Main ; programme principal;; Delay
;=============================================================================
;-----------------------------------------------------------------------------
PDelay movlw .165 ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .147 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 cycle delay
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
bra PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
bra PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
bra PLoop0 ; 2 no, loop
return ; 2+2 Done
END
0
Rejoignez-nous