Bonjour,
J'essaie de mettre au point une communication RS232 entre un PIC 18F46k20 et une IHM ( codé sous CVI).
J'utilise la carte DEMO Board du PICDEM 2 PLUS.
Le but pour l'instant est d'envoyé un octet de IHM le comparer dans le PIC est d'allumer ou d'éteindre une LED de la carte D'évaluation en fonction de l'octet envoyé.
J'ai déja mis au point ce petit test sur un PIC 16F76 est cela fonctionne parfaitement. Mais là je n'arrive pas à comprendre Pourquoi cela ne fonctionne pas. Si quelqu'un pourrais m'aider à résoudre ce petit problème??
J'utilise un quartz externe à 14,7456 MHZ
Voici mon code :
LIST p= 18f46k20 ; Définition de processeur
#include <p18F46K20.inc> ; fichier include
;=============================================================================
; CONFIGURATIONS EN MODE NORMAL =
;=============================================================================
CONFIG FOSC = HS
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRT = OFF
CONFIG BOREN = ON
CONFIG BORV = 30
CONFIG WDTEN = OFF
CONFIG WDTPS = 1
CONFIG CCP2MX = PORTBE
CONFIG PBADEN = OFF
CONFIG LPT1OSC = OFF
CONFIG HFOFST = OFF
CONFIG MCLRE = ON
CONFIG STVREN = ON
CONFIG LVP = OFF
CONFIG XINST = OFF
CONFIG DEBUG = OFF
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF
CONFIG CPD = OFF
CONFIG WRT0 = OFF
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG WRT3 = OFF
CONFIG WRTC = OFF
CONFIG WRTB = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
CONFIG EBTRB = OFF
;=============================================================================
; ASSIGNATION PROGRAMME =
;=============================================================================
BRGVAL EQU D'95' ; pour un débit de 9615 bauds en mode high-speed
;=============================================================================
; VARIABLES ACCESS RAM =
;=============================================================================
; zone de 96 octets
; -----------------
CBLOCK 0x000 ; zone access ram de la banque 0
flags : 1 ; Flag pour déclancher la mise en sommeil du PIC
; b0 : bit activation de la mise en sommeil
; si a 1 , le PIC se met en mode sleep sinon
; il continue le traitements des données reçus.
OCTET : 1 ; Variable pour stocker l'octet reçu
LEDOFF : 1 ; Variable pour éteindre la LED
LEDON : 1 ; Variable pour allumer la LED
Sommeil : 1 ; Variable pour mettre en sommeil le PIC
w_temp : 1 ; Variable de sauvegarde du registre W
status_temp : 1 ; Variable de sauvegarde du registre status
BSR_temp : 1 ; Variable de sauvegarde du registre FSR
ENDC
;*****************************************************************************
; DEMARRAGE SUR RESET *
;*****************************************************************************
org 0x00 ; Adresse de départ après reset
goto init ; Initialisation du PIC
;=============================================================================
; ROUTINE D'INTERRUPTION =
;=============================================================================
org 0x008 ; Adresse d'interruption
;sauvegarder registres
;---------------------
movff WREG, w_temp ; Sauver registre W
movff STATUS, status_temp ; Sauver registre status
movff BSR, BSR_temp ; Sauver registre BSR
; Interruption RB0/INT
; --------------------
intsw1
btfsc INTCON,INT0IE ; Tester si interruption RB0 autorisée
btfss INTCON,INT0IF ; Oui, tester si interruption RB0 en cours
bra intsw2
call intrb0 ; Oui, traiter interruption RB0
goto restorereg ; et fin d'interruption
; Interruption réception USART
; ----------------------------
intsw2
btfss PIE1,RCIE ; Tester si interruption autorisée
goto restorereg ; Non fin interruption
btfss PIR1,RCIF ; Tester si interruption en cours
goto restorereg ; Non fin interruption
call intrc ; Oui, traiter interruption
goto restorereg ; et fin d'interruption
;restaurer registres
;-------------------
restorereg
movf w_temp , w
movwf WREG ; Restaurer registre W
movf status_temp , w
movwf STATUS ; Restaurer registre status
movf BSR_temp , w
movwf BSR ; Restaurer registre BSR
retfie ; Retour au programme principal
;=============================================================================
; INTERRUPTION =
;=============================================================================
; Interruption RB0
; ----------------
intrb0
bcf INTCON,INT0IF ; Effacer flag interruption RB0
bcf INTCON,INT0IE ; Désactivé Interruption RBO
bcf flags, 0 ; Désactivé le mode sommeil
return ; Retour routine Interruption
; Interruption réception USART
; ----------------------------
intrc
movf RCREG,w ; charger octet reçu dans Variable OCTET
movwf OCTET
bcf RCSTA,CREN ; Mettre fin à la réception
call compare ; Appeller fonction compare
return ; Retour routine Interruption
;=============================================================================
; FONCTION COMPARE =
;=============================================================================
compare
movf OCTET,w ; Compare données reçus avec variable
xorwf LEDOFF,w ; LEDOFF
btfsc STATUS,Z ; Si Z=1 au passe à TLEDOFF sinon on passe
goto TLEDOFF ; à la comparaison suivante
BTG PORTB ,RB2
movf OCTET,w ; Compare données reçus avec variable
xorwf LEDON,w ; LEDON
btfsc STATUS,Z ; Si Z=1 au passe à TLEDON sinon on passe
goto TLEDON ; à la comparaison suivante
movf OCTET,w ; Compare données reçus avec variable
xorwf Sommeil,w ; Sommeil
btfsc STATUS,Z ; Si Z=1 au passe à TSommeil sinon on passe
goto TSommeil ; à la comparaison suivante
return ; retour à l'interruption
;=============================================================================
; CONFIGURATION PORT =
;=============================================================================
TLEDOFF
bcf PORTB , 2 ; Mettre RB2 du PIC au niveau Bas
goto restorereg ; retour fin d'interruption
TLEDON
bsf PORTB , 5 ; Mettre RB2 du PIC au niveau Haut
goto restorereg ; retour fin d'interruption
TSommeil
bsf flags,0 ; Autorisé la mise en sommeil du PIC
goto restorereg
;=============================================================================
; INITIALISATIONS =
;=============================================================================
init
; initialisation USART
;------------------
bcf TXSTA , SYNC
bsf TXSTA , BRGH
bcf BAUDCON , BRG16
movlw BRGVAL
movwf SPBRGH
movlw BRGVAL
movwf SPBRG
movlw B'11000000'
movwf TRISC
movlw B'10000000' ; module en service, réception 8 bits
movwf RCSTA ; dans registre RCSTA
; lancer interruption USART
; -------------------------
bsf INTCON,PEIE ; interruptions périphériques en service
bsf PIE1 , RCIE
bsf PIE1,RCIF ; autoriser interrupts RX USART
bsf INTCON,GIE ; lancer les interruptions
; initialisation des variable (banque0)
;---------------------------
movlw B'00000000' ; initialiser variable Voie1ON
movwf LEDOFF
movlw B'00000001' ; initialiser variable Voie1OFF
movwf LEDON
movlw B'11110000' ; initialiser variable Voie2ON
movwf Sommeil
; initialisation des PORT
;---------------------------
movlw B'00000001'
movwf TRISB
movlw B'00000000'
movwf TRISA
movlw B'00000000'
movwf PORTB
movlw B'00000000'
movwf PORTA
movlw B'00000000'
movwf PORTC
goto start ; démarrer programme principal
;=============================================================================
; PROGRAMME =
;=============================================================================
start
; lecture sur port série
; ----------------------
bsf RCSTA,CREN ; lancer la réception
nop
nop
btfsc flags ,0 ; si flags est à 1 mettre PIC en sommeil
goto sleepPIC ; sinon boucler
goto start
sleepPIC
bsf INTCON, 4 ; Autoriser interuption RB0
sleep ; mode sommeil du PIC
nop
goto start ; boucler
END ; directive fin de programme