Gamoover

Forums " WORKSHOP" => Jeux : Pcb & Systèmes arcadiens => Outils de dépannage pour Pcbs => Discussion démarrée par: gc339 le Dimanche 27 Janvier 2013, 15:34:59 PM

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Dimanche 27 Janvier 2013, 15:34:59 PM
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 :




(https://gamoovernet.pixhotel.fr/pics/20130126182519-gc339-atv017.jpg)   (https://gamoovernet.pixhotel.fr/pics/20130126182618-gc339-atv018.jpg)
(https://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 :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20121212093011-gc339-Image-0084.JPG) (https://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 :




(https://gamoovernet.pixhotel.fr/pics/20130126181223-gc339-Full.gif)   (https://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:


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126194331-gc339-MS2931.gif) (https://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 :
Ainsi pour la première ligne du tableau décrivant un signal à 15 kHz :




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.

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126213412-gc339-SX28AC.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126225609-gc339-15K.gif) (https://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 :
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 :
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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130127154830-gc339-ColorBars.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126225643-gc339-24K.gif) (https://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 :
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 :




Le timing des signaux à 31 kHz, moitié inférieure de la page I-6 du "Service Manual" du moniteur MS-2931 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126225746-gc339-31K.gif) (https://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 :
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 :




Le futur générateur en chantier :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130127151407-gc339-0096.JPG) (https://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 :
Seront implantés par la suite :

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: kos71 le Dimanche 27 Janvier 2013, 18:42:51 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Persecutor le Lundi 28 Janvier 2013, 10:54:56 AM
C'est vraiment une super idée  ^-^

et un sacré taff a venir  <:)

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Eko le Lundi 28 Janvier 2013, 12:03:49 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Lundi 28 Janvier 2013, 15:21:17 PM
Autant commencer par le programme de la mire à barres colorées, c'est le plus simple!


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130127154830-gc339-ColorBars.gif) (https://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
BlueEQU%001   ; Bit 2°
RedEQU%010; Bit 2¹
GreenEQU%100; Bit 2²
MagentaEQUBlue+Red
CyanEQUBlue+Green
YellowEQURed+Green
WhiteEQUBlue+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 :

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
ANDW,#%1000; Effacement des 3 bits de couleur
ORW,#Cyan; Positionnement des seuls bits impactés par la couleur Cyan
MOVRA,W; Émission de cette nouvelle couleur




Le câblage entre le SX28AC et l'embase HD-15 femelle pourrait être réalisé comme suit :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130127234142-gc339-Diagram.gif) (https://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
CALLDelay
MOVRA,#Yellow; Émission de la barre Jaune
CALLDelay
MOVRA,#Cyan; Émission de la barre Cyan
CALLDelay
MOVRA,#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
MOVCounter,#Delay; Initialisation du compteur
LoopWhiteDJNZCounter,LoopWhite
NOP
NOP
MOVRA,#Yellow; Émission de la barre Jaune
MOVCounter,#Delay; Initialisation du compteur
LoopYellowDJNZCounter,LoopYellow
NOP
NOP
MOVRA,#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
LOCALLocLoop; Étiquette interne à la macro
MOVW,RA; Lecture du port RA
ANDW,#%1000; Effacement des 3 bits de couleur
ORW,#Color; Positionnement des seuls bits impactés par la nouvelle couleur
MOVRA,W; Émission de cette nouvelle couleur
MOVCounter,#Delay; Initialisation du compteur
LocLoopDJNZCounter,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
SetColorYellow,100
SetColorCyan,100
SetColorGreen,100
SetColorMagenta,100
SetColorRed,100
SetColorBlue,100
SetColorBlack,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
SetColorWhite,100
SetColorYellow,100
SetColorCyan,100
SetColorGreen,100
SetColorMagenta,100
SetColorRed,100
SetColorBlue,100
SetColorBlack,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   
LOCALLocLoop
MOVW,RA; 1 cycle
ANDW,#%1000; 1 cycle
ORW,#Color; 1 cycle
MOVRA,W; 1 cycle
MOVCounter,#Delay; 2 cycles
LocLoopDJNZCounter,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
LOCALLocLoop; Étiquette interne à la macro
MOVW,RA; Lecture du port RA
ANDW,#%1000; Effacement des 3 bits de couleur
ORW,#Color; Positionnement des seuls bits impactés par la nouvelle couleur
MOVRA,W; Émission de cette nouvelle couleur
MOVCounter,#((Delay/4)-1); Initialisation du compteur de bouclettes
LocLoopDJNZCounter,LocLoop
REPTDelay//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
SetColorWhite,307
SetColorYellow,307
SetColorCyan,307
SetColorGreen,307
SetColorMagenta,307
SetColorRed,307
SetColorBlue,307
SetColorBlack,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)
SetColorWhite,DelayBar
SetColorYellow,DelayBar
SetColorCyan,DelayBar
SetColorGreen,DelayBar
SetColorMagenta,DelayBar
SetColorRed,DelayBar
SetColorBlue,DelayBar
SetColorBlack,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
Bars31ColorBars87,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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Vendredi 01 Février 2013, 11:35:36 AM
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
LOCALLocLoop; Étiquette interne à la macro
MOVW,RA; Lecture du port RA
ANDW,#%1000; Effacement des 3 bits de couleur
ORW,#Color; Positionnement des seuls bits impactés par la nouvelle couleur
MOVRA,W; Émission de cette nouvelle couleur
MOVCounter,#((Delay/4)-1); Initialisation du compteur de bouclettes
LocLoopDJNZCounter,LocLoop
REPTDelay//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
LOCALLocLoop; Étiquette interne à la macro
MOVLoopCounter,#Value; 2 cycles, initialisation du compteur de bouclettes
LocLoopDJNZLoopCounter,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
 BasicDelay250
ENDR
BasicDelayValue//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
REPTLoops/250   ; Correspond à 250 × 4 soit 1000 cycles d'horloge
 BasicDelay250
ENDR
BasicDelayLoops//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
REPTLoops/250   ; Correspond à 250 × 4 soit 1000 cycles d'horloge
 BasicDelay250
ENDR
BasicDelayLoops//250; Complémenté par le reste de la division par 250
REPTDelay//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
MOVW,RA; 1 cycle, lecture du port RA
ANDW,#%1000; 1 cycle, effacement des 3 bits de couleur
ORW,#Color; 1 cycle, positionnement des seuls bits impactés par la nouvelle couleur
MOVRA,W; 1 cycle, émission de cette nouvelle couleur
WaitDelay; 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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130131135901-gc339-Bars1.gif) (https://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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130131142315-gc339-Bars2.gif) (https://gamoovernet.pixhotel.fr/pics/20130131142315-gc339-Bars2.gif)





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
SetColorWhite,DelayBar; Première barre verticale
SetColorYellow,DelayBar
SetColorCyan,DelayBar
SetColorGreen,DelayBar
SetColorMagenta,DelayBar
SetColorRed,DelayBar
SetColorBlue,DelayBar
SetColorBlack,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
CLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
ColorBars307; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles
; Palier de suppression avant (Front Porch)
SetColorBlack,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
SETBSyncH; Émission de l'impulsion
Wait238; 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
LineLoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
ColorBars307; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles
; Palier de suppression avant (Front Porch)
SetColorBlack,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
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPLineLoop; 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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130131175827-gc339-NewDiagram.gif) (https://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 :
A comparer avec les chronogrammes du dessin inclus en tête du post précédent.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130201093919-gc339-ChronoGram.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130201102524-gc339-Image-0102.JPG) (https://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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130201103541-gc339-Image-0104.JPG) (https://gamoovernet.pixhotel.fr/pics/20130201103541-gc339-Image-0104.JPG)

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: pn_jeux le Vendredi 01 Février 2013, 12:13:54 PM
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... ^-^
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Vendredi 01 Février 2013, 13:16:23 PM
Citation de: pn_jeux le Vendredi 01 Février 2013, 12:13:54 PMil 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 !
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Shuff le Vendredi 01 Février 2013, 15:27:06 PM
Très instructif et détaillé ce topic.
Merci de partager ce travail avec nous gc339  <:)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: CkurcK le Samedi 02 Février 2013, 00:20:05 AM
Wouaw merci pour ce partage !

C'est pour ça que j'aime Gamo !!!  :-)=
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: nc333 le Mercredi 06 Février 2013, 20:53:47 PM
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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 07 Février 2013, 14:38:19 PM
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
LineLoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes
; Période d'affichage
IFDisplayPatten=1
 ColorBars307; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles
ELSE
 SetColorBlack,2456; Niveau du noir imposé pendant 2456 cycles
ENDIF
; Palier de suppression avant (Front Porch)
SetColorBlack,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
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPLineLoop; 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  CLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes
; Période d'affichage
IFDisplayPatten=1
 ColorBars307; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles
ELSE
 SetColorBlack,2456; Niveau du noir imposé pendant 2456 cycles
ENDIF
; Palier de suppression avant (Front Porch)
SetColorBlack,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
SETBSyncH; Émission de l'impulsion
Wait238; 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 :




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  CLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 323 cycles pour le palier arrière, tient compte des 4 cycles absorbés par les instructions précédentes
; Période d'affichage
IFDisplayPatten=1
 ColorBars307; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles
ELSE
 SetColorBlack,2456; Niveau du noir imposé pendant 2456 cycles
ENDIF
; Palier de suppression avant (Front Porch)
SetColorBlack,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
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPBlockDraft: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
LoopCounterDS1; Compteur de boucles
LineCounterDS2; Compteur de lignes
FrameCounterDS1; 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
TESTLineCounter+1; Test sur l'octet de poids fort
JZLabel2
DECLineCounter+1; -1 sur octet de poids fort
SKIP; 6 cycles déjà consommés, 8 à absorber pour atteindre l'adresse :Start
Label1JMP$+2; 4 cycles déjà consommés, 10 à absorber pour atteindre l'adesse :Start
SKIP
JMP$+1
NOP
JMPBlock:Start; Étiquette locale du bloc où cette suite d'instruction a été insérée
Label2MOVLineCounter,#(Value//256); Chargement du compteur, octet de poids faible
MOVLineCounter+1,#(Value/256); Idem, octet de poids fort
JMPNextBlock: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   
LOCALLabel1,Label2; Déclaration des étiquettes privées
DJNZLineCounter,Label1; -1 sur octet de poids faible
TESTLineCounter+1; Test sur l'octet de poids fort
JZLabel2
DECLineCounter+1; -1 sur octet de poids fort
SKIP; 6 cycles déjà consommés, 8 à absorber pour atteindre l'adresse :Start
Label1JMP$+2; 4 cycles déjà consommés, 10 à absorber pour atteindre l'adresse :Start
SKIP
JMP$+1
NOP
JMPCurrentBlock??:Start; Étiquette locale du bloc où cette suite d'instruction a été insérée
Label2MOVLineCounter,#(NewLineNumber//256); Chargement du compteur, octet de poids faible
MOVLineCounter+1,#(NewLineNumber/256); Idem, octet de poids fort
JMPNextBlock??: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
:LoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
SetColorBlack,2456; Contenu des lignes forcé au niveau du noir pendant le blanking trame
; Palier de suppression avant (Front Porch)
SetColorBlack,161-14; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage
LeadingFieldSET$; Décomptage des lignes du bloc en fin du palier (14 cycles)
NextLineLeadingField,SyncField,3; Durée de 3 lignes pour l'impulsion de synchronisation verticale
; Impulsion de synchronisation horizontale
:StartJMP$+1; Absorption de 3 cycles
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPLeadingField:Loop; Rebouclage avec absorption de 3 cycles

;------------------------------ Impulsion de synchronisation trame --------------------------------


SyncField   SET   $
   ; Palier de suppression arrière (Back Porch), suite
:LoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
SetColorBlack,2456; Contenu des lignes forcé au niveau du noir pendant l'impulsion de synchronisation trame
; Palier de suppression avant (Front Porch)
SetColorBlack,161-14; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage
SyncFieldSET$; Décomptage des lignes du bloc en fin du palier (14 cycles)
NextLineSyncField,LaggingField,23; Durée de 23 lignes pour le blanking arrière
; Impulsion de synchronisation horizontale
:StartJMP$+1; Absorption de 3 cycles
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPSyncField:Loop; Rebouclage avec absorption de 3 cycles

;----------------------------------------- Blanking arrière ---------------------------------------


LaggingField   SET   $
   ; Palier de suppression arrière (Back Porch), suite
:LoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
SetColorBlack,2456; Contenu des lignes forcé au niveau du noir pendant le blanking trame
; Palier de suppression avant (Front Porch)
SetColorBlack,161-14; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage
LaggingFieldSET$; Décomptage des lignes du bloc en fin du palier (14 cycles)
NextLineLaggingField,PatternField,224; Durée de 224 lignes pour afficher la mire à barres colorées
; Impulsion de synchronisation horizontale
:StartJMP$+1; Absorption de 3 cycles
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPLaggingField:Loop; Rebouclage avec absorption de 3 cycles

;---------------------------------------- Affichage de la mire --------------------------------------


PatternField   SET   $
   ; Palier de suppression arrière (Back Porch), suite
:LoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
ColorBars307; Affichage de la mire, chaque barre occupe un intervalle de 307 cycles
; Palier de suppression avant (Front Porch)
SetColorBlack,161-14; Palier forcé au niveau du noir, prise en compte des 14 cycles du décomptage
LaggingFieldSET$; Décomptage des lignes du bloc en fin du palier (14 cycles)
NextLinePatternField,LeadingField,13; Durée de 13 lignes pour le blanking avant
; Impulsion de synchronisation horizontale
:StartJMP$+1; Absorption de 3 cycles
SETBSyncH; Émission de l'impulsion
Wait238; 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)
JMPPatternField: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
LoopsSET(  (Delay)  /4)-1
Cycles  SET (Delay)//4  
REPTLoops/250; Correspond à 250 × 4 soit 1000 cycles d'horloge
 BasicDelay250
ENDR
BasicDelayLoops//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  
 REPTCycles  ; 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
:LoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
SyncFieldSET$; Décomptage des lignes du bloc en fin du palier (14 cycles)
NextLineSyncField,LaggingField,23; Durée de 23 lignes pour le blanking arrière
; Impulsion de synchronisation horizontale
:StartMOV  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
Wait238; 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)
JMPSyncField:Loop; Rebouclage avec absorption de 3 cycles

;----------------------------------------- Blanking arrière ---------------------------------------


LaggingField   SET   $
   ; Palier de suppression arrière (Back Porch), suite
:LoopCLRBSyncH; Effacement de l'impulsion de synchronisation Horizontale
Wait323; 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
LaggingFieldSET$; Décomptage des lignes du bloc en fin du palier (14 cycles)
NextLineLaggingField,PatternField,224; Durée de 224 lignes pour afficher la mire à barres colorées
; Impulsion de synchronisation horizontale
:StartMOV  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
Wait238; 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)
JMPLaggingField: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 :
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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130207133654-gc339-Frame01.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130207135601-gc339-Frame02.gif) (https://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...
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Lundi 11 Février 2013, 23:41:52 PM
Citation de: nc333 le Mercredi 06 Février 2013, 20:53:47 PM
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.

Citation de: nc333 le Mercredi 06 Février 2013, 20:53:47 PM
_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

Citation de: nc333 le Mercredi 06 Février 2013, 20:53:47 PM
_ 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.

Citation de: nc333 le Mercredi 06 Février 2013, 20:53:47 PM
_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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130211232423-gc339-Image-0149.JPG) (https://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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130211233103-gc339-Image-0163.JPG) (https://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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130211233349-gc339-DSCF7088.JPG) (https://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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Lundi 18 Février 2013, 17:07:38 PM
Le timing des signaux à 15 kHz tel qu'il est donné à la page I-5 du "Service Manual" du moniteur MS-2931 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126225609-gc339-15K.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126225643-gc339-24K.gif) (https://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 ).


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130217004602-gc339-P15.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130126225746-gc339-31K.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130218115944-gc339-Naomi31k.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130218123028-gc339-P2-6.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130218125805-gc339-29E31S.gif) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130218155805-gc339-Diagram.DipSw.gif) (https://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
Initializemovra,#%0000; Set port A low
movrb,#%11111111; Set port B high
movrc,#%11111111; Set port C high
; Pull-Up Resistor Configuration
modePLP; 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
modeTRIS; 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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Vendredi 07 Juin 2013, 15:53:36 PM
Citation de: gc339 le Lundi 18 Février 2013, 17:07:38 PMMaintenant 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 :
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 :

Citation






;-------------------------- DEVICE DIRECTIVES --------------------------

                                                                                                
IFDEF__SASM;SASM Directives
DEVICESX28AC, OSCHS3, TURBO, BOROFF, SYNC, OPTIONX, CARRYX
IRC_CALIRC_SLOW
ELSE; Parallax Assembler Directives
DEVICESX28AC, OSCXT2, TURBO, BOROFF, SYNC
ENDIF
ID"PATGEN"
RESETInitialize; Reset vector

;------------------------------- EQUATES -------------------------------

                                                                                                
SyncHEQUrb.0; Synchro Horizontale sur RB0
SyncVEQUrb.1; Synchro Verticale sur RB1
BlackEQU%0000
BlueEQU%0001; Bit 2°
RedEQU%0010; Bit 2¹
GreenEQU%0100; Bit 2²
CyanEQUGreen + Blue
MagentaEQURed + Blue
YellowEQURed + Green
WhiteEQURed + Green + Blue


                        ; MODE Register Settings to access the port control registers

TRISEQU$0F; Data Direction Register
PLPEQU$0E; Pull-Up Resistor Enable Register
LVLEQU$0D; TTL/CMOS Select Register
STEQU$0C; Schmitt Trigger Enable Register
WKENEQU$0B; Wake Up Enable Register
WKEDEQU$0A; Wake Up Edge Select Register
WKPNDEQU$09; MIWU Pending Register
CMPEQU$08; Comparator Enable Register
                                                                                                
;------------------------------ VARIABLES ------------------------------

                                                                                                
ORG8; Début de mémoire vive utilisable pour stocker les variables du progranne
LoopCounterDS1; Step Counter
LineCounterDS2; Line Conter
FrameCounterDS1; Frame Counter
FlipFlopDS1; 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 :

Citation






;-------------------------------- MACRO's -------------------------------

                                                                                                
BasicDelayMACROValue; Absorbe un nombre de µcycles = (Value × 4)
LOCALLocLoop; Etiquette interne à la macro
movLoopCounter,#Value; 2 µC, initialisation du compteur de bouclettes
LocLoopDJNZLoopCounter,LocLoop; 4 µC sinon 2 en sortie de boucle
ENDM

DelayMACROValue,Offset; Temporisation incluant une franchise (Offset)
LoopsSET(Value-(Offset))/4
CyclesSET(Value-(Offset))//4
REPTLoops/250; Correspond à 250×4 soit 1000 µcycles d'horloge
 BasicDelay250
ENDR
BasicDelayLoops//250; Complété par le reste de la division par 250
IFCycles=3; Afinage
 jmp$+1; Absorbe 3 µcycles en une seule instruction
ELSE
 REPTCycles; Répétition de NOP modulo 4
   nop
 ENDR
ENDIF
ENDM

WaitMACROValue; Temporisation, inclue les 4 µcycles du bloc d'instructions qui la précéde
 DelayValue,4; Minoration des 4 µcycles
ENDM

SetColorMACROColor, Delay; Emission de la couleur (Color), durée = (Delay)
movw,ra; 1 µC, lecture du port RA
andw,#%1000; 1 µC, effacement des 3 bits de couleur
orw,#Color; 1 µC, positionnement des bits impactés
movra,w; 1 µC, émission de cette nouvelle couleur
waitDelay; Temporisation, tient compte des µcycles absorbés par les instructions précédentes
ENDM

ColorBarsMACRODelayBar; Emission des 8 barres colorées, durée de chaque barre = (DelayBar)
SetColorWhite,DelayBar; Première barre verticale
SetColorYellow,DelayBar
SetColorCyan,DelayBar
SetColorGreen,DelayBar
SetColorMagenta,DelayBar
SetColorRed,DelayBar
SetColorBlue,DelayBar
SetColorBlack,DelayBar; La huitième barre est aussi la dernière
ENDM

NextLineMACROCurrent,Next; Absorbe 14 µCycles sauf sortie vers MainLoop qui en absorbe que 9
LOCALLocLab1,LocLab2; Déclaration des étiquettes privées
djnzLineCounter, LocLab1; 4/2 µC, décomptage sur octet de poids faible
testLineCounter+1; 1 µC, test de nullité sur l'octet de poids fort
NextAddrSETNext
IFNextAddr=MainLoop
 jnzLocLab2; 4/2 µC
 jmp@MainLoop; 1+3 µC, soit 9 consommés au total
ELSE
 jzNext??: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
LocLab1jmp$+3; 3 µC, 7 déjà consommés, encore 7 à absorber
LocLab2decLineCounter+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
jmpCurrent??:Start; 3 µC, 14 consommés au total
ENDM

PresetCountMACROValue; Initialisation du compteur ligne, absorbe 4 µCycles
movLineCounter,#(Value//256); 2 µC, chargement du compteur, octet de poids faible
movLineCounter+1,#(Value/256); 2 µC, idem, octet de poids fort
ENDM






Le programme principal en page 0 (adresse 0000H) :

Citation






                                                
LISTF=INHX8M

;-------------------------- ROUTINE D'INTERRUPTION --------------------------

                                                                                                
ORG0
Interruptreti

;-------------------------- ROUTINE D'INITIALISATION -------------------------

                                                                                                
ORG8
Initializemovra,#%0000; Set port A low
movrb,#%11111111; Set port B high
movrc,#%11111111; Set port C high


                        ; Pull-Up Resistor Configuration

modePLP; 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

modeTRIS; 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 -----------------------------

                                                                                                
MainsetbSyncH
setbSyncV
clrFlipFlop; Initialisation du flip flop
jmpPresetFrCnt


                        ; Compteur de trames pour clignotement, absorbe 7 µCycles

MainLoopdjnzFrameCounter,NoPreset; 2/4 µC
notFlipFlop; 1 µC, inversion du flip flop
PresetFrCntmovFrameCounter,#30; 2 µC, clignotement toutes les 30 trames (½ seconde)
skip; 2 µC, ajustement à 7 µC si rechargement FrameCount
NoPresetjmp$+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.

jnbrb.5,Jmp31k; 2/4 µC, lecture de la fréquence programmée par les dip-switches
jnbrb.4,Jmp24k; 2/4 µC
Jmp15kjmp$+1; 3 µC pour ajustage absorpsion à 11 µC
jmp@Start15k; 1+3 µC, instruction de page incluse avec "@"
Jmp24knop; 1 µC pour ajustage absorpsion à 11 µC
jmp@Start24k; 1+3 µC, instruction de page incluse avec "@"
Jmp31kjmp$+1; 3 µC pour ajustage absorpsion à 11 µC
jmp@Start31k; 1+3 µC, instruction de page incluse avec "@"
                                                                                                

Ajout des tests :




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 :
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 :
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)

Citation






                                                
ORG$0200
Start15kEQU$

;****************************** Impulsion de synchronisation trame ******************************

                                                                                                
SyncHor15kSET$
:SetUpPresetCount3; Nombre de lignes allouées à l'impulsion de synchronisation verticale
jmpSyncHor15k:Start


                        ; Palier de suppression arrière (Back Porch), suite

SyncHor15kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait323; Durée du palier arrière
                                                                                                

                        ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame

SetColorBlack,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)

NextLineSyncHor15k,Lagging15k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

SyncHor15kSET$
:Startmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
clrbwreg.1; 1 µC, positionnement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cette nouvel état
Wait238; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpSyncHor15k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) **********

                                                                                                
Lagging15kSET$
:SetUpPresetCount23; Nombre de lignes allouées au blanking arrière
jmpLagging15k:Start


                        ; Palier de suppression arrière(Back Porch),suite

Lagging15kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait323; Durée du palier arrière
                                                                                                

                        ; Blanking des lignes à la suite de l'impulsion de synchronisation trame

SetColorBlack,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)

NextLineLagging15k,Pattern15k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Lagging15kSET$
:Startmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
setbwreg.1; 1 µC, effacement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cet nouvel état
Wait238; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpLagging15k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;****************************** Affichage du motif de la mire ******************************

                                                                                                
Pattern15kSET$
:SetUpPresetCount224; 224 Nombre de lignes allouées pour afficher la mire
jmpPattern15k:Start


                        ; Palier de suppression arrière (Back Porch), suite

Pattern15kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait323; Durée du palier arrière
                                                                                                

                        ; Affichage des 8 barres colorées de la mire

ColorBars307; Chaque barre occupe 307 µcycles
                                                                                                

                        ; Palier de suppression avant (Front Porch)

SetColorBlack,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)

NextLinePattern15k,Leading15k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Pattern15kSET$
:Startjmp$+1; Absorption de 3 µcycles
clrbSyncH; Emission de l'impulsion SyncH
Wait238; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpPattern15k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) **************

                                                                                                
Leading15kSET$
:SetUpPresetCount13; 4 µC, nombre de lignes allouées au blanking avant
jmpLeading15k:Start; 3 µCycles


                        ; Palier de suppression arrière (Back Porch), suite

Leading15kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait323; 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)

SetColorBlack,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)

NextLineLeading15k,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

Leading15kSET$
:StartDelay20,-3; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1"
clrbSyncH; Emission de l'impulsion SyncH
Wait238; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpLeading15k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                




Le programme générant les mires à 24 kHz en page 2 (adresse 0400H)

Citation






                                                
ORG$0400
Start24kEQU$

;****************************** Impulsion de synchronisation trame ******************************

                                                                                                
SyncHor24kSET$
:SetUpPresetCount4; Nombre de lignes allouées à l'impulsion de synchronisation verticale
jmpSyncHor24k:Start


                        ; Palier de suppression arrière (Back Porch), suite

SyncHor24kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait222; Durée du palier arrière
                                                                                                

                        ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame

SetColorBlack,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)

NextLineSyncHor24k,Lagging24k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

SyncHor24kSET$
:Startmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
clrbwreg.1; 1 µC, positionnement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cette nouvel état
Wait150; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpSyncHor24k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) **********

                                                                                                
Lagging24kSET$
:SetUpPresetCount25; Nombre de lignes allouées au blanking arrière
jmpLagging24k:Start


                        ; Palier de suppression arrière(Back Porch),suite

Lagging24kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait222; Durée du palier arrière
                                                                                                

                        ; Blanking des lignes à la suite de l'impulsion de synchronisation trame

SetColorBlack,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)

NextLineLagging24k,Pattern24k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Lagging24kSET$
:Startmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
setbwreg.1; 1 µC, effacement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cet nouvel état
Wait150; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpLagging24k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;****************************** Affichage du motif de la mire ******************************

                                                                                                
Pattern24kSET$
:SetUpPresetCount384; Nombre de lignes allouées pour afficher la mire
jmpPattern24k:Start


                        ; Palier de suppression arrière (Back Porch), suite

Pattern24kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait222; Durée du palier arrière
                                                                                                

                        ; Affichage des 8 barres colorées de la mire

ColorBars1536/8; Chaque barre occupe 192 µcycles
                                                                                                

                        ; Palier de suppression avant (Front Porch)

SetColorBlack,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)

NextLinePattern24k,Leading24k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Pattern24kSET$
:Startjmp$+1; Absorption de 3 µcycles
clrbSyncH; Emission de l'impulsion SyncH
Wait150; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpPattern24k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) **************

                                                                                                
Leading24kSET$
:SetUpPresetCount11; Nombre de lignes allouées au blanking avant
jmpLeading24k:Start


                        ; Palier de suppression arrière (Back Porch), suite

Leading24kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait222; 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)

SetColorBlack,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)

NextLineLeading24k,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

Leading24kSET$
:StartDelay20,-3; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1"
clrbSyncH; Emission de l'impulsion SyncH
Wait150; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpLeading24k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                




Le programme générant les mires à 31 kHz en page 3 (adresse 0600H)

Citation






                                                
ORG$0600
Start31kEQU$

;****************************** Impulsion de synchronisation trame ******************************

                                                                                                
SyncHor31kSET$
:SetUpPresetCount3; Nombre de lignes allouées à l'impulsion de synchronisation verticale
jmpSyncHor31k:Start


                        ; Palier de suppression arrière (Back Porch), suite

SyncHor31kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait161; Durée du palier arrière
                                                                                                

                        ; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame

SetColorBlack,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)

NextLineSyncHor31k,Lagging31k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

SyncHor31kSET$
:Startmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
clrbwreg.1; 1 µC, positionnement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cette nouvel état
Wait152; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpSyncHor31k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) **********

                                                                                                
Lagging31kSET$
:SetUpPresetCount33; Nombre de lignes allouées au blanking arrière
jmpLagging31k:Start


                        ; Palier de suppression arrière(Back Porch),suite

Lagging31kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait161; Durée du palier arrière
                                                                                                

                        ; Blanking des lignes à la suite de l'impulsion de synchronisation trame

SetColorBlack,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)

NextLineLagging31k,Pattern31k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Lagging31kSET$
:Startmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
setbwreg.1; 1 µC, effacement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cet nouvel état
Wait152; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpLagging31k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;****************************** Affichage du motif de la mire ******************************

                                                                                                
Pattern31kSET$
:SetUpPresetCount480; Nombre de lignes allouées pour afficher la mire
jmpPattern31k:Start


                        ; Palier de suppression arrière (Back Porch), suite

Pattern31kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait161; Durée du palier arrière
                                                                                                

                        ; Affichage des 8 barres colorées de la mire

ColorBars1184/8; Chaque barre occupe 148 µcycles
                                                                                                

                        ; Palier de suppression avant (Front Porch)

SetColorBlack,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)

NextLinePattern31k,Leading31k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Pattern31kSET$
:Startjmp$+1; Absorption de 3 µcycles
clrbSyncH; Emission de l'impulsion SyncH
Wait152; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpPattern31k:Loop; Rebouclage avec absorption de 3 µcycles
                                                                                                
;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) **************

                                                                                                
Leading31kSET$
:SetUpPresetCount14; Nombre de lignes allouées au blanking avant
jmpLeading31k:Start


                        ; Palier de suppression arrière (Back Porch), suite

Leading31kSET$
:LoopsetbSyncH; Effacement de l'impulsion de synchronisation horizontale
Wait161; 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)

SetColorBlack,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)

NextLineLeading31k,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

Leading31kSET$
:StartDelay20,-3; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1"
clrbSyncH; Emission de l'impulsion SyncH
Wait152; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpLeading31k: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.




(https://gamoovernet.pixhotel.fr/pics/20130126181223-gc339-Full.gif)   (https://gamoovernet.pixhotel.fr/pics/20130126185854-gc339-Half.gif)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: AsPiC le Vendredi 07 Juin 2013, 16:35:53 PM
Merci gc339 pour ton boulot sur ce générateur de mire qui s'annonce indispensable ^-^
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: f4brice le Mercredi 25 Septembre 2013, 11:21:21 AM
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 :


Principe de fonctionnement :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20130925104956-f4brice-outil.png) (https://gamoovernet.pixhotel.fr/pics/20130925104956-f4brice-outil.png)


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" :

Ca intéresserait quelqu'un un tel outil ?  :D
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Mercredi 25 Septembre 2013, 13:54:04 PM
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 ) :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20120820173632-gc339-ETSF-1-.JPG)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Little_Rabbit le Vendredi 27 Septembre 2013, 11:56:18 AM
Salut

Citation de: f4brice le Mercredi 25 Septembre 2013, 11:21:21 AM
Ca intéresserait quelqu'un un tel outil ?  :D

Oui clairement ! Ce serait effectivement très pratique !! :)

A++
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Mardi 08 Avril 2014, 13:58:38 PM
Je viens de faire une version modifiée (pour mes besoins perso) de la mire gc339.

voici le schéma :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140408131626-spectroman-schema.PNG) (https://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)

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140408132313-spectroman-20140408-130705.jpg) (https://gamoovernet.pixhotel.fr/pics/20140408132313-spectroman-20140408-130705.jpg)

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140408132335-spectroman-20140408-130720.jpg) (https://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.

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140408135516-spectroman-20140408-135338.jpg) (https://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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Jeudi 10 Avril 2014, 12:08:46 PM
J'ai terminé l'intégration et le câble pour moniteur arcade (il ne reste que le péritel à faire).

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140410115752-spectroman-IMG-20140409-201340.jpg) (https://gamoovernet.pixhotel.fr/pics/20140410115752-spectroman-IMG-20140409-201340.jpg)

J'ai fait les essais sur un moniteur VGA

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140410115902-spectroman-IMG-20140409-164326.jpg) (https://gamoovernet.pixhotel.fr/pics/20140410115902-spectroman-IMG-20140409-164326.jpg)

et sur ma nstyl (mtc9110)

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20140410115925-spectroman-IMG-20140409-200521.jpg) (https://gamoovernet.pixhotel.fr/pics/20140410115925-spectroman-IMG-20140409-200521.jpg)
:-)=
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 10 Avril 2014, 12:47:17 PM
T'aurais pas inversé les sorties bleu et vert par hasard ?
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Jeudi 10 Avril 2014, 12:59:10 PM
Ah oui, exacte. Dans ce moment de joie, je n'avais même pas fait attention.

merci
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: kos71 le Jeudi 10 Avril 2014, 15:17:03 PM
Citation de: spectroman le Jeudi 10 Avril 2014, 12:59:10 PM
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 .  :-*
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Jeudi 05 Mars 2015, 10:33:27 AM
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  :)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Iro le Jeudi 05 Mars 2015, 10:44:59 AM
Oh, j'étais passé à coté !!! Super boulot bien pratique !  ^-^
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 05 Mars 2015, 11:02:02 AM
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é.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Jeudi 05 Mars 2015, 12:58:14 PM
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  :)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Jeudi 05 Mars 2015, 14:22:43 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 05 Mars 2015, 15:43:13 PM
C'est à spectro de te répondre, car je ne sais pas s'il a modifié le programme source que je lui avais communiqué.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Jeudi 05 Mars 2015, 16:11:58 PM
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à ....  ;)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Vendredi 06 Mars 2015, 07:59:03 AM
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?





Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Vendredi 06 Mars 2015, 08:40:12 AM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Vendredi 06 Mars 2015, 12:10:17 PM
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 ?
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Vendredi 06 Mars 2015, 15:56:51 PM
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...
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Vendredi 06 Mars 2015, 18:01:54 PM
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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Vendredi 06 Mars 2015, 18:41:36 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Samedi 07 Mars 2015, 00:32:24 AM
Citation de: gc339 le Vendredi 06 Mars 2015, 12:10:17 PM
@spectro : tu les programmes avec quel programmateur ?

J'ai un eetools topmax, il fait pas mal de chose.

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Lundi 09 Mars 2015, 08:30:24 AM
Commande des pièces passé plus qu'a attendre ....  :o
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Lundi 06 Avril 2015, 19:07:54 PM
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...
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Lundi 06 Avril 2015, 19:17:04 PM
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?
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Lundi 06 Avril 2015, 20:00:10 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mardi 07 Avril 2015, 12:00:49 PM
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

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Mardi 07 Avril 2015, 13:10:33 PM
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.



Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mardi 07 Avril 2015, 15:06:49 PM
Ok sa permettra d'isoler un soucie de programmation
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Mardi 07 Avril 2015, 16:28:28 PM
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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: f4brice le Mardi 07 Avril 2015, 23:17:07 PM
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".
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mercredi 08 Avril 2015, 08:38:40 AM
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...
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Mercredi 08 Avril 2015, 09:23:18 AM
Citation de: Fred G5 le Mercredi 08 Avril 2015, 08:38:40 AM
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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Mercredi 08 Avril 2015, 12:09:07 PM
C'est confirmé, je me suis planté en le programmant. Celui d'olschool ne génère rien du tout.


Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: olschool le Mercredi 08 Avril 2015, 13:05:26 PM
Citation de: spectroman le Mercredi 08 Avril 2015, 12:09:07 PM
C'est confirmé, je me suis planté en le programmant. Celui d'olschool ne génère rien du tout.




:-(( :-(( :-(( :-(( :-(( :-(( :-((

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: olschool le Mercredi 08 Avril 2015, 13:06:53 PM
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

:-*  ^-^
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mercredi 08 Avril 2015, 13:34:25 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: olschool le Mercredi 08 Avril 2015, 13:49:48 PM
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150408134938-olschool-vetandthecity.jpg) (https://gamoovernet.pixhotel.fr/pics/20150408134938-olschool-vetandthecity.jpg)


dans sa gueule


:D
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: spectroman le Mardi 12 Mai 2015, 09:41:35 AM
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

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150512093834-spectroman-Capture.PNG) (https://gamoovernet.pixhotel.fr/pics/20150512093834-spectroman-Capture.PNG)

Je fais passer le chip a gc339 pour qu'il le teste avec son programmateur.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mercredi 13 Mai 2015, 13:09:10 PM
Ceci explique le pourquoi des fréquences fausses de synchro
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mardi 26 Mai 2015, 08:23:50 AM
Des news par rapport à ces registres récalcitrants  =?=
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Mardi 08 Septembre 2015, 16:37:44 PM
Citation de: Fred G5 le Mardi 26 Mai 2015, 08:23:50 AM
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 :




Les fichiers du générateur de mires :
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Jeudi 10 Septembre 2015, 08:58:45 AM
Un petit programmateur simple et efficace, sa me rappel celui que j'avais fait à l'époque pour les PIC
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Lundi 14 Septembre 2015, 17:44:59 PM
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.

Citation de: gc339 le Dimanche 27 Janvier 2013, 15:34:59 PMDe 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 :




(https://gamoovernet.pixhotel.fr/pics/20130126181223-gc339-Full.gif)   (https://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 :




Le compteur qui va piloter le clignotement toutes les 30 trames soit ≈ ½ seconde a déjà été incorporé préventivement dans le programme existant :

Citation






;---------------------------- PROGRAMME PRINCIPAL -----------------------------

                                                                                                
MainsetbSyncH
setbSyncV
clrFlipFlop; Initialisation du flip flop
jmpPresetFrCnt


                        ; Compteur de trames pour clignotement, absorbe 7 µCycles

MainLoopdjnzFrameCounter,NoPreset; 2/4 µC
notFlipFlop; 1 µC, inversion du flip flop
PresetFrCntmovFrameCounter,#30; 2 µC, clignotement toutes les 30 trames (½ seconde)
skip; 2 µC, ajustement à 7 µC si rechargement FrameCount
NoPresetjmp$+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 :
Citation






;****************************** Affichage du motif de la mire ******************************

                                                                                                
Pattern15kSET$
:SetUpPresetCount224; 224 Nombre de lignes allouées pour afficher la mire
jmpPattern15k:Start


                        ; Palier de suppression arrière (Back Porch), suite

Pattern15kSET$
:LoopsetbSyncH; 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  

Wait323-2  ; Durée du palier arrière - 2 µCycles  
                                                                                                

                        ; Affichage des 8 barres colorées de la mire

ColorBars307; Chaque barre occupe 307 µcycles
                                                                                                

                        ; Palier de suppression avant (Front Porch)

Pattern15k  SET  $  
:FrontPorchSetColorBlack,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)

NextLinePattern15k,Leading15k; Décomptage lignes et test si zéro
                                                                                                

                        ; Impulsion de synchronisation horizontale

Pattern15kSET$
:Startjmp$+1; Absorption de 3 µcycles
clrbSyncH; Emission de l'impulsion SyncH
Wait238; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmpPattern15k: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.

Citation






;-------------------------- DEVICE DIRECTIVES --------------------------

                                                                                                
IFDEF__SASM;SASM Directives
DEVICESX28AC, OSCHS3, TURBO, BOROFF, SYNC, OPTIONX, CARRYX
IRC_CALIRC_SLOW
ELSE; Parallax Assembler Directives
DEVICESX28AC, OSCXT2, TURBO, BOROFF, SYNC
ENDIF
ID"PATGEN"
RESETInitialize; 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
MOVW,#LastLine/256; +1 µC
MOVW,LineCounter+1-W; +1 µC, soustraction entre octets de poids fort
JNZ$+3; +2/4 µC
MOVW,#LastLine//256; +1 µC
MOVW,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 :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) *********************

                                    
Twinkle15kEQU$

LastStripeLineSET224; Une seule ligne blanche pour le cadre

Stripes15kSET$; 4 µCycles déjà absorbés sur les 323 du back porch
:Stripe1CheckCountLastStripeLine; +6 µC pour la macro
jncStripes15k:Stripe2; +2/4 µC
Wait323-15; Ici 12 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:FrameLine; +3 µC, le trait est entièrement blanc

LastStripeLineSETLastStripeLine-2; Marge en dessous du cadre : 2 lignes/pixels

Stripes15kSET$; Ici 14 µC d'absorbés
:Stripe2CheckCountLastStripeLine; +6 µC pour la macro
jncStripes15k:Stripe3; +2/4 µC
Wait323-25; Ici 22 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:BlackLine; +3 µC, la marge supérieure est noire

LastStripeLineSETLastStripeLine-73; 1ère bande : 73 lignes/pixels

Stripes15kSET$; Ici 24 µC d'absorbés
:Stripe3CheckCountLastStripeLine; +6 µC pour la macro
jncStripes15k:Stripe4; +2/4 µC
jbFlipFlop.0,Stripes15k:Toggle3; +2/4 µC
Wait323-37; Ici 34 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:WhiteLine; +3 µC, la 1ère bande est blanche
Stripes15kSET$
:Toggle3Wait323-39; Ici 36 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:BlackLine; +3 µC, la 1ère bande est noire

LastStripeLineSETLastStripeLine-72; 2ème bande : 72 lignes/pixels

Stripes15kSET$; Ici 34 µC d'absorbés
:Stripe4CheckCountLastStripeLine; +6 µC pour la macro
jncStripes15k:Stripe5; +2/4 µC
jnbFlipFlop.0,Stripes15k:Toggle4; +2/4 µC
Wait323-47; Ici 44 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:WhiteLine; +3 µC, la 2ème bande est blanche
Stripes15kSET$
:Toggle4Wait323-49; Ici 46 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:BlackLine; +3 µC, la 2ème bande est noire

LastStripeLineSETLastStripeLine-73; 3ème et dernière bande : 73 lignes/pixels

Stripes15kSET$; Ici 44 µC d'absorbés
:Stripe5CheckCountLastStripeLine; +6 µC pour la macro
jncStripes15k:Stripe6; +2/4 µC
jbFlipFlop.0,Stripes15k:Toggle5; +2/4 µC
Wait323-57; Ici 54 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:WhiteLine; +3 µC, la 3ème bande est blanche
Stripes15kSET$
:Toggle5Wait323-59; Ici 56 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:BlackLine; +3 µC, la 3ème bande est noire

LastStripeLineSETLastStripeLine-2; Marge au dessus du cadre : 2 lignes/pixels

Stripes15k
SET$; Ici 54 µC d'absorbés
:Stripe6
CheckCountLastStripeLine; +6 µC pour la macro
jncStripes15k:Stripe7; +2/4 µC, trait inférieur du cadre
Wait323-65; Ici 62 µC d'absorbés, +3 µC du jmp suivant
jmpStripes15k:BlackLine; +3 µC, la marge inférieure est noire

Stripes15kSET$; Reste une ligne pour le cadre
:Stripe7Wait323-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 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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Lundi 14 Septembre 2015, 18:47:13 PM
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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Stek le Lundi 14 Septembre 2015, 19:53:10 PM
Ce type est un malade.... ;D


moi je vais prendre un doliprane    (:x  :fleche:
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Mardi 15 Septembre 2015, 00:15:11 AM
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 :
                                    
Stripes15kSET$; Affichage d'une ligne blanche sans marge verticales (cadre)
:FrameLineSetColorWhite,2456-3; -3 µC pour le jmp suivant
jmpPattern15k:FrontPorch

Stripes15kSET$; Affichage d'une ligne blanche avec marges verticales
:WhiteLineSetColorWhite,8; Egal à 0,97 arrondi à 1 pixel blanc pour 224 lignes au format 4/3
SetColorBlack,16; Marge gauche, équivaut à 2 pixels noirs
SetColorWhite,2456-( 2*24 ); Moins 2×3 pixels en largeur pour le cadre et les marges
SetColorBlack,16; Marge droite, équivaut à 2 pixels noirs
SetColorWhite,8-3; Equivaut à 1 pixel blanc, -3 µC pour le jmp suivant
jmpPattern15k:FrontPorch

Stripes15kSET$; Les marges sont confondues avec la ligne noire
:BlackLineSetColorWhite,8; Egal à 0,97 arrondi à 1 pixel blanc
SetColorBlack,2456-( 2*8 ); Moins 2×1 pixels en largeur pour le cadre
SetColorWhite,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:

Citation






                                                                                                
BasicDelayMACROValue; Absorbe un nombre de µcycles = (Value × 4)
 LOCALLocLoop; Etiquette interne à la macro
 IF Value>0 ; Test pour éviter qu'une valeur nulle génère 256 bouclettes
   movLoopCounter,#Value; 2 µC, initialisation du compteur de bouclettes
LocLoop    djnzLoopCounter,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 :




Prochaine étape la mire quadrillée :

(https://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
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Vendredi 18 Septembre 2015, 14:41:24 PM
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.





(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150917162650-gc339-Parallax-SX48BD-G-1-.jpg) (https://gamoovernet.pixhotel.fr/pics/20150917162650-gc339-Parallax-SX48BD-G-1-.jpg)
Le SX48 : pitch 0,5 mm
36 ports d'E/S

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150918162846-gc339-SX52BD-PQ.jpg) (https://gamoovernet.pixhotel.fr/pics/20150918162846-gc339-SX52BD-PQ.jpg)
Le SX52 : pitch 0,65 mm
Idem SX48 + 4 ports d'E/S

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM
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

(https://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 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 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 :




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 :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 :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.

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.








Récapitulatif :









|T  r  a   it|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  nt  a   nt|
I n t e
rv a l l e|
|
N o
rm a l|
C e
nt r a l|
C a
dr 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|

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Lundi 21 Septembre 2015, 16:57:31 PM
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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Mercredi 23 Septembre 2015, 16:31:12 PM
Citation de: Fred G5 le Lundi 21 Septembre 2015, 16:57:31 PMDommage 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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150923135609-gc339-SX48BD-G.PNG) (https://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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150923172241-gc339-28f-600-10.JPG) (https://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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Jeudi 24 Septembre 2015, 11:13:32 AM
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)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Samedi 26 Septembre 2015, 18:09:14 PM
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.

Citation de: gc339 le Vendredi 07 Juin 2013, 15:53:36 PMRappel 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 :

Citation de: gc339 le Mardi 15 Septembre 2015, 00:15:11 AM
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.

Citation


Stripes24kSET$; Affichage d'une ligne blanche sans marge (cadre)
:FrameLineSetColorWhite,1336 1536 -3; -3 µC pour le jmp suivant
jmpPattern24k:FrontPorch
                                    
Stripes24kSET$; Affichage d'une ligne blanche avec marge
:WhiteLineSetColorWhite,8 9; Egale à 3 pixels blancs pour 384 lignes au format 4/3
SetColorBlack,1618 ; Marge gauche, égale à 6 pixels noirs
SetColorWhite,1336-(2*24) 1536-(2*27); Moins 2×9 pixels en largeur pour le cadre et les marges
SetColorBlack,16 18; Marge droite, égale à 6 pixels noirs
SetColorWhite,8 9-3; Egale à 3 pixels blancs, -3 µC pour le jmp suivant
jmpPattern24k:FrontPorch
Stripes24kSET$; Marges confondues avec la ligne noire affichée
:BlackLineSetColorWhite,8 9; Egale à 3 pixels blancs
SetColorBlack,1336-(2*8 ) 1536-(2×9)
; Moins 2×3 pixels en largeur pour le cadre
SetColorWhite,8 9-3; Egale à 3 pixels blancs, -3 µC pour le jmp suivant
jmpPattern24k: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 riz 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  ic  a  l|
|
C a
dr e|
M a
rg 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 :

Citation de: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM
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.

Citation de: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM
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.

Citation de: gc339 le Lundi 21 Septembre 2015, 16:04:32 PM




Récapitulatif après corrections :









|Tr  a   it|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  nt  a   nt|
I n t e
rv a l l e|
|
N o
rm a l|
C e
nt r a l|
C a
dr 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|

Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 22 Octobre 2015, 12:31:09 PM
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 déclarations en tête de programme sont de fait impactées par les deux premières exigences (en bleu dans le listing).

Citation





;===================================================================================================
;
;                        File...... PatGen10.SRC
;                        Purpose... Video Pattern Generator V10.0
;                        Updated... 16/10/2015
;
;===================================================================================================


;------------------------------ DEVICE DIRECTIVES ----------------------------------------------------------------------------------


;SASM Directives
DEVICESX48BD, BOROFF, SYNC
DEVICEOSCHS3, XTLBUFD, IFBD
IRC_CALIRC_SLOW

ID"PatGen10"

RESETInitialize; Reset vector at $07FF
                                                                                                
;------------------------------ SETTINGS -------------------------------------------------------------------------------------


FREQ50_000_000; Information pour la SX-Key

LISTF=INHX8M; Format de sortie
                                                                                                
;------------------------------ EQUATES --------------------------------------------------------------------------------------------


NoEQU0
YesEQU~No

Padding; Bourrage par des nop's autorisé


SyncHEQUrb.0; Synchro Horizontale sur RB0
SyncVEQUrb.1; Synchro Verticale sur RB1

BlackEQU%0000
BlueEQU%0001; Bit 2°
RedEQU%0010; Bit 2¹
GreenEQU%0100; Bit 2²
CyanEQUGreen + Blue
MagentaEQURed + Blue
YellowEQURed + Green
WhiteEQURed + Green + Blue

AquaEQUCyan
FuchsiaEQUMagenta
                                                                                                

                        ; MODE Register Settings to write to the SX48/52 port control registers

DDIREQU$1F; Data Direction Register
PLPEQU$1E; Pull-Up Resistor Enable Register
LVLEQU$1D; TTL/CMOS Select Register
STEQU$1C; Schmitt Trigger Enable Register
                                                                                                
;------------------------------ VARIABLES ------------------------------------------------------------------------------------------


ORG10; Start of SX48/52 data memory

LoopCounterDS1; Step Counter
LineCounterDS2; Line Conter
FrameCounterDS1; Frame Counter
FlipFlopDS1; 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).

Citation





;###################################################################################################
;                        Section commune à toutes les mires
;###################################################################################################

;------------------------------ SIGNALS TIMING CHART -------------------------------------------------------------------------------


;LineFrontHoriz.BackDisplay
;Frequ.PorchSynch.Porch
;(kHz)(µcycles)(µcycles)(µcycles)(µcycles)
;151612383232456
;241421502221536
;31811521611184

;LineLeadingVert.TrailingDisplayed
;Frequ.BlankSynch.BlankLines
;(kHz)(lines)(lines)(lines)
;1513323224
;2411425384
;3114333480
                                                                                                            
;------------------------------ INTERRUPT ROUTINE ----------------------------------------------------------------------------------


ORG0
Interruptreti
                                                                                                
;-----------------------------------------------------------------------------------------------------------------------------------


NOEXPAND
Fill$0007; Bourrage zone réservée avec des NOP's
EXPAND
                                                                                                
;---------------------------- INITIALIZATION ROUTINE -------------------------------------------------------------------------------


ORG8
Initializemovra,#%0000; Set port A low
movrb,#%11111111; Set port B high
movrc,#%11111111; Set port C high
movrd,#%11111111; Set port D high
movre,#%11111111; Set port E high
                                                                                                

                        ; Pull-Up Resistor Configuration

movw,#PLP; Allow Pull-Up Resistor configuration
movm,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

movw,#DDIR; Allow Direction configuration
movm,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 ---------------------------------------------------------------------------------------


MainsetbSyncH
setbSyncV
clrFlipFlop; Initialisation du flip flop
jmpPresetFrCnt
                                                                                                

                        ; Compteur de trames pour clignotement, absorbe 7 µcycles

MainLoopdjnzFrameCounter,NoPreset; 2/4 µC
notFlipFlop; 1 µC, inversion du flip flop
PresetFrCntmovFrameCounter,#30; 2 µC, clignotement toutes les 30 trames (½ seconde)
skip; 2 µC, ajustement à 7 µC si rechargement FrameCount
NoPresetjmp$+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.

jnbrb.5,Jmp31k; 2/4 µC, lecture de la fréquence programmée sur les dip-switches
jnbrb.4,Jmp24k; 2/4 µC
Jmp15kjmp$+1; 3 µC pour ajustage absorpsion à 11 µC
jmp@Start15k; 1+3 µC, instruction de page incluse avec "@"
Jmp24knop; 1 µC pour ajustage absorpsion à 11 µC
jmp@Start24k; 1+3 µC, instruction de page incluse avec "@"
Jmp31kjmp$+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.

Citation





;###################################################################################################
;                        Sous-section pour l'affichage CGA : mire en 15 kHz
;###################################################################################################


                        ; Timings ligne (en µcycles du SX48)

FP15kEQU161; Front Porch
HSync15kEQU238; Horizontal Synchronisation
BP15kEQU323; Back Porch
HDisp15kEQU2456; Duration of the visible pixels inside any line
                                                                                                

                        ; Timings trame (en nombre de lignes)

LBI15kEQU13; Leading Blank Interval
VSync15kEQU3; Vertical Synchronisation
TBI15kEQU23; Trailing Blank Interval
VDisp15kEQU224; Visible Lines Per Frame
                                                                                                
;-----------------------------------------------------------------------------------------------------------------------------------


ColorBars15kEQU$
ColorBarsHDisp15k/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)

FP24kEQU142; Front Porch
HSync24kEQU150; Horizontal Synchronisation
BP24kEQU222; Back Porch
HDisp24kEQU1536; Duration of the visible pixels inside any line
                                                                                                

                        ; Timings Trame (en nombre de lignes)

LBI24kEQU11; Leading Blank Interval
VSync24kEQU4; Vertical Synchronisation
TBI24kEQU25; Trailing Blank Interval
VDisp24kEQU384; Visible Lines Per Frame
                                                                                                
;-----------------------------------------------------------------------------------------------------------------------------------


ColorBars24kEQU$
ColorBarsHDisp24k/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)

FP31kEQU81; Front Porch
HSync31kEQU152; Horizontal Synchronisation
BP31kEQU161; Back Porch
HDisp31kEQU1184; Duration of the visible pixels inside any line
                                                                                                

                        ; Timings Trame (en nombre de lignes)

LBI31kEQU14; Leading Blank Interval
VSync31kEQU3; Vertical Synchronisation
TBI31kEQU33; Trailing Blank Interval
VDisp31kEQU480; Visible Lines Per Frame
                                                                                                
;-----------------------------------------------------------------------------------------------------------------------------------


ColorBars31kEQU$
ColorBarsHDisp31k/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 :
Chacune de ces sections principales est constituée de 4 blocs, chacun correspondant aux lignes d'une portion de la 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é.

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20151022122731-gc339-Organigramme.GIF) (https://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 :
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.

Citation





;###################################################################################################
;                        Section principale pour l'affichage CGA : mires en 15 kHz
;###################################################################################################


                        ; Pages 1 et 2 allouées aux mires CGA en 15 kHz ($0200 ... $05FF)


ORG$0200
Start15kEQU$
                                                                                                
;****************************** Impulsion de synchronisation trame *****************************************************************


SyncVer15kSET$
:SetUpPresetCountVSync15k; Nombre de lignes allouées à l'impulsion de synchronisation verticale
jmpSyncVer15k:Loop; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                

                        ; Impulsion de synchronisation horizontale

SyncVer15kSET$
:Loopmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
clrbwreg.1; 1 µC, positionnement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cette nouvel état
WaitHSync15k; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmp$+1; Absorption de 3 µcycles
setbSyncH; Effacement de l'impulsion de synchronisation horizontale
WaitBP15k; 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

SetColorBlack,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)

NextLineSyncVer15k,Trailing15k; Décomptage lignes et test si zéro
                                                                                                
;****************************** Champ à la suite de l'impulsion de synchronisation trame (blanking arrière) ************************


Trailing15kSET$
:SetUpPresetCountTBI15k; Nombre de lignes allouées au blanking arrière
jmpTrailing15k:Loop; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                

                        ; Impulsion de synchronisation horizontale

Trailing15kSET$
:Loopmovw,rb; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
clrbwreg.0; 1 µC, positionnement du bit affecté à la synchronisation horizontale
setbwreg.1; 1 µC, effacement du bit affecté à la synchronisation verticale
movrb,w; 1 µC, émission de cet nouvel état
WaitHSync15k; Durée de l'impulsion ligne
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmp$+1; Absorption de 3 µcycles
setbSyncH; Effacement de l'impulsion de synchronisation horizontale
WaitBP15k; 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

SetColorBlack,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)

NextLineTrailing15k,Pattern15k; Décomptage lignes et test si zéro
                                                                                                
;****************************** Affichage du motif de la mire **********************************************************************


Pattern15kSET$
:SetUpPresetCountVDisp15k; Nombre de lignes allouées pour afficher la mire
jmpPattern15k:Loop; 7 µcycles d'absorbés par le rechargement du compteur de lignes
                                                                                                

                        ; Impulsion de synchronisation horizontale

Pattern15kSET$
:Loopjmp$+1; Absorption de 3 µcycles
clrbSyncH; Emission de l'impulsion SyncH
WaitHSync15k; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmp$+1; Absorption de 3 µcycles
setbSyncH; 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

jbrb.7,Pattern15k:NextSwitch; +2/4 µC
jmp@CrossHatch15k; +6 µcycles si dérivation vers mire quadrillée
                                                                                                

Pattern15kSET$
:NextSwitchjbrb.6,Pattern15k:BackPorch; +2/4 µC
jmp@Twinkle15k; +10 µcycles si dérivation vers mire clignotante
                                                                                                

                        ; Complétion du palier de suppression arrière

Pattern15kSET$
:BackPorchWaitBP15k-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)

Pattern15kSET$
:FrontPorchSetColorBlack,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)

NextLinePattern15k,Leading15k; Décomptage lignes et test si zéro
                                                                                                
;****************************** Champ précédant l'impulsion de synchronisation trame (blanking avant) ******************************


Leading15kSET$
:SetUpPresetCountLBI15k; Nombre de lignes allouées au blanking avant
jmpLeading15k: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

Leading15kSET$
:LoopDelay20,0; Délai avec offset nul
                                                                                                

                        ; Impulsion de synchronisation horizontale

Leading15kSET$
:Startjmp$+1; Absorption de 3 µcycles
clrbSyncH; Emission de l'impulsion SyncH
WaitHSync15k; Durée de l'impulsion
                                                                                                

                        ; Palier de suppression arrière (Back Porch)

jmp$+1; Absorption de 3 µcycles
setbSyncH; Effacement de l'impulsion de synchronisation horizontale
WaitBP15k; 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)

SetColorBlack,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)

NextLineLeading15k,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
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
dr e|
M a
rg 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  nt  a   nt|
I n t e
rv a l l e|
|
N o
rm a l|
C e
nt r a l|
C a
dr 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|


Citation





;****************************** Descripteurs des différents modèles de lignes **********************


Blank24kEQU$; Pas d'affichage, la ligne est complètement noire
SetColorBlack,HDisp24k-3; -3 µC pour le jmp suivant
jmpPattern24k:FrontPorch
                                                                                                

Black24kEQU$; Marges confondues avec la ligne noire affichée
SetColorWhite,9; Equivaut à 3 pixels blancs
SetColorBlack,HDisp24k-(2*9 ); Moins 2 × 3 pixels en largeur pour le cadre
SetColorWhite,9-3; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant
jmpPattern24k:FrontPorch
                                                                                                

Frame24kEQU$; Affichage d'une ligne blanche sans marge (cadre)
SetColorWhite,HDisp24k-3; -3 µC pour le jmp suivant
jmpPattern24k:FrontPorch
                                                                                                

White24kEQU$; Affichage d'une ligne blanche avec marge
SetColorWhite,9; Egal à 3 pixels blancs pour 384 lignes au format 4/3
SetColorBlack,18; Marge gauche, équivaut à 6 pixels noirs
SetColorWhite,HDisp24k-(2*27); Moins 2 × 9 pixels en largeur pour le cadre et les marges
SetColorBlack,16; Marge droite, équivaut à 6 pixels noirs
SetColorWhite,9-3; Equivaut à 3 pixels blancs, -3 µC pour le jmp suivant
jmpPattern24k:FrontPorch
                                                                                                
;-----------------------------------------------------------------------------------------------------------------------------------


Points24kEQU$; Affichage d'une ligne comportant 11 points blancs
                                                                                                

                        ; Moitié gauche de la ligne

REPT5; 5 ensembles point + intervalle
 IF%=1; Test sur compteur de répétitions
Length    SET18; 6 pixels pour le montant vertical gauche du cadre
 ELSE
Length    SET9; 3 pixels pour les autres traits verticaux
 ENDIF
SetColorWhite,Length; Point blanc
SetColorBlack,141; Intervalle noir de 47 pixels
ENDR
                                                                                                

                        ; Moitié droite de la ligne

REPT5; 5 ensembles point + intervalle
 IF%=1; Test sur compteur de répétitions
Length    SET18; 6 pixels pour le trait vertical central du quadrillage
 ELSE
Length    SET9; 3 pixels pour les autres traits verticaux
 ENDIF
SetColorWhite,Length; Point blanc
SetColorBlack,141; Intervalle noir de 47 pixels
ENDR
                                                                                                

                        ; Montant vertical droit du cadre

LengthSET18; 6 pixels pour le montant vertical droit du cadre
SetColorBlack,Length-3; -3 µC pour le jmp suivant
jmpPattern24k: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 :

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
LOCALFirstChoice
 jnbrb.6,FirstChoice; +2/4 µC, FirstLabel si bit à 0, SecondLabel si bit à 1
 skip; +2 µcycles pour égaliser les deux branches à 4 µcycles
FirstChoice  jmpFirstLabel; +3 µcycles, 2ème paramètre = FirstLabel
 jmpSecondLabel; +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 :

Citation





;-----------------------------------------------------------------------------------------------------------------------------------


                        ; Affichage d'une des lignes d'un duo en fonction de l'état sur rb.6


DashOrDots24kEQU$
SelectPoints24k,Frame24k; Affichage point blanc ou trait horizontal du quadrillage
                                                                                                

DotsOrNix24kEQU$
SelectBlank24k,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 :



Rb.7            Rb.6            
OFFOFFMire à barres colorées
OFFONMire à bandes clignotantes
ONOFFMire à quadrillage
ONONMire à points

A suivre... (http://www.gamoover.net/Forums/index.php?topic=27188.msg589842#msg589842)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: nc333 le Mardi 27 Octobre 2015, 23:30:55 PM
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 :)
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 23 Juin 2016, 00:24:41 AM


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" :



                                                                                          
DisplayStripeMACRO; StripeHeight, FirstLabel, SecondLabel
LOCALLocLab1, LocEnd
LastStripeLineSETLastStripeLine-\1; 1er paramètre = StripeHeight (en nombre de lignes)
CheckCountLastStripeLine; +6 µC pour la macro
jncLocEnd; +2/4 µC, total 8/10 µC
IF\0>2; Test si présence d'un troisième paramètre
  WaitRemainingCycles-16; 8 µC écoulés, +8 µC pour le bloc d'instructions suivantes
  jbFlipFlop.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)

    WaitRemainingCycles-19; 8 µC écoulés, +4 µC du saut interpages, +7 µC sélection par rb.6
  ELSE
    WaitRemainingCycles-12; 8 µC écoulés, +4 µC pour le saut interpages
  ENDIF
  jmp@\2; + 4 µcycles, 2ème paramètre = FirstLabel
ENDIF
LocEndEQU$
RemainingCyclesSETRemainingCycles-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.


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   it|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|


Citation





;***********************************************************************************************************************************


ORG$0C00; Extension de la section VGA en page 6
                                                                                                      
;****************************** Affichage de la mire clignotante noir/blanc ********************************************************

                                                                                                      
Twinkle31kEQU$
RemainingCyclesSETBP31k-10; 10 µcycles déjà absorbés sur les 222 du back porch
LastStripeLineSETVDisp31k+1
DisplayStripe4,Frame31k; Quatre lignes blanches pour le cadre (hauteur 4 pixels)
DisplayStripe8,Black31k; Marge en-dessous du trait du cadre : 8 lignes
DisplayStripe152,White31k,Black31k; 1ère bande clignotante : 152 lignes
DisplayStripe152,Black31k,White31k; 2ème bande clignotante : 152 lignes
DisplayStripe152,White31k,Black31k; 3ème et dernière bande clignotante : 152 lignes
DisplayStripe8,Black31k; Marge au-dessus du trait du cadre : 8 lignes
WaitRemainingCycles-4; Complétion du back porch avant affichage du cadre
jmp@Frame31k; 4 µcycles pour ce saut interpages
ElapsedSETRemainingCycles

;****************************** Tronc commun à l'affichage de la mire quadrillée et de la mire à points ****************************

                                                                                                      
CrossHatch31kEQU$

                              
; 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

                                                                                                      
HalfScreenLimitSET(VDisp31k+1)-6-(4*4)-(5*43); Moitié supérieure limitée au 5ème intervalle
CheckCountHalfScreenLimit; Déjà 6 µcycles d'écoulés +6 µC pour la macro
jncLowerHalf31k; +2/4 µC, donc comparaison = 8/10 µcycles

                              
; Traitement de la moitié supérieure de la trame

                                                                                                      
UpperHalf31kEQU$
RemainingCyclesSETBP31k-6-8; Déjà 6 µcycles écoulés + 8 pour la comparaison
LastStripeLineSETVDisp31k+1

                              
; 5 ensembles ruban + intervalle pour cette moitié supérieure
; Un ruban est constitué soit de traits horizontaux soit de points

                                                                                                      
REPT5
 IF%=1; Test sur compteur de répétitions
Height    SET6; 6 lignes pour le ruban supérieur
 ELSE
Height    SET4; 4 lignes pour les autres rubans
 ENDIF
 DisplayStripeHeight,DashOrDots31k; Affichage des traits horizontaux ou des points du ruban
 DisplayStripe43,DotsOrNix31k; Intervalle de 43 lignes, montants verticaux ou rien du tout
ENDR
ElapsedSETRemainingCycles
WaitRemainingCycles-4; Complétion du back porch
jmp@Blank31k; Echappatoire sur erreur de limite

                              
; Traitement de la moitié inférieure de la trame

                                                                                                      
LowerHalf31kEQU$
RemainingCyclesSETBP31k-6-10; Déjà 6 µcycles écoulés + 10 pour la comparaison
LastStripeLineSETHalfScreenLimit

                              
; 5 ensembles ruban + intervalle pour cette moitié inférieure
; Un ruban est constitué soit de traits horizontaux soit de points

                                                                                                      
REPT5
 IF%=1; Test sur compteur de répétitions
Height    SET6; 6 lignes pour le ruban central
 ELSE
Height    SET4; 4 lignes blanches pour les autres rubans
 ENDIF
 DisplayStripeHeight,DashOrDots31k; Affichage des traits horizontaux ou des points du ruban
 DisplayStripe43,DotsOrNix31k; Intervalle de 43 lignes, montants verticaux ou rien du tout
ENDR
ElapsedSETRemainingCycles

                              
; Traitement du dernier ruban (trait inférieur du cadre ou dernière ligne de points)

                                                                                                      
WaitRemainingCycles-4; Complétion du back porch avant affichage du dernier ruban
jmp@Frame31k; 4 µcycles pour ce saut interpages
CurrentLineSETLastStripeLine

;***********************************************************************************************************************************

                                                                                                      
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...

Citation





;***********************************************************************************************************************************

                              
; Page 7 inutilisée, en réserve ($0E00 ... $0FFE)

                                                      
ORG$0E00
UnusedEQU$

;***********************************************************************************************************************************

                                                                                                      
NOEXPAND
Fill$0FFE; Bourrage de la page 7 avec des NOP's (vecteur reset en $07FF)
EXPAND

;***********************************************************************************************************************************

                              
END
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: oOSphaXOo le Jeudi 23 Juin 2016, 07:09:50 AM
Tout bonnement impression, code clair et carré, je suis admiratif !
Super boulot !
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: funkycochise le Jeudi 23 Juin 2016, 10:13:09 AM
Très intéressant et instructif.  ^-
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 23 Juin 2016, 18:00:27 PM
Maintenant il s'agit de pouvoir programmer le SX48 :




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 :
 

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160623165625-gc339-NewFluffy.PNG) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160623171443-gc339-Stackable6.PNG) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160623172009-gc339-Image-1257.JPG) (https://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é :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160623172634-gc339-Image-1262.JPG) (https://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 :


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160623174800-gc339-IC-Prog.PNG) (https://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...
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Fred G5 le Mercredi 17 Août 2016, 19:31:35 PM
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
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160817192614-Fred%20G5-DSC03245-1024x768-.JPG) (https://gamoovernet.pixhotel.fr/pics/20160817192614-Fred%20G5-DSC03245-1024x768-.JPG)

Détail du véroboard
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160817192758-Fred%20G5-DSC03246-1024x768-.JPG) (https://gamoovernet.pixhotel.fr/pics/20160817192758-Fred%20G5-DSC03246-1024x768-.JPG)

La connectique
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160817192838-Fred%20G5-DSC03248-1024x768-.JPG) (https://gamoovernet.pixhotel.fr/pics/20160817192838-Fred%20G5-DSC03248-1024x768-.JPG)

La mire de barre sur un Hantarex Polo Star en 31KHz
(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160817192931-Fred%20G5-DSC03250-1024x768-.JPG) (https://gamoovernet.pixhotel.fr/pics/20160817192931-Fred%20G5-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  ^-^
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: maldoror68 le Mercredi 17 Août 2016, 19:38:28 PM
 :-* c'est magnifique  ^-^
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: gc339 le Jeudi 18 Août 2016, 13:42:28 PM
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.


(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20160818103831-gc339-Spectro.PNG) (https://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.
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.
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: Stek le Jeudi 18 Août 2016, 14:06:53 PM
Citation de: gc339 le Jeudi 18 Août 2016, 13:42:28 PM

....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:
Titre: Etude/Réalisation d'un générateur de mires 15/24/31 kHz
Posté par: SDF le Jeudi 11 Février 2021, 18:17:55 PM
Salut, je trouve tout ca fascinant, j'ai besoin d'un appareil comme celui ci, mais je serai incapable de tout mettre en oeuvre, la seule chose que je suis en mesure de faire c'est souder les composants.
Quelqu'un pourrait me « macher le travail », je suis pret a rémunérer bien entendu.