uart sur pic 18f2550
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

uart sur pic 18f2550



  1. #1
    juju_du_26

    uart sur pic 18f2550


    ------

    Bonjour a tous

    J'essaie de faire une liaison série rs232 entre mon pc et le pic 18f2550
    en utilisant l'uart du pic . J'ai câblé un max232 entre les deux .
    Sur le pc j'utilise le logiciel " Tera Term "( équivalent de l'HyperTerminal ) avec un câble USB/série
    Si je relie l'entrée / sortie du max232 ( coté TTL ) > je vois bien s'afficher ce que je tape .
    Liaison série : 9600 Bauds / 8 bits de données / 1 bit de stop

    Maintenant , la partie programmation du pic ( en asm )
    J'ai vu http://fabrice.sincere.pagesperso-or...usart628.htm#8

    J'ai donc fais ceci ( en regardant aussi la doc du pic)
    Dans la partie initialisation
    Code:
     clrf   PORTC
     clrf   LATC 
     movlw B'10010000' 
     movwf RCSTA
     bsf TRISC , 7    ; RX
     bsf TRISC , 6    ; TX
     movlw B'00100100' 
     movwf TXSTA
     movlw D'25'
     movwf SPBRG
    Les sous programmes d'envoi et de réception

    Code:
    envoi_rs232
    	movf mot,W 
    	movwf TXREG
    	return
    
    
    recoit_rs232
    	movf RCREG,W
    	movwf mot
    	return
    Je cherche juste a recevoir et renvoyer l'octet reçu .
    Y a-t-il un autre registre du pic a configurer ?
    Faut il absolument utiliser les interruptions ?

    Merci

    -----

  2. #2
    luc_1049

    Re : uart sur pic 18f2550

    Bonjour

    Vous devriez préciser sans sous entendu s'il s'agit de la réception sur le PC ou sur le PIC qui fonctionne.

    En effet même si vous ne l'avez pas dit vous recevez et visualiser peut être les données reçues sur un éventuel lcd sur votre carte PIC !

    Si vous n'utilisez pas les IT , il vous faut alors scruter le bit d'état ad-hoc pour extraire OU envoyer les données.

    Si en face vous avez configurez tetra term avec echo, sans IT vous ne pourez gérer Rx et Tx en même temps puisque votre PIC sera dédié dans l'état qu'à une seule des "tâches" dans une boucle. Sans echo il n'y aura pas sans frappe au clavier de renvoi vers votre PIC.

    Une des bonnes solutions est donc de valider les interruptions pour au moins la réception sur LE PIC quitte à faire la seule émission dans une boucle au moins dans une première version préliminaire de votre logiciel.

    Si vous avez un oscilloscope il sera le bienvenu pour être sur de l'émission du PIC. Enfin pour vous affranchir du PC et de sa carte USB/Rs232, connecter le rx ttl du max 232 sur le Tx ttl du max 232 sur votre carte PIC.

    cdlt

  3. #3
    paulfjujo

    Re : uart sur pic 18f2550

    bonjour,


    pour l'envoi de car, verifier si le tampon est dispo..
    ex avec 16F876, donc à adapter au 18F2550 ..

    Code:
    Rs_Putchar
    	bank0
    Rs_P1
    	btfss   PIR1,TXIF      ; while(!TXIF)
    	goto    Rs_P1
    	movwf   TXREG          ; TXREG = octet
    	return

    pour la reception s'inspirer de ceci


    Init de variables
    Code:
    *******************
    ; COMMON DATA AREA
    ;--------------------
    	CBLOCK 0x71
    ;Attention 0x70 used by ICD
    ; 0x71 ... 0x7B used by bootloader
    	w_temp: 1   	; Sauvegarde registre W
    	status_temp: 1	; sauvegarde registre STATUS
    	FSR_temp: 1   	; sauvegarde FSR (si indirect en interrupt)
    	PCLATH_temp: 1
    	time:1
    	Buff_In_Ptr: 1	; pointeur sur caractere courant buffer entree
    	Buff_Out_Ptr: 1	; pointeur sur caractere courant buffer sortie
    	flags : 1      	; 8 flags divers
    	value
    	ADR_HI
    	ADR_LO
    	MenuChoice
    	_Car_Recus		; compteur car recus
    	Pas
    	ENDC
    LastCDA equ Pas
    	IF ( LastCDA > 0x7E )
    	ERROR   "Attention debordement zone RAM Bootloader en bank0"
    	ENDIF

    Code:
    ;***********************
    ;       interruptions
    ;***********************
    	org 0x04
    
    	movwf w_temp ; sauver registre W
    	swapf STATUS , w ; swap status avec resultat dans w
    	movwf status_temp ; sauver status swappe
    	movf FSR , w ; charger FSR
    	movwf FSR_temp ; sauvegarder FSR
    	movf PCLATH , w ; charger PCLATH
    	movwf PCLATH_temp ; le sauver
    	clrf PCLATH ; on est en page 0
    	bank0 ; passer en banque0
    	btfss   INTCON,PEIE  ; tester si interrupt PERIPH autorisee
    	goto restorereg
    
    
    ;--------------------------------
    ; Interruption reception USART
    ;-------------------------------
    Uart_Rx_Int
    	bank1
    	btfss PIE1,RCIE ; tester si interrupt autorisee
    	goto Timer1_int ; non sauter
    	bank0
    	btfss PIR1,RCIF ; oui, tester si interrupt en cours
    	goto Timer1_int ; non sauter
    	call intrc  ; oui, traiter interrupt
    	BCF PIR1,RCIF
    ;--------------------------------
    ; Interruption TIMER1
    ;-------------------------------
    etc ....
    restorereg
    	bank0
    	movf PCLATH_temp , w    ; recharger ancien PCLATH
    	movwf PCLATH            ; le restaurer
    	movf FSR_temp , w       ; charger FSR sauve
    	movwf FSR               ; restaurer FSR
    	swapf status_temp , w   ; swap ancien status, resultat
    	movwf STATUS            ; restaurer status
    	swapf w_temp , f        ; Inversion L et H de l'ancien sans modifier Z
    	swapf w_temp , w        ; Reinversion de L et H dans W restaure sans modifier
    	retfie                  ; return from interrupt
    la routine de traitement IT USART
    Code:
    ;*************************************************
    ;      INTERRUPTION RECEPTION USART              *
    ;*************************************************
    ; Recoit le caractere de l'USART et le place dans le buffer d'entree.
    ; Si la longueur atteint Taille_buffer(=14), on n'encode plus, et on place 0x0D 0x0A
    ;  en derniere position
    ; Si la reception est terminee (longueur atteinte ou 0x0A recu), on stoppe les
    ; interruptions de reception et on repositionne le pointeur au debut du buffer
    ;-----------------------------------------------------------------------------
    intrc
    ; tester si erreur de frame
        bank0
    	btfsc   RCSTA,FERR      ; tester si erreur de frame
    	bsf     ER_FR           ; oui, signaler erreur de frame
    ; lire octet recu
    ;	bsf     STATUS,IRP      ; pointer banques 2 et 3 en indirect
    	movf    Buff_In_Ptr,w   ; charger pointeur destination
    	movwf   FSR             ; dans pointeur d'adresse
    	movf    RCREG,w 		; charger octet recu
    	movwf   dummy			; sauver dans duummy
    	movwf   INDF            ; sauver dans buffer
    	incf    Buff_In_Ptr,f   ; incrementer pointeur de caracteres
    ;	bcf 	STATUS,IRP		;@modif 17/7/09
    	incf 	_Car_Recus,f
    ; tester si erreur d'overflow
    ;	btfss   RCSTA,OERR      ; non, erreur d'overflow?
    ;	goto    intrc2  		; non, verifier caractere
    ;	bcf     RCSTA,CREN      ; oui, arret de la reception (reset de OERR)
    ;	bsf     RCSTA,CREN      ; remise en service de la reception
    ;	bsf     ER_OV           ; signaler erreur overflow
    ; tester si caractere recu = 0x0A ou 0x0D
    intrc2
    ; test fin de message
    	movlw    .13
    	xorwf   dummy,f         ; 0A=10 ou 0D=13 (LF ou CR)
    	btfsc   STATUS,Z        ; W- caractere  -> negatif ?si code caractere <14
    	goto Buffer_full
    ; test abort
    ;	movlw    .27
    ;	xorwf   dummy,f         ; ESC=27
    ;	btfsc   STATUS,Z        ; W- caractere  -> negatif ?si code caractere <14
    ;	BSF 	Abort_Saisie    ; oui,annule message
    ;	btfsc   STATUS,Z
    ;	goto Buffer_full
    ; verifier si buffer plein
    intrc3
    ;	movf    Buff_In_Ptr,w
    ;	xorlw   LOW Buffin + Taille_buffer -1 ; comparer avec dernier emplacement possible
    ;	btfsc   STATUS,Z        ; identique?
    	return					; Buffer NON Plein, on pousuit
    
    Buffer_full
    	bank1     				; passer banque 1
    	bcf    PIE1,RCIE       	; fin des interruptions de reception
    	bank0   			    ; repasser banque 0
    	BCF RCSTA ,CREN         ; Disable reception
    	bsf Fin_de_saisie
    	return                  ; non, fin de reception
    l'init dans le main()

    Code:
    **********************************************
    ; INITIALISATIONS
    ;**********************************************
    Init
    	bank0
    	clrf _Car_Recus
    	clrf _Cpt1          ; compteur pour debug
    	clrf _Cpt1+1
    	clrf _Temp1			; simule les 8E du PCF8574
    	clrf MenuChoice
    	clrf PORTA
    	clrf PORTB
    	clrf PORTC
    	clrf    flags           ; effacer flags
    	movlw   LOW Buffin      ; adresse du buffer de reception
    	movwf   Buff_In_Ptr     ; dans pointeur
    	movlw   LOW Buffout     ; adresse basse du buffer d'emission
    	movwf   Buff_Out_Ptr    ; dans pointeur
    qui contient aussi l'init de l'UART

    Code:
    ---------------------------------------------------------------------
    ;config  UART asynchrone PIC 16F877 DIL 40 broches
    ; pin 25  RC6 Tx ---vert -----  3 de DS275 --- RS232 --> Ecran
    ; pin 26  RC7 Rx ---blnc/vert-- 1 de DS275 --- RS232 <-- Clavier
    ;----------------------------------------------------------------------
    ;configures RC7/RX/DT and RC6/TX/CK pins as serial port
    	CLRF RCSTA              ; SYNC=0 asynchrone , mode 8 bits data
    	BSF RCSTA,SPEN          ;serial port Enable
    	BSF RCSTA ,CREN         ;Enable receiver
    	bank1
    	CLRF TXSTA                      ; 8 bits datas
    	IF HIGH_SPEED == 1  ;
    	bsf  TXSTA,BRGH      ;
    	ELSE
    	bcf   TXSTA,BRGH
    	ENDIF
    	bsf   TXSTA,TXEN              ;transmit enable bit
    	movlw DIVIDER     ;generateur de baud rate  =32 @10MHz for 19200bds
    	movwf SPBRG
    	bank0
    	movlw TIMEOUT+1
    	movwf time
    ;	ifdef TRACING
    ;	movlw '0'
    ;	call Trace		; trace de debugging
    ;	endif

  4. #4
    juju_du_26

    Re : uart sur pic 18f2550

    Merci déjà pour ta réponse.
    Oui , c'est bien l'affichage sur le pc qui fonctionne bien en passant par le max232 .
    Le pic déconnecté , la liaison " pc > max232 > sorties/entrées rebouclées > max232 > pc " fonctionne .
    Si je retire le rebouclage , évidement je ne reçoit rien .

    Mon problème vient donc bien du coté du pic .
    Je précise que , pour l'instant il n'y a rien autour du pic . A part son quartz 4MHz .
    Pour l'instant je voudrais juste recevoir un octet du pc > pic
    pour le renvoyer du pic > pc .
    Et malheureusement, je n'ai pas d'oscilloscope .

    Edit : Je viens de voir que Paulfjujo vient d'envoyer une réponse que je vais lire
    Dernière modification par juju_du_26 ; 14/06/2013 à 11h48.

  5. A voir en vidéo sur Futura
  6. #5
    juju_du_26

    Re : uart sur pic 18f2550

    Bonsoir

    En regardant la réponse de Paulfjujo et aussi le montage suivant
    http://fabrice.sincere.pagesperso-or.../rs232temp.htm
    et plus précisément le fichier asm
    http://fabrice.sincere.pagesperso-or...e/tempUART.asm

    Voila ce que j'ai écrit
    Code:
    ;**********************************************************************
    
    	LIST      p=18F2550            ; Définition de processeur
    	#include <p18F2550.inc>        ; Définitions des constantes
    
    ;*********************************************************************
    ;                             DEFINE                                 *
    ;*********************************************************************
    
    
     #DEFINE R232	 	PORTC,1		; entree rs232
     #DEFINE T232	 	PORTC,2		; sortie rs232
    
    
    	CBLOCK 0x71
    
    	STATUS_TEMP : 1 	; sauvegarde du registre STATUS (routine d'interruption)
    	W_TEMP : 1 			; sauvegarde du registre W		(routine d'interruption)
    	donnee_r : 1 		; 8 bits de données en réception
    	donnee_t : 1 		; 8 bits de données en émission
    
    	ENDC
    
    
    ;**********************************************************************
    ;                      DEMARRAGE SUR RESET                            *
    ;**********************************************************************
    
    	org 0x000 		; Adresse de départ après reset
      	call    init		; Adresse 0: initialiser
    	goto	start
    
    
    ;*********************************************************************
    ;                      INTERRUPTIONS                          *
    ;*********************************************************************
    
    	org 0x0008	 			; vecteur d'interruption
    
    	movwf 	W_TEMP 
    	swapf 	STATUS,W
    	movwf 	STATUS_TEMP		; sauvegarde du registre W puis du registre STATUS
    
    
    reception 
        movf 	         RCREG , W
        movwf 	donnee_r
    
    emission
    	movf	donnee_t
    	movwf 	TXREG
    
    
    	swapf 	STATUS_TEMP,W		; restauration des registres STATUS puis W
    	movwf 	STATUS	
    	swapf	W_TEMP,f
    	swapf 	W_TEMP,W
    
    	retfie
    
    
    ;**********************************************************************
    ;                       INITIALISATIONS                               *
    ;**********************************************************************
    
    init		; initialisation des ports en entree ou en sortie
    
    	clrf	PORTA  		; mise à 0 des sorties du port A
    	clrf	PORTB 		; mise à 0 des sorties du port B
    
    	movlw 	B'00000111'
    	movwf 	CMCON			; inactivation des comparateurs analogiques
    
    	CLRF	TRISA
    	CLRF	TRISB		; port A et A en sortie
    
    	movlw 	B'11111011'
    	movwf 	TRISC
        movlw	D'25'
        movwf 	SPBRG
    	movlw	B'00100100'	
    	movwf	TXSTA
    	movlw 	B'10010000'	 
    	movwf 	RCSTA
    
    	clrf 	donnee_r
    	clrf 	donnee_t
    ;	clrf 	flag_t
    ;	clrf 	flag_e
    
        bsf 	INTCON, GIE 	; autorisation globale des interruptions 
    	bsf 	INTCON , PEIE 	; autorisation des interruptions des périphériques
        bsf 	PIE1 , RCIE 	; autorisation de l'interruption de réception de l'USART
    	bsf 	PIE1 , TXIE 	; autorisation de l'interruption d'émission de l'USART	
    
    	BSF		T232
    
    	return
    
    
    ;*********************************************************************
    ;                      PROGRAMME PRINCIPAL                           *
    ;*********************************************************************
    
    start
    
    	goto	start
    	end
    Lorsque j'envoi un octet ( une lettre tapé dans Tera Term ) , il me le renvoi a l'infini au lieu d'une seule fois
    .
    Dernière modification par juju_du_26 ; 15/06/2013 à 19h34.

  7. #6
    paulfjujo

    Re : uart sur pic 18f2550

    bonjour,

    dans le traitement de l'interrupt,il ne faut pas traiter en meme temps les
    2 sources possibles d'interrupt.
    En regle generale on test quel flag d'interrupt est monte pour
    separer les traitements et dans chaque fin de traitement on raze le
    flag interrupt.
    dans ton cas,il y traitement
    soit par le flag de reception
    soit par le flag emission
    puisque ces 2 sources d'interrupt ont ete armee dans le main.
    L'envoi du caractere,dans l'interrupt, genere une demande d'interrupt
    via le flag TXIF,qui n'est pas mis a zero..donc cela tourne en rond !

    ne pas autoriser l'interrupt transmission
    bcf PIE1,TXIE
    Laisse seulement la reception dans l'interrupt
    et dans ta boucle principal du main, insere l'envoi du caractere
    si le flag interrupt est monte.
    Dernière modification par paulfjujo ; 16/06/2013 à 09h22.

  8. #7
    juju_du_26

    Re : uart sur pic 18f2550

    Salut et merci pour tes conseils
    J'ai enlevé l'interruption de transmission ( bcf PIE1,TXIE ) et
    Dans les interruptions , la réception est ok ( je renvoie quand même l'octet reçu au pc pour le voir)

    La partie émission de données sera gérée dans le programme principal .

    Encore merci déjà pour toutes ses infos .

  9. #8
    RISC

    Re : uart sur pic 18f2550

    Salut,

    N'hésites pas à consulter le site de référence en français pour les PIC16 / PIC18 et l'assembleur de Bigonoff. Des centaines de pages de descriptions très détaillées

    a+

  10. #9
    juju_du_26

    Re : uart sur pic 18f2550

    Bonjour
    Je voudrais maintenant changer l'état d'une sortie ( led1 ) a chaque fois que le pic reçoit le chiffre 1 ( 0x31 an ascii )
    J'ai donc écris ceci dans les interruptions

    Code:
    	org 0x0008	 			; vecteur d'interruption
    
    	movwf 	W_TEMP 
    	swapf 	STATUS,W
    	movwf 	STATUS_TEMP		; sauvegarde du registre W puis du registre STATUS
    
    reception 
                movf 	RCREG , W
               movwf 	donnee_r		; recoit données rs232
    ;emission
    	movf	donnee_t
    	movwf 	TXREG			; renvoit octet sur rs232
    
    
    ; test du code ascii	
    	movlw 0x31		; code ascii pour le 1
    	subwf donnee_r , W		
    
    	btfsc STATUS , Z
    	comf     led1                ;  <<<  inverse état de la sortie
    	btfss STATUS , Z
    	nop
    	
    
    	swapf 	STATUS_TEMP,W		; restauration des registres STATUS puis W
    	movwf 	STATUS	
    	swapf	W_TEMP,f
    	swapf 	W_TEMP,W
    
    	retfie
    mais ca ne fonctionne pas . Pourtant si je met " BSF led1 " , la sortie passe bien a 1
    Je voudrais un changement d'état ( de 0 a 1 ou de 1 a 0 ) a chaque fois .

    Merci

  11. #10
    invite0e5af214

    Re : uart sur pic 18f2550

    Salut,

    L'instruction comf inverse tous les BITS d'un REGISTRE.
    => par exemple : comf PORTA aurait du sens.
    Alors que comf PORTA, 1 n'en a aucun.

    Si je ne dis pas de bétise, pour inverser l'état d'un BIT seul, c'est l'instruction BTG (Bit toggle) qu'il faut utiliser.

  12. #11
    juju_du_26

    Re : uart sur pic 18f2550

    Salut
    En mettant " BTG led1 " , la led s'allume bien au premier envoi du caractère "1" ( la sortie passe bien de 0 a 1 )
    mais ne s'éteinds pas au 2eme envoi ( la sortie ne repasse pas a 0 )

  13. #12
    invite0e5af214

    Re : uart sur pic 18f2550

    Pas normal, certainement que tu ne passes plus dans l'interruption...

    Tu peux reposter l'intégralité de ton code stp ?

  14. #13
    juju_du_26

    Re : uart sur pic 18f2550

    Voila
    Code:
    ;**********************************************************************
    	LIST      p=18F2550            ; Définition de processeur
    	#include <p18F2550.inc>        ; Définitions des constantes
    
    ;*********************************************************************
    ;                             DEFINE                                 *
    ;*********************************************************************
    
     #DEFINE R232	 	PORTC,1		; entree rs232
     #DEFINE T232	 	PORTC,2		; sortie rs232
     #DEFINE led1	 	PORTA,1
    
    	N0	equ 0x30        ; codes ascii
    	N1	equ 0x31
    	N2	equ 0x32
    	N3	equ 0x33
    	N4	equ 0x34
    	N5	equ 0x35
    
    
    	CBLOCK 0x71
    	STATUS_TEMP : 1 	; sauvegarde du registre STATUS (routine d'interruption)
    	W_TEMP : 1 			; sauvegarde du registre W		(routine d'interruption)
    	donnee_r : 1 		; 8 bits de données en réception
    	donnee_t : 1 		; 8 bits de données en émission
    	compt1 : 1
    	ENDC
    
    ;**********************************************************************
    ;                      DEMARRAGE SUR RESET                            *
    ;**********************************************************************
    
    	org 0x000 		; Adresse de départ après reset
      	call    init		; Adresse 0: initialiser
    	goto   start
    
    ;*********************************************************************
    ;                      INTERRUPTIONS                          *
    ;*********************************************************************
    
    	org 0x0008	 			; vecteur d'interruption
    
    	movwf 	W_TEMP 
    	swapf 	STATUS,W
    	movwf 	STATUS_TEMP		; sauvegarde du registre W puis du registre STATUS
    
    reception 
            movf 	RCREG , W
            movwf 	donnee_r		; recoit données rs232
    ;emission
    	movf	donnee_t
    	movwf 	TXREG			; renvoit octet sur rs232
    
    
    ; test du code ascii	
    
    	movlw 0x31				; code ascii pour le 1
    	subwf donnee_r , W		
    	btfsc STATUS , Z
    	btg  led1                ;  <<<  inverse état de la sortie
    	btfss STATUS , Z
    	nop
    
    	swapf 	STATUS_TEMP,W		; restauration des registres STATUS puis W
    	movwf 	STATUS	
    	swapf	W_TEMP,f
    	swapf 	W_TEMP,W
    
    	retfie
    
    
    ;**********************************************************************
    ;                       INITIALISATIONS                               *
    ;**********************************************************************
    
    init		; initialisation des ports en entree ou en sortie
    
    	clrf	PORTA  		; mise à 0 des sorties du port A
    	clrf	PORTB 		; mise à 0 des sorties du port B
    
    	movlw 	B'00000111'
    	movwf 	CMCON			; inactivation des comparateurs analogiques
    
    	CLRF	TRISA
    	CLRF	TRISB		; port A et A en sortie
    
    	movlw 	B'11111011'
    	movwf 	TRISC
            movlw	D'25'
            movwf 	SPBRG
    	movlw	B'00100100'	
    	movwf	TXSTA
    	movlw 	B'10010000'	 
    	movwf 	RCSTA
    
    	clrf 	donnee_r
    	clrf 	donnee_t
    
            bsf 	INTCON, GIE 	; autorisation globale des interruptions 
    	bsf 	INTCON , PEIE 	; autorisation des interruptions des périphériques
            bsf 	PIE1 , RCIE 	; autorisation de l'interruption de réception de l'USART
    	bcf 	PIE1 , TXIE 	; ne pas autoriser'interruption d'émission de l'USART	
    
    	BSF	T232
    
    	return
    
    
    ;*********************************************************************
    ;                      PROGRAMME PRINCIPAL                           *
    ;*********************************************************************
    
    start
    	goto	start
    
    
    
    envoi_rs232
    	movf	donnee_t
    	movwf 	TXREG
    	call	tempo_100us
    	call	tempo_100us
    	return
    
    tempo_100us	
     	movlw  	.200
    	movwf  	compt1
    d1	decfsz 	compt1,1
    	goto    d1		
    	return
    
    
    	end

    N'y aurait il pas un ou des flag a redescendre a la fin de l'interruption ?
    De même j'ai essayer avec plusieurs leds comme ceci

    Code:
    
    	movlw 0x31				; code ascii pour le 1
    	subwf donnee_r , W		
    	btfsc STATUS , Z
    	btg  led1 ,0
    	btfss STATUS , Z
    	
    	movlw 0x32				; code ascii pour le 2
    	subwf donnee_r , W		
    	btfsc STATUS , Z
    	btg  led2
    	btfss STATUS , Z
    
    	movlw 0x33  			; code ascii pour le 
    	subwf donnee_r , W		
    	btfsc STATUS , Z
    	btg  led3
    	btfss STATUS , Z
    
    	movlw 0x34				; code ascii pour le 4
    	subwf donnee_r , W		
    	btfsc STATUS , Z
    	btg  led4
    	btfss STATUS , Z
    	nop
    Et la led en question ( 1 , 2 , 3 ou 4 ) s'allume bien mais ca éteint celle qui été allumé juste avant .

    Merci

  15. #14
    invite0e5af214

    Re : uart sur pic 18f2550

    N'y aurait il pas un ou des flag a redescendre a la fin de l'interruption ?
    Pas de flag à baisser, mais obligation de lire le contenu de RCREG (ce qui doit revenir à baisser un flag en interne), donc c'est bon tu le fais.

    movwf CMCON ; inactivation des comparateurs analogiques
    Contente toi plutot de mettre toutes les IO en digitale ->
    Code:
    movlw 0xff
    movwf ADCON1

  16. #15
    invite0e5af214

    Re : uart sur pic 18f2550

    Tu pourrais par contre tester que c'est bien l'interrupt USART qui t'as fait rentrer dans la routine (même si dans ce cas c'est la seule que tu as autorisé)

    Code:
    btfsc INTCON1, RXIF
    goto reception_usart
    goto exit_interrupt
    
    reception_usart:
      ...
      ...
    
    exit_interrupt:
      retfie

  17. #16
    juju_du_26

    Re : uart sur pic 18f2550

    Salut
    Ca fonctionne bien pour la 1ere led seule ( sur RA1 ) . J'arrive bien a l'allumer et l'éteindre .
    Mais dés que je met les autres led ( RA2 , RA3 , RA4 ) j'ai toujours le même problème .

  18. #17
    juju_du_26

    Re : uart sur pic 18f2550

    Je viens juste de voir ta 2eme réponse
    Je crois que le flag INTCON1, RXIF n'existe pas sur le 18F2550
    Ca doit être le flag PIR1 , RCIF ( Receive Interrupt Flag bit )
    Merci

  19. #18
    paulfjujo

    Re : uart sur pic 18f2550

    bonsoir,

    Citation Envoyé par juju_du_26 Voir le message
    Salut
    Ca fonctionne bien pour la 1ere led seule ( sur RA1 ) . J'arrive bien a l'allumer et l'éteindre .
    Mais dés que je met les autres led ( RA2 , RA3 , RA4 ) j'ai toujours le même problème .

    if faut choisir 1 seule selection..
    (à verifier bra , sinon goto)

    Code:
    
    
    	movlw 0x31				; code ascii pour le 1
    	subwf donnee_r , W		
    	btfss STATUS , Z
    	bra S2
    	btg  led1 ,0
    	bra Sx
    	
    S2	movlw 0x32				; code ascii pour le 2
    	subwf donnee_r , W		
    	btfss STATUS , Z
    	bra S3
    	btg  led2 ,0
    	bra Sx
    
    S3	movlw 0x33  			; code ascii pour le 3
    	subwf donnee_r , W		
    	btfss STATUS , Z
    	bra S4
    	btg  led3 ,0
    	bra Sx
    
    S4	movlw 0x34				; code ascii pour le 4
    	subwf donnee_r , W		
    	btfss STATUS , Z
    	bra SX
    	btg  led4 ,0
    SX	nop
    Dernière modification par paulfjujo ; 19/06/2013 à 17h15.

  20. #19
    juju_du_26

    Re : uart sur pic 18f2550

    Merci a tous pour vos réponses.
    Je viens de faire ce test : mettre les led sur le portB .... et ca fonctionne très bien
    J'arrive bien a allumer et éteindre les leds comme prévu donc
    c'était un problème d'init du portA .

  21. #20
    invite0e5af214

    Re : uart sur pic 18f2550

    Ca doit être le flag PIR1 , RCIF ( Receive Interrupt Flag bit )
    Euh oui c'est exactement ca

Discussions similaires

  1. Horloge PIC 18f2550
    Par invite11fdcbbe dans le forum Électronique
    Réponses: 5
    Dernier message: 15/05/2011, 00h46
  2. programmation du pic 18f2550
    Par invite3a1c1685 dans le forum Électronique
    Réponses: 3
    Dernier message: 11/12/2010, 20h22
  3. Problème de transmission par UART sur PIC 18F
    Par invite2b6500ce dans le forum Électronique
    Réponses: 2
    Dernier message: 18/03/2010, 09h34
  4. Pic 18f2550
    Par inviteac09f73c dans le forum Électronique
    Réponses: 1
    Dernier message: 04/04/2007, 14h04
  5. Possibilité d'avoir 2 UART sur un PIC ??
    Par invitef0dd4a99 dans le forum Électronique
    Réponses: 4
    Dernier message: 24/01/2006, 22h18
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...