; liste des variables utiliseés : caract,cmpt1,cmpt2,cmpt5 ; SERIALS correspond à la pin utilisée pour la sortie RS232, ne pas utiliser les sorties à drain ouvert ; SERIALR correspond à la pin utilisée pour l'entrée RS232 ;exemple: ;#DEFINE SERIALR PORTA,0 ; entree du pic ;#DEFINE SERIALS PORTA,1 ; sortie du pic ;******************************************************************** ; sous routine de reception * ; Pour une frequence de 4MHz * ; 9600 bauds, 8bits, pas de parite, 2bits stop * ; l'octet sera dans caract à declarer * ;******************************************************************** receive btfsc SERIALR ; tester si start bit present goto receive ; non attendre call tempo50 ; oui attendre 1/2 bit call tempo93 ; se placer au milieu du premier bit nop nop nop nop movlw D'8' ; pour 8 bits movwf cmpt5 reloop bcf STATUS,C ; cary=0 btfsc SERIALR ; tester si bit=0 bsf STATUS,C ; cary=1 rrf caract,f ; faire entrer le bit par la gauche call tempo93 ; attendre 1 bit decfsz cmpt5,f ; decrementer le compteur goto reloop ; boucler si pas dernier nop nop return ;******************************************************************** ; sous routine d'emission * ; Pour une frequence de 4MHz * ; 9600 bauds, 8bits, pas de parite, 2bits stop * ; l'octet est dans caract à declarer * ;******************************************************************** send call tempo50 call tempo93 ;envoyer start bit bcf SERIALS ; envoyer startbit movlw D'8' ; pour 8 bits movwf cmpt5 ; dans compteur nop nop call tempo93 ; attendre 1 bit ;envoyer 8 bits send_loop rrf caract,f ; decaler et bit dans cary btfsc STATUS,C ; tester si cary=1 goto X1 ; si oui aller en X nop bcf SERIALS ; si non serials a 0 goto Y1 X1 bsf SERIALS ; serials a 1 nop nop Y1 call tempo93 ; attendre 1 bit decfsz cmpt5,f ; decrementer compteur goto send_loop ; boucler si pas dernier ;envoyer 2 bits de stop bsf SERIALS ; serials a 1 call tempo93 ; 1 bit call tempo93 ;1 bit call tempo93 ;1 bit pour securite return ;******************************************************************** ; sous routines de temporisation * ;******************************************************************** tempo93 clrf cmpt1 ; effacer cmpt1 movlw D'29' ; charger 32 dans w movwf cmpt1 ; charger w dans cmpt1 boucle1 decfsz cmpt1,f ; decrementer et saut si zero goto boucle1 ; boucler si pas zero return tempo50 clrf cmpt2 movlw D'14' movwf cmpt2 boucle2 decfsz cmpt2,f goto boucle2 nop nop return