Programation [Minitel] (encore!)
Modérateurs : Papy.G, fneck, Carl
Programation [Minitel] (encore!)
Bonjour(soir) !
Si je crée un autre sujet, c'est que je fais les choses différemment de Papy G., et que je ne voudrais pas encombrer le sien.
J'ai actuellement un Minitel Telic Alcatel, dont j'ai remplacé le 8052 par un PIC16F1518. Je peux lire le clavier et communiquer via le port série, mais il me manque quelques données pour pouvoir afficher quelque chose (et enlever le bip continuel du EF9345 non-configuré...).
Alors, sur ce que j'ai pu trouver sur ce forum (super, au passage !), on peut parler directement au EF9345 a partir du 8052, notamment avec movx @DPTR,A, mais je dois recoder cette fonction sur mon Pic, et quand je regarde la doc, je vois qu'elle se sert de deux ports (alors qu'il n'y en a qu'un seul de lié, non ?) et c'est là où je bloque : Comment communiquer avec le EF9345 ?
Aussi, je ne comprend pas bien comment adresser un registre, je ne vois pas comment faire dans la doc... Par exemple, si je veux envoyer 0x65 dans R1, je m'y prend comment ?
Merci d'avoir lu !
Et au passage, je code en C, si c'est important.
Si je crée un autre sujet, c'est que je fais les choses différemment de Papy G., et que je ne voudrais pas encombrer le sien.
J'ai actuellement un Minitel Telic Alcatel, dont j'ai remplacé le 8052 par un PIC16F1518. Je peux lire le clavier et communiquer via le port série, mais il me manque quelques données pour pouvoir afficher quelque chose (et enlever le bip continuel du EF9345 non-configuré...).
Alors, sur ce que j'ai pu trouver sur ce forum (super, au passage !), on peut parler directement au EF9345 a partir du 8052, notamment avec movx @DPTR,A, mais je dois recoder cette fonction sur mon Pic, et quand je regarde la doc, je vois qu'elle se sert de deux ports (alors qu'il n'y en a qu'un seul de lié, non ?) et c'est là où je bloque : Comment communiquer avec le EF9345 ?
Aussi, je ne comprend pas bien comment adresser un registre, je ne vois pas comment faire dans la doc... Par exemple, si je veux envoyer 0x65 dans R1, je m'y prend comment ?
Merci d'avoir lu !
Et au passage, je code en C, si c'est important.
Re: Programation Minitel (encore!)
J'avais commencé des explications sur la programmation du EF-9345 ICI
Tu veux placer $65 en R1 avec le 8052.
Le mnemo du 8052 movx @DPTR,A permet d’écrire en RAM externe ayant une adresse (16 bits) contenu en DPH et DPL
Quand tu veux que l'EF-9345 prenne en compte tes valeurs de registres tu ne dois pas oublier t'envoyer la commande EXEC.
Et a savoir: c'est que il y a une copie des registres du EF-9345 en RAM du 8052 (de R0 à R7) l'EF-9345 rafraichi ces registres en fonction des valeurs présentes à ces emplacements RAM ($8020-$8027).
Je pense que Papy.G pourra donner des explications plus précises du côté électronique, vitesse de rafraichissement, occultation ou pas ....
Donc tu dois simuler ce fonctionnement.
Tu veux placer $65 en R1 avec le 8052.
Le mnemo du 8052 movx @DPTR,A permet d’écrire en RAM externe ayant une adresse (16 bits) contenu en DPH et DPL
Quand tu veux que l'EF-9345 prenne en compte tes valeurs de registres tu ne dois pas oublier t'envoyer la commande EXEC.
Et a savoir: c'est que il y a une copie des registres du EF-9345 en RAM du 8052 (de R0 à R7) l'EF-9345 rafraichi ces registres en fonction des valeurs présentes à ces emplacements RAM ($8020-$8027).
Je pense que Papy.G pourra donner des explications plus précises du côté électronique, vitesse de rafraichissement, occultation ou pas ....
Donc tu dois simuler ce fonctionnement.
Re: Programation Minitel (encore!)
C'est justement sur tes explications que je me base pour "traduire" le code 8052 vers Pic, par exemple :
Là si j'ai bien compris, tu te places à l'adresse 0x8021 pour envoyer 0x29, puis tu vas à 0x8028 pour envoyer VDP_MAT.
Donc, concrètement, comment ça ce passe au niveau communication ?
J’imagine que deux triplets d'octets sont envoyés (0x21, 0x80, 0x29 puis 0x28, 0x80, VDP_MAT), mais ce que je n'arrive pas à déterminer c'est comment ?
Dans la doc du EF9345, ils n'expliquent que pour envoyer deux octets : l'adresse et la donnée, mais là l'adresse fait deux octets !
Merci en tout cas pour ta réponse rapide !
Code : Tout sélectionner
mov DPH,#80h
mov DPL,#21h
mov A,#29h
movx @DPTR,A
mov DPH,#80h
mov DPL,#28h
mov A,#VDP_MAT
movx @DPTR,A
Donc, concrètement, comment ça ce passe au niveau communication ?
J’imagine que deux triplets d'octets sont envoyés (0x21, 0x80, 0x29 puis 0x28, 0x80, VDP_MAT), mais ce que je n'arrive pas à déterminer c'est comment ?
Dans la doc du EF9345, ils n'expliquent que pour envoyer deux octets : l'adresse et la donnée, mais là l'adresse fait deux octets !
Merci en tout cas pour ta réponse rapide !
Re: Programation Minitel (encore!)
Euh ca risque de ne pas être aussi simple
Dans un premier temps quel est l'implantation des pins de ton PIC sur le support du 8052 ?
Movx @DPTR utilise le port 2 il me semble pour écrire dans la RAM externe ?
Ensuite le VDP doit aussi accéder à la RAM externe du 8052 pour lire la recopie des registres du EF-9345 !!!
Dans un premier temps quel est l'implantation des pins de ton PIC sur le support du 8052 ?
Movx @DPTR utilise le port 2 il me semble pour écrire dans la RAM externe ?
Ensuite le VDP doit aussi accéder à la RAM externe du 8052 pour lire la recopie des registres du EF-9345 !!!
Re: Programation Minitel (encore!)
C'est pour ça que ça va être sympa
J'ai le Port A sur le port Address/Data, le Port B sur la sortie du clavier, et le Port C est partagé entre AS, DS, R/W (CS est relié à la masse) et le clavier/port série.
C'est justement parce qu'il utilise 2 ports que ça me gène, comme de base il n'y en a qu'un seul de relié au EF9345 (je n'ai pas de carte fille sur ce modèle).
J'ai le Port A sur le port Address/Data, le Port B sur la sortie du clavier, et le Port C est partagé entre AS, DS, R/W (CS est relié à la masse) et le clavier/port série.
C'est justement parce qu'il utilise 2 ports que ça me gène, comme de base il n'y en a qu'un seul de relié au EF9345 (je n'ai pas de carte fille sur ce modèle).
Re: Programation Minitel (encore!)
Le port A point sur quoi ?
Re: Programation Minitel (encore!)
En fait j'ai enlevé le 8052 pour le remplacer par un pic, et le port A de mon pic je l'ai relié au port Adresse/Donnée du EF9345.
Mais après sur le pic il n'y a pas de communication parallèle (enfin du moins j'en ais pas vu), donc sont implantation n'est pas très importante... A moins que je n'ai pas compris la question ?
Mais après sur le pic il n'y a pas de communication parallèle (enfin du moins j'en ais pas vu), donc sont implantation n'est pas très importante... A moins que je n'ai pas compris la question ?
- Papy.G
- Modérateur
- Messages : 3051
- Inscription : 10 juin 2014 13:40
- Localisation : Haute-Garonne/Gers
Re: Programation Minitel (encore!)
Bonsoir, et bienvenue.
Ta démarche est somme toute la plus proche qui soit de la mienne, par rapport à tout ce que l'on peut voir sur le net à ce sujet.
T'as un modèle sans carte-fille rom, tu dois adresser l'EF9345 en h2x, sur un bus huit bits multiplexé, le CE est tout le temps activé.
En gros, les huit adresses de registre sont à suivre de h20 à h27 pour R0 à R7, tu y ajoutes 8 (bit de demande d'exécution de commande), ce sont les registres à accès direct.
Houlà! Par contre, si ton PIC n'a pas d'accès mémoire prévu et seulement trois ports huit bits, c'est tendu et très lent, il va te falloir simuler broche à broche, à la place d'un 8052, j'aurais mieux vu un ARM, mais après tout, pourquoi pas...
Donc, tu dois relier les broches de gestion de mémoire, et mettre sur ton port l'octet adresse, mettre bas ALE, puis mettre l'octet donnée, puis mettre bas la broche d'écriture un truc dans le genre (jettes un œil aux diagrammes temporels d'accès mémoire dans les docs du 9345 et/ou 8052).
Pour le bip, c'est la broche insertion qui pilote, tu mets insertion caractère par caractère, ou surimpression, et tes caractères ne doivent pas être insérés individuellement, et n'oublies pas de ne pas activer l'insertion de la zone hors affichage (oui, c'est possible).
6502man> On doit systématiquement exécuter, juste pour écrire une valeur dans les registres à accès direct?
En fait, j'ai dû mal m'exprimer, il n'y a pas une copie des registres du 9345, mais l'accès à ces registres apparaît dans l'espace d'adressage RAM du 8032 quand il y a carte-fille rom, car c'est la ligne A15 qui active le CE du 9345, dans le modèle sans, le 8052 accède sur huits bits seulement, le CE du 9345 étant tiré à la masse par un shunt. Les 8032/52 n'ont pas d'espace d'adressage IO réservé, comme certains processeurs.
Désolé si je suis un peu lapidaire, panne d'internet, et je suis dans ma voiture auprès d'un hotspot, j'ai pas mes docs sous la main.
Ta démarche est somme toute la plus proche qui soit de la mienne, par rapport à tout ce que l'on peut voir sur le net à ce sujet.
T'as un modèle sans carte-fille rom, tu dois adresser l'EF9345 en h2x, sur un bus huit bits multiplexé, le CE est tout le temps activé.
En gros, les huit adresses de registre sont à suivre de h20 à h27 pour R0 à R7, tu y ajoutes 8 (bit de demande d'exécution de commande), ce sont les registres à accès direct.
Houlà! Par contre, si ton PIC n'a pas d'accès mémoire prévu et seulement trois ports huit bits, c'est tendu et très lent, il va te falloir simuler broche à broche, à la place d'un 8052, j'aurais mieux vu un ARM, mais après tout, pourquoi pas...
Donc, tu dois relier les broches de gestion de mémoire, et mettre sur ton port l'octet adresse, mettre bas ALE, puis mettre l'octet donnée, puis mettre bas la broche d'écriture un truc dans le genre (jettes un œil aux diagrammes temporels d'accès mémoire dans les docs du 9345 et/ou 8052).
Pour le bip, c'est la broche insertion qui pilote, tu mets insertion caractère par caractère, ou surimpression, et tes caractères ne doivent pas être insérés individuellement, et n'oublies pas de ne pas activer l'insertion de la zone hors affichage (oui, c'est possible).
6502man> On doit systématiquement exécuter, juste pour écrire une valeur dans les registres à accès direct?
En fait, j'ai dû mal m'exprimer, il n'y a pas une copie des registres du 9345, mais l'accès à ces registres apparaît dans l'espace d'adressage RAM du 8032 quand il y a carte-fille rom, car c'est la ligne A15 qui active le CE du 9345, dans le modèle sans, le 8052 accède sur huits bits seulement, le CE du 9345 étant tiré à la masse par un shunt. Les 8032/52 n'ont pas d'espace d'adressage IO réservé, comme certains processeurs.
Désolé si je suis un peu lapidaire, panne d'internet, et je suis dans ma voiture auprès d'un hotspot, j'ai pas mes docs sous la main.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Demandez-en plus, ou faites-le vous-même.
Re: Programation Minitel (encore!)
Sauf erreur mais si on écrit des valeurs dans des registres tant que l'on a pas "exécuter" elles ne seront pas validées par l'EF-9345 il me semble.Papy.G a écrit :6502man> On doit systématiquement exécuter, juste pour écrire une valeur dans les registres à accès direct?
Après il faudrait faire des tests pour vérifier le comportement sur le minitel !!!
Oui effectivement sans carte fille il n'y auras pas la copie des registres dans le 8032/8052
Merci papy.G pour ces précisions.
- Papy.G
- Modérateur
- Messages : 3051
- Inscription : 10 juin 2014 13:40
- Localisation : Haute-Garonne/Gers
Re: Programation Minitel (encore!)
Ok, mais il conserve ce que l'on écrit en R1, avant une commande indirecte, par exemple, sans que l'on demande une exécution?
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Demandez-en plus, ou faites-le vous-même.
Re: Programation Minitel (encore!)
Je pense que tant que l'on écrit rien à la place en R1 il doit conserver la valeur, mais il faudrait faire des tests pour en être sur
Re: Programation Minitel (encore!)
Bonjour, et merci !
Juste pour être sûr d'avoir compris, si je veux mettre la valeur X dans R1, puis Y dans R0, et enfin exécuter, je dois faire :
Envoyer l'adresse (0x21)
Envoyer X
Envoyer l'adresse (0x20+0x08)
Envoyer Y
Envoyer l'adresse (0x20)
Lire Busy
Je vais tester tout ça !
Et encore une fois merci à vous ! Je sens que je vais rester ici, même si ma contribution sera plutôt faible (un TO7-70, une Atari 7800, et une snes).
Je poste mon code d'écriture, si ça intéresse quelqu'un (testé, ça marche):
EDIT:
A moins que ce qu'ils entendent par "any other register" ce soit les registres internes ?
EDIT2:
ça marche !
Bon, je n'arrive pas à configurer correctement l'affichage (syncro, entrelacement, ...), mais j'arrive à communiquer avec lui !
D'ailleurs, j'envoie le bit d’exécution seulement à la fin (pas à chaque modification), et ça ne semble pas poser problème.
Grâce à ça j'ai enfin compris la doc (http://pdf.datasheetcatalog.com/datashe ... s/1783.pdf, page 33) !Papy.G a écrit :En gros, les huit adresses de registre sont à suivre de h20 à h27 pour R0 à R7, tu y ajoutes 8 (bit de demande d'exécution de commande), ce sont les registres à accès direct.
Juste pour être sûr d'avoir compris, si je veux mettre la valeur X dans R1, puis Y dans R0, et enfin exécuter, je dois faire :
Envoyer l'adresse (0x21)
Envoyer X
Envoyer l'adresse (0x20+0x08)
Envoyer Y
Envoyer l'adresse (0x20)
Lire Busy
Je vais tester tout ça !
Et encore une fois merci à vous ! Je sens que je vais rester ici, même si ma contribution sera plutôt faible (un TO7-70, une Atari 7800, et une snes).
Je poste mon code d'écriture, si ça intéresse quelqu'un (testé, ça marche):
Code : Tout sélectionner
void writeByte(byte addr, byte data)
{
//Preset
TRISA=0x00;
GRRW=1;
GRDS=1;
//Write Addr
GRAS=1;
LATA=addr;
_delay_us(1);
GRAS=0;
//Write Data
_delay_us(1);
GRRW=0;
LATA=data;
_delay_us(1);
//Reset
GRRW=1;
GRAS=1;
}
byte readByte(byte addr)
{
byte data;
//Preset
TRISA=0x00;
GRRW=1;
GRDS=1;
//Write Addr
GRAS=1;
LATA=addr;
_delay_us(1);
GRAS=0;
//Read Data
TRISA=0xFF;
_delay_us(1);
GRDS=0;
_delay_us(1);
data=PORTA;
//Reset
GRDS=1;
GRAS=1;
return data;
}
void waitBusy()
{
while(readByte(GR_R0)&0x80);
return;
}
Euh, là ils ne disent pas que le seul registre accessible c'est R0 ?Page 35 a écrit :Register access with XQR = 0
- Read STATUS is effective.
- Write COMMAND or any other register access
are ineffective.
Register access with XQR = 1
- Read STATUS or write COMMAND are effective,
- Access to other registers is ineffective.
A moins que ce qu'ils entendent par "any other register" ce soit les registres internes ?
EDIT2:
ça marche !
Bon, je n'arrive pas à configurer correctement l'affichage (syncro, entrelacement, ...), mais j'arrive à communiquer avec lui !
D'ailleurs, j'envoie le bit d’exécution seulement à la fin (pas à chaque modification), et ça ne semble pas poser problème.
Re: Programation Minitel (encore!)
Oui c'est ca tu envoi à la fin le code d’exécution (+$08), pas la peine de l'envoyer à chaque commande.
pour l'affichage il faut que tu définisse complétement tous les registres MAT, PAT, DOR, ROR ...
Après tu pourra afficher du texte comme tu veux.
pour l'affichage il faut que tu définisse complétement tous les registres MAT, PAT, DOR, ROR ...
Après tu pourra afficher du texte comme tu veux.
Re: Programation Minitel (encore!)
Le problème, c'est que je sais comment définir, mais je ne sais pas quoi définir... Je ne trouve pas les spécifications de l'écran...
- Papy.G
- Modérateur
- Messages : 3051
- Inscription : 10 juin 2014 13:40
- Localisation : Haute-Garonne/Gers
Re: Programation Minitel (encore!)
321 Lignes Progressif (non entrelacé), à priori, pas encore eu le temps de programmer ma séquence d'initialisation, mais comme on arrive à afficher le signal sur une télé (en couleur, en plus!), je ne vois que ce mode.
Et si ça ne marche pas, bah, essaye en entrelacé, tu verras bien.
Le passage page 35 est mieux explicité dans la version de mars 1995 (lien que j'ai donné dans mon topic), mais j'ai du mal à le comprendre aussi.
A moins que la demande d'exécution ne puisse se faire que lors de l'envoi de commande, ce qui semble normal, inutile de demander l'exécution de l'écriture dans les registres à accès directs, puisque c'est déjà l'état de la broche dédiée qui définit que tu y écris ou que tu les lis (ou deux broches, selon le standard d'interface mémoire).
Le bit d'exécution en dernier, une fois que toutes les valeurs ont été chargées, c'est comme cela qu'il faut faire, à mon avis, j'ai posé la question à 6502man de façon un peu naïve, je me doutais de la réponse.
D'ailleurs, les valeurs restent dans les registres, sauf contre-indication, par exemple, en mode 24 bits, si tu veux passer deux caractères à suivre avec les mêmes attributs, tu n'a qu'un octet à changer (code "ASCII") avant d'envoyer KRV, c'est une source d'économie.
Pour le buzzer, il y a un ou deux topics remontés récemment sur la musique un bit, en faisant basculer l'insertion de la zone d'affichage et hors affichage à une certaine fréquence, tu devrais arriver à obtenir un son.
J'ai rien compris à ton code, je vais me pencher sur le mien, et vois ce que ça donne, si je me plante pas en programmant mon EEprom (à la main).
Et si ça ne marche pas, bah, essaye en entrelacé, tu verras bien.
Le passage page 35 est mieux explicité dans la version de mars 1995 (lien que j'ai donné dans mon topic), mais j'ai du mal à le comprendre aussi.
A moins que la demande d'exécution ne puisse se faire que lors de l'envoi de commande, ce qui semble normal, inutile de demander l'exécution de l'écriture dans les registres à accès directs, puisque c'est déjà l'état de la broche dédiée qui définit que tu y écris ou que tu les lis (ou deux broches, selon le standard d'interface mémoire).
Le bit d'exécution en dernier, une fois que toutes les valeurs ont été chargées, c'est comme cela qu'il faut faire, à mon avis, j'ai posé la question à 6502man de façon un peu naïve, je me doutais de la réponse.
D'ailleurs, les valeurs restent dans les registres, sauf contre-indication, par exemple, en mode 24 bits, si tu veux passer deux caractères à suivre avec les mêmes attributs, tu n'a qu'un octet à changer (code "ASCII") avant d'envoyer KRV, c'est une source d'économie.
Pour le buzzer, il y a un ou deux topics remontés récemment sur la musique un bit, en faisant basculer l'insertion de la zone d'affichage et hors affichage à une certaine fréquence, tu devrais arriver à obtenir un son.
J'ai rien compris à ton code, je vais me pencher sur le mien, et vois ce que ça donne, si je me plante pas en programmant mon EEprom (à la main).
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Demandez-en plus, ou faites-le vous-même.