[Retour]


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