[PIC 16F688] Emission-réception infrarouge
Bonjour, je suis débutant dans le monde de la programmation en Assembleur.
J'aimerais concevoir un badge electronique qui, à l'aide d'un PIC 16F688, me permette d'envoyer une trame specifique à un autre badge récepteur.
Le coeur du système sera un écran LCD monochrone graphique de 48 84 pixels.
A l'aide du PIC on fera un système de communication infrarouge.
La trame est la suivante :
Vitesse de modulation 56khz communication
nombre mini d'impulsions par burst 10
vitesse de transmission 4800bauds
pas de modulation NRZ
8 bits de donnée
1 bit de start
1 bit de stop
pas de bit de parité
12 octets par message en liason serie asynchrone
premier octet synchronisation 0xAA les 10 suivants correspondent au message et le dernier octet sera checksum.
1 message toutes les 2 secondes.
J'ai pris le module récepteur TSOP 2156 de chez farnell.
Le module d'émission est le tsal6200
L'écran qu'on a choisi est le PCD8544
J'ai fait un petit programme pour tester l'envoi de n'importe quoi sur le PIC avec les paramètres reglés comme précédemment mais je ne retrouve rien en sortie.
Si vous avez une idée de mon erreur j'en serais fort reconnaissant.
Voici mon programme :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| ;*******************************************************************
;
; Ce programme fait clignoter les leds
;
;*******************************************************************
errorlevel -302 ; supprime l'alerte sur les banks
;*******************************************************************
; configuration du compilateur
;*******************************************************************
list p=16F688
include <p16F688.inc>
;*******************************************************************
; configuration du registre d'état du microcontroleur
;*******************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
;*******************************************************************
; assignation des ports du pic
;*******************************************************************
;#define entre PORTC,5 ; RC5 en entrée
#define sortie PORTC ; RC4 en sortie
;*******************************************************************
; definition des variables
;*******************************************************************
cblock 0x0c ; adresse de debut de la RAM pour les variables
w_temp:1
status_temp:1
temp0:1
temp1:1
temp2:1
temp3:1
endc
;*******************************************************************
; definition des macros
;*******************************************************************
bank1 macro
bsf STATUS,RP0 ; sélectionne la page1
endm
bank0 macro
bcf STATUS,RP0 ; selectionne la page2
endm
;*******************************************************************
; Début du code source
;*******************************************************************
org 0x000 ; vecteur de reset
goto debut ; sauter au programme principal
org 0x004 ; vecteur d'interrruption
retfie
debut
call init ; saut au sous programme d'initialisation
boucle
movlw b'11110000'
movwf sortie
movlw .250
call tempo
movlw .250
call tempo
movlw b'10101000'
movwf sortie
movlw .250
call tempo
movlw .250
call tempo
movlw b'11100110'
movwf sortie
movlw .250
call tempo
movlw .250
call tempo
movlw b'01010101'
movwf sortie
movlw .250
call tempo
movlw .250
call tempo
goto boucle
;*******************************************************************
;
; définitions des sous routines
;
;*******************************************************************
;*******************************************************************
; initialisation du micro controleur
;*******************************************************************
init bank1
movlw b'111111' ; configure le port A en entrée
movwf TRISA
movlw b'101100' ; configure RC5 en entrée Asynchrone (RX) et RC4 en sortie Asynchrone (TX) ensuite on a RC3 et RC2 en entrées et RC1 RC0 en sortie
movwf TRISC ;
movlw b'11111111' ; Habilite toutes les interruptions
movwf INTCON
movlw b'11100010' ; Interruptions périphériques
movwf PIE1
movlw b'1100111' ; Fréquence d'oscillation de 4Mhz
movwf OSCCON
movlw b'00100010' ; Transmission 8 bits, transmit enable, Asynchrone. On a SYNC=0 et BRGH=0
movwf TXSTA
movlw b'10011111' ; Serial port enabled, réception 8 bits, enables receiver
movwf RCSTA
movlw b'00000010' ; On a BRG16=0
movfw BAUDCTL ; Le fait d'avoir SYNC=0 BRGH=0 BRG16=0 nous permet de déterminer le Baud, on doit precharger SPBRG à 12.
movlw b'1100' ; on precharge SPBRG à 12 pour obtenir un vitesse de transmission de 4800 Bauds
bank0
clrf PORTC ; efface les PORTA et B
clrf PORTA
return ; fin du sous programme
;*******************************************************************
; temporisation d'environ 1 ms
;*******************************************************************
tempo
movwf temp0 ; on assigne Wreg = 250 à temp0
boucle2
movlw .249 ; on assigne 249 à Wreg
movwf temp1 ; on donne la valeur de Wreg à temp1
boucle3
nop
decfsz temp1,F ; On décremente la valeur de temp1, si on arrive à 0 on saute la ligne suivante, donc dans ce cas là on sort de la boucle
goto boucle3
decfsz temp0,F ; On décremente la valeur de temp0 (qui avant valait 1) qui vaut 250, ceci veut dire que la boucle précédente sera faite 250 fois.
goto boucle2
return
end ; fin du programme |