[NanoReseau] Projet réalisable ?

C'est la catégorie reine de l'ordinophile, 8 bits et pas un de plus!
Single board ou bus S-100 acceptés.

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
gilles
Messages : 2779
Inscription : 07 août 2008 13:44
Localisation : Nantes
Contact :

Re: [NanoReseau] Projet réalisable ?

Message par gilles »

Pas certain qu'il y ait de l'HPET sur une machine avec de l'ISA. On va sans doute avoir un bout du chipset qui reprendra plus ou moins bien les fonctions du PIT (le strict nécessaire, probablement pas le canal qui servait au refresh de la RAM).

Mais oui s'il y a un vrai PIT sur la carte et qu'un canal est libre dessus autant l'exploiter. (par contre c'est un 8253, on ne peut pas relire la sortie comme sur le 8254, la valeur du compteur il me semble que oui)
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

Si vous pouvez trouver un canal de libre avec une fréquence bien définie permettant la résolution souhaitée, il n'y a pas de soucis pour relire le compteur (pas besoin du status propre au 8254). Il suffit d'écrire le compteur en mode 0 avec la valeur souhaité, puis de relire le compteur en boucle jusqu'à qu'il descende à 0.
the 8253 is used on the PC & XT, while the 8254 is used on the AT+
A mon avis, on doit avoir un 8254 là, non ?

En ce cas, on peut boucler sur "Read Back Command Status" jusqu'à ce que le bit 7 "OUT" soit positionné à 1 après avoir sélectionner le mode 0, affecter le compteur et configurer le "Read Back Command Status" pour lire le statut du canal choisi pour compter. Par contre, il ne faudrait pas qu'une interruption change le "Read Back Command Status" en cours de route.
Avatar de l’utilisateur
gilles
Messages : 2779
Inscription : 07 août 2008 13:44
Localisation : Nantes
Contact :

Re: [NanoReseau] Projet réalisable ?

Message par gilles »

@hlide: sur la carte nanoréseau c'est un 8253 (c'est logique vu la date de sortie).
Je suppose que l'un des 3 timers est la base de temps pour l'ensemble du nanoréseau, les 2 autres à voir. Parfois on a des surprises entre le matériel et les drivers, un composant peut très bien n'être jamais utilisé...
Fool-DupleX
Messages : 2286
Inscription : 06 avr. 2009 12:07

Re: [NanoReseau] Projet réalisable ?

Message par Fool-DupleX »

Sur la carte NR, il y a un 8253. Il n'est pas utilisé et on peut relire ses compteurs, au nombre de 3. La base de temps du NR est fixe, c'est le 14.318 MHz divisé par 32, soit 447 KHz (câblé hardware). Au final, je n'ai pas besoin d'autre chose. Il ne s'agit pas ici de générer des évènements mais de compter avec une base de temps qui soit la même sur tous les hôtes. Je crois que c'est la meilleure solution.

La première spec du HPET c'est vers 2004, donc je suppose qu'on ne trouvera pas de machine grand public avec de l'ISA et un HPET, effectivement.
Avatar de l’utilisateur
gilles
Messages : 2779
Inscription : 07 août 2008 13:44
Localisation : Nantes
Contact :

Re: [NanoReseau] Projet réalisable ?

Message par gilles »

Un test amusant (pour vérifier qu'il n'est pas utilisé), serait de retirer le 8253 d'une carte NR dans un réseau fonctionnel pour vérifier que tout marche encore.
Une possibilité c'est qu'il ne soit utilisé que par un driver particulier et pas sur d'autres, ou bien uniquement sur des vieilles versions. Avec un émulateur PC qui trace sur le port de ce PIT additionnel on devrait pouvoir savoir ce qui se passe.
Fool-DupleX
Messages : 2286
Inscription : 06 avr. 2009 12:07

Re: [NanoReseau] Projet réalisable ?

Message par Fool-DupleX »

J'ai déjà intégralement désassemblé le code du logiciel Nanoréseau, ainsi que celui des pilotes pour l'IBM PC et et l'Olivetti-Logabax Persona 1600. Pas de trace d'utilisation du 8253. Il sert peut-être dans un des autres drivers, ou alors il est là pour la version avec noyau temps réel préemptif qui avait été envisagée par les développeurs mais qui n'a jamais été écrite.

De toutes les manières, s'il ne servait pas jusqu'à présent sur le PC standard, il ne servira pas plus sur un 386 ou un Athlon. Autant en profiter.
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

Ah si c'est un 8253 sur la carte et non sur le PC, c'est encore mieux alors ! donc un cran de compteur équivaudrait à ~2,24 µs. Avec un compteur octet seulement, on ne pourra pas faire plus que la la moitié de 1 ms, donc j'imagine qu'il faudra plutôt envisager de compter en mot 16-bit.

Je dis ça parce quand j'utilise le PIT de MZ-700, je privilégie d'utiliser le compteur 8-bit quand c'est possible car ça simplifie en terme de code Z80 à utiliser derrière, mais là vu que c'est du 80x86, pas vraiment un problème.
Fool-DupleX
Messages : 2286
Inscription : 06 avr. 2009 12:07

Re: [NanoReseau] Projet réalisable ?

Message par Fool-DupleX »

1 ms suffirait largement pour le besoin puisque les réponses ne prennent guère plus de 200-300 us à venir, mais oui, j'aimerais pouvoir monter jusqu'à 100 ms, donc ce sera 16 bits. Sur un 386 et supérieurs, la complexité du code n'est pas un problème.

J'ai essayé et ça fonctionne !

@hlide: Tu sembles bien connaitre le 8253. Sais-tu s'il existe un moyen de stopper le compteur en mode 0 par logiciel ? Je trouve la spec peu claire à ce sujet. J'aimerais idéalement éviter d'atteindre 0 quand je compte, parce que cela génère une interruption sur la carte NR. Pour le moment, je fais ainsi : je masque l'interruption, je charge FFFF dans le compteur, je compte jusqu'a -nb. tick souhaité en pollant avec une boucle sur le compteur puis je continue mon travail. Une interruption arrivera plus tard quand le compteur atteint 0, mais puisqu'elle est masquée, ça ne fait rien. J'aimerais bien pouvoir stopper le compteur en sortant de la boucle.
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

Si tu configures le mode du canal choisi sans affecter le compteur par la suite, le compteur est à l'arrêt. Pour sortir du son à la ZX Spectrum (son beeper), j'alterne entre mode 0 et mode 4 pour émettre respectivement du 0 et du 1 sur le OUT connecté au speaker sans jamais affecter leur compteur pour garder en permanence leur état pour faire du PWM.

Tu utilises quel mode ? le mode 0 j'imagine avec OUT = 1 pour avoir une interruption. Dans ce cas, il faut juste reconfigurer le mode 0 sans affecter le compteur pour maintenir OUT = 0 jusqu'à l'affectation du compteur.

- Initialiser ou stopper le compteur :

Code : Tout sélectionner

PORT[I8253_CTL] = I8253_MODE0|I8253_TIMER0|I8253_16BIT|I8253_BIN;
- lancer le compteur :

Code : Tout sélectionner

// la ligne suivante n'est pas nécessaire si elle est déjà faite à l'initialisation
// et qu'elle ne changera jamais (les deux autres timers jamais utilisés)
// PORT[I8253_CTL] = I8253_MODE0|I8253_TIMER0|I8253_16BIT|I8253_BIN;
PORT[I8253_CNT0] = 255; // LSB byte
PORT[I8253_CNT0] = 255; // MSB byte
// Attention, le compteur n'est pas immédiatement à $FFFF mais au cycle suivant du timer
// Donc potentiellement, on pourrait lire un compteur qui nous fasse sortir trop tôt ! donc à voir !
// Polling actif jusqu'à ce que le compteur atteigne le seuil cnt 
while ((short)PORT[I8253_CNT0] < -cnt); // < ou <= ? faut voir
// On stoppe le compteur et on n'aura jamais d'interruption (OUT toujours 0)
PORT[I8253_CTL] = I8253_MODE0|I8253_TIMER0|I8253_16BIT|I8253_BIN;
8253ppt-10-1024.jpg
8253ppt-10-1024.jpg (128.85 Kio) Consulté 2706 fois
Dernière modification par hlide le 26 oct. 2022 11:20, modifié 2 fois.
Fool-DupleX
Messages : 2286
Inscription : 06 avr. 2009 12:07

Re: [NanoReseau] Projet réalisable ?

Message par Fool-DupleX »

hmm. J'ai essayé de remettre le mode 0 à la fin, mais le compteur ne semble pas s'arrêter. Peut-être parce que c'est le même octet de configuration. Je vais essayer de passer dans un autre mode à la fin de la boucle. Tu penses que si je passes en BCD en gardant le mode 0, ça stoppera le compteur ?

C'est malin ton astuce pour toggler le OUT !
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

J'ai modifié mon post précédent.
Dernière modification par hlide le 26 oct. 2022 11:32, modifié 1 fois.
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

Mode 0 Interrupt on Terminal Count
The counter will be programmed to an initial value and afterwards counts down at a rate equal to the input clock frequency. When the count is equal to 0, the OUT pin will be a logical 1. The output will stay a logical 1 until the counter is reloaded with a new value or the same value or until a mode word is written to the device.

Once the counter starts counting down, the GATE input can disable the internal counting by setting the GATE to a logical 0
Ça marche très bien et c'est comme ça que j'ai pu produire mes premiers sons type PWM sur "[SHARP MZ-700] Space Rally".
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

Voici le code d'émulation du i8253 lorsque l'on affecte le registre de contrôle :

Code : Tout sélectionner

	case 3: // ctrl reg
		if((data & 0xc0) == 0xc0) {
			break;
		}
		ch = (data >> 6) & 3;
		
		if(data & 0x30) {
			static const int modes[8] = {0, 1, 2, 3, 4, 5, 2, 3};
			counter[ch].mode = modes[(data >> 1) & 7];
			counter[ch].count_latched = false;
			counter[ch].low_read = counter[ch].high_read = false;
			counter[ch].low_write = counter[ch].high_write = false;
			counter[ch].ctrl_reg = data;
			// set signal
			if(counter[ch].mode == 0) {
				set_signal(ch, false);
			} else {
				set_signal(ch, true);
			}
			// stop count
			stop_count(ch);
			counter[ch].count_reg = 0;
		} else if(!counter[ch].count_latched) {
			latch_count(ch);
		}
		break;
On peut voir l'arrêt du compteur et sa remise à 0.
Fool-DupleX
Messages : 2286
Inscription : 06 avr. 2009 12:07

Re: [NanoReseau] Projet réalisable ?

Message par Fool-DupleX »

Mon code fait exactement ce que tu décrit. Mais je crois savoir. il y a un effet de bord à la fin dont je n'ai pas tenu compte en relisant le compteur. Je pense que si je le relis deux fois de suite après l'avoir arrêté, j'aurai la même valeur. Je vais vérifier. Et si c'est le cas, tout est en ordre.

Merci, ça m'a bien aidé !
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [NanoReseau] Projet réalisable ?

Message par hlide »

Ah oui, mon code est fautif ! il faut lire deux fois, le composer en un mot 16-bit et comparer. Là je l'ai lu comme si c'était un compteur 8-bit, désolé !

Code : Tout sélectionner

do
{
    unsigned val = (unsigned)(PORT[I8253_CNT0]);
    val |= ((unsigned)(PORT[I8253_CNT0]))<<8;
    // On boucle si -cnt < val <= FFFF
}
while (val > (unsigned)(-cnt)); // < ou <= ? faut voir
Répondre