12Fermer14
ZerosquareLe 08/01/2013 à 04:04
Pour Vince qui voulait un "hello world" pour le ComLynx, voici un petit programme qui envoie "Hello world !" au démarrage, puis qui renvoie le caractère suivant chaque caractère reçu (si vous envoyez 'A', ça renvoie 'B', etc.). En plus de la doc d'Epyx, je me suis basé sur le code de réception du BLL.

Côté PC, n'importe quel programme de terminal devrait convenir, il suffit de le configurer comme ceci : vitesse 9600 bps, 1 bit de stop, 8 bits de données, parité paire, pas de contrôle de flux.

#include <lynx.h> 


/* Initialisation du ComLynx */
void ComLynx_Init()
{
	timer4.reload = 12;			/* 9600 bps */
	timer4.control = 0x18;			/* Horloge 1 MHz, rechargement auto activé, timer activé */
	serctl = 0x1D;				/* Parité paire, mode collecteur ouvert, interruptions désactivées, reset des erreurs, break désactivé */
	
	/* Effacement du buffer de réception */
	while (serctl & 0x40) 
	{
		unsigned char c;
		c = serdat;
	}
}


/* Réception d'un octet */
unsigned char ComLynx_ReceptionOctet()
{
	while (!(serctl & 0x40));		/* Attend qu'un octet ait été reçu */
	return serdat;				/* Retourne l'octet reçu */
}


/* Envoi d'un octet */
void ComLynx_EnvoiOctet(octet)
unsigned char octet;
{
	while (!(serctl & 0x80));		/* Attend que l'émetteur soit prêt */
	serdat = octet;				/* Envoie l'octet */
	ComLynx_ReceptionOctet();		/* Comme Tx et Rx sont communs, chaque octet envoyé est reçu, on l'efface donc du buffer de réception */
}


/* Envoi d'une chaîne de caractères */
void ComLynx_EnvoiChaine(chaine)
unsigned char *chaine;
{
	unsigned char c;
	while ((c = *(chaine)++) != '\0') ComLynx_EnvoiOctet(c);
}


void main()  
{  
	ComLynx_Init();
	
	ComLynx_EnvoiChaine("\15\nHello world !\15\n");
	
	/* Renvoie le caractère suivant chaque caractère reçu */
	for (;;)
	{
		ComLynx_EnvoiOctet(ComLynx_ReceptionOctet() + 1);
	}
}

Remarques :

- si le compilateur râle à propos de timer4, éditez le fichier lynx.h et enlevez les commentaires autour de la définition des adresses des timers.

- c'est volontairement basique, il n'y a pas de gestion des erreurs de réception ni des interruptions.

- l'effacement de l'octet envoyé dans ComLynx_EnvoiOctet() peut théoriquement bloquer si le PC envoie un caractère juste au même moment ou force la ligne du ComLynx à l'état bas, c'est à tester.

- le \15\n avant et après Hello world !, c'est CR + LF, pour sauter une ligne.