-
J'utilise actuellement une version simplifiée du générateur vidéo décrit par Marcello Maggi, il permet de générer simplement 4 mires différentes en 15 kHz entrelacé : barres colorées, quadrillage, points ainsi qu'une image entièrement blanche :
(http://gamoovernet.pixhotel.fr/pics/20130126182519-gc339-atv017.jpg) | | (http://gamoovernet.pixhotel.fr/pics/20130126182618-gc339-atv018.jpg) |
(http://gamoovernet.pixhotel.fr/pics/20130126183651-gc339-atv019.jpg)
Le dossier complet ou les fichiers isolés du générateur vidéo sont disponibles à partir de plusieurs sites sur le net, il suffit de faire une recherche avec les mots clef "Marcello Maggi" et "video pattern generator".
A défaut voici le dossier pdf original sauvegardé ici sur le serveur Gamoover : http://www.gamoover.net/gc339/VidPatGen.pdf
Le générateur réalisé à partir de cette description :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20121212093011-gc339-Image-0084.JPG) (http://gamoovernet.pixhotel.fr/pics/20121212093011-gc339-Image-0084.JPG)
Seul le pic 16F84 avec le programme original a été conservé, l'encodeur PAL inutile a été remplacé par un circuit intégré genre 26LS31 qui bufferise la synchro et les signaux RVB, ce qui me permet d'avoir deux sorties pour chaque signal : une normale (positive ) et la deuxième inversée (négative ).
Les deux switches Secme permettent de choisir une des 4 mires possibles.
Le problème est que ce générateur ne délivre que du 15 kHz et qu'il faudrait pouvoir générer les mêmes mires en 24 et en 31 kHz pour pouvoir tester les moniteurs multifréquences.
De plus la 4ème mire, celle affichant un écran uniformément blanc, n'est pas d'une très grande utilité. Il serait préférable de la remplacer par une mire alternant images ou larges bandes noires et blanches pour vérifier la stabilité de la THT :
(http://gamoovernet.pixhotel.fr/pics/20130126181223-gc339-Full.gif) | | (http://gamoovernet.pixhotel.fr/pics/20130126185854-gc339-Half.gif) |
En effet, une image noire demande aucun courant au bloc THT alors qu'une image uniformément blanche lui en soutire un maximum. Si le bloc THT est sous dimensionné ou mal en point, la tension s'affaissera avec le courant délivré, les électrons seront alors moins accélérés et seront donc plus facilement déviés par les bobinages du yoke, l'image affichée augmentera de taille et les zones blanches seront moins lumineuses.
L'objet de ce wip est de réaliser un générateur vidéo capable de délivrer les 3 mires de base plus la mire alternant zones blanches et noires et ceci aux 3 fréquences utilisées en arcade, 15, 24 et 31 kHz.
Le document de départ sera ce tableau extrait du "Service Manual" du moniteur MS-2931 donnant les timings des différents signaux vidéo, les trames sont toutes identiques, pas de trames paires et impaires car il n'y a pas d'entrelacement:
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126194331-gc339-MS2931.gif) (http://gamoovernet.pixhotel.fr/pics/20130126194331-gc339-MS2931.gif)
Seules les trois premières lignes horizontales du tableau sont utiles car elles concernent les signaux vidéo issus de systèmes Sega, ils serviront donc de référence pour l'élaboration de ce générateur.
Les 3 dernières lignes indiquent les timings correspondant à la taille d'image maximum que ce moniteur peut afficher.
Chaque ligne comporte deux cellules dans certaines colonnes verticales :
- Les cellules du haut concerne la ligne. Elles indiquent la durée de l'impulsion de synchronisation ligne (Sync ), celle du contenu correspondant aux pixels affichés (Video ) avec son positionnement dans la ligne (B.P. pour Back Porch ), le tout exprimé en microsecondes.
- Les cellules du bas concerne la trame. Elles délivrent la durée de l'impulsion de synchronisation (Sync ), la taille de l'image affichée (Video )avec son positionnement dans la trame (B.P.), le tout exprimé en nombre de lignes.
Ainsi pour la première ligne du tableau décrivant un signal à 15 kHz :
- L'impulsion de synchronisation ligne dure 4,75 µs, suivie 6,45 µs après par 49,17 µs du contenu à afficher. La ligne dure au total 63,56 µs et il reste donc 63,56 - 4,75 - 6,45 - 49,17 soit 3,19 µs entre la fin du contenu affiché et le début de l'impulsion ligne suivante.
- L'impulsion de synchronisation trame dure 3 lignes, suivie 23 lignes vides après par 224 lignes de l'image à afficher. La trame dure au total 263 lignes et il reste donc 263 - 3 - 23 - 224 soit 13 lignes vides entre la fin de l'image affichée et le début de l'impulsion trame suivante
Les timings du signal vidéo à 15 kHz délivré par le précédent générateur étaient basés sur la durée des instructions du programme exécuté par le PIC 16F84 quitte à ajouter des instructions "nop" inopérantes pour ajuster les durées.
Ici les timings des lignes sont donnés à 0,01 µs près soit 10 ns ce qui correspondrait à une fréquence d'horloge de 100 Mhz pour un micro-contrôleur capable d'exécuter une instruction par cycle.
Le PIC16F84 du précédent générateur en est bien incapable avec sa plus grande fréquence d'horloge à 20 MHz, c'est pourquoi un SX28AC Scenix/Parallax/Ubicom lui sera substitué.
Ce micro-contrôleur SX28, en mode turbo, est capable d'exécuter une instruction par cycle d'horloge. Un SX28AC de base fonctionne parfaitement à une fréquence d'horloge de 50 MHz, certains exemplaires triés fonctionnent à 75 MHz voir même 100 MHz.
Avec un SX28AC de série cadencé à 50 MHz il sera donc possible d'exécuter une instruction toutes les 20 ns et ainsi de coller à ± 10 ns près au timing des signaux d'une ligne.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126213412-gc339-SX28AC.gif) (http://gamoovernet.pixhotel.fr/pics/20130126213412-gc339-SX28AC.gif)
Le brochage du SX28AC avec son boîtier oscillateur externe.
20 ports d'E/S sont disponibles : 4 pour le port RA, 8 pour les ports RB et RC.
Le timing des signaux à 15 kHz sous forme graphique, page I-5 du "Service Manual" du moniteur MS-2931 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126225609-gc339-15K.gif) (http://gamoovernet.pixhotel.fr/pics/20130126225609-gc339-15K.gif)
Les quatre intervalles de temps exprimés en µs et recalculés en pas de 20 ns :
- La synchronisation horizontale : 4,75 µs soit 4750 ns donc 237,5 pas.
- Le palier de suppression arrière (back porch ): 6,45 µs donc 322,5 pas.
- Le contenu à afficher : 49,17 µs donc 2458,5 pas.
- Le palier de suppression avant (front porch ): 3,19 µs donc 159,5 pas.
Soit un total de 3178 pas de 20 ns pour une ligne complète. Un demi pas correspond en fait à 10 ns
Comme un pas correspondra à un cycle du SX28AC, chaque intervalle de temps doit être un nombre entier et il est préférable d'arrondir au nombre de pas immédiatement supérieur les intervalles de temps les plus courts , quitte à minorer les intervalles les plus longs, ainsi donc :
- De 237,5 pas la synchronisation sera arrondie à 238.
- De 322,5 pas le palier arrière sera arrondi à 323.
- De 159,5 pas le palier avant sera arrondi à 160.
- Il reste donc 3178 - (238 + 323 + 160) pas pour le contenu à afficher, soit 2457 pas.
Hors 2457 n'est pas divisible par 8, pourquoi par 8? Par ce que la mire à barre colorée comporte 8 barres. Ce qui ferait 307,125 pour chaque barre, si l'on arrondi à 307 pas par barre le total passe à 2456 pas et il faut soit augmenter d'un pas le palier avant soit le faire pour la dernière barre. En réalité cela n'a aucune importance pour cette mire car le palier avant est confondu avec la dernière barre puisque celle ci est de couleur noire :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130127154830-gc339-ColorBars.gif) (http://gamoovernet.pixhotel.fr/pics/20130127154830-gc339-ColorBars.gif)
Comme on peut le voir sur ce dessin représentant les 3 signaux RVB d'une mire à barre colorée, ces signaux ont une amplitude nulle quand la dernière barre, la noire, est affichée. Elle est donc au même niveau que celui de l'intervalle de temps séparant cette barre de l'impulsion de synchronisation, autrement dit elle est confondue avec le palier de suppression avant.
Le timing des signaux à 24 kHz, moitié supérieure de la page I-6 du "Service Manual" du moniteur MS-2931 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126225643-gc339-24K.gif) (http://gamoovernet.pixhotel.fr/pics/20130126225643-gc339-24K.gif)
Les quatre intervalles de temps exprimés en µs et recalculés en pas de 20 ns :
- La synchronisation horizontale : 3,00 µs donc 150 pas.
- Le palier de suppression arrière (back porch ): 4,44 µs donc 222 pas.
- Le contenu à afficher : 30,69 µs donc 1534,5 pas.
- Le palier de suppression avant (front porch ): 2,87 µs donc 143,5 pas.
Soit un total de 2050 pas de 20 ns pour une ligne complète.
Le nombre entier 1534 n'est pas divisible par 8, le plus proche multiple étant de 1536. En portant à 192 pas (1536 ÷ 8 = 192) l'intervalle de temps correspondant à chaque barre colorée, le palier de suppression avant devra alors être raboté de 1,5 pas soit 30 ns, ce qui n'est pas un problème puisque la dernière barre est confondue avec le palier de suppression avant.
Les intervalles de temps correspondant à l'impulsion de synchronisation ligne et au palier de suppression arrière restent inchangés puisque ce sont déjà des nombres entiers de pas, ainsi donc :
- L'impulsion de synchronisation reste inchangée à 150 pas.
- Le palier arrière reste inchangé à 222.
- Le contenu à afficher est modifié à 8 × 172 soit 1536 pas.
- Le palier avant est minoré de 1,5 pas, sa nouvelle valeur est de 142 pas soit 2,84 µs au lieu de 2,87 µs, ce qui représente une erreur de 1%.
Le timing des signaux à 31 kHz, moitié inférieure de la page I-6 du "Service Manual" du moniteur MS-2931 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126225746-gc339-31K.gif) (http://gamoovernet.pixhotel.fr/pics/20130126225746-gc339-31K.gif)
Les quatre intervalles de temps exprimés en µs et recalculés en pas de 20 ns :
- La synchronisation horizontale : 3,58 µs donc 179 pas.
- Le palier de suppression arrière (back porch ): 1,75 µs donc 87,5 pas.
- Le contenu à afficher : 25,92 µs donc 1296 pas.
- Le palier de suppression avant (front porch ): 0,33 µs donc 16,5 pas.
Soit un total de 1579 pas de 20 ns pour une ligne complète.
Le nombre entier 1296 est un multiple de 8, (1296 ÷ 8 = 162), il n'y a rien à retoucher. Par contre aucune durée des paliers de suppression ne correspond à un nombre entier et comme il est préférable de majorer le nombre le plus faible (16,5 pour le palier avant ) et de minorer le plus grand (87,5 pour le palier arrière ), cela aura pour effet négligeable de recentrer l'image affichée de 0,5 % ÷ 1296 soit 0,26 ‰vers la gauche. Ainsi donc :
- L'impulsion de synchronisation reste inchangée à 179 pas.
- Le palier arrière est tronqué de 10 ns, sa nouvelle valeur est de 87 pas au lieu de 87,5.
- Le contenu à afficher est reste inchangé, 8 × 162 soit 1296 pas.
- Le palier avant est allongé de 10 ns, sa nouvelle valeur est de 17 pas au lieu de 16,5.
Le futur générateur en chantier :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130127151407-gc339-0096.JPG) (http://gamoovernet.pixhotel.fr/pics/20130127151407-gc339-0096.JPG)
Le circuit prépercé remplace le couvercle d'un boîtier de 120 × 75 × 55. Le boîtier du générateur précédent était plus petit puisqu'il ne mesurait que 90 × 60 × 40.
Pour l'instant ne sont implantés que :
- Dans le coin supérieur gauche : le jack pour connecter le bloc secteur de l'alimentation extérieure
- Au milieu toujours en haut, le régulateur 5 volts avec son radiateur.
- En dessous à gauche, le module oscillateur 50 MHz récupéré sur une épave.
- Toujours en dessous et à droite, le micro-contrôleur SX28AC Parallax.
Seront implantés par la suite :
- Une embase HD-15 femelle pour sortir les signaux vidéo vers le moniteur en test.
- Une batterie de 4 dip-switches, 2 pour choisir la mire et 2 autres pour la fréquence.
- ...
-
oulalalal ça me plait bien ça . très bonne idée . je vais suivre ce post de pret car c 'est ideal pour le test d'écran . Il va m'en falloir un vu le nombre de wip que eyeshield me ramène en ce moment.
bon courage a toi pour la suite et surtout merci pour le partage de l'info et du concept
-
C'est vraiment une super idée ^-^
et un sacré taff a venir <:)
-
Ah Ahhhhh c'est reparti pour un projet qui va bien !!!!!!
<:) <:)
Bon, on se voit quand =?= =?= :D :D
Faut bien qu'on se fasse une bise pour la nouvelle année quand même ;)
Et puis j'ai un truc à te faire visiter :D j'ai fini... :D
-
Autant commencer par le programme de la mire à barres colorées, c'est le plus simple!
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130127154830-gc339-ColorBars.gif) (http://gamoovernet.pixhotel.fr/pics/20130127154830-gc339-ColorBars.gif)
Comme on peut le voir sur le dessin, les 8 couleurs de la mire à barre colorées sont générées à partir des 3 couleurs de base, leur présence ou leur absence détermine la teinte finale.
Un niveau logique 1 pour une couleur donnée équivaut à sa présence alors que le niveau 0 équivaut à son absence.
Dans le langage assembleur du SX28A, les couleurs peuvent être définies en binaire comme suit :
; Définition des couleurs de la mire à barres colorées
| Black | | EQU | | %000 |
| Blue | | EQU | | %001 | | ; Bit 2° |
| Red | | EQU | | %010 | | ; Bit 2¹ |
| Green | | EQU | | %100 | | ; Bit 2² |
| Magenta | | EQU | | Blue+Red |
| Cyan | | EQU | | Blue+Green |
| Yellow | | EQU | | Red+Green |
| White | | EQU | | Blue+Red+Green |
Le port RA du SX28AC étant arbitrairement choisi pour émettre les signaux de couleur, 3 de ses ports élémentaires se retrouvent affectés de fait suite à la définition qui a été donnée ci-dessus pour les couleurs de base :
- RA0, patte n° 6, niveau logique de la couleur Bleue.
- RA1, patte n° 7, niveau logique de la couleur Rouge.
- RA2, patte n° 8, niveau logique de la couleur Verte.
Ainsi pour émettre une couleur ou en changer, l'instruction suivante pourra être employée :
| MOV | | RA,#Cyan | | ; Émission de la couleur Cyan |
Le problème avec cette simple instruction est qu'elle affecte les 4 ports élémentaires du port RA dont fait partie RA3 qui n'est pas concerné par les informations de couleur. Il est préférable d'utiliser la séquence d'instructions suivante même si elle nécessite quelques cycles machine supplémentaires (W est le registre de travail ou accumulateur du micro-contrôleur ) :
| MOV | | W,RA | | ; Lecture du port RA |
| AND | | W,#%1000 | | ; Effacement des 3 bits de couleur |
| OR | | W,#Cyan | | ; Positionnement des seuls bits impactés par la couleur Cyan |
| MOV | | RA,W | | ; Émission de cette nouvelle couleur |
Le câblage entre le SX28AC et l'embase HD-15 femelle pourrait être réalisé comme suit :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130127234142-gc339-Diagram.gif) (http://gamoovernet.pixhotel.fr/pics/20130127234142-gc339-Diagram.gif)
Le buffer LS367A inséré entre les 3 ports du SX28AC et l'embase HD-15 permet de le protéger contre toute fausse manip. Il vaut mieux suicider un vulgaire LS367A coûtant une fraction d'euro que de bousiller le micro-contrôleur. D'ailleurs, il faudra certainement insérer un atténuateur commutable entre les sorties du LS367A et l'embase HD-15 car, selon les exigences du moniteur MS-2931, l'amplitude des signaux vidéo doit être limitée à 0,7 volt sur 75 ? en 24 et en 31 kHz. Ceci est à vérifier pour tout autre moniteur.
Dans le cas de la mire à barres colorées un délai doit être mis en oeuvre entre chaque changement de couleur, cette temporisation déterminera la largeur des barres verticales :
Exemple cette séquence d'instructions :
Start | | MOV | | RA,#White | | ; Émission de la barre Blanche |
| | CALL | | Delay |
| | MOV | | RA,#Yellow | | ; Émission de la barre Jaune |
| | CALL | | Delay |
| | MOV | | RA,#Cyan | | ; Émission de la barre Cyan |
| | CALL | | Delay |
| | MOV | | RA,#Green | | ; Émission de la barre Verte |
Et ainsi de suite pour les autres couleurs...
Comme évoqué dans le message précédent, ces délais ou temporisations sont basées sur la durée que met le micro-contrôleur à exécuter une bouclette de programme. Généralement on utilise une variable, préalablement déclarée en entête de programme, qui sera pré-positionnée pour être ensuite décrémentée jusqu'à ce que sa valeur soit nulle. Exemple :
Start | | MOV | | RA,#White | | ; Émission de la barre Blanche |
| | MOV | | Counter,#Delay | | ; Initialisation du compteur |
LoopWhite | | DJNZ | | Counter,LoopWhite |
| | NOP |
| | NOP |
| | MOV | | RA,#Yellow | | ; Émission de la barre Jaune |
| | MOV | | Counter,#Delay | | ; Initialisation du compteur |
LoopYellow | | DJNZ | | Counter,LoopYellow |
| | NOP |
| | NOP |
| | MOV | | RA,#Cyan | | ; Émission de la barre Cyan |
Et ainsi de suite pour les autres couleurs...
L'instruction DJNZ (Decrement and Jump if Non Zero) est celle de la bouclette, elle décrémente la variable "Counter" et reboucle à l'adresse "LoopWhite", c'est à dire sur elle même, jusqu'à ce que la variable atteigne zéro. Comme cette instruction DJNZ nécessite plusieurs cycles d'horloge, des instructions NOP (qui font rien du tout sauf consommer un cycle d'horloge ), ont été ajoutées à sa suite pour ajuster au cycle près la durée de la temporisation.
Plutôt que de répéter X fois la même séquence d'instructions, il est préférable de les regrouper sous une macro. Macro qui sera déclarée en tête de programme et appelée autant de fois que nécessaire dans le programme, exemple :
SetColor | | MACRO | | Color,Delay | | ; Déclaration de la macro et de ses deux paramètres |
| | LOCAL | | LocLoop | | ; Étiquette interne à la macro |
| | MOV | | W,RA | | ; Lecture du port RA |
| | AND | | W,#%1000 | | ; Effacement des 3 bits de couleur |
| | OR | | W,#Color | | ; Positionnement des seuls bits impactés par la nouvelle couleur |
| | MOV | | RA,W | | ; Émission de cette nouvelle couleur |
| | MOV | | Counter,#Delay | | ; Initialisation du compteur |
LocLoop | | DJNZ | | Counter,LocLoop |
| | NOP |
| | NOP |
| | ENDM |
Avec une temporisation fantaisiste de 100 choisie pour cet exemple, l'émission des 8 barres colorées pourra s'écrire plus simplement, :
Start | | SetColor | | White,100 |
| | SetColor | | Yellow,100 |
| | SetColor | | Cyan,100 |
| | SetColor | | Green,100 |
| | SetColor | | Magenta,100 |
| | SetColor | | Red,100 |
| | SetColor | | Blue,100 |
| | SetColor | | Black,100 |
Les intervalles de suppression correspondent en fait à l'émission d'aucun bit de couleur donc à l'émission de la couleur noire. Il n'est alors pas utile de dissocier l'émission de la dernière barre de celle du palier de suppression avant, elle et il peuvent être regroupés en une seule émission de la couleur noire avec augmentation de la temporisation en conséquence, la séquence devient alors :
Start | | SetColor | | Black,30 | | ; Émission du palier de suppression arrière, durée 30 |
| | SetColor | | White,100 |
| | SetColor | | Yellow,100 |
| | SetColor | | Cyan,100 |
| | SetColor | | Green,100 |
| | SetColor | | Magenta,100 |
| | SetColor | | Red,100 |
| | SetColor | | Blue,100 |
| | SetColor | | Black,100+20 | | ; Palier de suppression avant accolé à dernière bande, durée 20 |
Pour l'exemple, les délais passés à la macro étaient fantaisistes. Il va falloir maintenant utiliser les pas calculés dans le précédent post pour chaque fréquence de balayage et faire en sorte que la macro puisse s'en servir directement pour éviter à chaque fois des calculs fastidieux.
Il est nécessaire de quantifier la durée de la macro "SetColor" en nombre de cycles :
SetColor | | MACRO | | Color,Delay | | |
| | LOCAL | | LocLoop |
| | MOV | | W,RA | | ; 1 cycle |
| | AND | | W,#%1000 | | ; 1 cycle |
| | OR | | W,#Color | | ; 1 cycle |
| | MOV | | RA,W | | ; 1 cycle |
| | MOV | | Counter,#Delay | | ; 2 cycles |
LocLoop | | DJNZ | | Counter,LocLoop | | ; 4 cycles sinon 2 en sortie de boucle |
| | ... |
| | ENDM |
Ce qui donne : 1 + 1 + 1 + 1 + 2 + (4 × (Delay-1)) + 2 cycles, ce qui se simplifie en : 4 × (Delay+1)
Autrement dit, une unité du paramètre "Delay" équivaut actuellement à 4 cycles d'horloge. Si l'on veut qu'une unité de "Delay" corresponde à un pas ou cycle, il va falloir diviser le nombre de bouclettes par 4 moins une et rajouter de 1 à 3 "NOP" pour affiner la temporisation au plus près :
SetColor | | MACRO | | Color,Delay | | ; Déclaration de la macro et de ses deux paramètres |
| | LOCAL | | LocLoop | | ; Étiquette interne à la macro |
| | MOV | | W,RA | | ; Lecture du port RA |
| | AND | | W,#%1000 | | ; Effacement des 3 bits de couleur |
| | OR | | W,#Color | | ; Positionnement des seuls bits impactés par la nouvelle couleur |
| | MOV | | RA,W | | ; Émission de cette nouvelle couleur |
| | MOV | | Counter,#((Delay/4)-1) | | ; Initialisation du compteur de bouclettes |
LocLoop | | DJNZ | | Counter,LocLoop |
| | REPT | | Delay//4 | | ; Affinage, répétition de NOP modulo 4 |
| | NOP |
| | ENDR |
| | ENDM |
L'opérateur "/" effectue une division ayant un nombre entier comme résultat alors que l'opérateur "//" ou modulo permet de récupérer le reste de cette même division. Ainsi la macro peut calculer automatiquement le nombre de bouclettes adéquates et insérer l'appoint en instructions "NOP".
Avec le nombre de pas calculés dans le post précédent, une ligne de la mire à barres colorées peut s'exprimer ainsi pour la fréquence de 15 kHz :
Start | | SetColor | | Black,323 | | ; Émission du palier de suppression arrière, durée 323 cycles |
| | SetColor | | White,307 |
| | SetColor | | Yellow,307 |
| | SetColor | | Cyan,307 |
| | SetColor | | Green,307 |
| | SetColor | | Magenta,307 |
| | SetColor | | Red,307 |
| | SetColor | | Blue,307 |
| | SetColor | | Black,307+161 | | ; Palier de suppression avant accolé à dernière bande, durée 161 cycles |
On peut même pousser le luxe en englobant cette série de macros dans une nouvelle macro à laquelle on ne fourni que les paramètres de durée des différents intervalles :
ColorBars | | MACRO | | DelayBP,DelayBar, DelayFP | | ; Déclaration de la macro et de ses trois paramètres |
| | SetColor | | Black,DelayBP | | ; Émission du palier de suppression arrière (BP as Back Porch) |
| | SetColor | | White,DelayBar |
| | SetColor | | Yellow,DelayBar |
| | SetColor | | Cyan,DelayBar |
| | SetColor | | Green,DelayBar |
| | SetColor | | Magenta,DelayBar |
| | SetColor | | Red,DelayBar |
| | SetColor | | Blue,DelayBar |
| | SetColor | | Black,DelayBar+DelayFP | | ; Palier de suppression avant accolé à dernière bande (FP as Front Porch) |
| | ENDM |
Ainsi pour générer la même ligne en 15 kHz il suffira d'écrire (après avoir écrit toutes les déclarations nécessaires ) :
Bars15 | | ColorBars | | 323,307,161 | | ; Émission d'une ligne à 15 kHz de la mire à barres colorées |
Aussi simple pour générer une ligne en 24 et en 31 kHz :
Bars24 | | ColorBars | | 222,172,142 | | ; Émission d'une ligne à 24 kHz de la mire à barres colorées |
Bars31 | | ColorBars | | 87,122,17 | | ; Émission d'une ligne à 31 kHz de cette même mire. |
Bon maintenant il ne reste plus qu'à intégrer l'impulsion de synchronisation dans la ligne et à répéter les lignes autant de fois que nécessaire pour constituer la trame.
-
Un petit retour en arrière sur la macro "SetColor" ou plus exactement sur les deux lignes de code (en bleu) qui réalisent la temporisation :
SetColor | | MACRO | | Color,Delay | | ; Déclaration de la macro et de ses deux paramètres |
| | LOCAL | | LocLoop | | ; Étiquette interne à la macro |
| | MOV | | W,RA | | ; Lecture du port RA |
| | AND | | W,#%1000 | | ; Effacement des 3 bits de couleur |
| | OR | | W,#Color | | ; Positionnement des seuls bits impactés par la nouvelle couleur |
| | MOV | | RA,W | | ; Émission de cette nouvelle couleur |
| | MOV | | Counter,#((Delay/4)-1) | | ; Initialisation du compteur de bouclettes |
LocLoop | | DJNZ | | Counter,LocLoop |
| | REPT | | Delay//4 | | ; Affinage, répétition de NOP modulo 4 |
| | NOP |
| | ENDR |
| | ENDM |
La taille de la variable "Counter" étant d'un octet, elle ne peut servir à décompter que 256 bouclettes au maximum, la temporisation s'étage donc entre (1 + 1) × 4 = 8 et (1 + 25) × 4 = 1028 cycles d'horloge par sauts de 4 en 4.
Ces 1028 cycles ou pas maximum ne seront pas suffisants dans le cas de la mire clignotante où toutes les lignes sont uniformes pendant un intervalle de temps aussi grand que 2456 pas dans le cas du 15 kHz.
Il convient donc de réécrire cette macro et d'en profiter pour isoler les lignes de code de la temporisation dans une nouvelle macro spécifique afin d'éviter leur répétition intempestive dans le programme source.
Tout d'abord les deux lignes (en bleu) peuvent être isolées dans une sous-macro indépendante :
BasicDelay | | MACRO | | Value | | ; Déclaration de la macro et de son paramètre |
| | LOCAL | | LocLoop | | ; Étiquette interne à la macro |
| | MOV | | LoopCounter,#Value | | ; 2 cycles, initialisation du compteur de bouclettes |
LocLoop | | DJNZ | | LoopCounter,LocLoop | | ; 4 cycles sinon 2 en sortie de boucle |
| | ENDM |
Le nom de la variable "Counter" évolue en LoopCounter pour l'identifier immédiatement par rapport aux autres compteurs "LineCounter" et "FrameCounter" qui seront utilisés par la suite.
La temporisation, en nombre de cycles, réalisée par cette macro de base est tout simplement égale à 4 fois la valeur paramétrée.
La temporisation maximum réalisable par cette macro est donc de 1024 cycles d'horloge (256 × 4). Plutôt que de décompter, avec un deuxième compteur, le nombre de fois ou une telle macro sera utilisée, il est plus simple d'en accoler plusieurs à la suite surtout qu'un nombre raisonnable de trois sera nécessaire pour atteindre la temporisation de 2456 pas évoquée plus en avant.
En choisissant une valeur maximum de 250 au lieu de 256, ce qui correspond au nombre bien bien plus pratique de 1000 cycles, la temporisation voulue pourra être ainsi exprimée :
| | REPT | | Value/250 | | ; Correspond à 250 × 4 soit 1000 cycles d'horloge |
| | BasicDelay | | 250 |
| | ENDR |
| | BasicDelay | | Value//250 | | ; Complémenté par le reste de la division par 250 |
A fin d'éviter à l'assembleur de recalculer à chaque fois l'expression ((Delay/4)-1) on peut assigner cette expression à un symbole redéfinissable, ici "Loops", grâce à la directive "SET" :
Loops | | SET | | (Delay/4)-1 |
| | REPT | | Loops/250 | | ; Correspond à 250 × 4 soit 1000 cycles d'horloge |
| | BasicDelay | | 250 |
| | ENDR |
| | BasicDelay | | Loops//250 | | ; Complémenté par le reste de la division par 250 |
Chaque boucle élémentaire consommant 4 cycles d'horloge, il faut rajouter l'affinage final à la nouvelle macro "Wait" qui va maintenant gérer les temporisations :
Wait | | MACRO | | Delay | | ; Déclaration de la macro et de son paramètre |
Loops | | SET | | (Delay/4)-1 |
| | REPT | | Loops/250 | | ; Correspond à 250 × 4 soit 1000 cycles d'horloge |
| | BasicDelay | | 250 |
| | ENDR |
| | BasicDelay | | Loops//250 | | ; Complémenté par le reste de la division par 250 |
| | REPT | | Delay//4 | | ; Affinage, répétition de NOP modulo 4 |
| | NOP |
| | ENDR |
| | ENDM |
Ainsi la précédente macro "SetColor" peut maintenant s'écrire :
SetColor | | MACRO | | Color,Delay | | ; Déclaration de la macro et de ses deux paramètres |
| | MOV | | W,RA | | ; 1 cycle, lecture du port RA |
| | AND | | W,#%1000 | | ; 1 cycle, effacement des 3 bits de couleur |
| | OR | | W,#Color | | ; 1 cycle, positionnement des seuls bits impactés par la nouvelle couleur |
| | MOV | | RA,W | | ; 1 cycle, émission de cette nouvelle couleur |
| | Wait | | Delay | | ; Temporisation, tient compte des 4 cycles absorbés par les instructions précédentes |
| | ENDM |
La nouvelle macro dédiée à la temporisation inclus dans son calcul de boucles un offset qui correspond aux 4 cycles des instructions l'ayant précédé. Ces instructions ayant permis de changer de couleur, voici une représentation explicitant l'impact de ce décalage sur l'affichage des barres colorées de la mire :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130131135901-gc339-Bars1.gif) (http://gamoovernet.pixhotel.fr/pics/20130131135901-gc339-Bars1.gif)
La nouvelle couleur n'est émise qu'après exécution de l'instruction "MOV RA,W", et comme le décalage de 4 cycles est systématique pour chaque nouvelle couleur, les durées sont toujours respectées au cycle près.
Le traitement de la synchronisation horizontale devra de fait être calqué sur celui des barres colorées et assumer ce même décalage.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130131142315-gc339-Bars2.gif) (http://gamoovernet.pixhotel.fr/pics/20130131142315-gc339-Bars2.gif)
- A l'extrême gauche la représentation de la fin de la dernière barre de la mire : la barre noire.
- Ensuite débute l'enchaînement de 3 intervalles de temps communs à toutes les différentes mires :
- Le palier de suppression avant, l'émission de la couleur noire est impérative pour la raison évoquée ci-dessus car la couleur précédente peut être différente.
- L'impulsion de synchronisation, la couleur restant noire, inutile de l'émettre à nouveau. L'intervalle de 4 cycles qu'occupait cette opération est mis à profit pour émettre cette impulsion :
- 3 cycles sont absorbés par une instruction qui n'exécute qu'un saut sur la suivante :
| | JMP | | $+1 | | ; Absorpsion de 3 cycles |
Le sigle "$" représentant l'adresse de l'instruction "JMP", $+1 représente donc celle de la suivante - La dernière est une manipulation de bit qui positionne le port associé à la synchronisation horizontale :
| | SETB | | SyncH | | ; Emission de l'impulsion |
Ce port aura préalablement été déclaré en tête de programme :
| SyncH | | EQU | | RB.0 | | ; Synchronisation horizontale, port RB0, patte 10 |
| SyncV | | EQU | | RB.1 | | ; Synchronisation verticale, port RB1, patte 11 |
- Le palier de suppression arrière. Il efface l'impulsion de synchronisation horizontale après absorpsion de 3 cycles par une instruction "JMP".
| | JMP | | $+1 | | ; Absorpsion de 3 cycles |
| | CLRB | | SyncH | | ; Effacement de l'impulsion |
- Et enfin à l'extrême droite la figuration du début de la première bande de la ligne suivante, la barre blanche.
Avec la précédente macro ColorBars réécrite sans les paliers de suppression :
ColorBars | | MACRO | | DelayBar | | ; Déclaration de la macro et de son unique paramètre |
| | SetColor | | White,DelayBar | | ; Première barre verticale |
| | SetColor | | Yellow,DelayBar |
| | SetColor | | Cyan,DelayBar |
| | SetColor | | Green,DelayBar |
| | SetColor | | Magenta,DelayBar |
| | SetColor | | Red,DelayBar |
| | SetColor | | Blue,DelayBar |
| | SetColor | | Black,DelayBar | | ; La huitième barre est aussi la dernière |
| | ENDM |
Avec le nombre de pas calculés dans le premier post, la définition dans le post précédent d'une ligne de la mire à barres colorées peut être réexprimée ainsi pour la fréquence de 15 kHz :
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | $+1 | | ; Absorpsion de 3 cycles |
| | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
|
| | | | | | ; Affichage des 8 barres colorées de la mire |
| | ColorBars | | 307 | | ; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles |
|
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161 | | ; Suppression de la dernière couleur par forçage du noir, durée du palier 161 cycles |
|
| | | | | | ; Impulsion de synchronisation horizontale |
| | JMP | | $+1 | | ; Absorpsion de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
En réordonnant les instructions afin d'utiliser un des sauts absorbateur pour assurer indéfiniment le rebouclage de la séquence :
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
LineLoop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
|
| | | | | | ; Affichage des 8 barres colorées de la mire |
| | ColorBars | | 307 | | ; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles |
|
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161 | | ; Suppression de la dernière couleur par forçage du noir, durée du palier 161 cycles |
|
| | | | | | ; Impulsion de synchronisation horizontale |
| | JMP | | $+1 | | ; Absorpsion de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | LineLoop | | ; Rebouclage avec absorpsion de 3 cycles |
Les durées des différents intervalles d'une ligne sont ainsi respectés au cycle près, la prochaine étape consistera à compter les lignes pour déterminer les différents intervalles d'une trame.
Le câblage prévu pour raccorder les synchronisations sur l'embase HD-15 en profitant des deux derniers buffers dans le LS367 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130131175827-gc339-NewDiagram.gif) (http://gamoovernet.pixhotel.fr/pics/20130131175827-gc339-NewDiagram.gif)
Après assemblage du code source, simulation avec le simulateur SXSim pour vérification des temporisations et enfin programmation d'un SX28AC avec le programmateur Fluffy-2, voici les différents signaux échantillonnés à 20 MHz par le Scanalogic 2 pour une fréquence ligne de 15 kHz :
- CH1/trace bleue pour le signal du bleu.
- CH2/trace jaune pour la synchronisation horizontale.
- CH3/trace rouge pour le signal du rouge.
- CH4/trace verte pour le signal du vert.
A comparer avec les chronogrammes du dessin inclus en tête du post précédent.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130201093919-gc339-ChronoGram.gif) (http://gamoovernet.pixhotel.fr/pics/20130201093919-gc339-ChronoGram.gif)
Par contre quand ces mêmes signaux sont visualisés à l'oscilloscope, ils sont beaucoup moins lisses, le palier correspondant au niveau logique haut n'est pas exempt de "glitches"
Par exemple pour le signal du bleu :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130201102524-gc339-Image-0102.JPG) (http://gamoovernet.pixhotel.fr/pics/20130201102524-gc339-Image-0102.JPG)
Avec une résistance de 4,7 kΩ entre la masse et la sortie concernée du LS367 pour soutirer un peu de courant au transistor qui assure le niveau haut, les "glitches" disparaissent et le palier redevient plat, quoique le niveau correspondant se soit affaissé de quelques dixièmes de volt.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130201103541-gc339-Image-0104.JPG) (http://gamoovernet.pixhotel.fr/pics/20130201103541-gc339-Image-0104.JPG)
-
Bonjour, cela me rappelle que j'avais réalisé un petit programme de mires sur Atari st, il est vrai que ces microcontrôleurs Scenix ont une puissance de calcul phénoménale, certains ont réussi à programmer des jeux vidéo. Fameux travail, en tout cas... ^-^
-
il est vrai que ces microcontrôleurs Scenix ont une puissance de calcul phénoménale, certains ont réussi à programmer des jeux vidéo.
(http://www.rickard.gunee.com/projects/video/sx/pong_ntsc.jpg) (http://www.rickard.gunee.com/projects/video/sx/pong.php) http://www.rickard.gunee.com/projects/video/sx/pong.php
| | (http://www.rickard.gunee.com/projects/video/sx/tetris_ntsc.jpg) (http://www.rickard.gunee.com/projects/video/sx/tetris.php) http://www.rickard.gunee.com/projects/video/sx/tetris.php
|
Non seulement le µC SX exécute le programme du jeu en affichant les scores, mais il arrive à générer la sous-porteuse NTSC/PAL avec le reste de cycles machine disponibles car il délivre en sortie un signal couleur en vidéo composite acceptable directement par une TV !
-
Très instructif et détaillé ce topic.
Merci de partager ce travail avec nous gc339 <:)
-
Wouaw merci pour ce partage !
C'est pour ça que j'aime Gamo !!! :-)=
-
Je propose quelque amélioration:
_afficher le bord du quadrillage en une autre couleur, effectivement quand l'écrans est très déréglé on ne peut savoir si l'image est décentré de un ou deux carreau
_Garder une page blanche en plus, peut s’avérer utile pour mètre en évidence le marquage du tube ou pour réglé la luminosité de la THT
_ Faire un dégradé de chaque couleur, pour régler les cut-offs
_Mettre le montage sur batterie :)
Je suis toujours impressionné par le niveau de tes réalisation.
-
Une trame ne comporte pas que des lignes dont le contenu est représentatif, elle est aussi composée de lignes inertes encadrant celles consacrées à la synchronisation verticale dont le contenu est forcé au niveau du noir. Le bloc de lignes représentant une période quelconque de la trame, pourra être redéfini ainsi (pour une mire à 15 kHz ):
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
LineLoop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Période d'affichage |
| | IF | | DisplayPatten=1 |
| | ColorBars | | 307 | | ; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles |
| | ELSE |
| | SetColor | | Black,2456 | | ; Niveau du noir imposé pendant 2456 cycles |
| | ENDIF |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161 | | ; Suppression de la dernière couleur par forçage du noir, durée du palier 161 cycles |
| | | | | | ; Impulsion de synchronisation horizontale |
| | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | LineLoop | | ; Rebouclage avec absorption de 3 cycles |
Le problème vient du fait que ce bloc boucle indéfiniment sur lui-même sans jamais enchaîner sur un autre, il est donc nécessaire de lui insérer un comptage pour que le contrôle échoie au bloc suivant une fois le bon nombre de lignes déroulées atteint.
Mais avant de réaliser cette inclusion, il est nécessaire de différencier chaque bloc de lignes par une étiquette globale. Les étiquettes suivantes seront déclarées locales à ce même bloc en les préfixant par deux points verticaux ":" ce qui devrait permettre de réutiliser localement les mêmes noms sans conflit dans les autres blocs :
BlockDraft | | EQU | | $ | | ; Étiquette globale en entête du bloc d'instructions |
|
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Période d'affichage |
| | IF | | DisplayPatten=1 |
| | ColorBars | | 307 | | ; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles |
| | ELSE |
| | SetColor | | Black,2456 | | ; Niveau du noir imposé pendant 2456 cycles |
| | ENDIF |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161 | | ; Suppression de la dernière couleur par forçage du noir, durée du palier 161 cycles |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | :Loop | | ; Rebouclage local avec absorption de 3 cycles |
Ainsi les deux étiquettes "Loop" et ":Start" seront locales à ce bloc mais pourront être connues des autres comme étiquettes globales si on les préfixe par celle du bloc d'instructions auquel elles appartiennent, exemple : "BlockDraft:Start"
L'emplacement le plus judicieux pour insérer le comptage se situe à la fin du palier avant de la suppression ligne auquel il devra emprunter quelques cycles machine.
Deux cas de figure après décomptage d'une ligne :
- LineCounter ≠ 0, l'enchaînement est repris dans le même bloc à partir de son étiquette ":Start"
- LineCounter = 0, le compteur est rechargé avec le nombre de lignes de la période suivante et l'enchaînement est transféré sur l'étiquette ":Start" du bloc suivant.
Mais il y a échec lors de l'assemblage car les étiquettes locales ne le sont qu'à la suite d'instructions précédée par une étiquette globale et le drame vient du fait que les macros sont aussi considérées comme des étiquettes globales, ainsi les étiquettes ":Loop" et "Start" ne sont plus locales à la même suite d'instructions puisque celle-ci à été fractionnée par les macros invoquées entre-temps.
L'astuce trouvée, quoique pas très orthodoxe, a été de redéfinir l'étiquette globale après invocation des macros à l'aide d'une seconde directive "SET" :
BlockDraft | | SET | | $ | | ; Étiquette globale en entête du bloc d'instructions |
|
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Période d'affichage |
| | IF | | DisplayPatten=1 |
| | ColorBars | | 307 | | ; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles |
| | ELSE |
| | SetColor | | Black,2456 | | ; Niveau du noir imposé pendant 2456 cycles |
| | ENDIF |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161 | | ; Suppression de la dernière couleur par forçage du noir, durée du palier 161 cycles |
|
BlockDraft | | SET | | $ | | ; Étiquette globale redéfinie sur cette nouvelle adresse |
|
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | BlockDraft:Loop | | ; Rebouclage avec absorption de 3 cycles |
Ainsi les deux étiquettes locales impliquées semblent appartenir en première lecture au même bloc d'instructions alors que l'assembleur fait bien la distinction et assemble le code sans générer une quelconque erreur.
Étant donné que le compteur devra pouvoir compter jusqu'à 480 lignes avec le 31 kHZ, un seul octet ne sera pas suffisant, il faut donc le prévoir sur un mot de 2 octets :
| | ORG | | 8 | | ; Début de mémoire utilisable |
LoopCounter | | DS | | 1 | | ; Compteur de boucles |
LineCounter | | DS | | 2 | | ; Compteur de lignes |
FrameCounter | | DS | | 1 | | ; Compteur de Trames |
En fait le compteur ne comptera pas les lignes mais les décomptera, leur nombre ayant été préalablement initialisé par le bloc précédent avant de transférer l'exécution dans celui-ci.
La suite d'instructions suivantes gérant ce comptage est destinée à être incluse dans n'importe quel bloc de la trame, en fin du palier de suppression avant comme cela a été projeté :
| | DJNZ | | LineCounter,Label1 | | ; -1 sur octet de poids faible |
| | TEST | | LineCounter+1 | | ; Test sur l'octet de poids fort |
| | JZ | | Label2 | | |
| | DEC | | LineCounter+1 | | ; -1 sur octet de poids fort |
| | SKIP | | | | ; 6 cycles déjà consommés, 8 à absorber pour atteindre l'adresse :Start |
Label1 | | JMP | | $+2 | | ; 4 cycles déjà consommés, 10 à absorber pour atteindre l'adesse :Start |
| | SKIP | | | | |
| | JMP | | $+1 | | |
| | NOP | | | | |
| | JMP | | Block:Start | | ; Étiquette locale du bloc où cette suite d'instruction a été insérée |
Label2 | | MOV | | LineCounter,#(Value//256) | | ; Chargement du compteur, octet de poids faible |
| | MOV | | LineCounter+1,#(Value/256) | | ; Idem, octet de poids fort |
| | JMP | | NextBlock:Start | | ; Étiquette locale du bloc suivant où l'exécution doit être transférée |
Le nombre de cycles le plus grand de cette suite d'instructions est celui du traitement où le compteur a atteint zéro et il est dans ce cas égal à 14. Aux autres cas de figure doivent correspondre le même temps d'exécution, c'est pour cela qu'ils ont été ajustés au cycle près par l'insertion d'instructions inertes comme NOP (1 cycle ), SKIP (2 cycles ) et JMP (3 cycles )
Cette suite d'instructions testant le compteur de lignes peut-être transformé en macro invoquable par les différents blocs dont une trame est constituée :
NextLine | | MACRO | | CurrentBlock,NextBlock, NewLineNumber | | |
| | LOCAL | | Label1,Label2 | | ; Déclaration des étiquettes privées |
| | DJNZ | | LineCounter,Label1 | | ; -1 sur octet de poids faible |
| | TEST | | LineCounter+1 | | ; Test sur l'octet de poids fort |
| | JZ | | Label2 | | |
| | DEC | | LineCounter+1 | | ; -1 sur octet de poids fort |
| | SKIP | | | | ; 6 cycles déjà consommés, 8 à absorber pour atteindre l'adresse :Start |
Label1 | | JMP | | $+2 | | ; 4 cycles déjà consommés, 10 à absorber pour atteindre l'adresse :Start |
| | SKIP | | | | |
| | JMP | | $+1 | | |
| | NOP | | | | |
| | JMP | | CurrentBlock??:Start | | ; Étiquette locale du bloc où cette suite d'instruction a été insérée |
Label2 | | MOV | | LineCounter,#(NewLineNumber//256) | | ; Chargement du compteur, octet de poids faible |
| | MOV | | LineCounter+1,#(NewLineNumber/256) | | ; Idem, octet de poids fort |
| | JMP | | NextBlock??:Start | | ; Étiquette locale du bloc suivant où l'exécution doit être transférée |
| | ENDM |
L'opérateur "??" permet de concaténer le nom de l'étiquette globale passée en tant que paramètre à celui de l'étiquette locale accolée à la suite en temps que texte.
On peut maintenant juxtaposer les différents blocs pour écrire le code d'une trame de la mire à barre colorées.
Le nombre de lignes de chaque bloc est issu du timing des signaux à 15 kHz joint au premier post de ce wip :
FrameStart | | JMP | | LeadingField:Start |
;------------------------------------------ Blanking avant ----------------------------------------
LeadingField | | SET | | $ |
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Blanking des lignes précédant l'impulsion trame |
| | SetColor | | Black,2456 | | ; Contenu des lignes forcé au niveau du noir pendant le blanking trame |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161-14 | | ; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage |
LeadingField | | SET | | $ | | ; Décomptage des lignes du bloc en fin du palier (14 cycles) |
| | NextLine | | LeadingField,SyncField,3 | | ; Durée de 3 lignes pour l'impulsion de synchronisation verticale |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | LeadingField:Loop | | ; Rebouclage avec absorption de 3 cycles |
;------------------------------ Impulsion de synchronisation trame --------------------------------
SyncField | | SET | | $ |
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Blanking des lignes pendant l'impulsion de synchronisation trame |
| | SetColor | | Black,2456 | | ; Contenu des lignes forcé au niveau du noir pendant l'impulsion de synchronisation trame |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161-14 | | ; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage |
SyncField | | SET | | $ | | ; Décomptage des lignes du bloc en fin du palier (14 cycles) |
| | NextLine | | SyncField,LaggingField,23 | | ; Durée de 23 lignes pour le blanking arrière |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | SyncField:Loop | | ; Rebouclage avec absorption de 3 cycles |
;----------------------------------------- Blanking arrière ---------------------------------------
LaggingField | | SET | | $ |
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Blanking des lignes à la suite de l'impulsion trame |
| | SetColor | | Black,2456 | | ; Contenu des lignes forcé au niveau du noir pendant le blanking trame |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161-14 | | ; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage |
LaggingField | | SET | | $ | | ; Décomptage des lignes du bloc en fin du palier (14 cycles) |
| | NextLine | | LaggingField,PatternField,224 | | ; Durée de 224 lignes pour afficher la mire à barres colorées |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | LaggingField:Loop | | ; Rebouclage avec absorption de 3 cycles |
;---------------------------------------- Affichage de la mire --------------------------------------
PatternField | | SET | | $ |
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Affichage des 8 barres colorées de la mire |
| | ColorBars | | 307 | | ; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles |
| | | | | | ; Palier de suppression avant (Front Porch) |
| | SetColor | | Black,161-14 | | ; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage |
LaggingField | | SET | | $ | | ; Décomptage des lignes du bloc en fin du palier (14 cycles) |
| | NextLine | | PatternField,LeadingField,13 | | ; Durée de 13 lignes pour le blanking avant |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | JMP | | $+1 | | ; Absorption de 3 cycles |
| | SETB | | SyncH | | ; Émission de l'impulsion |
| | Wait | | 238 | | ; Durée de l'impulsion, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | PatternField:Loop | | ; Rebouclage avec absorption de 3 cycles |
D'emblée on se rend compte que le palier arrière d'une ligne peut être confondu avec son contenu car il sont tous les deux forcés au niveau du noir pendant les périodes de suppression trame ou blanking : lignes écrites en bleu.
A ce propos, le simulateur SXSim a permis de faire ressortir un problème au niveau de l'assembleur, l'expression "161-14" passée comme paramètre à la macro SetColor n'est pas évaluée par celle-ci, mais par la macro fille "Wait" qui applique la précédence des opérateurs dans ses calculs, ce qui donne des résultats inattendus. La solution est soit d'englober l'expression par des parenthèses soit de modifier cette macro "Wait" pour que son paramètre "Delay" soit entouré de ces parenthèses à chaque fois qu'il doit être évalué.
Cette dernière solution est de loin la préférable :
Wait | | MACRO | | Delay | | ; Déclaration de la macro et de son paramètre |
Loops | | SET | | ( (Delay) /4)-1 |
Cycles | | SET | | (Delay)//4 |
| | REPT | | Loops/250 | | ; Correspond à 250 × 4 soit 1000 cycles d'horloge |
| | BasicDelay | | 250 |
| | ENDR |
| | BasicDelay | | Loops//250 | | ; Complété par le reste de la division par 250 |
| | IF | | Cycles=3 | | ; Affinage |
| | JMP | | $+1 | | ; Absorbe 3 cycles en une seule instruction |
| | ELSE |
| | REPT | | Cycles | | ; Répétition de NOP modulo 4 |
| | NOP |
| | ENDR |
| | ENDIF |
| | ENDM |
Conjointement à cette correction, la macro a été modifiée pour économiser de la mémoire programme. Un test est maintenant effectué sur le nombre de cycles à ajuster et s'il est égal à 3, la répétition d'instructions "NOP" est remplacée par une seule instruction "JMP $+1" qui absorbe à elle seule 3 cycles à la fois.
Maintenant que la trame est constituée et qu'elle boucle indéfiniment sur elle-même, il reste plus qu'à gérer l'impulsion de synchronisation verticale sur le port RB1.
Pour que début et la fin de cette impulsion de synchronisation trame soit strictement synchrone avec celle de la synchronisation ligne, l'émission de cette dernière doit être modifiée pour que les deux changent d'état simultanément tout en respectant le temps d'exécution de 4 cycles précédemment évoqué : surlignage marron .
;------------------------------ Impulsion de synchronisation trame --------------------------------
SyncField | | SET | | $ |
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Blanking des lignes pendant la synchronisation trame |
| | SetColor | | Black,2456+161-14 | | ; Contenu + palier avant forcés au niveau du noir pendant cette période. Moins les 14 cycles du décomptage |
SyncField | | SET | | $ | | ; Décomptage des lignes du bloc en fin du palier (14 cycles) |
| | NextLine | | SyncField,LaggingField,23 | | ; Durée de 23 lignes pour le blanking arrière |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | MOV | | W,RB | | ; Lecture du port RB, la manipulation de bits impossible sur W est réalisée sur son emplacement mémoire WREG |
| | SETB | | WREG.0 | | ; Positionnement du bit correspondant à la synchronisation horizontale |
| | SETB | | WREG.1 | | ; Positionnement du bit correspondant à la synchronisation verticale |
| | MOV | | RB,W | | ; Émission de ce nouvel état |
| | Wait | | 238 | | ; Durée de l'impulsion ligne, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | SyncField:Loop | | ; Rebouclage avec absorption de 3 cycles |
;----------------------------------------- Blanking arrière ---------------------------------------
LaggingField | | SET | | $ |
| | | | | | ; Palier de suppression arrière (Back Porch), suite |
:Loop | | CLRB | | SyncH | | ; Effacement de l'impulsion de synchronisation Horizontale |
| | Wait | | 323 | | ; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Blanking des lignes à la suite de la synchronisation trame |
| | SetColor | | Black,2456+161-14 | | ; Contenu + palier avant forcés au niveau du noir pendant cette période. Moins les 14 cycles du décomptage |
LaggingField | | SET | | $ | | ; Décomptage des lignes du bloc en fin du palier (14 cycles) |
| | NextLine | | LaggingField,PatternField,224 | | ; Durée de 224 lignes pour afficher la mire à barres colorées |
| | | | | | ; Impulsion de synchronisation horizontale |
:Start | | MOV | | W,RB | | ; Lecture du port RB, la manipulation de bits impossible sur W est réalisée sur son emplacement mémoire WREG |
| | SETB | | WREG.0 | | ; Positionnement du bit correspondant à la synchronisation horizontale |
| | CLRB | | WREG.1 | | ; Effacement du bit correspondant à la synchronisation verticale |
| | MOV | | RB,W | | ; Émission de ce nouvel état |
| | Wait | | 238 | | ; Durée de l'impulsion ligne, tient compte des 4 cycles absorbés par les instructions précédentes |
| | | | | | ; Palier de suppression arrière (Back Porch) |
| | JMP | | LaggingField:Loop | | ; Rebouclage avec absorption de 3 cycles |
La manipulation de bits, ceux correspondant aux synchronisations, est impossible sur l'accumulateur W, cependant ce registre peut être mappé en mémoire à la place d'un autre qui réside à l'adresse $01.
Deux conditions sont alors requises :
- Avoir positionné le pseudo fusible OPTIONX qui sera programmé en même temps que le code dans le microcontrôleur SX28. Sinon le bit "RTW" du registre "OPTION" restera positionné à 1.
Ceci s'effectue dans le texte source à l'aide de la directive "DEVICE OPTIONX" - Que le bit "RTW" dans le registre "OPTION" soit à 0.
Tous les bits ayant été positionnés à 1 suite au reset, il faut l'avoir préalablement effacé avec l'instruction "MOV !option,#%0111111" lors de la séquence d'initialisation sinon on accède au compteur/temporisateur RTCC à la place.
L'accumulateur W est alors accessible en temps que registre mémoire "WREG" et ses bits peuvent être alors manipulés aisément.
Après nouvel assemblage du code source et programmation d'un SX28AC avec le programmateur Fluffy-2, voici les différents signaux échantillonnés à 10 MHz par le Scanalogic 2 pour une fréquence ligne de 15 kHz :
•CH1/trace bleue pour la synchronisation horizontale.
•CH2/trace jaune pour la synchronisation verticale.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130207133654-gc339-Frame01.gif) (http://gamoovernet.pixhotel.fr/pics/20130207133654-gc339-Frame01.gif)
Le temps mesuré entre deux impulsions de synchronisation trame avec la fonction "Quick time selection" est de 17,716 ms, le "Recommended Signal Timing Chart" inséré dans le premier post de ce wip donnait 16,715 ms, c'est tout bon compte tenu de toutes les imprécisions.
Le détail de l'impulsion trame, elle dure bien les trois lignes prévues :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130207135601-gc339-Frame02.gif) (http://gamoovernet.pixhotel.fr/pics/20130207135601-gc339-Frame02.gif)
Maintenant reste à intégrer la lecture des dip-switches pour pouvoir choisir la fréquence ligne de la mire...
-
Je propose quelques améliorations :
_afficher le bord du quadrillage en une autre couleur, effectivement quand l'écran est très déréglé on ne peut savoir si l'image est décentrée de un ou deux carreaux
Oui, c'est facilement faisable dans le cas de la mire à quadrillage. Mais je pencherais plus pour un trait de cadre plus épais ou constitué d'un trait double.
_Garder une page blanche en plus, peut s’avérer utile pour mettre en évidence le marquage du tube ou pour régler la luminosité de la THT
Le marquage du cathoscope se voit plutôt quand il est éteint, la seule utilité que pourrait avoir une image uniformément blanche concerne plutôt le contrôle de l'efficacité de la démagnétisation
_ Faire un dégradé de chaque couleur, pour régler les cut-offs
Oui, j'ai déjà songé à inclure ce genre de mire :
(http://img1.uplood.fr/free/cdzb_dsc00764_redimer.jpg)
Photo postée à l'origine par kaneda56 sur Néo-Arcadia
Cette mire nécessite 3 convertisseurs digital/analogique, un par couleur primaire, ce qui la complexifie. Mais pour l'instant ce n'est pas la priorité car j'ai surtout besoin d'un générateur simplifié.
Mais j'ai prévu d'utiliser les 8 ports RC0 à RC7 qui restent disponibles et de réaffecter les 4 ports RA0 à RA3 à cet effet. Cela fera 12 ports au total pour piloter 3 réseaux R2-R avec 16 niveaux par couleur, juste ce qu'il faut pour obtenir la mire de dégradés comme celle de la photo.
_Mettre le montage sur batterie
Qui dit batteries, dit chargeur. Et c'est encore une complication pour un générateur vidéo qui se veut le plus simple possible avec un minimum de composants.
Néanmoins, cette dernière proposition m'a fait réaliser qu'il vaudrait mieux que j'inclus le générateur dans un boîtier qui le protège.
Un boîtier Teko de récupération va vivre une nouvelle vie, le circuit imprimé d'origine a été conservé car il incluait une petite alimentation secteur et aussi parce qu'il facilitait la fixation de la plaquette pré-percée au-dessus avec uniquement des entretoises de 15 mm. Néanmoins une découpe a été effectuée dans ce circuit, juste en dessous de la plaque pré-percée, pour laisser le champ libre aux broches des supports à wrapper.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130211232423-gc339-Image-0149.JPG) (http://gamoovernet.pixhotel.fr/pics/20130211232423-gc339-Image-0149.JPG)
La découpe dans le circuit imprimé d'origine.
La plaque pré-percée vue coté mini-wrapping avec la fixation de l'embase HD-15 ainsi que celle du bloc de mini-switches qui permettront de choisir la mire.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130211233103-gc339-Image-0163.JPG) (http://gamoovernet.pixhotel.fr/pics/20130211233103-gc339-Image-0163.JPG)
La plaque prépercée en place sur ses entretoises.
A gauche le bloc de mini-switches, au centre l'embase vidéo HD-15 et à droite celle du secteur 220 VAC, il/elles sont tous accessibles sur le même face du boîtier.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130211233349-gc339-DSCF7088.JPG) (http://gamoovernet.pixhotel.fr/pics/20130211233349-gc339-DSCF7088.JPG)
La mire à barres colorée sur un Hantarex MTC9000, le commutateur SW4 du châssis a du être changé de position car la mire délivre des impulsions de synchronisation positives.
-
Le timing des signaux à 15 kHz tel qu'il est donné à la page I-5 du "Service Manual" du moniteur MS-2931 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126225609-gc339-15K.gif) (http://gamoovernet.pixhotel.fr/pics/20130126225609-gc339-15K.gif)
Et les durées retenues pour le générateur de mire, en nombre de pas de 20 ns :
Timing ligne 15 kHz: | | Timing Trame associé : |
- 161 pas ou µ-cycles pour le palier de suppression avant.
- 238 pas pour l'impulsion de synchronisation horizontale.
- 323 pas pour le palier de suppression arrière.
- 2456 pas pour le contenu à afficher.
| | - 13 lignes pour le champ de suppression avant.
- 3 lignes pour l'impulsion de synchronisation verticale.
- 23 lignes pour le champ de suppression arrière.
- 224 lignes à afficher (au lieu de 381 ).
|
Rien à redire en ce qui concerne la trame, le nombre de 224 lignes affichées est divisible par 8 (28 × 8 ) et convient donc parfaitement.
Dans le timing trame des signaux à 24 kHz (moitié supérieure de la page I-6 du "Service Manual" du moniteur MS-2931 ), le nombre de lignes constituant l'image est égal à 381, nombre impair indivisible par 8 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126225643-gc339-24K.gif) (http://gamoovernet.pixhotel.fr/pics/20130126225643-gc339-24K.gif)
Par contre dans le même timing à 24 kHz donné page 15/21 dans le "Service Manual" du moniteur du moniteur Nanao MS9-29SU le nombre de lignes affichées est de 384, nombre beaucoup plus pertinant puisque divisible par 8 (48 × 8 ).
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130217004602-gc339-P15.gif) (http://gamoovernet.pixhotel.fr/pics/20130217004602-gc339-P15.gif)
A durée de ligne égale (41 µs ) et durée de trame identique (17,384 ms ou 424 lignes ) ce nombre de lignes affichées supérieur est effectué au détriment du champ de suppression arrière qui de 28 lignes rétrograde à 25 lignes, toutes les autres durées élémentaires de la trame restant inchangées.
Ce nombre de 384 lignes affichées par trame, est celui qui sera donc retenu pour les timings des signaux à 24 kHz que la mire la mire devra générer, ainsi :
Timing ligne 24 kHz : | | Timing Trame correspondant : |
- 142 pas ou µ-cycles pour le palier de suppression avant.
- 150 pas pour l'impulsion de synchronisation horizontale.
- 222 pas pour le palier de suppression arrière.
- 1536 pas pour le contenu à afficher.
| | - 11 lignes pour le champ de suppression avant.
- 4 lignes pour l'impulsion de synchronisation verticale.
- 25 lignes (au lieu de 28 ) pour le champ de suppression arrière.
- 384 lignes à afficher (au lieu de 381 ).
|
Par contre il y a un souci avec les timings des signaux à 31 kHz ou plus exactement à 31,67 kHz, ceux déjà évoqués et qui sont donnés à la page I-6 du "Service Manual" du moniteur MS-2931 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130126225746-gc339-31K.gif) (http://gamoovernet.pixhotel.fr/pics/20130126225746-gc339-31K.gif)
En effet, le palier de suppression avant de 0,33 µs calculé puis arrondi à 17 pas est trop court par rapport aux 14 cycles absorbés par la macro de comptage de lignes auxquels il faut encore ajouter 4 cycles supplémentaires pour l'émission de l'impulsion ligne.
De plus le nombre de 477 lignes affichées dans une trame est impair, ce qui le disqualifie d'entrée.
Il y a bien les timings à 31,69kHz donnés page 1-10 dans le "Service Manual" du moniteur Nanao MS2934 mais ils sont inexploitables car les chiffres sont illisibles :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130218115944-gc339-Naomi31k.gif) (http://gamoovernet.pixhotel.fr/pics/20130218115944-gc339-Naomi31k.gif)
Heureusement, dans cette même notice, un tableau page 2-6 énumère toutes les informations qui étaient illisibles :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130218123028-gc339-P2-6.gif) (http://gamoovernet.pixhotel.fr/pics/20130218123028-gc339-P2-6.gif)
Il reste donc 31,55 - (3,04 + 3,22 + 23,70) soit 1,59 µs pour le palier de suppression avant, ce qui en arrondissant correspond à 80 pas ou µ-cycles, ce qui est beaucoup plus confortable que les 17 pas extrapolés du timing précédent. Non seulement, le nombre de lignes affichées par trame est divisible par 8 (80 × 8 ), mais il correspond à celui du standard VGA.
Ce sont aussi les mêmes timings, à 10 ns près en ce qui concerne la ligne, qui sont donnés page 5 dans le "Service Manual" du moniteur Sanwa 29E31S, ce qui les rend encore plus plausibles :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130218125805-gc339-29E31S.gif) (http://gamoovernet.pixhotel.fr/pics/20130218125805-gc339-29E31S.gif)
Même avec les données du dernier graphique qui sont toutes des nombres pairs, il va falloir procéder à un ajustage car le nombre de 1185 pas (23700 ÷ 20 ) alloués à la période affichée dans chaque ligne n'est pas divisible par 8. Le nombre le plus proche étant 1184 (148 × 8 ), le palier de suppression qui est le plus court des 4 autres intervalles de temps, se doit d'être gratifié d'un pas supplémentaire pour compenser, on a donc :
Timing ligne 31 kHz : | | Timing Trame correspondant : |
- 81 pas ou µ-cycles pour le palier de suppression avant (au lieu des 17 précédents ).
- 152 pas pour l'impulsion de synchronisation horizontale.
- 161 pas pour le palier de suppression arrière.
- 1184 pas pour le contenu à afficher.
| | - 14 lignes pour le champ de suppression avant.
- 3 lignes pour l'impulsion de synchronisation verticale.
- 33 lignes pour le champ de suppression arrière.
- 480 lignes à afficher (au lieu des 477 précédentes ).
|
Le câblage des dip-switches :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130218155805-gc339-Diagram.DipSw.gif) (http://gamoovernet.pixhotel.fr/pics/20130218155805-gc339-Diagram.DipSw.gif)
Le bloc de dip-switches est raccordé directement sur les entrées RB4 à RB7 qu'ils connectent à la masse quand le switch correspondant est positionné sur "ON". Ainsi pour que l'entrée soit lue à l'état "1" quand son switch associé est positionné sur "OFF", il faut avoir préalablement validé les résistances de "pull-up" internes au micro-contrôleur. Il n'est pas nécessaire de valider ces résistances en permanence si l'on veut faire de petites économie de consommation, il suffit de les valider quelques cycles avant la lecture pour qu'elle soit fiable et de les inhiber immédiatement après.
;------------------------ INITIALIZATION ROUTINE -----------------------
| | ORG | | 8 |
Initialize | | mov | | ra,#%0000 | | ; Set port A low |
| | mov | | rb,#%11111111 | | ; Set port B high |
| | mov | | rc,#%11111111 | | ; Set port C high |
|
| | | | | | ; Pull-Up Resistor Configuration |
|
| | mode | | PLP | | ; Allow Pull-Up Resistor configuration |
| | mov | | !ra,#%1111 | | ; Set port A, bit 0-3 to normal |
| | mov | | !rb,#%00001111 | | ; Set port B bits 4-7 with pull-up resistors |
| | mov | | !rc,#%11111111 | | ; Set port C bits 0-7 to normal |
|
| | | | | | ; Port Direction Configuration |
|
| | mode | | TRIS | | ; Allow Direction configuration |
| | mov | | !ra,#%0000 | | ; Set port A bits 0-3 to output |
| | mov | | !rb,#%11110000 | | ; Set port B bits 0-3 to output, 4-7 to input |
| | mov | | !rc,#%11111111 | | ; Set port C bits 0-7 to input |
Les registres notifiés !RA, !RB et !RC (avec le point d'exclamation ) ne sont pas des registres mais des points d'accès au bloc de registres qui contrôlent les ports RA, RB et RC. Il est nécessaire de définir préalablement le registre que l'on veut atteindre dans le bloc en écrivant sa sous-adresse dans le registre "MODE" commun à tous grâce à l'instruction du même nom.
Maintenant que les paramètres des signaux à 15, 24 et 31 kHz ont été retouchés, que les dip-switches sont câblés, il ne reste plus qu'à écrire et tester le bout de programme qui permettra de choisir la bonne fréquence de la mire à barre colorées à la mise sous tension du générateur.
Plus tard cette lecture des dip-switches pourra être effectuée à chaque trame ou toutes les X trames afin de pouvoir changer de mire et de fréquence au fil de l'eau sans avoir à réinitialiser le microcontrôleur à chaque changement.
-
Maintenant que les paramètres des signaux à 15, 24 et 31 kHz ont été retouchés, que les dip-switches sont câblés, il ne reste plus qu'à écrire et tester le bout de programme qui permettra de choisir la bonne fréquence de la mire à barre colorées à la mise sous tension du générateur.
Plus tard cette lecture des dip-switches pourra être effectuée à chaque trame ou toutes les X trames afin de pouvoir changer de mire et de fréquence au fil de l'eau sans avoir à réinitialiser le microcontrôleur à chaque changement.
Comme la mémoire programme du µC est paginée, 4 pages de 512 octets, et que le code du générateur dépasse allègrement cette limitation de page, il va falloir gérer la pagination de cette mémoire programme.
Le plus simple est donc de réserver la page 0 aux initialisations et aux tests qui seront effectués dans la boucle principale et d'affecter chacune des trois pages restantes à l'exécution des boucles locales propres à chaque fréquence ligne :
- Chaque boucle locale génèrera les mires pour une fréquence ligne donnée, ainsi les pages 1, 2 et 3 hébergeront respectivement les boucles locales pour les fréquences 15, 24 et 31 kHz.
- L'exécution sera transférée en fin de chaque trame à la boucle principale qui lira alors les micro-switches.
- Le contrôle passera de la boucle principale à la boucle locale désignée par ces micro-switches. S'il sont inchangés, le déroulement reprendra dans la même boucle locale là où il a été dérouté.
Ainsi les micro-switches seront lus périodiquement et la fréquence ligne de la mire pourra être modifiée au fil de l'eau sans avoir à reseter le µC ou à couper son alimentation.
Edition du 25/09/2015 : 1536 est la valeur correcte pour le 24 kHz.
Rappel des timings choisis :
Line Frequ. (kHz) | | | | | Front Porch (µcycles) | Horiz. Synch. (µcycles) | Back Porch (cycles) | Display
(µcycles) | | | | | Leading Blank (lines) | Vert. Synch. (lines) | Lagging Blank (lines) | Pattern
(lines) | 15 | | | 161 | 238 | 323 | 2456 | | | 13 | 3 | 23 | 224 | 24 | | | 142 | 150 | 222 | 13361536 | | | 11 | 4 | 25 | 384 | 31 | | | 81 | 152 | 161 | 1184 | | | 14 | 3 | 33 | 480 |
|
Les déclarations en tête du programme :
;-------------------------- DEVICE DIRECTIVES -------------------------- | | | | IFDEF | __SASM | ;SASM Directives | | | DEVICE | SX28AC, OSCHS3, TURBO, BOROFF, SYNC, OPTIONX, CARRYX | | | IRC_CAL | IRC_SLOW | | ELSE | | ; Parallax Assembler Directives | | | DEVICE | SX28AC, OSCXT2, TURBO, BOROFF, SYNC | | ENDIF | | | ID | "PATGEN" | | | RESET | Initialize | ; Reset vector |
|
;------------------------------- EQUATES ------------------------------- | | | SyncH | EQU | rb.0 | ; Synchro Horizontale sur RB0 | SyncV | EQU | rb.1 | ; Synchro Verticale sur RB1 | | Black | EQU | %0000 | Blue | EQU | %0001 | ; Bit 2° | Red | EQU | %0010 | ; Bit 2¹ | Green | EQU | %0100 | ; Bit 2² | Cyan | EQU | Green + Blue | Magenta | EQU | Red + Blue | Yellow | EQU | Red + Green | White | EQU | Red + Green + Blue |
|
| ; MODE Register Settings to access the port control registers |
TRIS | EQU | $0F | ; Data Direction Register | PLP | EQU | $0E | ; Pull-Up Resistor Enable Register | LVL | EQU | $0D | ; TTL/CMOS Select Register | ST | EQU | $0C | ; Schmitt Trigger Enable Register | WKEN | EQU | $0B | ; Wake Up Enable Register | WKED | EQU | $0A | ; Wake Up Edge Select Register | WKPND | EQU | $09 | ; MIWU Pending Register | CMP | EQU | $08 | ; Comparator Enable Register | | | |
;------------------------------ VARIABLES ------------------------------ | | | | ORG | 8 | ; Début de mémoire vive utilisable pour stocker les variables du progranne | LoopCounter | DS | 1 | ; Step Counter | LineCounter | DS | 2 | ; Line Conter | FrameCounter | DS | 1 | ; Frame Counter | FlipFlop | DS | 1 | ; Used to blink pattern |
|
|
Juste la déclaration d'une nouvelle variable "FlipFlop" qui sera utile pour la mire clignotante
La déclaration des macros :
;-------------------------------- MACRO's ------------------------------- | | | BasicDelay | MACRO | Value | ; Absorbe un nombre de µcycles = (Value × 4) | | LOCAL | LocLoop | ; Etiquette interne à la macro | | mov | LoopCounter,#Value | ; 2 µC, initialisation du compteur de bouclettes | LocLoop | DJNZ | LoopCounter,LocLoop | ; 4 µC sinon 2 en sortie de boucle | | ENDM |
| Delay | MACRO | Value,Offset | ; Temporisation incluant une franchise (Offset) | Loops | SET | (Value-(Offset))/4 | Cycles | SET | (Value-(Offset))//4 | | REPT | Loops/250 | ; Correspond à 250×4 soit 1000 µcycles d'horloge | | BasicDelay | 250 | | ENDR | | BasicDelay | Loops//250 | ; Complété par le reste de la division par 250 | | IF | Cycles=3 | ; Afinage | | jmp | $+1 | ; Absorbe 3 µcycles en une seule instruction | | ELSE | | REPT | Cycles | ; Répétition de NOP modulo 4 | | nop | | ENDR | | ENDIF | | ENDM |
| Wait | MACRO | Value | ; Temporisation, inclue les 4 µcycles du bloc d'instructions qui la précéde | | Delay | Value,4 | ; Minoration des 4 µcycles | | ENDM |
| SetColor | MACRO | Color, Delay | ; Emission de la couleur (Color), durée = (Delay) | | mov | w,ra | ; 1 µC, lecture du port RA | | and | w,#%1000 | ; 1 µC, effacement des 3 bits de couleur | | or | w,#Color | ; 1 µC, positionnement des bits impactés | | mov | ra,w | ; 1 µC, émission de cette nouvelle couleur | | wait | Delay | ; Temporisation, tient compte des µcycles absorbés par les instructions précédentes | | ENDM |
| ColorBars | MACRO | DelayBar | ; Emission des 8 barres colorées, durée de chaque barre = (DelayBar) | | SetColor | White,DelayBar | ; Première barre verticale | | SetColor | Yellow,DelayBar | | SetColor | Cyan,DelayBar | | SetColor | Green,DelayBar | | SetColor | Magenta,DelayBar | | SetColor | Red,DelayBar | | SetColor | Blue,DelayBar | | SetColor | Black,DelayBar | ; La huitième barre est aussi la dernière | | ENDM |
| NextLine | MACRO | Current,Next | ; Absorbe 14 µCycles sauf sortie vers MainLoop qui en absorbe que 9 | | LOCAL | LocLab1,LocLab2 | ; Déclaration des étiquettes privées | | djnz | LineCounter, LocLab1 | ; 4/2 µC, décomptage sur octet de poids faible | | test | LineCounter+1 | ; 1 µC, test de nullité sur l'octet de poids fort | NextAddr | SET | Next | | IF | NextAddr=MainLoop | | jnz | LocLab2 | ; 4/2 µC | | jmp | @MainLoop | ; 1+3 µC, soit 9 consommés au total | | ELSE | | jz | Next??:SetUp | ; 4/2 µC, 7 déjà consommés, les 7 manquants seront absorbés par le setup | | skip | | ; 2 µC, 7 déjà consommés, encore 7 à absorber | | ENDIF | LocLab1 | jmp | $+3 | ; 3 µC, 7 déjà consommés, encore 7 à absorber | LocLab2 | dec | LineCounter+1 | ; 1 µC, décomptage propagé sur octet de poids fort | | skip | | ; 2 µC, 10 déjà consommés, encore 4 à absorber | | jmp | $+1 | ; 3 µC, 10 déjà consommés, plus que 4 à absorber | | nop | | ; 1 µC, 11 déjà consommés, plus que 3 à absorber | | jmp | Current??:Start | ; 3 µC, 14 consommés au total | | ENDM |
| PresetCount | MACRO | Value | ; Initialisation du compteur ligne, absorbe 4 µCycles | | mov | LineCounter,#(Value//256) | ; 2 µC, chargement du compteur, octet de poids faible | | mov | LineCounter+1,#(Value/256) | ; 2 µC, idem, octet de poids fort | | ENDM |
|
|
- Eclatement de l'ancienne macro "Wait" avec création de la macro fille "Delay" issue de cette première :
- La macro "Wait" nouvelle mouture génère le même délai que l'ancienne en appelant la nouvelle macro "Delay".
- La nouvelle macro "Delay" génère une temporisation ± un offset passé comme deuxième paramètre.
- Modifications de la macro "NextLine :
- Suppression du troisième paramètre et extraction des instructions correspondantes. L'opération de chargement du compteur ligne est transféré à la nouvelle macro "PresetCount".
- Ajout d'une condition, l'adresse "Next" passée en deuxième paramètre est comparée avec celle de la boucle principale. Si c'est bien l'adresse de cette boucle principale, le programme sera dérouté vers le test des micro-switches de la boucle principale plutôt que de poursuivre son déroulement normal dans la boucle locale.
- Création de la macro "PresetCount" issue de l'ancienne macro "NextLine".
Le programme principal en page 0 (adresse 0000H) :
;-------------------------- ROUTINE D'INTERRUPTION -------------------------- ;-------------------------- ROUTINE D'INITIALISATION ------------------------- | | | | ORG | 8 | Initialize | mov | ra,#%0000 | ; Set port A low | | mov | rb,#%11111111 | ; Set port B high | | mov | rc,#%11111111 | ; Set port C high |
|
| ; Pull-Up Resistor Configuration |
| mode | PLP | ; Allow Pull-Up Resistor configuration | | mov | !ra,#%1111 | ; Set port A, bit 0-3 to normal | | mov | !rb,#%00001111 | ; Set port B bits 4-7 with pull-up resistors | | mov | !rc,#%00000000 | ; Set port C bits 0-7 with pull-up resistors | | | |
| ; Port Direction Configuration |
| mode | TRIS | ; Allow Direction configuration | | mov | !ra,#%0000 | ; Set port A bits 0-3 to output | | mov | !rb,#%11110000 | ; Set port B bits 0-3 to output, 4-7 to input | | mov | !rc,#%11111111 | ; Set port C bits 0-7 to input | | | |
| ; Device Configuration Options |
| mov | !option,#%01111111 | ; Raz bit RTW, RTCC inhibé, WREG accessible à la place | | | |
;---------------------------- PROGRAMME PRINCIPAL ----------------------------- | | | Main | setb | SyncH | | setb | SyncV | | clr | FlipFlop | ; Initialisation du flip flop | | jmp | PresetFrCnt |
|
| ; Compteur de trames pour clignotement, absorbe 7 µCycles |
MainLoop | djnz | FrameCounter,NoPreset | ; 2/4 µC | | not | FlipFlop | ; 1 µC, inversion du flip flop | PresetFrCnt | mov | FrameCounter,#30 | ; 2 µC, clignotement toutes les 30 trames (½ seconde) | | skip | | ; 2 µC, ajustement à 7 µC si rechargement FrameCount | NoPreset | jmp | $+1 | ; 3 µC, ajustement à 7 µCycles pour décomptage normal | | | |
| ; Lecture de la fréquence ligne sur les 2 premiers microswitches. | | ; Absorbe 11 µCycles quelque soit la boucle à exécuter. |
| jnb | rb.5,Jmp31k | ; 2/4 µC, lecture de la fréquence programmée par les dip-switches | | jnb | rb.4,Jmp24k | ; 2/4 µC | Jmp15k | jmp | $+1 | ; 3 µC pour ajustage absorpsion à 11 µC | | jmp | @Start15k | ; 1+3 µC, instruction de page incluse avec "@" | Jmp24k | nop | | ; 1 µC pour ajustage absorpsion à 11 µC | | | jmp | @Start24k | ; 1+3 µC, instruction de page incluse avec "@" | Jmp31k | jmp | $+1 | ; 3 µC pour ajustage absorpsion à 11 µC | | jmp | @Start31k | ; 1+3 µC, instruction de page incluse avec "@" | | | |
|
Ajout des tests :
- Sur le compteur trame. La variable "FlipFlop" est inversée toutes les trente trames, donc la mire concernée clignotera toutes les ½ secondes environ.
- Sur les deux premiers micro-switches. L'exécution du programme continuera dans la boucle locale (la page de 512 octets) correspondant à la fréquence ligne programmée.
Il y a donc 3 boucles locales, une pour chaque fréquence ligne.
Chaque boucle locale correspond à une trame, elle est composée de 4 blocs dont chacun est constitué de la répétition d'un nombre fixe de lignes dépendant de la fréquence ligne utilisée :
- L'impulsion de synchronisation trame. Le signal correspondant est à zéro pendant cette période.
- Le champ à la suite de l'impulsion trame, le signal vidéo est au niveau du noir pendant cette période.
- Les lignes affichant la mire, les couleurs de la mire sont affichées pendant cette période.
- Le champ précédant l'impulsion trame, le signal vidéo est au niveau du noir pendant cette période.
C'est en fin d'exécution de ce dernier bloc, c'est à dire à la fin de la trame, que le contrôle est transféré de la boucle locale vers la boucle principale pour incrémenter le compteur de trame et lire la fréquence ligne programmée sur les micro-switches.
Chaque ligne à l'intérieur d'un bloc est décomposée en 4 périodes distinctes dépendantes de la fréquence utilisée :
- L'impulsion de synchronisation ligne. Le signal correspondant est à zéro pendant cette période.
- Le palier arrière (back porch), le signal vidéo est au niveau du noir pendant ce palier.
- Le contenu de la ligne, il est affiché uniquement pendant cette période.
- Le palier avant (front porch), le signal vidéo est au niveau du noir pendant ce palier.
C'est en fin de ce dernier palier que le compteur ligne est décrémenté, le déroulement du bloc correspondant à un champ de la trame est terminée quand ce compteur ligne s'annule, l'exécution est alors transférée dans le bloc suivant.
Le code des 3 pages est identique aux noms des étiquettes près, il n'y a que les valeurs des paramètres (nombre de µcycles, nombre de lignes) passées aux macros qui diffèrent :
Le programme générant les mires à 15 kHz en page 1 (adresse 0200H)
;****************************** Impulsion de synchronisation trame ****************************** | | | SyncHor15k | SET | $ | :SetUp | PresetCount | 3 | ; Nombre de lignes allouées à l'impulsion de synchronisation verticale | | jmp | SyncHor15k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
SyncHor15k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 323 | ; Durée du palier arrière | | | |
| ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame |
| SetColor | Black,2456+161-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | SyncHor15k,Lagging15k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
SyncHor15k | SET | $ | :Start | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | clrb | wreg.1 | ; 1 µC, positionnement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cette nouvel état | | Wait | 238 | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | SyncHor15k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) ********** | | | Lagging15k | SET | $ | :SetUp | PresetCount | 23 | ; Nombre de lignes allouées au blanking arrière | | jmp | Lagging15k:Start |
|
| ; Palier de suppression arrière(Back Porch),suite |
Lagging15k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 323 | ; Durée du palier arrière | | | |
| ; Blanking des lignes à la suite de l'impulsion de synchronisation trame |
| SetColor | Black,2456+161-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Lagging15k,Pattern15k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Lagging15k | SET | $ | :Start | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | setb | wreg.1 | ; 1 µC, effacement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cet nouvel état | | Wait | 238 | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Lagging15k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;****************************** Affichage du motif de la mire ****************************** | | | Pattern15k | SET | $ | :SetUp | PresetCount | 224 | ; 224 Nombre de lignes allouées pour afficher la mire | | jmp | Pattern15k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Pattern15k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 323 | ; Durée du palier arrière | | | |
| ; Affichage des 8 barres colorées de la mire |
| ColorBars | 307 | ; Chaque barre occupe 307 µcycles | | | |
| ; Palier de suppression avant (Front Porch) |
| SetColor | Black,161-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Pattern15k,Leading15k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Pattern15k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 238 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Pattern15k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ************** | | | Leading15k | SET | $ | :SetUp | PresetCount | 13 | ; 4 µC, nombre de lignes allouées au blanking avant | | jmp | Leading15k:Start | ; 3 µCycles |
|
| ; Palier de suppression arrière (Back Porch), suite |
Leading15k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 323 | ; Durée du palier arrière | | | |
| ; Blanking des lignes précédant l'impulsion de synchronisation trame | | ; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop | | ; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor××k:SetUp) |
| SetColor | Black,2456+161-34 | ; Contenu = niveau du noir + palier avant, minoré de 34 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Leading15k,MainLoop | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale | | ; Un délai supplémentaire de 20 µCycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14 |
Leading15k | SET | $ | :Start | Delay | 20,-3 | ; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1" | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 238 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Leading15k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
|
Le programme générant les mires à 24 kHz en page 2 (adresse 0400H)
;****************************** Impulsion de synchronisation trame ****************************** | | | SyncHor24k | SET | $ | :SetUp | PresetCount | 4 | ; Nombre de lignes allouées à l'impulsion de synchronisation verticale | | jmp | SyncHor24k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
SyncHor24k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 222 | ; Durée du palier arrière | | | |
| ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame |
| SetColor | Black,1536+142-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | SyncHor24k,Lagging24k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
SyncHor24k | SET | $ | :Start | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | clrb | wreg.1 | ; 1 µC, positionnement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cette nouvel état | | Wait | 150 | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | SyncHor24k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) ********** | | | Lagging24k | SET | $ | :SetUp | PresetCount | 25 | ; Nombre de lignes allouées au blanking arrière | | jmp | Lagging24k:Start |
|
| ; Palier de suppression arrière(Back Porch),suite |
Lagging24k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 222 | ; Durée du palier arrière | | | |
| ; Blanking des lignes à la suite de l'impulsion de synchronisation trame |
| SetColor | Black,1536+142-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Lagging24k,Pattern24k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Lagging24k | SET | $ | :Start | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | setb | wreg.1 | ; 1 µC, effacement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cet nouvel état | | Wait | 150 | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Lagging24k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;****************************** Affichage du motif de la mire ****************************** | | | Pattern24k | SET | $ | :SetUp | PresetCount | 384 | ; Nombre de lignes allouées pour afficher la mire | | jmp | Pattern24k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Pattern24k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 222 | ; Durée du palier arrière | | | |
| ; Affichage des 8 barres colorées de la mire |
| ColorBars | 1536/8 | ; Chaque barre occupe 192 µcycles | | | |
| ; Palier de suppression avant (Front Porch) |
| SetColor | Black,142-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Pattern24k,Leading24k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Pattern24k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 150 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Pattern24k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ************** | | | Leading24k | SET | $ | :SetUp | PresetCount | 11 | ; Nombre de lignes allouées au blanking avant | | jmp | Leading24k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Leading24k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 222 | ; Durée du palier arrière | | | |
| ; Blanking des lignes précédant l'impulsion de synchronisation trame | | ; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop | | ; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor××k:SetUp) |
| SetColor | Black,1536+142-34 | ; Contenu = niveau du noir + palier avant, minoré de 34 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Leading24k,MainLoop | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale | | ; Un délai supplémentaire de 20 µCycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14 |
Leading24k | SET | $ | :Start | Delay | 20,-3 | ; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1" | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 150 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Leading24k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
|
Le programme générant les mires à 31 kHz en page 3 (adresse 0600H)
;****************************** Impulsion de synchronisation trame ****************************** | | | SyncHor31k | SET | $ | :SetUp | PresetCount | 3 | ; Nombre de lignes allouées à l'impulsion de synchronisation verticale | | jmp | SyncHor31k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
SyncHor31k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 161 | ; Durée du palier arrière | | | |
| ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame |
| SetColor | Black,1184+81-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | SyncHor31k,Lagging31k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
SyncHor31k | SET | $ | :Start | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | clrb | wreg.1 | ; 1 µC, positionnement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cette nouvel état | | Wait | 152 | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | SyncHor31k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) ********** | | | Lagging31k | SET | $ | :SetUp | PresetCount | 33 | ; Nombre de lignes allouées au blanking arrière | | jmp | Lagging31k:Start |
|
| ; Palier de suppression arrière(Back Porch),suite |
Lagging31k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 161 | ; Durée du palier arrière | | | |
| ; Blanking des lignes à la suite de l'impulsion de synchronisation trame |
| SetColor | Black,1184+81-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Lagging31k,Pattern31k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Lagging31k | SET | $ | :Start | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | setb | wreg.1 | ; 1 µC, effacement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cet nouvel état | | Wait | 152 | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Lagging31k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;****************************** Affichage du motif de la mire ****************************** | | | Pattern31k | SET | $ | :SetUp | PresetCount | 480 | ; Nombre de lignes allouées pour afficher la mire | | jmp | Pattern31k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Pattern31k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 161 | ; Durée du palier arrière | | | |
| ; Affichage des 8 barres colorées de la mire |
| ColorBars | 1184/8 | ; Chaque barre occupe 148 µcycles | | | |
| ; Palier de suppression avant (Front Porch) |
| SetColor | Black,81-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Pattern31k,Leading31k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Pattern31k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 152 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Pattern31k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ************** | | | Leading31k | SET | $ | :SetUp | PresetCount | 14 | ; Nombre de lignes allouées au blanking avant | | jmp | Leading31k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Leading31k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | 161 | ; Durée du palier arrière | | | |
| ; Blanking des lignes précédant l'impulsion de synchronisation trame | | ; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop | | ; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor××k:SetUp) |
| SetColor | Black,1184+81-34 | ; Contenu = niveau du noir + palier avant, minoré de 34 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Leading31k,MainLoop | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale | | ; Un délai supplémentaire de 20 µCycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14 |
Leading31k | SET | $ | :Start | Delay | 20,-3 | ; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1" | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 152 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Leading31k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | | | END |
|
Pour l'instant le générateur ne délivre qu'un seul type de mire : celle à barre colorée, la prochaine étape sera l'inclusion de l'une ou l'autre de ces mires clignotantes dans chaque boucle locale.
(http://gamoovernet.pixhotel.fr/pics/20130126181223-gc339-Full.gif) | | (http://gamoovernet.pixhotel.fr/pics/20130126185854-gc339-Half.gif) |
-
Merci gc339 pour ton boulot sur ce générateur de mire qui s'annonce indispensable ^-^
-
Bonjour.
Ce générateur de mire sera très utile pour qui a besoin de dépanner un écran ! 8)
Un autre outil, très complémentaire, serait très utile pour qui a besoin de dépanner un PCB.
Je m'explique...
Quand je dépanne un PCB, il arrive souvent que le problème soit "visuellement" situé à un endroit précis sur l'image : par exemple un sprite qui buggue, un truc qui a la mauvaise couleur, etc...
Lorsque j'utilise l'oscillo sur des RAM, des ROM, des composants TTL, etc..., je vois tout et n'importe quoi, faute de pouvoir synchroniser le déclenchement de mon oscillo avec l'instant où le problème est visible.
J'aimerais réaliser un outil (probablement à base de microcontrôleur) permettant cette synchro :
- il disposerait d'une entrée "SYNC-IN" (le signal de synchro généré par le PCB pour le moniteur, signal supposé bon)
- il diposerait d'un affichage LCD genre 2x16 ou 4x20 (exemple (http://www.electronique-diffusion.fr/product_info.php?products_id=92107))
- il disposerait de quelques boutons pour régler l'instant de déclenchement
- il disposerait d'une sortie "TRIGGER-OUT" à connecter à l'entrée "EXT-TRIGGER-IN" de l'oscillo
Principe de fonctionnement :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20130925104956-f4brice-outil.png) (http://gamoovernet.pixhotel.fr/pics/20130925104956-f4brice-outil.png)
- l'outil analyse le signal "SYNC" qu'il reçoit du PCB, il identifie les débuts d'affichage trame et ligne
- via les boutons et l'affichage LCD, l'utilisateur règle le numéro de la ligne + un éventuel délai supplémentaire en µs
- l'outil génère une impulsion sur sa sortie "TRIGGER-OUT" lorsque la ligne précédemment réglée commence à être affichée (plus l'éventuel délai)
- l'utilisateur règle son oscillo sur "EXT-TRIGGER", front montant ou descendant (choix à faire)
- l'utilisateur peut ainsi examiner les signaux de son choix sur le PCB dépanné à l'exact moment de son choix par rapport à l'image affichée
Exemple de réglages / d'affichage sur le LCD de l'outil :
59.9Hz/15.625kHz
LINE:004+074.1µs
La ligne du haut indiquerait l'état interne de l'outil : si le signal qu'il reçoit sur son entrée SYNC-IN est bon, il affiche les fréquences trame et ligne.
La ligne du bas indique le réglage actuel du déclenchement ; dans mon exemple, l'outil envoie une impulsion sur sa sortie "TRIGGER-OUT" 74,1 µs après le début de l'affichage de la 4e ligne.
Il y aurait 3 boutons pour modifier les réglages : un bouton "+", un bouton "-" et un bouton "NEXT" :
- le bouton "NEXT" passe de réglage en réglage :
- chiffre des centaines du n° de ligne
- chiffre des dizaines du n° de ligne
- chiffre des unités du n° de ligne
- chiffre des centaines du délai supplémentaire
- chiffre des dizaines du délai supplémentaire
- chiffre des unités du délai supplémentaire
- chiffre des dixièmes du délai supplémentaire
- la position courante est représentée, selon les possibilités de l'afficheur, par un clignotement du caractère concerné ou une inverse vidéo
- un appui sur le bouton "+" incrémente intelligemment le chiffre (s'il était à 9, il passe à 0 et le chiffre de poids fort immédiatement suivant est incrémenté)
- un appui sur le bouton "-" décrémente intelligemment le chiffre (s'il était à 0, il passe à 9 et le chiffre de poids fort immédiatement suivant est décrémenté)
Ca intéresserait quelqu'un un tel outil ? :D
-
Une réalisation de ce type : http://kudelsko.free.fr/Loupe_Video/presentation.htm. Elle est certes moins complète puisque spécifique au standard 625 lignes et le LM1881 gagnerait à être remplacé par un EL4583 (http://www.intersil.com/data/fn/fn7173.pdf) pour simplifier encore plus le schéma.
Un autre schéma moins sophistiqué puisqu'à base de compteurs et de roues codeuses, §15 de ce livre (Sélecteur de ligne de synchronisation ) :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20120820173632-gc339-ETSF-1-.JPG)
-
Salut
Ca intéresserait quelqu'un un tel outil ? :D
Oui clairement ! Ce serait effectivement très pratique !! :)
A++
-
Je viens de faire une version modifiée (pour mes besoins perso) de la mire gc339.
voici le schéma :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140408131626-spectroman-schema.PNG) (http://gamoovernet.pixhotel.fr/pics/20140408131626-spectroman-schema.PNG)
j'ai ajouté :
- un switch (n°8) pour mixer les deux synchros sur la sortie synchro horizontale
- un switch (n°7) pour inverser les synchros
- un switch (n°1) pour envoyer du noir (avec les synchros)
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140408132313-spectroman-20140408-130705.jpg) (http://gamoovernet.pixhotel.fr/pics/20140408132313-spectroman-20140408-130705.jpg)
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140408132335-spectroman-20140408-130720.jpg) (http://gamoovernet.pixhotel.fr/pics/20140408132335-spectroman-20140408-130720.jpg)
Le générateur fonctionne avec ces modifications.
Il faut que je termine l'intégration mécanique.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140408135516-spectroman-20140408-135338.jpg) (http://gamoovernet.pixhotel.fr/pics/20140408135516-spectroman-20140408-135338.jpg)
Les fichiers nécessaires à la fabrication du pcb sont ici (http://www.gamoover.net/AsPiC/mire.zip)
merci gc339 pour ton travail.
-
J'ai terminé l'intégration et le câble pour moniteur arcade (il ne reste que le péritel à faire).
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140410115752-spectroman-IMG-20140409-201340.jpg) (http://gamoovernet.pixhotel.fr/pics/20140410115752-spectroman-IMG-20140409-201340.jpg)
J'ai fait les essais sur un moniteur VGA
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140410115902-spectroman-IMG-20140409-164326.jpg) (http://gamoovernet.pixhotel.fr/pics/20140410115902-spectroman-IMG-20140409-164326.jpg)
et sur ma nstyl (mtc9110)
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20140410115925-spectroman-IMG-20140409-200521.jpg) (http://gamoovernet.pixhotel.fr/pics/20140410115925-spectroman-IMG-20140409-200521.jpg)
:-)=
-
T'aurais pas inversé les sorties bleu et vert par hasard ?
-
Ah oui, exacte. Dans ce moment de joie, je n'avais même pas fait attention.
merci
-
Ah oui, exacte. Dans ce moment de joie, je n'avais même pas fait attention.
merci
Le resume meme de ma vie au taff .
Il faut que j explique u client que l impetuosite des petits jeunes de mon BE ne vaut pas la fiabilite des conceptions de mes seniors et que donc fatalement il y a des conneries de faites mais c est vite torché .
Maintenant ils ont fait leur choix ;D .
Desole spectro fallait que je la fasse celle la . :-*
-
Je remonte un peut se sujet des oubliettes.
Étant en galère avec le circuit de commutation Horizontal de ma platine POLO Star tri-fréquence, je me suis dit qu'un générateur de mires me serait bien pratique.... et voilà que je tombe sur ce sujet en cherchant sur le net. ^-
Je suis donc fortement intéressé par la réalisation de se générateur mais cependant je n'est pas de quoi compiler et programmer un µp SX28AC.
Pour ceux qui ont fabriqué se géné comment avait vous procédé?
Pour le reste pas de soucie je vais me débrouiller avec les données et schéma disponible dans ce sujet
J'ai juste besoin d'un SX28AC programmé donc si quelqu'un pouvais m'aider pour cela sa serai sympa :)
-
Oh, j'étais passé à coté !!! Super boulot bien pratique ! ^-^
-
Bonjour
T'achètes un SX28 chez RS particuliers (http://fr.rs-online.com/web/p/microcontroleurs/0405632/).
T'en profites pour acheter aussi un boîtier oscillateur 50 MHz (http://fr.rs-online.com/web/c/semi-conducteurs/quartz-oscillateurs-et-resonateurs/oscillateurs-a-quartz/?searchTerm=Quartz+50+MHz&h=s&sra=oss&redirect-relevancy-data=636F3D3226696E3D4931384E44656661756C74266C753D6672266D6D3D6D61746368616C6C7061727469616C26706D3D5E5B5C707B4C7D5C707B4E647D5C707B5A737D2D2C2F255C2E5D2B2426706F3D3926736E3D592673743D4B4559574F52445F4D554C54495F414C5048415F4E554D455249432673633D592677633D4E4F4E45267573743D51756172747A203530204D487A26&esid=cl_4294652264,cl_4294192196,cl_4294641446&m=1&aaaExp=Y&applied-dimensions=4294190309,4294185059,4294185834&last-removed=4294532173) si tu n'en possèdes pas.
A commander de préférence le week-end pour bénéficier de la gratuité des frais d'expédition.
Une fois la commande reçue, tu m'expédies le SX28 avec quelques timbres poste pour le retour et je te le réexpédie après l'avoir programmé.
-
Bien écoute moi sa me va comme cela ^-, en plus je doit commander aussi des condos par ma POLO Star.
J'en profiterai pour passer toute ma liste de course en même temps 8)
Des que j'ai le circuit je me permettrai de recontacter par MP :)
PS: si un modo passe par là je pense que se très bon sujet à toutes sa place dans la nouvelle section "Outils homemade & commerciaux"
Sa sera plus facile de le retrouver :)
-
Autre question qui me taraude l'esprit ;D
La version de soft qui tu me programmera correspondra telle au dernier schéma de Spectroman ou l'autre sans mix de synchro =?=
C'est juste histoire que je parte sur la bonne version de montage dans ma liste de course. :D
-
C'est à spectro de te répondre, car je ne sais pas s'il a modifié le programme source que je lui avais communiqué.
-
pas sûr que sa soit la même version de soft car j'ai cru remarquer qu'il utilise un ports en plus patte 18 par rapport ta première version.
Spectroman si tu passe par là .... ;)
-
Oui c'est le même logiciel.
J'ai juste ajouté une broche au cas ou...
Je peux aussi te programmer le chip si tu veux. Par contre je n'arrive plus à trouver de SX28AC/DP-G.
Si tu passe commande, peux tu prends en un pour olschool?
-
En effet le SX28AC en DIL n'est plus dispo chez RS-Particulier, à mon avis se composant est obsolète car même sur Ebay on en trouve qu'un vendeur
J'en ai encore trouvé chez Selectronic pour 9.92€ la pièces donc si tu veut je t'en commande un de plus
-
Surtout ne pas commander le SX28 Scenix (http://www.selectronic.fr/microcontroleurs-st-scenix-intel-sx28ac.html), c'est un des tous premiers modèles et d'après ce que j'ai pu lire, il subsiste quelques bugs dont des difficultés pour le programmer à moins d'augmenter la tension de programmation d'un demi volt.
(http://www.selectronic.fr/media/catalog/product/cache/1/image/250x250/17f82f742ffe127f42dca9de82fb58b1/6/9/6972a.png)
@spectro : tu les programmes avec quel programmateur ?
-
Chez Selectronic j'ai noté cette référence SX28AC/DP (http://www.selectronic.fr/sx28ac-dp-non-rohs-dil-28.html) qui semble être la version Parallax mais il ni a pas de photo.
De toute manière vu la faible disponibilité de ce produit faudra prendre ce qu'il y a en espérant que cela marche...
-
Il suffit de prendre le modèle ROHS, le SX28AC/DP-G (http://www.selectronic.fr/sx28ac-dp-g-rohs-dil-28.html), ainsi on est sûr qu'il est de fabrication récente !
De plus c'est le moins cher (7€17) mais il n'y en a que 3 en stock contre 75 pour le SX28AC/DP (http://www.selectronic.fr/sx28ac-dp-non-rohs-dil-28.html) non ROHS.
-
Je les avait loupé ceux là, bien je vais en prendre avant qu'il n'y ai plus!
Je vais aussi contacter Spectroman par MP pour qu'il me confirme qu'il en veut bien un aussi
-
@spectro : tu les programmes avec quel programmateur ?
J'ai un eetools topmax, il fait pas mal de chose.
-
Commande des pièces passé plus qu'a attendre .... :o
-
J'ai profité du week-end de Pâques pour réaliser le générateur de mire version Spectroman.
Tout est assemblé mais je n'arrive pas à avoir les bonnes fréquences de synchro Horizontale.
Je n'ai que le 1/3 de ce qu'il faudrait soit environ 5, 8, et 10Khz... sur la patte 10 du SX28
L'oscillateur mouline bien à 50MHz donc j'avoue ne pas comprendre ce qui ne va pas...
-
Je n'ai pas eu ce problème sur les deux mires que j'ai faites.
Avec quel appareil tu fais tes mesures?
peux tu mesurer le signal directement sur la pin 10 du sx28?
tu as quel signal sur la pin 11 (sync V), c'est aussi 1/3 de la fréquence?
-
Les mesures sont faites à l'oscilloscope
Sortie patte 10 du SX28 j'ai 5.3Khz, 8.2KHz ou 10.8KHz soit exactement le 1/3 des bonnes fréquences de synchro.
Sa ressemble à un registre ou diviseur d'horloge mal calé en interne
La synchro Verticale j'ai beaucoup de mal à la mesurer car vraiment très/trop lente.
Demain j’amène le montage ou boulot pour voir la tête exact de l'oscillateur à 50MHz et la synchro verticale.
Mon fréquencemètre me donne lui bien 50Mhz.
Le "color enable" fonctionne ainsi que l'inversion de polarité synchro H
-
Bon les premiers tests au boulot confirment les valeurs de synchro mesuré sur mon oscillo, 1/3 de ce qu'il faudrai....
L'oscillateur turbine bien à 50MHz
La synchro vertical c'est encore bien pire un pulse tous les 2.2 secondes au lieux de 17ms...
Mesures faites directement sur le pattes du circuit en 10 et 11
Ce soir je sort le circuit et je vais le mettre sur ma platine d'essai avec alimentation direct histoire d'être sûr que c'est rien d'externe qui fout le bordel
-
Il y avait certainement des réglages de fuse a faire lors de la programmation, que j'ai mal du faire?
lors de la programmation :
- J'ai choisi le sx28
- J'ai regardé les fuses
- J'ai chargé le programme
- J'ai vérifier que les fuses ont étaient modifiés
- J'ai lancé une programmation/vérification
J'ai programmé en même temps celui pour olschool, je vais vérifié, sur ma mire si il fonctionne correctement.
Je te tiens au courant.
-
Ok sa permettra d'isoler un soucie de programmation
-
Les boucles de programme qui déterminent les timings sont conçues avec le fusible "Turbo/" positionné à zéro pour que les instructions courantes soient exécutées à la fréquence d'horloge.
Normalement les octets correspondant aux fusibles sont inclus dans le fichier ".hex" issu de l'assembleur.
-
Selon le programmateur utilisé, il est peut-être nécessaire de lui demander explicitement de programmer "en plus" les fusibles.
Charger le fichier .hex et lancer la programmation peut ne pas suffire.
Il faut aller dans les settings, et chercher une case à cocher du genre "program fuses".
-
Hier je n'ai pas eu le temps de faire les manips que je voulais, les journées de 24H sont trop courte
Après Spectroman n'en est pas à son premier circuit programmé, donc le mystère reste entier...
-
Hier je n'ai pas eu le temps de faire les manips que je voulais, les journées de 24H sont trop courte
Après Spectroman n'en est pas à son premier circuit programmé, donc le mystère reste entier...
Ce n'est que la deuxième fois que je programme ce chip. Si ça ne fonctionne pas c'est que j'ai du me planter.
Je teste le chip de olschool que j'ai programmé en même temps ce midi.
-
C'est confirmé, je me suis planté en le programmant. Celui d'olschool ne génère rien du tout.
-
C'est confirmé, je me suis planté en le programmant. Celui d'olschool ne génère rien du tout.
:-(( :-(( :-(( :-(( :-(( :-(( :-((
-
Spectroman, voleur escroc !!!! jouer de gameboy !!!!!
:D :D :D :D
nan je déconne :D
c'est cool que tu te soit aperçu du problème avant que je la récupère
:-* ^-^
-
Le soucie doit être le même, mauvaise fréquence de synchro du cout sa génère rien..
Comme on dit: l’erreur est humaine, qui celui qui ne s'est jamais trompé te jette la première pierre
-
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150408134938-olschool-vetandthecity.jpg) (http://gamoovernet.pixhotel.fr/pics/20150408134938-olschool-vetandthecity.jpg)
dans sa gueule
:D
-
Je n'arrive pas a programmer les fuse et fusex. Lors de la programmation ca dit ok et quand je relis le chips après la programmation, j'ai fff fff au lieu de 3fa f3f
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150512093834-spectroman-Capture.PNG) (http://gamoovernet.pixhotel.fr/pics/20150512093834-spectroman-Capture.PNG)
Je fais passer le chip a gc339 pour qu'il le teste avec son programmateur.
-
Ceci explique le pourquoi des fréquences fausses de synchro
-
Des news par rapport à ces registres récalcitrants =?=
-
Des news par rapport à ces registres récalcitrants =?=
Ayant hérité du SX28 récalcitrant de Fred G5, je viens de le reprogrammer sans problème. La prochaine étape est la vérification de ce SX28 en le substituant à celui de mon propre générateur.
Le programmateur et le logiciel utilisés :
- Ma réalisation personnelle du programmateur Fluffy2 (site : http://www.semis.demon.co.uk/Sx/SXmain.htm) :
(http://hico-srv004.pixhotel.fr/sites/default/files/styles/gamoovernet890px/public/gamoovernet/20101120004128-gc339-Fluffy2.JPG) (http://hico-srv004.pixhotel.fr/sites/default/files/gamoovernet/20101120004128-gc339-Fluffy2.JPG)
- Le logiciel de programmation (IC-Prog version 1.06C) :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150908154105-gc339-IC-Prog.PNG) (http://gamoovernet.pixhotel.fr/pics/20150908154105-gc339-IC-Prog.PNG)
Téléchargement du logiciel : http://www.ic-prog.com/icprog106C.zip
Ne pas oublier le driver pour NT/2000/XP : http://www.ic-prog.com/icprog_driver.zip
Les fichiers du générateur de mires :
- Le code source : http://www.gamoover.net/gc339/PatGen6/PatGen6.SRC
- Le listing issu de l'assembleur SASM : http://www.gamoover.net/gc339/PatGen6/PatGen6.LST
- Le code à programmer (format Intel HEX ) : http://www.gamoover.net/gc339/PatGen6/PatGen6.HEX
-
Un petit programmateur simple et efficace, sa me rappel celui que j'avais fait à l'époque pour les PIC
-
Le fait d'avoir dû ressortir le matériel pour programmer le SX de Fred G5 m'a encouragé à replonger dans le logiciel du générateur pour y incorporer une nouvelle mire.
Pour ce nouvel exercice, j'ai choisi arbitrairement la mire clignotante plutôt que la mire quadrillée (cross-hatch) parmi celles que j'avais prévues à l'origine. J'ai préféré implanter celle de droite en premier car elle sollicite un peu moins le bloc THT avec ses trois bandes alternées.
De plus la 4ème mire, celle affichant un écran uniformément blanc, n'est pas d'une très grande utilité. Il serait préférable de la remplacer par une mire alternant images ou larges bandes noires et blanches pour vérifier la stabilité de la THT :
(http://gamoovernet.pixhotel.fr/pics/20130126181223-gc339-Full.gif) | | (http://gamoovernet.pixhotel.fr/pics/20130126185854-gc339-Half.gif) |
En effet, une image noire demande aucun courant au bloc THT alors qu'une image uniformément blanche lui en soutire un maximum. Si le bloc THT est sous dimensionné ou mal en point, la tension s'affaissera avec le courant délivré, les électrons seront alors moins accélérés et seront donc plus facilement déviés par les bobinages du yoke, l'image affichée augmentera de taille et les zones blanches seront moins lumineuses.
Quand on analyse la constitution de ces mires clignotantes, on se rend compte qu'elles sont obtenues par la juxtaposition de 3 types de lignes élémentaires :
- Des lignes complètement blanches pour les traits inférieur et supérieur du cadre.
- Des lignes blanches délimitées par les montants verticaux du cadre, elles sont juxtaposées pour former les bandes blanches de la mire.
Chaque ligne blanche comporte ainsi :- Les pixels blancs du montant gauche du cadre.
- Les pixels noirs de la marge verticale gauche.
- La ligne blanche en question.
- Les pixels noirs de la marge droite.
- Les pixels blancs du montant droit.
- Des lignes noires délimitées par les montants verticaux du cadre. Leur juxtaposition permet de former les bandes noires de la mire.
Les pixels des marges verticales étant confondus avec les lignes noires, chaque ligne noire comporte donc :- Les pixels blancs du montant gauche du cadre.
- La ligne noire en question, marges confondues.
- Les pixels blancs du montant droit.
Et ces lignes noires sont aussi employées pour réaliser les marges horizontales entre les bandes blanches et les traits blancs du cadre, ces marges se confondant alors avec les deux bandes noires quand c'est à leur tour d'être affichées.
Le compteur qui va piloter le clignotement toutes les 30 trames soit ≈ ½ seconde a déjà été incorporé préventivement dans le programme existant :
;---------------------------- PROGRAMME PRINCIPAL ----------------------------- | | | Main | setb | SyncH | | setb | SyncV | | clr | FlipFlop | ; Initialisation du flip flop | | jmp | PresetFrCnt |
|
| ; Compteur de trames pour clignotement, absorbe 7 µCycles |
MainLoop | djnz | FrameCounter,NoPreset | ; 2/4 µC | | not | FlipFlop | ; 1 µC, inversion du flip flop | PresetFrCnt | mov | FrameCounter,#30 | ; 2 µC, clignotement toutes les 30 trames (½ seconde) | | skip | | ; 2 µC, ajustement à 7 µC si rechargement FrameCount | NoPreset | jmp | $+1 | ; 3 µC, ajustement à 7 µCycles pour décomptage normal | | | |
|
Le meilleur endroit pour insérer le code de cette nouvelle mire se situe assurément au niveau de la génération du motif de la mire à barres colorées. Une interception au tout début du palier de suppression arrière (back-porch ) permet de récupérer bien plus d'une centaine de µCycles inactifs avant d'afficher les lignes de cette nouvelle mire clignotante, la reprise s'effectuant juste devant le palier de suppression avant (front-porch ).
Exemple pour le programme de la mire à 15 kHz en page 1 (0200H), les modifications du code existant sont surlignées couleur fuchsia . Le principe est identique pour le code 24 et 31 kHz :
- Le switch concerné sur rb.6 (patte 16 du SX28 ) est testé.
- Le code de la mire clignotante est exécuté si le switch est à ON.
- Après affichage d'une ligne de cette nouvelle mire, la reprise du cours normal du programme doit s'effectuer juste devant le palier de suppression avant, sur la nouvelle étiquette "Pattern15k:FrontPorch".
- La durée du palier de suppression arrière est minorée de 2 cycles pour tenir compte du test.
;****************************** Affichage du motif de la mire ****************************** | | | Pattern15k | SET | $ | :SetUp | PresetCount | 224 | ; 224 Nombre de lignes allouées pour afficher la mire | | jmp | Pattern15k:Start |
|
| ; Palier de suppression arrière (Back Porch), suite |
Pattern15k | SET | $ | :Loop | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | | |
| ; Lecture en tout début de palier du dip-switch affecté au choix de la mire |
| jnb | rb.6,Twinkle15k | ; Absorbe 2 µC, 4 µC si dérivation vers mire clignotante |
| | Wait | 323-2 | ; Durée du palier arrière - 2 µCycles | | | |
| ; Affichage des 8 barres colorées de la mire |
| ColorBars | 307 | ; Chaque barre occupe 307 µcycles | | | |
| ; Palier de suppression avant (Front Porch) |
Pattern15k | SET | $ | :FrontPorch | SetColor | Black,161-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Pattern15k,Leading15k | ; Décomptage lignes et test si zéro | | | |
| ; Impulsion de synchronisation horizontale |
Pattern15k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | 238 | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | Pattern15k:Loop | ; Rebouclage avec absorption de 3 µcycles | | | |
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ************** |
La nouvelle mire étant constituée des 3 types de ligne précédemment évoqués, il va falloir comparer le numéro de celle qui va être affichée à ceux de chaque bande horizontale pour savoir à laquelle elle appartient et ainsi connaître son type afin de sélectionner le sous-programme concerné.
Le compteur de lignes "LineCounter" étant sur 16 bits, la création d'une nouvelle macro s'avère nécessaire pour effectuer cette comparaison sur deux octets.
;-------------------------- DEVICE DIRECTIVES -------------------------- | | | | IFDEF | __SASM | ;SASM Directives | | | DEVICE | SX28AC, OSCHS3, TURBO, BOROFF, SYNC, OPTIONX, CARRYX | | | IRC_CAL | IRC_SLOW | | ELSE | | ; Parallax Assembler Directives | | | DEVICE | SX28AC, OSCXT2, TURBO, BOROFF, SYNC | | ENDIF | | | ID | "PATGEN" | | | RESET | Initialize | ; Reset vector |
|
|
La comparaison s'effectuant à l'aide de deux soustractions, il a fallu effacer la déclaration du fusible CARRYX qui avait été déclaré à tord, l'algorithme employé étant perturbé par la propagation de la retenue issue d'une opération précédente.
La nouvelle macro qui compare le compteur de ligne LineCount à la valeur passée comme paramètre (la dernière ligne d'une bande horizontale ) :
CheckCount | | MACRO | | LastLine | | ; Test sur le comteur ligne, absorbe 6 µcycles |
| | MOV | | W,#LastLine/256 | | ; +1 µC |
| | MOV | | W,LineCounter+1-W | | ; +1 µC, soustraction entre octets de poids fort |
| | JNZ | | $+3 | | ; +2/4 µC |
| | MOV | | W,#LastLine//256 | | ; +1 µC |
| | MOV | | W,LineCounter-W | | ; +1 µC, soustraction entre octets de poids faible |
| | ENDM | | | | ; C=1 si LineCounter >= LastLine |
En 15kHz le nombre de lignes affichées est de 224, avec un trait de cadre d'une épaisseur d'un pixel (1 ligne ) et une marge horizontale de 2 pixels d'épaisseur (2 lignes ), il reste 224-6 soit 218 lignes pour les 3 bandes clignotantes soit 72,67 lignes pour chaque bande. Les lignes n'étant pas fractionnables, les 3 bandes ne pourront pas toutes être d'une même épaisseur :- la 1ère bande : 73 lignes,
- la 2ème : 72 lignes,
- et la 3ème : 73 lignes.
Soit un total de 218 lignes, le compte est bon.
Le palier de suppression arrière comporte, quelque soit la fréquence ligne, un bon nombre de µCycles inactifs dont les premiers vont pouvoir être réaffectés au test sur le numéro de ligne courant. De ce test va être déterminé le type de ligne à afficher et par conséquent la portion de code adéquate à exécuter .
;********************** Affichage de la mire clignotante noir/blanc (fréquence 15 kHz) *********************
| | | | | |
Twinkle15k | | EQU | | $ |
|
LastStripeLine | | SET | | 224 | | ; Une seule ligne blanche pour le cadre |
|
Stripes15k | | SET | | $ | | ; 4 µCycles déjà absorbés sur les 323 du back porch |
:Stripe1 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe2 | | ; +2/4 µC |
| | Wait | | 323-15 | | ; Ici 12 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:FrameLine | | ; +3 µC, le trait est entièrement blanc |
|
LastStripeLine | | SET | | LastStripeLine-2 | | ; Marge en dessous du cadre : 2 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 14 µC d'absorbés |
:Stripe2 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe3 | | ; +2/4 µC |
| | Wait | | 323-25 | | ; Ici 22 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la marge supérieure est noire |
|
LastStripeLine | | SET | | LastStripeLine-73 | | ; 1ère bande : 73 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 24 µC d'absorbés |
:Stripe3 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe4 | | ; +2/4 µC |
| | jb | | FlipFlop.0,Stripes15k:Toggle3 | | ; +2/4 µC |
| | Wait | | 323-37 | | ; Ici 34 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:WhiteLine | | ; +3 µC, la 1ère bande est blanche |
Stripes15k | | SET | | $ |
:Toggle3 | | Wait | | 323-39 | | ; Ici 36 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la 1ère bande est noire |
|
LastStripeLine | | SET | | LastStripeLine-72 | | ; 2ème bande : 72 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 34 µC d'absorbés |
:Stripe4 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe5 | | ; +2/4 µC |
| | jnb | | FlipFlop.0,Stripes15k:Toggle4 | | ; +2/4 µC |
| | Wait | | 323-47 | | ; Ici 44 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:WhiteLine | | ; +3 µC, la 2ème bande est blanche |
Stripes15k | | SET | | $ |
:Toggle4 | | Wait | | 323-49 | | ; Ici 46 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la 2ème bande est noire |
|
LastStripeLine | | SET | | LastStripeLine-73 | | ; 3ème et dernière bande : 73 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 44 µC d'absorbés |
:Stripe5 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe6 | | ; +2/4 µC |
| | jb | | FlipFlop.0,Stripes15k:Toggle5 | | ; +2/4 µC |
| | Wait | | 323-57 | | ; Ici 54 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:WhiteLine | | ; +3 µC, la 3ème bande est blanche |
Stripes15k | | SET | | $ |
:Toggle5 | | Wait | | 323-59 | | ; Ici 56 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la 3ème bande est noire |
|
LastStripeLine | | SET | | LastStripeLine-2 | | ; Marge au dessus du cadre : 2 lignes/pixels |
|
Stripes15k | | SET | | $ | | ; Ici 54 µC d'absorbés |
:Stripe6 | | CheckCount | | LastStripeLine | | ; +6 µC pour la macro |
| | jnc | | Stripes15k:Stripe7 | | ; +2/4 µC, trait inférieur du cadre |
| | Wait | | 323-65 | | ; Ici 62 µC d'absorbés, +3 µC du jmp suivant |
| | jmp | | Stripes15k:BlackLine | | ; +3 µC, la marge inférieure est noire |
|
Stripes15k | | SET | | $ | | ; Reste une ligne pour le cadre |
:Stripe7 | | Wait | | 323-64 | | ; Ici 64 µC d'absorbés |
|
;***********************************************************************************************************
On peut considérer le code ci-dessus composé de 7 blocs distincts, autant que d'éléments horizontaux (traits de cadre, marges et bandes clignotantes ) à afficher.
A l'intérieur de chaque bloc :
- Le numéro de la ligne courante est comparé à la dernière ligne d'un élément horizontal de la mire. Si non concordance, elle est comparée à celle de l'élément suivant.
- S'il y a concordance :
- Avec un trait de cadre : une ligne complètement blanche doit être affichée.
- Avec une marge horizontale : une ligne noire doit être affichée
- Avec une bande clignotante : le choix de la couleur de la ligne à afficher est déterminé par le compteur de clignotement (variable FlipFlop).
Ce choix est inverse pour la bande centrale sinon un seul pavé clignotant serait affiché et on obtiendrait alors la mire de gauche présentée en début du message.
- Les comparaisons successives absorbant un nombre de µCycles proportionnel au nombre de celles effectuées, un délai approprié à chacune est appelé pour compléter le palier de suppression arrière.
- Le code correspondant au type de ligne à afficher est enfin exécuté.
Le principe est le même pour les fréquences 24 et 31 kHz à condition de prendre en compte un palier de suppression arrière plus court (respectivement 222 et 161 µCycles au lieu de 323 ) ainsi qu'un nombre de lignes accru attribué à chaque élément horizontal de la mire.
-
Moi je dit chapeau bas <:) <:)
Sa me rappel des souvenir à l'époque ou je m’amuser avec du code en assembleur sur Thomson ST6 ou 68HC11. Aujourd'hui c'est bien loin tout cela et comme je bosse quasi que dans l'analogique j'aurai bien du mal à m'y remettre ....
Reste à confirmer que cela fonctionne bien à 24 et 31KHz
-
Ce type est un malade.... ;D
moi je vais prendre un doliprane (:x :fleche:
-
Maintenant au tour du code pour l'affichage des lignes des mires clignotantes.
D'entrée, l'objectif est d'avoir visuellement sur l'écran une épaisseur similaire pour tous les cotés du cadre, qu'ils soient horizontaux ou verticaux. La même considération se doit aussi d'être appliquée aux marges.
A 15 kHz, l'écran affiche 224 lignes ayant une durée de 2456 µCycles du SX28 cadencé à 50 Mhz. En considérant un écran au format 4/3 avec des pixels carrés :
On a donc 2456 ÷ ((224 ÷ 3) × 4) = 8,22 µCycles par pixel, valeur que l'on peut arrondir à 8, ce qui donne alors 0,97 pixel par µCycle.
Avec une épaisseur d'un pixel pour le trait horizontal, cela correspond à 8 µCycles pour le montant vertical et 16 µCycles pour une marge verticale fixée à 2 pixels.
Le code pour l'affichage des 3 types de lignes à 15 kHz est alors le suivant : | | | | | |
Stripes15k | | SET | | $ | | ; Affichage d'une ligne blanche sans marge verticales (cadre) |
:FrameLine | | SetColor | | White,2456-3 | | ; -3 µC pour le jmp suivant |
| | jmp | | Pattern15k:FrontPorch |
|
Stripes15k | | SET | | $ | | ; Affichage d'une ligne blanche avec marges verticales |
:WhiteLine | | SetColor | | White,8 | | ; Egal à 0,97 arrondi à 1 pixel blanc pour 224 lignes au format 4/3 |
| | SetColor | | Black,16 | | ; Marge gauche, équivaut à 2 pixels noirs |
| | SetColor | | White,2456-( 2*24 ) | | ; Moins 2×3 pixels en largeur pour le cadre et les marges |
| | SetColor | | Black,16 | | ; Marge droite, équivaut à 2 pixels noirs |
| | SetColor | | White,8-3 | | ; Equivaut à 1 pixel blanc, -3 µC pour le jmp suivant |
| | jmp | | Pattern15k:FrontPorch |
|
Stripes15k | | SET | | $ | | ; Les marges sont confondues avec la ligne noire |
:BlackLine | | SetColor | | White,8 | | ; Egal à 0,97 arrondi à 1 pixel blanc |
| | SetColor | | Black,2456-( 2*8 ) | | ; Moins 2×1 pixels en largeur pour le cadre |
| | SetColor | | White,8-3 | | ; Equivaut à 1 pixel blanc, -3 µC pour le jmp suivant |
| | jmp | | Pattern15k:FrontPorch |
Au passage, la macro "SetColor" boguait avec des faibles valeurs de temporisation. La coupable était une de ses macros subalternes, la macro "BasicDelay" qui interprétait un délai nul comme étant égal à 256.
Un simple test sur la nullité du délai permet de corriger ce bogue:
| | | BasicDelay | MACRO | Value | ; Absorbe un nombre de µcycles = (Value × 4) | | LOCAL | LocLoop | ; Etiquette interne à la macro | | IF | Value>0 | ; Test pour éviter qu'une valeur nulle génère 256 bouclettes | | mov | LoopCounter,#Value | ; 2 µC, initialisation du compteur de bouclettes | LocLoop | djnz | LoopCounter,LocLoop | ; 4 µC sinon 2 en sortie de boucle | | ENDIF | | ENDM |
|
|
En 24 kHz, le nombre de µCycles/pixel est de 1336 ÷ ((384 ÷ 3) × 4) ≈ 2,61 µC/pixel et encore moins en 31 kHz, ce nombre est alors de 1184 ÷ ((480 ÷ 3) × 4) = 1,85 µC/pixel.
Le problème est que la macro "SetColor" absorbe déjà 4 µCycles avec une temporisation nulle et que 3 autres µCycles sont nécessaires (jmp) pour reprendre le cours du programme en Pattern24k:FrontPorch ou Pattern31k:FrontPorch. L'épaisseur du montant vertical de cadre ou de sa marge ne peut donc être inférieur à 7 µCycles.
En se basant sur une épaisseur de 8 µCycles pour le montant vertical, le double pour sa marge et en respectant les règles édictées plus en avant pour le 15 kHz, on peut en déduire toutes les autres caractéristiques :
- En 24 kHz :
- épaisseur du trait horizontal : 8 ÷ 2,61 = 3,065 lignes soit 3 lignes, donc 6 pour la marge horizontale
- par conséquent il reste 384-18 lignes pour les 3 bandes, soit 122 lignes pour chacune.
- En 31 kHz :
- épaisseur du trait horizontal : 8 ÷ 1,85 = 4,32 arrondi à 4 lignes et par conséquent 8 lignes pour la marge horizontale.
Dans ces conditions la marge verticale pourrait être ramenée à 8 × 1,85 = 14,8 soit 15 µCycles au lieu des 16 prévus. - par conséquent il reste 480-24 lignes pour les 3 bandes, soit 152 lignes pour chacune.
Prochaine étape la mire quadrillée :
(http://gamoovernet.pixhotel.fr/pics/20130126182618-gc339-atv018.jpg)
Pour cette mire, le même principe peut être repris car il n'y a besoin que de deux type de lignes : une ligne complètement blanche et une ligne avec les pixels blancs des lignes verticales. La contrepartie est que cette mire nécessitera autant de comparaisons sur le compteur de lignes que le double de ses lignes horizontales.
L'autre écueil est que les pages 1, 2 et 3 de la mémoire programme du SX28 sont presque complètes avec la mire clignotante, il faudra nécessairement passer au SX48 en boîtier TQFP48 pour disposer de 2k octets supplémentaires : https://www.parallax.com/product/sx48bd-g
-
Préambule matériel à l'adjonction de la mire mire à quadrillage
D'entrée la mémoire programme du SX28 n'est pas suffisante à moins de réétudier les algorithmes en introduisant des boucles de programme, opération trop fastidieuse et chronophage. Donc passage quasi obligé au SX48 ou accessoirement au SX52 pour doubler la taille de la mémoire programme de 2 kOctets à 4 kOctets.
Le passage du SX28 au SX48/SX52 n'est pas une opération bénigne car le SX48 n'existe qu'en boîtier TQFP48 au pitch de 0,5 mm et le SX52 qu'en boîtier PQFP52 au pitch de 0,65 mm.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150917162650-gc339-Parallax-SX48BD-G-1-.jpg) (http://gamoovernet.pixhotel.fr/pics/20150917162650-gc339-Parallax-SX48BD-G-1-.jpg)
Le SX48 : pitch 0,5 mm 36 ports d'E/S | (http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150918162846-gc339-SX52BD-PQ.jpg) (http://gamoovernet.pixhotel.fr/pics/20150918162846-gc339-SX52BD-PQ.jpg)
Le SX52 : pitch 0,65 mm Idem SX48 + 4 ports d'E/S |
- Un adaptateur s'avère nécessaire pour éclater le brochage au pas usuel de 2,54. Il y a bien ce genre d'adaptateur multi-boîtier de 16 jusqu'à 64 pattes que l'on peut obtenir pour une fraction d'euro :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150917165634-gc339-mC42oQmTea9dHldYJnwUDew-2-.jpg)
(http://gamoovernet.pixhotel.fr/pics/20150917165815-gc339--KGrHqZHJFcFG-Yjl59BR519Cf3Q-60-57-1-.JPG)
Malheureusement il faut effectuer la délicate soudure des pattes au pitch de 0,5 mm ou celle à peine moins fastidieuse à celui de 0,65 mm, cela parait presque facile sur certaines vidéos. Le secret de la réussite semble résider dans le flux généreusement étalé et la forme de la panne du fer qui doit être adaptée à la méthode employée.
Il existe heureusement une autre solution bien plus pratique quoique nettement plus onéreuse car le prix de ces adaptateurs est voisin ou supérieur aux 50 euro.
Ai cependant trouvé ce modèle TQFP48/DIP48 à 22€45 ($25) sur AliExpress (http://fr.aliexpress.com/item/100-New-High-Quality-QFP48-to-DIP48-IC-Test-Socket-LQFP48-tO-DIP48-Programming-Adapter-TQFP48/32381665362.html?ws_ab_test=201526_1,201527_3_71_72_73_74_75,201409_1) (le vendeur accepte PayPal) :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150918105230-gc339-TQFP48-LQFP48-QFN48.5bs.jpg) (http://gamoovernet.pixhotel.fr/pics/20150917235803-gc339-TQFP48-LQFP48-QFN48.5b.jpg)
|
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150918105403-gc339-TQFP48-LQFP48-QFN48.6s.jpg) (http://gamoovernet.pixhotel.fr/pics/20150918105138-gc339-TQFP48-LQFP48-QFN48.6.jpg)
| (http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150918105811-gc339-TQFP48-LQFP48-QFN48.3bs.jpg) (http://gamoovernet.pixhotel.fr/pics/20150917235844-gc339-TQFP48-LQFP48-QFN48.3b.jpg)
|
D'après l'inscription en relief que l'on peut lire sur la photo centrale, le support clamshell (littéralement coquille de palourde ) serait le modèle IC51-0484-806 du japonais Yamaichi (http://docs-europe.electrocomponents.com/webdocs/0635/0900766b80635613.pdf).
|
- L'approvisionnement du SX48 n'est pas mission impossible, il n'y a que son coût qui est prohibitif chez certains.
- Parallax : le fabricant : https://www.parallax.com/product/sx48bd-g. Bradé à $0.78 pièce mais $39,75 de frais d'expédition en USPS priority mail international. C'est sans compter sur les éventuels frais de douane où les frais de port sont inclus dans le calcul de la taxe ...
- Selectronic : http://www.selectronic.fr/ci-cms-sx48bd-g.html. 9€26 pièce et 6€90 de Colissimo.
- All Electronique : http://www.selectronic.fr/ci-cms-sx48bd-g.html. 14€70 le lot de 2 et 7€80 de Colissimo.
- Mouser Electronics : http://eu.mouser.com/ProductDetail/Parallax/SX48BD-G/?qs=%2fha2pyFaduhWK8SzAAllCTxobgv%252bTJB3j7%2f%2fK5PkgCA%3d. 1€69 pièce et 20€ de frais de livraison. En principe pas de frais de douane car la plateforme logistique pour l'Europe est basée en Allemagne.
Le calcul est vite fait, pour un peu plus de 30 euro , on peut en acquérir 6 exemplaires chez Mouser (prix de revient unitaire ≈5€02) alors que sans dépasser ce budget il n'est possible d'en acquérir que 2 chez Selectronic et All Electronique et aucun chez Parallax. - Quant à l'outsider, le SX52, n'en ai vu que sur AliExpress, des Ubicom récents et aussi des Scenix plus anciens. Trouvé quelques uns à moins de $5, des Ubicom, frais d'expédition en sus.
- La programmation du SX48/SX52 :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150918011847-gc339-fluf2cct-1-.gif) (http://gamoovernet.pixhotel.fr/pics/20150918011847-gc339-fluf2cct-1-.gif)
-
Préambule à l'adjonction de la mire à quadrillage, définition des paramètres
Le modèle de mire quadrillée à reproduire est celui du tout premier message de ce fil de discussion (http://www.gamoover.net/Forums/index.php?topic=27188.msg428239#msg428239), celui du générateur vidéo décrit par Marcello Maggi : http://www.gamoover.net/gc339/VidPatGen.pdf
(http://gamoovernet.pixhotel.fr/pics/20130126182618-gc339-atv018.jpg)
Une petite touche personnelle consiste à entourer le quadrillage par un cadre pour améliorer la présentation de la mire, conséquemment le nombre de traits aussi bien horizontaux que verticaux sera porté à 11 (9 + 2).
Le nombres d'intervalles noirs entre les traits restant égal à 10, la somme des lignes dévolues à ces intervalles doit être divisible par 10.
Ainsi en 15 kHz, le nombre total de lignes affichées est de 224.
- En réservant 14 lignes pour l'affichage des traits horizontaux, il reste 210 lignes pour les intervalles noirs, chacun ayant alors une épaisseur de 21 lignes.
Avec des traits d'une ligne d'épaisseur, il reste 14 - 9 = 5 lignes pour le cadre. Ce chiffre impair pose problème : avec 2 lignes par trait de cadre, il reste 1 ligne excédentaire.
Une solution élégante serait de doubler l'épaisseur du 5ème trait, celui en plein milieu de l'écran et par conséquent le compte de viendrait bon. - En réservant 24 lignes, il en reste 200 pour les intervalles noirs, donc 10 pour chacun.
Avec des traits de 2 lignes d'épaisseur, il reste 24 - (9 × 2) = 6 lignes, soit 3 lignes par trait de cadre, le compte est bon.
En 24 kHz, le nombre total de lignes affichées est de 384.
Il convient de tenir compte des exigences rencontrées pour l'élaboration de la mire clignotante, l'épaisseur d'un trait horizontal ne devrait pas être inférieure à 3 lignes.
- En réservant 34 lignes pour l'affichage des traits horizontaux, il reste 350 lignes pour les intervalles noirs, donc 35 pour chacun.
Avec des traits de 3 lignes d'épaisseur, il reste 34 - (9 × 3) = 7 lignes pour le cadre. Ce chiffre est impair, donc avec 3 lignes par trait de cadre, il reste 1 ligne excédentaire que l'on pourra utiliser pour épaissir le trait horizontal central, le compte est alors bon. - En réservant 44 lignes, il reste 340 lignes pour les intervalles noirs, chacun ayant 34 lignes d'épaisseur.
Avec des traits de 3 lignes d'épaisseur, il reste 44 - (9 × 3) = 17 lignes pour le cadre. Ce chiffre est impair, donc avec 7 lignes par trait de cadre, un peu plus que le double d'un trait normal, il reste 3 lignes que l'on pourra utiliser pour doubler l'épaisseur du trait horizontal central, le compte est alors bon.
En 31 kHz, le nombre total de lignes affichées est de 480. La remarque est la même au sujet de l'épaisseur du trait, elle ne devrait pas être inférieure à 4 lignes.
En réservant 50 lignes pour l'affichage des traits horizontaux, il en reste 430 pour les intervalles noirs, donc 43 pour chacun.
Avec des traits d'une épaisseur de 4 lignes, il reste 50 - (9 × 4) = 14 lignes. Donc plusieurs solutions dont deux des plus harmonieuses :
- 8 lignes (4+4) pour le trait horizontal central, épaisseur donc doublée, il reste 5 lignes pour chaque trait de cadre.
- 6 lignes d'épaisseur pour le trait horizontal de cadre ainsi que le trait central, soit 1,5 fois plus que l'épaisseur d'un trait normal.
En définitive, l'attribution la plus élégante de certaines épaisseurs de traits horizontaux ne réside pas uniquement dans l'épaississement des traits de cadre mais aussi dans celle du trait médian par rapport à ses voisins. Autant en profiter pour élargir aussi le trait médian vertical, ainsi on pourra distinguer une croix superposée à ces deux traits au centre du quadrillage.
La largeur en pixels des différents montants verticaux de la mire devront refléter l'épaisseur de ses traits horizontaux comme si on leur avait fait subir une rotation de 90°.
Ici encore il va falloir procéder à des arbitrages sur la largeur des montants verticaux pour arriver à obtenir un nombre µcycles multiple de 10 pour la somme des pixels dévolus aux intervalles noirs entre ces montants.
Ainsi en 15 kHz, la largeur d'un pixel équivaut à 8,22 µCycles, arrondi à 8, comme cela a été précédemment déterminé avec la mire clignotante.
D'entrée, c'est l'option "a" qui a été retenue car elle définit une épaisseur double pour les traits du cadre ainsi que pour le trait central. On a donc :- 8 montants normaux, épaisseur 1 pixel donc 8 µCycles.
- 1 montants central élargi, épaisseur 2 pixels donc 16 µCycles.
- 2 montants de cadre élargis, épaisseur 2 pixels donc 16 µCycles.
Il reste donc 2456 - (8×8)- 16 - (2×16) = 2344 µC soit 234 µC par intervalle vertical avec 4 µC en excès.
Ce ne sont pas les combinaisons qui manquent quand à la manière de répartir ces 4 µCycles excédentaires pour élargir les montants du cadre ainsi que le montant central, respectivement :- 1 + 2 + 1
- 2 + 0 + 2, privilégie l'épaisseur des montants.
- 0 + 4 + 0, le trait central serait ainsi 2,5 fois plus large que ses voisins.
- 2+0+0+0+2 en créant une marge extérieure noire de 2 µCycles à gauche et à droite du cadre.
Puisqu'il faut arbitrer, c'est la toute première (1+2+1) qui sera retenue car c'est celle dont les moitiés gauche et droite de la mire sont symétriques par rapport à leur propre axe vertical.
En 24 kHz, la largeur d'un pixel équivaut à 2,61 µCycles, ce qui inversement représente 3,066 pixels pour 8 µCycles, autant dire 3 comme cela a été précédemment déterminé pour la mire clignotante.
Après calcul préliminaire, c'est l'option "b" qui l'emporte car c'est la seule des deux dont la répartition des pixels blancs ne génère pas de µCycles excédentaires.
- Cette option "b" a défini une épaisseur double pour le trait central et une ligne de plus que ce double pour les traits du cadre. On a donc :
- 8 montants normaux, épaisseur 3 pixels donc 8 µCycles.
- 1 montant central double épaisseur, donc 16 µCycles.
- 2 montants de cadre élargis à 7 pixels, donc 18,27 µCycles, arrondi à 18.
Il reste donc 1336 - (8×8) - 16 - (2×18) = 1220 µC soit 122 µCycles pile poil par intervalle vertical.
En 31 kHz, la largeur d'un pixel équivaut à 1,85 µCycles, ce qui inversement représente 4,324 pixels pour 8 µCycles, ramené à 4 comme cela a été précédemment déterminé pour la mire clignotante.
Après calcul préliminaire, c'est aussi l'option "b" qui l'emporte sur l'option "a" car elle ne génère que 4 µCycles excédentaires au lieu de 6.
- Cette option "b" a défini pour le trait central et les traits du cadre une épaisseur de 1,5 fois celle du trait normal. On a donc :
- 8 montants normaux, épaisseur 4 pixels donc 8 µCycles.
- 1 montant central élargi à 6 pixels, donc 12 µCycles.
- 2 montants de cadre élargis à 6 pixels, donc 12 µCycles.
Il reste donc 1184 - (8×8) - 12 - (2×12) = 1084 µC soit 108 µC par intervalle vertical et 4 µC en excès.
Les combinaisons déjà évoquées pour le 15 kHz sont envisageables pour répartir ces 4 µCycles en excès.
Puisque là aussi il faut arbitrer, c'est la toute première (1+2+1) qui sera retenue pour la raison déjà évoquée.
Récapitulatif : |
|
| | | | T | r a i | t | | | | Intervalle | | | |Fréquence | | | Normal | | | Central | | | Cadre | | | | | | | 15 kHz | | | 1 ligne | | | 2 lignes | | | 2 lignes | | | 21 lignes | | | | 24 kHz | | | 3 lignes | | | 6 lignes | | | 7 lignes | | | 34 lignes | | | | 31 kHz | | | 4 lignes | | | 6 lignes | | | 6 lignes | | | 43 lignes | | |
|
|
| | | | | | M | o n | t | a n | t | | | | | | I n t e | r | v a l l e | | | | | | N o | r | m a l | | | C e | n | t r a l | | | C a | d | r e | | | | | | | | |Fréquence | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | | 15 kHz | | | 0,973 | | | 8 | | | 2,189 | | | 18 | | | 2,068 | | | 17 | | | 28,46 | | | 234 | | | | 24 kHz | | | 3,066 | | | 8 | | | 6,132 | | | 16 | | | 6,899 | | | 18 | | | 46,76 | | | 122 | | | | 31 kHz | | | 4,324 | | | 8 | | | 7,567 | | | 14 | | | 7,027 | | | 13 | | | 58,37 | | | 108 | | |
|
|
-
gc quand il est lancé c'est une MACHINE ;D ^-
Dommage que les boitiers sx28 sx48 ne soient pas facilement compatible, la mire quadrillé c'est un vrai plus pour le réglage des écrans.
-
Dommage que les boitiers sx28 sx48 ne soient pas facilement compatible.
Il y a toujours moyen de fabriquer soi-même un adaptateur PQFP48 vers DIL28 pour les circuits imprimés déjà réalisés avec un SX28. Nul besoin de câbler toute les pattes du SX28 car le générateur de mire n'utile que la moitié des E/S du SX28.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150923135609-gc339-SX48BD-G.PNG) (http://gamoovernet.pixhotel.fr/pics/20150923135609-gc339-SX48BD-G.PNG)
Cet adaptateur peut facilement se bricoler à partir d'une plaquette adaptatrice et une plateforme DIL28 espacement 0,300" du commerce.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20150923172241-gc339-28f-600-10.JPG) (http://gamoovernet.pixhotel.fr/pics/20150923172241-gc339-28f-600-10.JPG)
Comme on trouve plus facilement des plateformes DIL28 avec un espacement de 0,600" qu'avec un espacement de 0,300". Le plus simple est d'en fabriquer une avec un bout de circuit imprimé pastillé pré-percé au pas de 2,54 et des queues de résistances en guise de broches.
-
Effectivement vu comme cela sa parait plus simple ^-
Je me garde cette possibilité d'évolution pour plus tard, dans un premier temps, je vais déjà faire fonctionner mon géné avec le SX28 8)
-
Errata : suite à une erreur de frappe dans ce tableau récapitulatif établi en Juin 2013, la bonne valeur pour le temps imparti à l'affichage des pixels d'une ligne en 24 kHz n'est pas de 1336 mais bien de 1536 µCycles.
Cette erreur n'a aucune incidence pour la mire à barres colorées car c'est bien la valeur 1536 qui avait été utilisée pour la version originale du programme de la mire.
Il n'en est pas de même pour les valeurs récemment calculées en 24kHz pour les deux nouvelles mires, car ce sont les valeurs de ce tableau récapitulatif qui ont servi de référence.
Rappel des timings choisis :
Line Frequ. (kHz) | | | | | Front Porch (µcycles) | Horiz. Synch. (µcycles) | Back Porch (cycles) | Display
(µcycles) | | | | | Leading Blank (lines) | Vert. Synch. (lines) | Lagging Blank (lines) | Pattern
(lines) | 15 | | | 161 | 238 | 323 | 2456 | | | 13 | 3 | 23 | 224 | 24 | | | 142 | 150 | 222 | 13361536 | | | 11 | 4 | 25 | 384 | 31 | | | 81 | 152 | 161 | 1184 | | | 14 | 3 | 33 | 480 |
|
Correctif pour la mire clignotante :
Maintenant au tour du code pour l'affichage des lignes des mires clignotantes. [couic...]
En 24 kHz, le nombre de µCycles/pixel est de 1336 1536 ÷ ((384 ÷ 3) × 4) = 2,61 3,00 µC/pixel et encore moins en 31 kHz, ce nombre est alors de 1184 ÷ ((480 ÷ 3) × 4) = 1,85 µC/pixel.
Le problème est que la macro "SetColor" absorbe déjà 4 µCycles avec une temporisation nulle et que 3 autres µCycles sont nécessaires (jmp) pour reprendre le cours du programme en Pattern24k:FrontPorch ou Pattern31k:FrontPorch. L'épaisseur du montant vertical de cadre ou de sa marge ne peut donc être inférieur à 7 µCycles.
En se basant sur une épaisseur minimale de 8 µCycles pour le montant vertical, le double pour sa marge et en respectant les règles édictées plus en avant pour le 15 kHz, on peut en déduire toutes les autres caractéristiques :
- En 24 kHz :
- épaisseur du trait horizontal : 8 ÷
2,61 3 = 3,065 2,67 lignes soit 3 lignes, donc 6 pour la marge horizontale.
Le 24 kHz est un cas bien particulier car avec 3 µCycles pile poil par pixel, il suffit d'épaissir le trait d'un µCycle, soit 9 µCycles, pour obtenir un nombre de pixels/lignes entier égal à 3. Une marge verticale d'une largeur de 18 pixels correspond exactement à 6 lignes de marge horizontale. - par conséquent il reste 384-18 lignes pour les 3 bandes, soit 122 lignes pour chacune.
- En 31 kHz :
- épaisseur du trait horizontal : 8 ÷ 1,85 = 4,32 arrondi à 4 lignes et par conséquent 8 lignes pour la marge horizontale.
Dans ces conditions la marge verticale pourrait être ramenée à 8 × 1,85 = 14,8 soit 15 µCycles au lieu des 16 prévus. - par conséquent il reste 480-24 lignes pour les 3 bandes, soit 152 lignes pour chacune.
Cette valeur de 1536 µCycles n'affecte les choix précédemment établis que d'un pixel pour le cadre et de deux pour les marges, par contre elle allonge de 200 µCycles le temps dévolu à l'affichage des trois types de ligne de la mire clignotante.
Stripes24k | | SET | | $ | | ; Affichage d'une ligne blanche sans marge (cadre) |
:FrameLine | | SetColor | | White,1336 1536 -3 | | ; -3 µC pour le jmp suivant |
| | jmp | | Pattern24k:FrontPorch |
| | | | | |
Stripes24k | | SET | | $ | | ; Affichage d'une ligne blanche avec marge |
:WhiteLine | | SetColor | | White,8 9 | | ; Egale à 3 pixels blancs pour 384 lignes au format 4/3 |
| | SetColor | | Black,1618 | | ; Marge gauche, égale à 6 pixels noirs |
| | SetColor | | White,1336-(2*24) 1536-(2*27) | | ; Moins 2×9 pixels en largeur pour le cadre et les marges |
| | SetColor | | Black,16 18 | | ; Marge droite, égale à 6 pixels noirs |
| | SetColor | | White,8 9-3 | | ; Egale à 3 pixels blancs, -3 µC pour le jmp suivant |
| | jmp | | Pattern24k:FrontPorch |
|
Stripes24k | | SET | | $ | | ; Marges confondues avec la ligne noire affichée |
:BlackLine | | SetColor | | White,8 9 | | ; Egale à 3 pixels blancs |
| | SetColor | | Black,1336-(2*8 ) 1536-(2×9) | | ; Moins 2×3 pixels en largeur pour le cadre |
| | SetColor | | White,8 9-3 | | ; Egale à 3 pixels blancs, -3 µC pour le jmp suivant |
| | jmp | | Pattern24k:FrontPorch |
Le signal de la mire clignotante en 24kHz n'était donc pas conforme avant cette retouche.
Récapitulatif après corrections : |
|
| | | e n H o r | i | z o n t a l | | | |Fréquence | | | Cadre | | | Marge | | | Ligne | | | | 15 kHz | | | 1 ligne | | | 2 lignes | | | 2456 µCycles | | | | 24 kHz | | | 3 lignes | | | 6 lignes | | | 1536 µCycles | | | | 31 kHz | | | 4 lignes | | | 8 lignes | | | 1184 µCycles | | |
|
|
| | | en | | V e r t | i | c a l | | | | | | | | C a | d | r e | | | M a | r | g e | | | |Fréquence | | | Pixel(s) | | | µCycles | | | Pixel(s) | | | µCycles | | | | 15 kHz | | | 0,973 | | | 8 | | | 1,946 | | | 16 | | | | 24 kHz | | | 3,000 | | | 9 | | | 6,000 | | | 18 | | | | 31 kHz | | | 4,324 | | | 8 | | | 8,107 | | | 15 | | |
|
|
Correctif pour la mire quadrillée :
En 24 kHz, le nombre total de lignes affichées est de 384.
Il convient de tenir compte des exigences rencontrées pour l'élaboration de la mire clignotante, l'épaisseur d'un trait horizontal ne devrait pas être inférieure à 3 lignes.
- En réservant 34 lignes pour l'affichage des traits horizontaux, il reste 350 lignes pour les intervalles noirs, donc 35 pour chacun.
Avec des traits de 3 lignes d'épaisseur, il reste 34 - (9 × 3) = 7 lignes pour le cadre. Ce chiffre est impair, donc avec 3 lignes par trait de cadre, il reste 1 ligne excédentaire que l'on pourra utiliser pour épaissir le trait horizontal central, le compte est alors bon. - En réservant 44 lignes, il reste 340 lignes pour les intervalles noirs, chacun ayant 34 lignes d'épaisseur.
Avec des traits de 3 lignes d'épaisseur, il reste 44 - (9 × 3) = 17 lignes pour le cadre. Ce chiffre est impair, donc avec 7 lignes par trait de cadre, un peu plus que le double d'un trait normal, il reste 3 lignes que l'on pourra utiliser pour doubler l'épaisseur du trait horizontal central, le compte est alors bon.
En 24 kHz, la largeur d'un pixel équivaut à 2,61 exactement 3 µCycles, ce qui inversement représente 3,066 3 pixels entiers pour 8 9 µCycles, autant dire 3 comme cela a été précédemment déterminé pour la mire clignotante.
Après calcul préliminaire, c'est l'option "b" qui l'emporte car c'est la seule des deux dont la répartition des pixels blancs ne génère pas de µCycles excédentaires l'épaisseur du montant vertical central est le double d'un montant normal.
- Cette option "b" a défini une épaisseur double pour le trait central et une ligne de plus que ce double pour les traits du cadre. On a donc :
- 8 montants normaux, épaisseur 3 pixels donc
8 9 µCycles. - 1 montant central double épaisseur, donc
16 18 µCycles. - 2 montants de cadre élargis à 7 pixels, donc
18,27 21 µCycles, arrondi à 18.
Il reste donc 1336 1536 - (8×8 9) - 16 18 - (2×18 21) = 1220 1404 µC, soit un excédent de 4 µCycles, soit un déficit de 6 pour obtenir un nombre multiple de 10.
Le plus logique est de désépaissir d'un pixel les montants verticaux du cadre pour récupérer les 6 µCycles manquants. Il restera alors 1410 µCycles soit 122 141 µCycles pile poil par intervalle vertical.
Récapitulatif après corrections : |
|
| | | | T | r a i | t | | | | Intervalle | | | |Fréquence | | | Normal | | | Central | | | Cadre | | | | | | | 15 kHz | | | 1 ligne | | | 2 lignes | | | 2 lignes | | | 21 lignes | | | | 24 kHz | | | 3 lignes | | | 6 lignes | | | 7 lignes | | | 34 lignes | | | | 31 kHz | | | 4 lignes | | | 6 lignes | | | 6 lignes | | | 43 lignes | | |
|
|
| | | | | | M | o n | t | a n | t | | | | | | I n t e | r | v a l l e | | | | | | N o | r | m a l | | | C e | n | t r a l | | | C a | d | r e | | | | | | | | |Fréquence | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | | 15 kHz | | | 0,973 | | | 8 | | | 2,189 | | | 18 | | | 2,068 | | | 17 | | | 28,46 | | | 234 | | | | 24 kHz | | | 3,000 | | | 9 | | | 6,000 | | | 18 | | | 6,000 | | | 18 | | | 47,00 | | | 141 | | | | 31 kHz | | | 4,324 | | | 8 | | | 7,567 | | | 14 | | | 7,027 | | | 13 | | | 58,37 | | | 108 | | |
|
|
-
La migration du SX28 vers le SX48 nécessite quelques adaptations décrites dans la note d'application Parallax/Ubicom n°15 (https://www.parallax.com/sites/default/files/downloads/SX-Application-Notes_0.zip).
Dans le cas du générateur de mire, ces différences concernent surtout :
- Les fusibles FUSE et FUSEX qui sont organisés différement.
- La mémoire utilisateur qui débute à l'adresse 10 au lieu de 8, les ports RD et RE occupant respectivement les adresses 8 et 9.
- Le MODE REGISTER qui nécessite deux instructions au lieu d'une pour accéder à tous ses nouveaux registres.
Les déclarations en tête de programme sont de fait impactées par les deux premières exigences (en bleu dans le listing).
;=================================================================================================== ; ; File...... PatGen10.SRC ; Purpose... Video Pattern Generator V10.0 ; Updated... 16/10/2015 ; ;=================================================================================================== ;------------------------------ DEVICE DIRECTIVES ----------------------------------------------------------------------------------
| | ;SASM Directives | | DEVICE | SX48BD, BOROFF, SYNC | | DEVICE | OSCHS3, XTLBUFD, IFBD | | IRC_CAL | IRC_SLOW |
| | ID | "PatGen10" |
| | RESET | Initialize | ; Reset vector at $07FF | | | |
;------------------------------ SETTINGS -------------------------------------------------------------------------------------
| | FREQ | 50_000_000 | ; Information pour la SX-Key |
| | LIST | F=INHX8M | ; Format de sortie | | | |
;------------------------------ EQUATES --------------------------------------------------------------------------------------------
| No | EQU | 0 | Yes | EQU | ~No |
| Padding | | | ; Bourrage par des nop's autorisé |
| SyncH | EQU | rb.0 | ; Synchro Horizontale sur RB0 | SyncV | EQU | rb.1 | ; Synchro Verticale sur RB1 |
| Black | EQU | %0000 | Blue | EQU | %0001 | ; Bit 2° | Red | EQU | %0010 | ; Bit 2¹ | Green | EQU | %0100 | ; Bit 2² | Cyan | EQU | Green + Blue | Magenta | EQU | Red + Blue | Yellow | EQU | Red + Green | White | EQU | Red + Green + Blue |
| Aqua | EQU | Cyan | Fuchsia | EQU | Magenta | | | |
| ; MODE Register Settings to write to the SX48/52 port control registers |
DDIR | EQU | $1F | ; Data Direction Register | PLP | EQU | $1E | ; Pull-Up Resistor Enable Register | LVL | EQU | $1D | ; TTL/CMOS Select Register | ST | EQU | $1C | ; Schmitt Trigger Enable Register | | | |
;------------------------------ VARIABLES ------------------------------------------------------------------------------------------
| | ORG | 10 | ; Start of SX48/52 data memory |
| LoopCounter | DS | 1 | ; Step Counter | LineCounter | DS | 2 | ; Line Conter | FrameCounter | DS | 1 | ; Frame Counter | FlipFlop | DS | 1 | ; Used to blink pattern | | | |
|
La page 0 ($0000 à $01FF) du SX48 reste dédiée aux initialisations à la mise sous tension ainsi qu'au tronc commun à tous les standards (CGA / 15 kHz, EGA / 24 kHz et VGA / 31 kHz) pendant lequel s'effectue le test des dip-switches déterminant justement ce standard.
Les adjonctions concernent les initialisations des deux nouveaux ports RD et RE ainsi que l'accès modifié au MODE REGISTER (en bleu dans le listing).
;################################################################################################### ; Section commune à toutes les mires ;################################################################################################### ;------------------------------ SIGNALS TIMING CHART -------------------------------------------------------------------------------
| ; | Line | Front | Horiz. | Back | Display | ; | Frequ. | Porch | Synch. | Porch | ; | (kHz) | (µcycles) | (µcycles) | (µcycles) | (µcycles) | ; | 15 | 161 | 238 | 323 | 2456 | ; | 24 | 142 | 150 | 222 | 1536 | | ; | 31 | 81 | 152 | 161 | 1184 |
| ; | Line | Leading | Vert. | Trailing | Displayed | ; | Frequ. | Blank | Synch. | Blank | Lines | ; | (kHz) | (lines) | (lines) | (lines) | ; | 15 | 13 | 3 | 23 | 224 | ; | 24 | 11 | 4 | 25 | 384 | ; | 31 | 14 | 3 | 33 | 480 | | | | | | |
;------------------------------ INTERRUPT ROUTINE ---------------------------------------------------------------------------------- ;-----------------------------------------------------------------------------------------------------------------------------------
| | NOEXPAND | | Fill | $0007 | ; Bourrage zone réservée avec des NOP's | | EXPAND | | | |
;---------------------------- INITIALIZATION ROUTINE -------------------------------------------------------------------------------
| | ORG | 8 | Initialize | mov | ra,#%0000 | ; Set port A low | | mov | rb,#%11111111 | ; Set port B high | | mov | rc,#%11111111 | ; Set port C high | | mov | rd,#%11111111 | ; Set port D high | | mov | re,#%11111111 | ; Set port E high | | | |
| ; Pull-Up Resistor Configuration |
| mov | w,#PLP | ; Allow Pull-Up Resistor configuration | | mov | m,w | | mov | !ra,#%1111 | ; Set port A, bit 0-3 to normal | | mov | !rb,#%00001111 | ; Set port B bits 4-7 with pull-up resistors | | mov | !rc,#%00000000 | ; Set port C bits 0-7 with pull-up resistors | | mov | !rd,#%00000000 | ; Set port D bits 0-7 with pull-up resistors | | mov | !re,#%00000000 | ; Set port E bits 0-7 with pull-up resistors | | | |
| ; Port Direction Configuration |
| mov | w,#DDIR | ; Allow Direction configuration | | mov | m,w | | mov | !ra,#%0000 | ; Set port A bits 0-3 to output | | mov | !rb,#%11110000 | ; Set port B bits 0-3 to output, 4-7 to input | | mov | !rc,#%11111111 | ; Set port C bits 0-7 to input | | mov | !rd,#%11111111 | ; Set port D bits 0-7 to input | | mov | !re,#%11111111 | ; Set port E bits 0-7 to input | | | |
| ; Device Configuration Options |
| mov | !option,#%01111111 | ; Raz bit RTW, RTCC inhibé, WREG accessible à la place | | | |
;------------------------------ MAIN PROGRAM ---------------------------------------------------------------------------------------
| Main | setb | SyncH | | setb | SyncV | | clr | FlipFlop | ; Initialisation du flip flop | | jmp | PresetFrCnt | | | |
| ; Compteur de trames pour clignotement, absorbe 7 µcycles |
MainLoop | djnz | FrameCounter,NoPreset | ; 2/4 µC | | not | FlipFlop | ; 1 µC, inversion du flip flop | PresetFrCnt | mov | FrameCounter,#30 | ; 2 µC, clignotement toutes les 30 trames (½ seconde) | | skip | | ; 2 µC, ajustement à 7 µC si rechargement FrameCount | NoPreset | jmp | $+1 | ; 3 µC, ajustement à 7 µcycles pour décomptage normal | | | |
| ; Lecture de la fréquence ligne sur les 2 premiers microswitches. | | ; Absorbe 11 µcycles quelque soit la boucle à exécuter. |
| jnb | rb.5,Jmp31k | ; 2/4 µC, lecture de la fréquence programmée sur les dip-switches | | jnb | rb.4,Jmp24k | ; 2/4 µC | Jmp15k | jmp | $+1 | ; 3 µC pour ajustage absorpsion à 11 µC | | jmp | @Start15k | ; 1+3 µC, instruction de page incluse avec "@" | Jmp24k | nop | | ; 1 µC pour ajustage absorpsion à 11 µC | | | jmp | @Start24k | ; 1+3 µC, instruction de page incluse avec "@" | Jmp31k | jmp | $+1 | ; 3 µC pour ajustage absorpsion à 11 µC | | jmp | @Start31k | ; 1+3 µC, instruction de page incluse avec "@" | | | |
|
Ces instructions n'occupant que partiellement la page 0, les octets restants ont été mis à profit pour l'affichage des mires à bares colorées, autrement dit pour le développement de la macro "ColorBars" pour chacun des 3 standards. Opération salutaire qui a permis de libérer de précieux octets dans les pages où elles résidaient précédemment.
La macro "ColorBars" a été modifiée en conséquence. La durée de la dernière barre, la noire, inclut dorénavant les 4 µcycles du saut inter-pages de retour dans la page d'origine.
Pour éviter les erreurs répertoriées dans le précédent message, les valeurs littérales des différents timings ont été nommées symboliquement.
A noter l'emploi maintenant systématique de la macro "Fill" pour remplir les octets inutilisés en fin de page par la valeur $00 qui correspond à l'instruction NOP au lieu de les laisser non programmés à la valeur $FF.
;################################################################################################### ; Sous-section pour l'affichage CGA : mire en 15 kHz ;###################################################################################################
| | ; Timings ligne (en µcycles du SX48) |
FP15k | EQU | 161 | ; Front Porch | HSync15k | EQU | 238 | ; Horizontal Synchronisation | BP15k | EQU | 323 | ; Back Porch | HDisp15k | EQU | 2456 | ; Duration of the visible pixels inside any line | | | |
| ; Timings trame (en nombre de lignes) |
LBI15k | EQU | 13 | ; Leading Blank Interval | VSync15k | EQU | 3 | ; Vertical Synchronisation | TBI15k | EQU | 23 | ; Trailing Blank Interval | VDisp15k | EQU | 224 | ; Visible Lines Per Frame | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| ColorBars15k | EQU | $ | | ColorBars | HDisp15k/8 | ; Chaque bande verticale consomme 307 µcycles | | jmp | @Pattern15k:FrontPorch | ; Absorbe 4 µC, pris en compte dans la macro ColorBars | | | |
;################################################################################################### ; Sous-section pour l'affichage EGA : mires en 24 kHz ;###################################################################################################
| | ; Timings ligne (en µcycles du SX48) |
FP24k | EQU | 142 | ; Front Porch | HSync24k | EQU | 150 | ; Horizontal Synchronisation | BP24k | EQU | 222 | ; Back Porch | HDisp24k | EQU | 1536 | ; Duration of the visible pixels inside any line | | | |
| ; Timings Trame (en nombre de lignes) |
| LBI24k | EQU | 11 | ; Leading Blank Interval | VSync24k | EQU | 4 | ; Vertical Synchronisation | TBI24k | EQU | 25 | ; Trailing Blank Interval | VDisp24k | EQU | 384 | ; Visible Lines Per Frame | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| ColorBars24k | EQU | $ | | ColorBars | HDisp24k/8 | ; Chaque bande verticale consomme 192 µcycles | | jmp | @Pattern24k:FrontPorch | ; Absorbe 4 µC, pris en compte dans la macro ColorBars | | | |
;################################################################################################### ; Sous-section affichage VGA : mires en 31 kHz ;###################################################################################################
| | ; Timings ligne (en µcycles du SX48) |
FP31k | EQU | 81 | ; Front Porch | HSync31k | EQU | 152 | ; Horizontal Synchronisation | BP31k | EQU | 161 | ; Back Porch | HDisp31k | EQU | 1184 | ; Duration of the visible pixels inside any line | | | |
| ; Timings Trame (en nombre de lignes) |
LBI31k | EQU | 14 | ; Leading Blank Interval | VSync31k | EQU | 3 | ; Vertical Synchronisation | TBI31k | EQU | 33 | ; Trailing Blank Interval | VDisp31k | EQU | 480 | ; Visible Lines Per Frame | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| ColorBars31k | EQU | $ | | ColorBars | HDisp31k/8 | ; Chaque bande verticale consomme 148 µcycles | | jmp | @Pattern31k:FrontPorch | ; Absorbe 4 µC, pris en compte dans la macro ColorBars | | | |
;***********************************************************************************************************************************
| | NOEXPAND | | Fill | $01FF | ; Bourrage de la page 0 avec des NOP's | | EXPAND | | | |
|
Les sections principales, quelque soit le standard, restent identiques dans leur conception et chacune occupe un jeu de pages dédiées :
- La page 1 ($0200..$03FF) pour le CGA/15 kHz. La page 2 ($0400..$05FF) lui servant d'extension.
- La page 3 ($0600..$07FF) pour l'EGA/24 kHz. La page 4 ($0800..$09FF) lui servant d'extension.
- La page 5 ($0A00..$0BFF) pour le VGA/31 Khz. La page 6 ($0C00..$0DFF) lui servant d'extension.
Chacune de ces sections principales est constituée de 4 blocs, chacun correspondant aux lignes d'une portion de la trame :
- Les lignes correspondant à la génération de l'impulsion de synchronisation trame.
- Les lignes du blanking arrière à la suite de cette impulsion
- Les lignes visibles, celles qui seront effectivement affichées sur un écran.
- Les lignes du blanking avant qui précède l'impulsion de synchronisation trame
C'est pendant le déroulement de la dernière ligne du quatrième bloc, celui du blanking avant, que seront testés les dip-switches du standard avant de reboucler sur le premier bloc du standard programmé.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20151022122731-gc339-Organigramme.GIF) (http://gamoovernet.pixhotel.fr/pics/20151022122731-gc339-Organigramme.GIF)
Tous les blocs sont calqués sur le même modèle bien qu'ils aient été remaniés pour débuter par l'impulsion de synchronisation ligne avec cette version du logiciel.
Chaque bloc comporte donc le détail des lignes qui le caractérise :
- La période correspondant à l'impulsion de synchronisation ligne.
- Le palier de suppression arrière (Back Porch).
- L'affichage du contenu visible de la ligne
- Le palier de suppresion avant (Front Porch).
C'est en fin de ce dernier palier que sera décrémenté le compteur de lignes du bloc, le contrôle passera au bloc suivant dés qu'il atteindra zéro.
Le palier arrière du bloc gérant l'affichage du contenu visible est le seul qui comporte une spécificité puisque c'est la période opportune pour décider du contenu visible à afficher en fonction de la mire programmée. Ainsi les dip-switches impactés seront testés afin d'exécuter le sous-programme approprié.
Ci-dessous la section principale pour le standard CGA/15 kHz (en bleu les insertions) par rapport aux versions SX28 précédentes. A noter que les instructions de chaque bloc ont été réordonnées, il débute maintenant par l'élaboration de la synchronisation ligne.
La section principale de chacun des deux autres standards est strictement identique à condition de faire abstraction des paramêtres de ligne et de trame qui lui est propre.
;################################################################################################### ; Section principale pour l'affichage CGA : mires en 15 kHz ;###################################################################################################
| | ; Pages 1 et 2 allouées aux mires CGA en 15 kHz ($0200 ... $05FF) |
;****************************** Impulsion de synchronisation trame *****************************************************************
| SyncVer15k | SET | $ | :SetUp | PresetCount | VSync15k | ; Nombre de lignes allouées à l'impulsion de synchronisation verticale | | jmp | SyncVer15k:Loop | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Impulsion de synchronisation horizontale |
SyncVer15k | SET | $ | :Loop | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | clrb | wreg.1 | ; 1 µC, positionnement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cette nouvel état | | Wait | HSync15k | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | BP15k | ; Durée du palier arrière | | | |
| ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame | | ; Le contenu des lignes et le palier avant sont ici confondus puisqu'ils sont tous les 2 au niveau du noir |
| SetColor | Black,HDisp15k+FP15k-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | SyncVer15k,Trailing15k | ; Décomptage lignes et test si zéro | | | |
;****************************** Champ à la suite de l'impulsion de synchronisation trame (blanking arrière) ************************
| Trailing15k | SET | $ | :SetUp | PresetCount | TBI15k | ; Nombre de lignes allouées au blanking arrière | | jmp | Trailing15k:Loop | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Impulsion de synchronisation horizontale |
Trailing15k | SET | $ | :Loop | mov | w,rb | ; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG | | clrb | wreg.0 | ; 1 µC, positionnement du bit affecté à la synchronisation horizontale | | setb | wreg.1 | ; 1 µC, effacement du bit affecté à la synchronisation verticale | | mov | rb,w | ; 1 µC, émission de cet nouvel état | | Wait | HSync15k | ; Durée de l'impulsion ligne | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | BP15k | ; Durée du palier arrière | | | |
| ; Blanking des lignes à la suite de l'impulsion de synchronisation trame | | ; Le contenu des lignes et le palier avant sont ici confondus puisqu'ils sont tous les 2 au niveau du noir |
| SetColor | Black,HDisp15k+FP15k-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Trailing15k,Pattern15k | ; Décomptage lignes et test si zéro | | | |
;****************************** Affichage du motif de la mire **********************************************************************
| Pattern15k | SET | $ | :SetUp | PresetCount | VDisp15k | ; Nombre de lignes allouées pour afficher la mire | | jmp | Pattern15k:Loop | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Impulsion de synchronisation horizontale |
Pattern15k | SET | $ | :Loop | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | HSync15k | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | | |
| ; Test en tout début de palier sur les dip-switches affectés au choix de la mire |
| jb | rb.7,Pattern15k:NextSwitch | ; +2/4 µC | | jmp | @CrossHatch15k | ; +6 µcycles si dérivation vers mire quadrillée | | | |
Pattern15k | SET | $ | :NextSwitch | jb | rb.6,Pattern15k:BackPorch | ; +2/4 µC | | jmp | @Twinkle15k | ; +10 µcycles si dérivation vers mire clignotante | | | |
| ; Complétion du palier de suppression arrière |
Pattern15k | SET | $ | :BackPorch | Wait | BP15k-8-4 | ; -8 µC du test sur les switches et -4 µC du saut interpages | | | |
| ; Affichage des 8 barres colorées de la mire | | ; Déplacé en page 0 pour récupérer de la place en page 1 |
| jmp | @ColorBars15k | ; Absorbe 4 µcycles | | | |
| ; Palier de suppression avant (Front Porch) |
Pattern15k | SET | $ | :FrontPorch | SetColor | Black,FP15k-14 | ; Contenu = niveau du noir + palier avant, minoré de 14 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Pattern15k,Leading15k | ; Décomptage lignes et test si zéro | | | |
;****************************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ******************************
| Leading15k | SET | $ | :SetUp | PresetCount | LBI15k | ; Nombre de lignes allouées au blanking avant | | jmp | Leading15k:Start | ; 7 µcycles d'absorbés par le rechargement du compteur de lignes | | | |
| ; Un délai supplémentaire de 20 µcycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14 |
Leading15k | SET | $ | :Loop | Delay | 20,0 | ; Délai avec offset nul | | | |
| ; Impulsion de synchronisation horizontale |
Leading15k | SET | $ | :Start | jmp | $+1 | ; Absorption de 3 µcycles | | clrb | SyncH | ; Emission de l'impulsion SyncH | | Wait | HSync15k | ; Durée de l'impulsion | | | |
| ; Palier de suppression arrière (Back Porch) |
| jmp | $+1 | ; Absorption de 3 µcycles | | setb | SyncH | ; Effacement de l'impulsion de synchronisation horizontale | | Wait | BP15k | ; Durée du palier arrière | | | |
| ; Blanking des lignes précédant l'impulsion de synchronisation trame | | ; Le contenu des lignes et le palier avant sont ici confondus puisqu'ils sont tous les 2 au niveau du noir | | ; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop | | ; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor15k:SetUp) |
| SetColor | Black,HDisp15k+FP15k-34 | ; Contenu = niveau du noir + palier avant, minoré de 34 µcycles | | | |
| ; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles) |
| NextLine | Leading15k,MainLoop | ; Décomptage lignes et test si zéro | | | |
|
A la suite des instructions de la section principale, en page 1, 3 ou 5 selon le standard, sont implantés les descripteurs des différents modèles de ligne utilisés par les 3 mires noir et blanc
- Ligne complètement noire (Blank) : mire à points.
- Ligne noire + cadre (Black) : mire clignotante.
- Ligne complètement blanche (Frame) : cadre mire clignotante, mire quadrillée.
- Ligne blanche + cadre (White) : mire clignotante.
- Ligne à points blancs (Points) : mire à points, mire quadrillée.
Chaque descripteur énumère les différents segments qui constituent la ligne associée. Il n'y a que la description de la ligne à points qui est singulière puisqu'elle fractionne virtuellement la ligne en deux pour pouvoir utiliser la directive de répétition d'instructions.
Le retour dans la section principale doit s'effectuer avec un saut intra-page (3 µcycles) pour une question de timing, c'est pour cette raison que les descripteurs sont implantés à sa suite.
Ci-dessous, pour l'exemple, les descripteurs pour le standard EGA/24 kHz.
Les descripteurs pour les deux autres standards ne diffèrent que par la longueur (en µcycles) des segments noir/blanc tels qu'ils ont été déterminés dans le message précédent.
Récapitulatif pour la mire clignotante : |
|
| | | | C a | d | r e | | | M a | r | g e | | | |Fréquence | | | Pixel(s) | | | µCycles | | | Pixel(s) | | | µCycles | | | | 15 kHz | | | 0,973 | | | 8 | | | 1,946 | | | 16 | | | | 24 kHz | | | 3,000 | | | 9 | | | 6,000 | | | 18 | | | | 31 kHz | | | 4,324 | | | 8 | | | 8,107 | | | 15 | | |
|
|
| | Récapitulatif pour la mire à quadrillage : |
| | | | | | | M | o n | t | a n | t | | | | | | I n t e | r | v a l l e | | | | | | N o | r | m a l | | | C e | n | t r a l | | | C a | d | r e | | | | | | | | |Fréquence | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | Pixels | | | µCycles | | | | 15 kHz | | | 0,973 | | | 8 | | | 2,189 | | | 18 | | | 2,068 | | | 17 | | | 28,46 | | | 234 | | | | 24 kHz | | | 3,000 | | | 9 | | | 6,000 | | | 18 | | | 6,000 | | | 18 | | | 47,00 | | | 141 | | | | 31 kHz | | | 4,324 | | | 8 | | | 7,567 | | | 14 | | | 7,027 | | | 13 | | | 58,37 | | | 108 | | |
|
|
|
;****************************** Descripteurs des différents modèles de lignes **********************
| Blank24k | EQU | $ | ; Pas d'affichage, la ligne est complètement noire | | SetColor | Black,HDisp24k-3 | ; -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
Black24k | EQU | $ | ; Marges confondues avec la ligne noire affichée | | SetColor | White,9 | ; Equivaut à 3 pixels blancs | | SetColor | Black,HDisp24k-(2*9 ) | ; Moins 2 × 3 pixels en largeur pour le cadre | | SetColor | White,9-3 | ; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
Frame24k | EQU | $ | ; Affichage d'une ligne blanche sans marge (cadre) | | SetColor | White,HDisp24k-3 | ; -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
White24k | EQU | $ | ; Affichage d'une ligne blanche avec marge | | SetColor | White,9 | ; Egal à 3 pixels blancs pour 384 lignes au format 4/3 | | SetColor | Black,18 | ; Marge gauche, équivaut à 6 pixels noirs | | SetColor | White,HDisp24k-(2*27) | ; Moins 2 × 9 pixels en largeur pour le cadre et les marges | | SetColor | Black,16 | ; Marge droite, équivaut à 6 pixels noirs | | SetColor | White,9-3 | ; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
;-----------------------------------------------------------------------------------------------------------------------------------
| Points24k | EQU | $ | ; Affichage d'une ligne comportant 11 points blancs | | | |
| ; Moitié gauche de la ligne |
| REPT | 5 | ; 5 ensembles point + intervalle | | IF | %=1 | ; Test sur compteur de répétitions | Length | SET | 18 | ; 6 pixels pour le montant vertical gauche du cadre | | ELSE | Length | SET | 9 | ; 3 pixels pour les autres traits verticaux | | ENDIF | | SetColor | White,Length | ; Point blanc | | SetColor | Black,141 | ; Intervalle noir de 47 pixels | | ENDR | | | |
| ; Moitié droite de la ligne |
| REPT | 5 | ; 5 ensembles point + intervalle | | IF | %=1 | ; Test sur compteur de répétitions | Length | SET | 18 | ; 6 pixels pour le trait vertical central du quadrillage | | ELSE | Length | SET | 9 | ; 3 pixels pour les autres traits verticaux | | ENDIF | | SetColor | White,Length | ; Point blanc | | SetColor | Black,141 | ; Intervalle noir de 47 pixels | | ENDR | | | |
| ; Montant vertical droit du cadre |
Length | SET | 18 | ; 6 pixels pour le montant vertical droit du cadre | | SetColor | Black,Length-3 | ; -3 µC pour le jmp suivant | | jmp | Pattern24k:FrontPorch | | | |
|
Si on applique la hauteur du trait horizontal de la mire quadrillée au point de la mire à points et que l'on conserve des intervalles identiques, le même algorythme par comparaison du n° de ligne peut être utilisé, il suffit juste de remplacer :
- la ligne blanche horizontale de la première par la ligne de points pour la seconde.
- la même ligne de points qui constituait les montants verticaux de la première par une ligne complètement noire pour remplir les intervalles de la seconde.
Une nouvelle macro "Select" a donc été crée pour choisir le type de ligne à afficher en fonction du dip-switch rb.6 quand rb.7 est sur ON
La macro "Select" : |
|
| ; Choix d'une ligne parmis celles du duo passé comme paramètre selon le dip-switch sur rb.6 |
Select | MACRO | FirstLabel, SecondLabel | ; Le test sur rb.6 consomme 7 µcycles supplémentaires | | LOCAL | FirstChoice | | jnb | rb.6,FirstChoice | ; +2/4 µC, FirstLabel si bit à 0, SecondLabel si bit à 1 | | skip | | ; +2 µcycles pour égaliser les deux branches à 4 µcycles | FirstChoice | jmp | FirstLabel | ; +3 µcycles, 2ème paramètre = FirstLabel
| | jmp | SecondLabel | ; +3 µcycles, 3ème paramètre = SecondLabel | | ENDM |
|
|
Seule précaution avec cette macro, elle doit être déroulée en fin ultime du palier de suppression arrière, juste pile poil avant la période d'affichage.
Le choix du type de ligne par test sur rb.6 immédiatement à la suite des descripteurs :
;-----------------------------------------------------------------------------------------------------------------------------------
| | ; Affichage d'une des lignes d'un duo en fonction de l'état sur rb.6 |
| DashOrDots24k | EQU | $ | | Select | Points24k,Frame24k | ; Affichage point blanc ou trait horizontal du quadrillage | | | |
DotsOrNix24k | EQU | $ | | Select | Blank24k,Points24k | ; Affichage intervalle noir ou montant vertical du quadrillage | | | |
;***************************************************************************************************
| | NOEXPAND | | Fill | $03FF | ; Bourrage de la page 3 avec des NOP's | | EXPAND | | | |
|
Au tour maintenant des 3 autres mires, leur choix s'effectue à l'aide des dip-switches sur les ports rb.7 et rb.6 :
- Ils sont lus une première fois au début du palier de suppression arrière du bloc affichage du contenu visible pour déterminer la routine à exécuter.
- Le switch sur le port rb.6 est éventuellement relu une deuxième fois en fin du même palier (macro "Select") pour déterminer la ligne d'un duo qui doit être affichée.
Rb.7 | Rb.6 |
OFF | OFF | Mire à barres colorées |
OFF | ON | Mire à bandes clignotantes |
ON | OFF | Mire à quadrillage |
ON | ON | Mire à points |
A suivre... (http://www.gamoover.net/Forums/index.php?topic=27188.msg589842#msg589842)
-
Bien que j'ai pas le temps de lire et analyser tout ce que tu nous propose, j'admire cette réalisation qui n'utilise pas de solution clef en main pour être mené a bien (pas de bibliothèque d'affichage magique, utilisation d'un chips a la programmation en bas niveau etc) .. Chapeaux bas :)
-
Suite migration du SX28 vers le SX48.
L'affichage de la mire clignotante a déjà été évoqué quelques messages plus haut (http://www.gamoover.net/Forums/index.php?topic=27188.msg551241#msg551241) et avait nécessité la création d'une macro "CheckCount" pour comparer le n° de ligne courant avec ceux qui délimitent la base des différentes bandes horizontales à afficher.
Cette mire est basé principalement sur l'affichage de 3 bandes horizontales à l'intérieur d'un cadre fixe, la bande centrale clignotant à l'inverse des deux autres. Elle était donc constituée de 7 bandes successives de hauteur différente, ce qui avait nécessité l'écriture de 7 blocs juxtaposés de lignes de code ainsi que de calculer manuellement pour chacun le nombre de µcycles restant à absorber pour compléter le palier arrière.
Afin d'en simplifier l'écriture une nouvelle macro "DisplayStripe" a été créée pour reprendre les lignes de code communes à tous les blocs et surtout comptabiliser le nombre de µcycles consommé par les comparaisons successives.
La macro "DisplayStripe" : |
|
| | | DisplayStripe | MACRO | | ; StripeHeight, FirstLabel, SecondLabel | | LOCAL | LocLab1, LocEnd | LastStripeLine | SET | LastStripeLine-\1 | ; 1er paramètre = StripeHeight (en nombre de lignes) | | CheckCount | LastStripeLine | ; +6 µC pour la macro | | jnc | LocEnd | ; +2/4 µC, total 8/10 µC | | IF | \0>2 | ; Test si présence d'un troisième paramètre | | Wait | RemainingCycles-16 | ; 8 µC écoulés, +8 µC pour le bloc d'instructions suivantes | | jb | FlipFlop.0,LocLab1 | ; +2/4 µC, test sur inverseur clignotement | | nop | | ; 2 NOP's pour égaliser les deux branches à 4 µcycles | | nop | | jmp | @\2 | ; + 4 µcycles, 2ème paramètre = FirstLabel | LocLab1 | jmp | @\3 | ; + 4 µcycles, 3ème paramètre = SecondLabel | | ELSE |
| IF | (\2=DashOrDots15k) OR (\2=DotsOrNix15k) OR (\2=DashOrDots24k) OR (\2=DotsOrNix24k) OR (\2=DashOrDots31k) OR (\2=DotsOrNix31k) |
| Wait | RemainingCycles-19 | ; 8 µC écoulés, +4 µC du saut interpages, +7 µC sélection par rb.6 | | ELSE | | Wait | RemainingCycles-12 | ; 8 µC écoulés, +4 µC pour le saut interpages | | ENDIF | | jmp | @\2 | ; + 4 µcycles, 2ème paramètre = FirstLabel | | ENDIF | LocEnd | EQU | $ | RemainingCycles | SET | RemainingCycles-10 | ; Décompte des µcycles consommés par la comparaison | | ENDM | | | |
|
|
Cette macro compare le numéro de ligne courant avec le numéro de ligne passé comme premier paramètre, ce dernier numéro doit être celui de la dernière ligne d'une bande horizontale.
- Si la ligne courante n'appartient pas à cette bande, on cumule le nombre de µcycles consommés avec le cumul de ceux déjà absorbés par les comparaisons précédentes.
- Si elle appartient à cette bande :
- Si un troisième paramètre est présent, on teste le Flip-Flop de clignotement pour savoir lequel du deuxième ou du troisième paramètre il faut sélectionner, ces deux paramètres correspondent au nom des lignes à afficher pour la mire clignotante.
- Si le troisième paramètre est absent, on compare le deuxième paramêtre avec le nom des duos car le nombre de µcycles nécessaire pour compléter le palier de suppression arrière doit tenir compte du temps d'exécution de la macro "select". Le contrôle est ensuite passé par un saut inter-pages à l'affichage du contenu de la ligne ou du duo dont le nom a été passé comme deuxième paramètre.
Les développements successifs de cette macro pour les 3 mires occupent tellement de lignes mémoire programme qu'ils nécessitent l'allocation d'une page d'extension pour chaque standard.
Ci-dessous, pour l'exemple, le code de la mire clignotante suivi de celui de la mire à quadrillage/à points pour le standard VGA/31 kHz.
Le code de ces mires pour les deux autres standards ne diffèrent que par la la hauteur des bandes horizontales telles qu'elles ont été déterminées dans le message précédent.
Récapitulatif pour la mire clignotante : |
|
| |Fréquence | | | Cadre | | | Marge | | | Ligne | | | | 15 kHz | | | 1 ligne | | | 2 lignes | | | 2456 µCycles | | | | 24 kHz | | | 3 lignes | | | 6 lignes | | | 1536 µCycles | | | | 31 kHz | | | 4 lignes | | | 8 lignes | | | 1184 µCycles | | |
|
|
| | Récapitulatif pour la mire à quadrillage : |
| | | | | T | r a i | t | | | | Intervalle | | | |Fréquence | | | Normal | | | Central | | | Cadre | | | | | | | 15 kHz | | | 1 ligne | | | 2 lignes | | | 2 lignes | | | 21 lignes | | | | 24 kHz | | | 3 lignes | | | 6 lignes | | | 7 lignes | | | 34 lignes | | | | 31 kHz | | | 4 lignes | | | 6 lignes | | | 6 lignes | | | 43 lignes | | |
|
|
|
;***********************************************************************************************************************************
| | ORG | $0C00 | ; Extension de la section VGA en page 6 | | | |
;****************************** Affichage de la mire clignotante noir/blanc ******************************************************** | | | Twinkle31k | EQU | $ | | RemainingCycles | SET | BP31k-10 | ; 10 µcycles déjà absorbés sur les 222 du back porch | LastStripeLine | SET | VDisp31k+1 | | | DisplayStripe | 4,Frame31k | ; Quatre lignes blanches pour le cadre (hauteur 4 pixels) | | DisplayStripe | 8,Black31k | ; Marge en-dessous du trait du cadre : 8 lignes | | DisplayStripe | 152,White31k,Black31k | ; 1ère bande clignotante : 152 lignes | | DisplayStripe | 152,Black31k,White31k | ; 2ème bande clignotante : 152 lignes | | DisplayStripe | 152,White31k,Black31k | ; 3ème et dernière bande clignotante : 152 lignes | | DisplayStripe | 8,Black31k | ; Marge au-dessus du trait du cadre : 8 lignes | | Wait | RemainingCycles-4 | ; Complétion du back porch avant affichage du cadre | | jmp | @Frame31k | ; 4 µcycles pour ce saut interpages | | Elapsed | SET | RemainingCycles |
|
;****************************** Tronc commun à l'affichage de la mire quadrillée et de la mire à points **************************** | | ; L'ensemble des traitements est fractionné en deux | | ; Ainsi la durée du traitement de chaque moitié n'excède pas celle du palier arrière |
| | | HalfScreenLimit | SET | (VDisp31k+1)-6-(4*4)-(5*43) | ; Moitié supérieure limitée au 5ème intervalle | | CheckCount | HalfScreenLimit | ; Déjà 6 µcycles d'écoulés +6 µC pour la macro | | jnc | LowerHalf31k | ; +2/4 µC, donc comparaison = 8/10 µcycles |
| | ; Traitement de la moitié supérieure de la trame |
| | | UpperHalf31k | EQU | $ | | RemainingCycles | SET | BP31k-6-8 | ; Déjà 6 µcycles écoulés + 8 pour la comparaison | LastStripeLine | SET | VDisp31k+1 |
| | ; 5 ensembles ruban + intervalle pour cette moitié supérieure | | ; Un ruban est constitué soit de traits horizontaux soit de points |
| | | | REPT | 5 | | IF | %=1 | ; Test sur compteur de répétitions | Height | SET | 6 | ; 6 lignes pour le ruban supérieur | | ELSE | Height | SET | 4 | ; 4 lignes pour les autres rubans | | ENDIF | | DisplayStripe | Height,DashOrDots31k | ; Affichage des traits horizontaux ou des points du ruban | | DisplayStripe | 43,DotsOrNix31k | ; Intervalle de 43 lignes, montants verticaux ou rien du tout | | ENDR | | Elapsed | SET | RemainingCycles | | | Wait | RemainingCycles-4 | ; Complétion du back porch | | jmp | @Blank31k | ; Echappatoire sur erreur de limite |
| | ; Traitement de la moitié inférieure de la trame |
| | | LowerHalf31k | EQU | $ | | RemainingCycles | SET | BP31k-6-10 | ; Déjà 6 µcycles écoulés + 10 pour la comparaison | LastStripeLine | SET | HalfScreenLimit |
| | ; 5 ensembles ruban + intervalle pour cette moitié inférieure | | ; Un ruban est constitué soit de traits horizontaux soit de points |
| | | | REPT | 5 | | IF | %=1 | ; Test sur compteur de répétitions | Height | SET | 6 | ; 6 lignes pour le ruban central | | ELSE | Height | SET | 4 | ; 4 lignes blanches pour les autres rubans | | ENDIF | | DisplayStripe | Height,DashOrDots31k | ; Affichage des traits horizontaux ou des points du ruban | | DisplayStripe | 43,DotsOrNix31k | ; Intervalle de 43 lignes, montants verticaux ou rien du tout | | ENDR | | Elapsed | SET | RemainingCycles |
| | ; Traitement du dernier ruban (trait inférieur du cadre ou dernière ligne de points) |
| | | | Wait | RemainingCycles-4 | ; Complétion du back porch avant affichage du dernier ruban | | jmp | @Frame31k | ; 4 µcycles pour ce saut interpages | | CurrentLine | SET | LastStripeLine |
|
;*********************************************************************************************************************************** | | | | NOEXPAND | | Fill | $0DFF | ; Bourrage de la page 6 avec des NOP's | | EXPAND |
|
|
Et pour finir, le bourrage de la dernière page ($0E00..$0FFE) avec des NOP's. Ces 511 octets resteront en réserve pour une adjonction éventuelle...
;*********************************************************************************************************************************** | | ; Page 7 inutilisée, en réserve ($0E00 ... $0FFE) |
;*********************************************************************************************************************************** | | | | NOEXPAND | | Fill | $0FFE | ; Bourrage de la page 7 avec des NOP's (vecteur reset en $07FF) | | EXPAND |
|
;*********************************************************************************************************************************** |
-
Tout bonnement impression, code clair et carré, je suis admiratif !
Super boulot !
-
Très intéressant et instructif. ^-
-
Maintenant il s'agit de pouvoir programmer le SX48 :
- Le circuit imprimé du programmateur Fluffy-2 n'a été dessiné que pour pouvoir y flasher des SX18 et des SX28, il ne dispose pas des emplacements pour les SX48 et SX52.
Heureusement son concepteur l'a doté d'un connecteur ISP à 4 broches, ce qui va amplement faciliter l'ajout de l'extension pour le SX48.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623161624-gc339-SX-ISP.JPG) (http://gamoovernet.pixhotel.fr/pics/20160623161624-gc339-SX-ISP.JPG)
- Le SX48 étant packagé dans un boîtier 48 pin PQFP au pas de 0,5 mm, il devra être soudé sur une plaquette adaptatrice pour que ses pattes soient espacées au pas de 2,54 bien plus pratique pour une réalisation amateur.
L'extension SX48 pour le Fluffy-2 devra par conséquent comporter un support 48 pin compatible avec cette plaquette adaptatrice.
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623154257-gc339-PQFP48.PNG) (http://gamoovernet.pixhotel.fr/pics/20160623154257-gc339-PQFP48.PNG)
- Le logiciel universel de programmation IC-PROG version 1.06C qui servait jusqu'à maintenant pour programmer les SX28AC des versions précédente de la mire comporte bien le SX48 non suffixé ainsi que le SX52 dans sa liste déroulante. Reste à savoir s'il est bien compatible avec les SX48BD et SX52BD même s'il n'est pas optimisé pour ces deux derniers.
Au niveau du câblage, rien de bien compliqué, il suffit de connecter les pattes concernées du SX48 aux broches du connecteur ISP, en gris sur le nouveau schéma :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623165625-gc339-NewFluffy.PNG) (http://gamoovernet.pixhotel.fr/pics/20160623165625-gc339-NewFluffy.PNG)
Plus concrètement, le connecteur pour le SX48 soudé sur son adaptateur a été réalisé avec 8 connecteurs gigognes (6 pin stackable female header) pour Arduino enfichés dans un bout de plaquette d'essais, les interconnections étant mini-wrappées par en dessous :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623171443-gc339-Stackable6.PNG) (http://gamoovernet.pixhotel.fr/pics/20160623171443-gc339-Stackable6.PNG)
L'extension SX48 installée dans le coin en haut à gauche sur le support en plexiglas, elle est raccordée au circuit-imprimé du programmateur par l'intermédiaire du connecteur femelle bleu embroché sur celui de l'ISP :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623172009-gc339-Image-1257.JPG) (http://gamoovernet.pixhotel.fr/pics/20160623172009-gc339-Image-1257.JPG)
Un adaptateur équipé d'un SX48 enfiché dans le connecteur de l'expansion prêt à être programmé :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623172634-gc339-Image-1262.JPG) (http://gamoovernet.pixhotel.fr/pics/20160623172634-gc339-Image-1262.JPG)
Le logiciel IC-PROG, configuré pour le SX48, buffer chargé avec la version 10 de la mire qui reste à déboguer :
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160623174800-gc339-IC-Prog.PNG) (http://gamoovernet.pixhotel.fr/pics/20160623174800-gc339-IC-Prog.PNG)
La programmation des 4K lignes de la mémoire programme du SX42 dure 1'32" plus 25" pour la vérification, ça semble un peu long par rapport à celle du SX28, à l'occasion faudra vérifier si elle équivaut bien au double de ce dernier.
Bon maintenant reste plus qu'à câbler le même support constitué des 8 connecteurs gigognes sur la plaque à trous de la mire, juste à coté du support vide du SX48 et en // sur les ports qui leur sont communs. Et ensuite à déboguer la version 10 du logiciel de la mire...
-
Je poste enfin les photos de mon générateur mires tri-fréquences
J'ai tout intégré dans une boite que j'avais en stock, montage du circuit sur véroboard.
Une sortie VGA et une molex pour les signaux vidéos, alimentation externe 12V. fonction On/OFF sur la boite
Vu d'ensemble
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160817192614-Fred G5-DSC03245-1024x768-.JPG) (http://gamoovernet.pixhotel.fr/pics/20160817192614-Fred G5-DSC03245-1024x768-.JPG)
Détail du véroboard
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160817192758-Fred G5-DSC03246-1024x768-.JPG) (http://gamoovernet.pixhotel.fr/pics/20160817192758-Fred G5-DSC03246-1024x768-.JPG)
La connectique
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160817192838-Fred G5-DSC03248-1024x768-.JPG) (http://gamoovernet.pixhotel.fr/pics/20160817192838-Fred G5-DSC03248-1024x768-.JPG)
La mire de barre sur un Hantarex Polo Star en 31KHz
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160817192931-Fred G5-DSC03250-1024x768-.JPG) (http://gamoovernet.pixhotel.fr/pics/20160817192931-Fred G5-DSC03250-1024x768-.JPG)
J'ai pas de bonnes photos de la mire clignotante, mais elle marche bien aussi
Un grand merci à GC339 pour le partage et la programmation de mon circuit ^-^
-
:-* c'est magnifique ^-^
-
Juste un aparté au sujet du schéma publié par Spectro quelques pages plus en avant.
Cet remarque concerne la manière dont le signal de synchronisation trame interfère avec celui de la synchronisation ligne pour produire la synchronisation composite nécessaire à certains moniteurs.
- Le OU exclusif (ou XOR) U2-A assure la superposition des impulsions de synchronisation trame par dessus celles de synchronisation ligne quand le switch 8 de SW1 est fermé.
- Le XOR suivant, U2-C, permet de choisir la polarité de la synchronisation ligne/composite :
- Synchronisation positive quand le switch 7 de SW1 est fermé.
- Synchronisation négative quand ce même switch est ouvert.
- La polarité de la synchronisation trame est de pair affectée par l'intermédiaire de U2-B
(http://gamoovernet.pixhotel.fr/pics_gamoovernet690px/20160818103831-gc339-Spectro.PNG) (http://gamoovernet.pixhotel.fr/pics/20160818103831-gc339-Spectro.PNG)
L'apparition ou la disparition de l'impulsion de synchronisation trame doit être synchrone avec l'impulsion de synchronisation ligne.
- Avec le front montant de l'impulsion ligne quand la polarité du signal est positive.
- Avec le front descendant de l'impulsion ligne quand la polarité du signal est négative.
Sur les chronogrammes ci-dessous, la durée de l'impulsion de synchronisation équivaut à celle de 4 lignes.
┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ││ ││ ││ ││ ││ ││ ││ ││ ││ ││ ──█┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└────────┘└───── Synchro Ligne Positive ┌───────────────────────────────────────┐ │ ↓ ↓ ↓ │ ──█──────────────────────────────┘ ↓ ↓ ↓ └────────────────────────── Synchro Trame Positive ┌┐ ┌┐ ┌┐ ↓┌────────┐┌────────┐┌────────┐┌─────────┐ ┌┐ ┌┐ ││ ││ ││ ↓│ ││ ││ ││ ↓│ ││ ││ ──█┘└────────┘└────────┘└─────────┘ └┘ └┘ └┘ ↓└────────┘└────────┘└───── Synchro Composite Positive ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ──█┐┌────────┐┌────────┐┌─────────┐ ┌┐ ┌┐ ┌┐ ↓┌────────┐┌────────┐┌───── Synchro Composite Négative ││ ││ ││ ↓│ ││ ││ ││ ↓│ ││ ││ └┘ └┘ └┘ ↓└────────┘└────────┘└────────┘└─────────┘ └┘ └┘
|
Hors, quelque soit la polarité de la synchronisation composite, les impulsions de synchronisation lignes attendues pendant la durée de la synchronisation trame se retrouvent inversées par le XOR U2-A. Le front montant de ces impulsions lignes incluses se retrouve alors remplacé par un front descendant et vis versa.
Et c'est là que le bât blesse car la base de temps ligne des moniteurs est plutôt conçue pour se synchroniser sur un front que sur le niveau du signal synchronisant.
En l'occurrence sur le front descendant des impulsions lignes avec un signal de polarité négative pour les moniteurs arcade usuels. La base de temps ligne du moniteur tend à rattraper le léger retard des fronts descendants pendant la synchronisation trame puis à reprendre son rythme normal quand elle disparaît. Cela peut se traduire par un déchirement des lignes tout en haut de l'image.
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ──█┐┌────────┐┌────────┐┌─────────┐ ┌┐ ┌┐ ┌┐ ↓┌────────┐┌────────┐┌───── Synchro Composite Négative ││ ││ ││ ↓│ ││ ││ ││ ↓│ ││ ││ Avant Correction └┘ └┘ └┘ ↓└────────┘└────────┘└────────┘└─────────┘ └┘ └┘ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ──█┐┌────────┐┌────────┐┌────────┐ ┌┐ ┌┐ ┌┐ ┌┐┌────────┐┌────────┐┌───── Synchro Composite Négative ││ ││ ││ │ ││ ││ ││ │││ ││ ││ Après Correction └┘ └┘ └┘ └────────┘└────────┘└────────┘└────────┘└┘ └┘ └┘ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ──█┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐┌───── Synchro Ligne Négative ││ ││ ││ ││ ││ ││ ││ ││ ││ ││ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ──█──────────────────────────────┐ ┌────────────────────────── Synchro Trame Négative │ │ └───────────────────────────────────────┘
|
La réelle solution à ce petit problème posé pendant la synchronisation trame serait de générer l'impulsion de synchronisation ligne à ce moment là en avance d'un temps égal à sa propre durée pour que les fronts synchronisants coïncident ( fronts montants pour la synchronisation positive, descendants pour la négative) ainsi que représenté par le chronogramme rouge au dessus.
Ce signal composite revu et corrigé est plus complexe à générer par hardware, le plus judicieux serait de le générer par logiciel sur un port actuellement libre du SX28. Son inversion de polarité pourra avantageusement être réalisée par le XOR U2-A que cette modification aura rendu disponible.
-
....La réelle solution à ce petit problème posé pendant la synchronisation trame serait de générer l'impulsion de synchronisation ligne à ce moment là en avance d'un temps égal à sa propre durée pour que les fronts synchronisants coïncident....
C'est la première chose que je me suis dite en lisant le post de spectro 8)
:fleche: