MODEM type Baycom 300 Bauds Half Duplex
Description du programme
Le programme a été écrit en assembleur. Son fonctionnement est trés simple. Il s'agit ici d'une base de départ pour un programme plus efficace. Ce programme a été testé, et il fonctionne lorsque les conditions de transmission sont excellentes. Il est trés sensible aux parasites. Il convient d'améliorer l'algorithme de discrimination. Il est probable que l'adoption d'un microcontroleur fonctionnant à 10 MHz apporterait une plus grande latitude au niveau algorithme.
En fait, les comptages ont lieu pendant les alternances positives du signal et la mdiscrimination pendant les alternances négatives.Il Serait interessant d'introduire des statistiques dans le programme, ce qui améliorerait son efficacité.
Boucle principale
MAIN call RX bsf PORTA,1 ; PTT ON call TX bcf PORTA,1 ; PTT OFF goto MAIN
D'entrée de jeu, on va dans la boucle de réception. Dans cette boucle, on teste s'il faut passer en émission. Si c'est le cas, on sort du sous programme RX, on active le PTT, et on passe dans la boucle TX. En fin d'émission, on revient de la fonction TX, on désactive le PTT, et on repart dans la fonction réception.
La boucle de Réception
La tâche essentielle de la boucle de réception consiste à compter la durée de chaque alternance positive du signal reçu. La fréquence est déduite à partir de la durée. Selon la valeur de la frequence, on place le sortie à 1 ou à 0. Le signal audio de réception entre sur le bit 2 du port A. La commande émission (PTT) entre sur le bit 4 du port A.
D'entrée de jeu on attend soit la présence d'une alternance positive du signal, soit l'activation du PTT, qui fait sortir de la boucle de réception au profit de la boucle d'émission.
RX loop btfss PORTA,4 ; If PTT Low, jump to end of RX loop goto F_RX btfss PORTA,2 ; waiting on positive alternance goto loop clrf TMR0 ; loop1 btfsc PORTA,2 ; waiting now on the end of the positive goto loop1 ; alternance movfw TMR0 movwf TIME ; Save timer value
Lorsque l'on a détecté un début d'alternance positive, on remet à 0 le timer, et on attend le front descendant. A la fin de l'alternance, on stocke la valeur contenue dans le timer dans la mémoire TIME.
Les Leds servant de voyant pour les limites hautes et basses des fréquences sont réliées aux bits 6 et 7 du port B. Elles s'allument lorsque les valeurs des sorties sont à 0.
bsf PORTB,6 bsf PORTB,7 sublw D'9' btfsc STATUS,Z bcf PORTB,7 ; frequency high limit reached, Led 1 on movfw TIME sublw D'10' ; Frequency discrimination btfsc STATUS,Z bcf PORTA,3 movfw TIME sublw D'11' btfsc STATUS,Z bcf PORTA,3 movfw TIME sublw D'12' btfsc STATUS,Z bcf PORTA,3 movfw TIME sublw D'13' btfsc STATUS,Z bsf PORTA,3 movfw TIME sublw D'14' btfsc STATUS,Z bsf PORTA,3 movfw TIME sublw D'15' btfsc STATUS,Z bsf PORTA,3 movfw TIME sublw D'16' btfsc STATUS,Z bcf PORTB,6 ; Frequency low limit reached, Led 2 on btfsc PORTA,4 ; Test if Tx Request goto loop F_RX return
Le bit 3 du port A représente la valeur du signal reçu. Il est mis à jour dans la partie discrimination. On remarque que la fenêtre de discrimination est assez large. C'est dans la partie présentée ci-dessus que des améliorations sont nécessaires.
La boucle d'émission
Elle est relativement simple. Elle se contente de générer un signal dont la fréquence est fonction de l'état d'une entrée. Le choix de la fréquence se fait selon la norme d'émission que l'on veut utiliser.
Génération d'un signal sinusoïdal
On extrait la valeur du sinus à partir d'une table en mémoire. Il suffit d'avoir en mémoire la valeur des sinus de 0 à 90°. Pour les valeurs angulaires supérieures, on utilise les formules de trigo classiques.
Fonction de génération Sinus :
La première partie applique les formules de trigo en fonction du quadrant dans lequel se trouve l'angle. La seconde partie est le tableau des sinus pour des angles compris entre 0 et 90°, en 64 pas. Les tests ne sont pas optimisés, afin d'assurer une régularité temporelle du signal.
SINUS movwf ANGLE call SIN4 btfss ANGLE,7 addlw 0x80 btfsc ANGLE,7 sublw 0x80 ; F_SIN return ; SIN4 btfss ANGLE,6 goto VALSIN sublw D'127' ; ;========================================================================= VALSIN ANDLW 0x3F ; First quadrant ADDWF PCL,F ; retlw D'0' ;0 0 retlw D'3' ;1 0.024543693 retlw D'6' ;2 0.049087385 retlw D'9' ;3 0.073631078 retlw D'12' ;4 0.09817477 retlw D'15' ;5 0.122718463 retlw D'18' ;6 0.147262156 retlw D'21' ;7 0.171805848 retlw D'24' ;8 0.196349541 retlw D'27' ;9 0.220893233 retlw D'30' ;10 0.245436926 retlw D'33' ;11 0.269980619 retlw D'36' ;12 0.294524311 retlw D'39' ;13 0.319068004 retlw D'42' ;14 0.343611696 retlw D'45' ;15 0.368155389 retlw D'48' ;16 0.392699082 retlw D'51' ;17 0.417242774 retlw D'54' ;18 0.441786467 retlw D'57' ;19 0.46633016 retlw D'59' ;20 0.490873852 retlw D'62' ;21 0.515417545 retlw D'65' ;22 0.539961237 retlw D'67' ;23 0.56450493 retlw D'70' ;24 0.589048623 retlw D'73' ;25 0.613592315 retlw D'75' ;26 0.638136008 retlw D'78' ;27 0.6626797 retlw D'80' ;28 0.687223393 retlw D'82' ;29 0.711767086 retlw D'85' ;30 0.736310778 retlw D'87' ;31 0.760854471 retlw D'89' ;32 0.785398163 retlw D'91' ;33 0.809941856 retlw D'94' ;34 0.834485549 retlw D'96' ;35 0.859029241 retlw D'98' ;36 0.883572934 retlw D'100' ;37 0.908116626 retlw D'102' ;38 0.932660319 retlw D'103' ;39 0.957204012 retlw D'105' ;40 0.981747704 retlw D'107' ;41 1.006291397 retlw D'108' ;42 1.030835089 retlw D'110' ;43 1.055378782 retlw D'112' ;44 1.079922475 retlw D'113' ;45 1.104466167 retlw D'114' ;46 1.12900986 retlw D'116' ;47 1.153553552 retlw D'117' ;48 1.178097245 retlw D'118' ;49 1.202640938 retlw D'119' ;50 1.22718463 retlw D'120' ;51 1.251728323 retlw D'121' ;52 1.276272016 retlw D'122' ;53 1.300815708 retlw D'123' ;54 1.325359401 retlw D'123' ;55 1.349903093 retlw D'124' ;56 1.374446786 retlw D'125' ;57 1.398990479 retlw D'125' ;58 1.423534171 retlw D'126' ;59 1.448077864 retlw D'126' ;60 1.472621556 retlw D'126' ;61 1.497165249 retlw D'126' ;62 1.521708942 retlw D'126' ;63 1.546252634
La mémoire PHASE contient la valeur de l'angle. elle va évoluer par additions successives d'une constante, dont la valeur dépendra de la fréquence souhaitée pour le signal de sortie. La précision de la fréquence serait améliorée en augmentant la fréquence d'horloge du PIC (Passer à 10, ou même 20 MHz pour certains circuits). Rappelons que ce programme peut facilement être adapté à d'autres PIC, moyennant quelques modifications minimes.
;========================================================================= ; ; TX LOOP ; ;========================================================================= TX clrf PHASE SINLOOP btfss PORTB,0 movlw D'9' ; 9 : 1070 Hz btfsc PORTB,0 ; 10 : 1270 Hz movlw D'10' ; 17 : 2070 Hz addwf PHASE,f ; 19 : 2270 Hz movfw PHASE call SINUS movwf SINMEM ; ; Convert into 6 bits value rrf SINMEM,f ; Only 5 bits used, RB0 acts as input rrf SINMEM,w andlw 0x3F movwf PORTB ; btfss PORTA,4 goto SINLOOP return
Le convertisseur fonctionne sur 5 bits. Il est donc nécessaire de réduire la valeur extraite du tableau à 5 bits.
Pour une frequence d'horloge de 4 MHz, les valeurs des incréments de la mémoire phase sont :
| Fréquence | Incrément |
| 1070 | 9 |
| 1270 | 10 |
| 2070 | 17 |
| 2270 | 19 |