CAN du pic 16F876 et module UART

sniple Messages postés 8 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 6 avril 2010 - 6 avril 2010 à 05:19
Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 juillet 2015 - 7 avril 2010 à 09:25
salut a tous,
j'ai un petit problème d'utilisation du CAN du pic 16F876A.
en effet,j'ai réalisé mon programme en configurant les registres adcon0 et adcon1,et en envoyant les résultats (adressH,adressL) sur les ports B,C pour les visualiser par les leds et ça bien marché. après j'ai tenté de visualiser ces résultats en les envoyant vers le port série (utilisation du module UART) mais rien ne s'affiche.
ensuite j'ai ajouté au programme précédent l'initialisation du module UART sans l'utiliser dans le programme principale,mais j'ai rien obtenue comme résultat .
la question qui se pose : est ce que je peux utiliser les modules CAN et UART dans un seul programme,sachant que j'ai testé les deux modules mais indépendamment.
j'espère que vous m'aidiez a résoudre se problème car j'en ai besoin.
et merci d'avance.

9 réponses

Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 juillet 2015 1
6 avril 2010 à 13:23
bien sur c'est possible...
Les deux "fonctions" du PIC ne font pas appel aux même registres...
tu envois tes info sur le port série vers un PC ??
As tu correctement initialiser le port série (baudrate entre autre...) des deux coté si c'est la cas ?
Ton programme est en quel langage ?
cordialement...
0
sniple Messages postés 8 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 14:09
bonjour,
merci d'avoir me répondu a ma question.
en effet je programme en langage assembleur,j'ai déjà fait un programme pour l'acquisition des données numériques vers le port série su PC en utilisant la liaison UART, et ça marché,ensuite j'ai tenté de faire l'acquisition des données analogiques(capteurs températures,tentions analogiques ..)et les envoyées vers le PC mais dans ce stade je me suis bloqués!!!
j'ai réalisé un programme de conversion en utilisant des LEDs comme indicateurs de résultats et ça bien marché,mais si j'ajoute l'initialisation du module UART dans ce programme il se bloque et me donne rien comme résultats!!
de toute façon je vous joindre mon code afin que vous m'aidez a détecté l'erreur.
cordialement


list p=16f876A,r=dec ; Quartz 4MHz
include
__CONFIG 3F71h

OPTIONVAL EQU B'10001111'

BRGVAL EQU D'25' ; pour un débit de 9615 bauds en mode low-speed
AN1 EQU 0x70


CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
endc

org 0x000 ; Adresse de départ après reset
goto init ; Initialiser

org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR,w ; charger FSR
movwf FSR_temp ; sauvegarder FSR

init
bsf STATUS,RP0 ; passer en banque 1
bcf STATUS,RP1 ; passer en banque 1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
bsf STATUS,RP0 ; passer en banque 1
movlw B'00000110' ; mode asynchrone, émission 8 bits haute vitesse
movwf TXSTA ; dans registre TXSTA
movlw BRGVAL ; valeur calculée de SPBRG
movwf SPBRG ; dans baud rate generator
bcf STATUS,RP0 ; repasser banque 0
movlw B'10000000' ; module en service, réception 9 bits
movwf RCSTA
movlw B'00111111'
movwf TRISA
BCF STATUS, RP0 ; Bank 0 selectonnee
movlw B'11111111'
movwf PORTA
BSF STATUS, RP1 ; Bank 1 selectonnee
MOVLW b'10001110' ; select RA0
MOVWF ADCON1 ; as analog inputs
goto star


star

bcf INTCON, GIE ; Global Interrupts: disabled

movlw b'01000001' ; Select; RC osc, Ch2
movwf ADCON0 ; turn on A/D

movlw D'6'
movwf AN1
decfsz AN1, f
goto $-1


BSF ADCON0, GO ; Start new A/D conversion

loop
BTFSC ADCON0, 2 ; A/D over ?
GOTO loop ; no then loop

MOVF ADRESH, W
addlw D'48'
call envoi



movf ADRESL,w
call envoi




envoi
bcf STATUS,RP0 ; passer banque 0
movwf TXREG ; octet dans registre de transmission
bsf STATUS,RP0 ; repasser banque 1
bsf TXSTA,TXEN ; envoyer l'octet
nop
btfss TXSTA,TRMT ; transmission terminée?
goto $-2 ; non, attendre
bcf TXSTA,TXEN ; oui, fin de transmission
bcf STATUS,RP0 ; repasser banque 0
return



sleep

end
0
Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 juillet 2015 1
6 avril 2010 à 15:36
Quelque remarque pour commencer
Tu paramètre le CAN sur FOSC/8 et non en RC ; tu travail sur le canal 0 et non le canal 2 comme dans le commentaire...
De la même façon, l'UART travail sur 8 bit et pas 9...
D'autre part, tu ne boucle pas dans ton programme..., il s'exécute qu'un seul fois, essaye de mettre une boucle pour exécuter plusieurs mesure/envoi....
Le vecteur d'interruption ne doit pas contenir de code, il n'est pas là pour ça, mais pour contenir le renvoie vers le code et ça peut-être que ça fout le bordel (Cf. p15 du datasheet).
0
sniple Messages postés 8 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 15:48
vous parlez de quel vecteur d'interruption?
est ce que j'ai trompé dans le code quelque part?
je vais essayé de bouclé mon programme, espérant qu'il marche.
merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 juillet 2015 1
6 avril 2010 à 15:57
Pour le vecteur d'interruption :
org 0x004 ; adresse d'interruption
goto Interruption

Dans le code :
Interruption ; Le label qui définie ta
[ Ton Code] fonction d'interruption

Après autre relecture : le programme est séquentiel donc SI tu ne boucle PAS le label "star" ne sert à rien
Pour boucler rien de plus simple à la fin du programme => "goto star"

A quoi sert ce code ? :
movlw D'6'
movwf AN1
decfsz AN1, f
goto $-1

Je vais continuer à regarder...
0
sniple Messages postés 8 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 16:06
ce code est un compteur de temporisation, après le lancement du service de conversion il faut attendre un temps d'acquisition pour débuter la conversion.
0
Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 juillet 2015 1
6 avril 2010 à 16:54
J'ai refais un peu le code à ma sauce...

list p=16f876A,r=dec ; Quartz 4MHz
include
__CONFIG 3F71h


CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
AN1 : 1
endc

org 0x000 ; Adresse de départ après reset
goto Programme ; Début du programme pricnpal

org 0x004 ; adresse d'interruption
goto Interruption

;----------------------------------------
Programme

Initialisation
; Initialisation des interruptions
bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
bsf INTCON, GIE ; Disable all Interrupt

; Initialisation de l'UART
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
movlw D'25' ;\ Baudrate 9615bds
movwf SPBRG ;/

molw b'00000110' ;\Asynchronus Mode, Hight speed
movwf TXSAT ;/

bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
molw b'10000000' ;\Enable serial port, no framing error controle,
movwf TXSAT ;/no continuous receive

bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
bcf TRISC, 7 ; TX in Output
bsf TRISC, 8 ; RX in Input

; Initialisation du CAN
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
movlw b'10001110' ;\Right Justified, An0 as Analog input
movwf ADCON1 ;/Other as digital input, FOSC/8

bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movlw b'01000001' ;\FOSC/8, AN0
movwf ADCON1 ;/Enabled

bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
bsf TRISA, 0 ; AN0 as Input


conversion
bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movlw d'6'
movwf AN1
decfsz AN1, f
goto $-1
bcf PIR1, ADIF ; clear Flag
bsf ADCON0, 2 ; Start conversion

btfss PIR1, ADIF ; Wait the end of conversion
goto $-1

MOVF ADRESH, W
addlw D'48'
call envoi

movf ADRESL,w
call envoi

goto conversion


;----------------------------------------
envoi
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
bsf TXSTA,TXEN ;

bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movwf TXREG ; octet dans registre de transmission

nop
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
btfsc TXSTA,TRMT ; transmission terminée?
goto $-1 ; non, attendre
bcf TXSTA,TXEN ; oui, fin de transmission
return
;----------------------------------------

Attention, il n'est pas meilleur que le tient, mais il suit ma logique propre...
Je ne l'ai pas testé, ni compilé...
Regarde si il fonctionne de manière différente du tient...
0
sniple Messages postés 8 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 17:02
je vais essayer de le tester espérant qu'il marche.
Merci infiniment de votre aide,je vais vous rendre compte du résultat.
Cordialement.
0
Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 juillet 2015 1
7 avril 2010 à 09:25
Le même code debuggé et compilé avec Mplab 8.46

;titre :
;Auteur : Zayann
;Date :
;Nom du projet :
;Nom du fichier source : .asm
;********************************************************************************
;********************************************************************************
; Caractéristiques du programme :
;
;
;
;
;
;
;********************************************************************************
;********************************************************************************
; partie déclarative
;
list p=16f876A ;déclaration du processeur utilisé
include
;
RESET equ 0x0000 ;vecteur de reset
MAIN equ 0x0005 ;adresse de début du programme principal.
INTERRUPT equ 0x0004 ;vecteur d'interruption
;
;Déclaration des variables


CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
AN1 : 1
endc


;********************************************************************************
;RESET
org RESET
goto debut
;
;********************************************************************************
;Programme principal
org MAIN
debut

Initialisation
; Initialisation des interruptions
bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
bsf INTCON, GIE ; Disable all Interrupt

; Initialisation de l'UART
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
movlw D'25' ;\ Baudrate 9615bds
movwf SPBRG ;/

movlw b'00000110' ;\Asynchronus Mode, Hight speed
movwf TXSTA ;/

bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movlw b'10000000' ;\Enable serial port, no framing error controle,
movwf TXSTA ;/no continuous receive

bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
bcf TRISC, 7 ; TX in Output
bsf TRISC, 8 ; RX in Input

; Initialisation du CAN
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
movlw b'10001110' ;\Right Justified, An0 as Analog input
movwf ADCON1 ;/Other as digital input, FOSC/8

bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movlw b'01000001' ;\FOSC/8, AN0
movwf ADCON1 ;/Enabled

bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
bsf TRISA, 0 ; AN0 as Input


conversion
bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movlw d'6'
movwf AN1
decfsz AN1, f
goto $-1
bcf PIR1, ADIF ; clear Flag
bsf ADCON0, 2 ; Start conversion

btfss PIR1, ADIF ; Wait the end of conversion
goto $-1

MOVF ADRESH, W
addlw D'48'
call envoi

movf ADRESL,w
call envoi

goto conversion

;********************************************************************************
;Sous-programme

envoi
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
bsf TXSTA,TXEN ;

bcf STATUS,RP0 ;\ Bank 0
bcf STATUS,RP1 ;/
movwf TXREG ; octet dans registre de transmission

nop
bsf STATUS,RP0 ;\ Bank 1
bcf STATUS,RP1 ;/
btfsc TXSTA,TRMT ; transmission terminée?
goto $-1 ; non, attendre
bcf TXSTA,TXEN ; oui, fin de transmission
return



;********************************************************************************
;Routines d'interruptions


;********************************************************************************
;Fin de fichier
END
0
Rejoignez-nous