Voor de echte
electronica liefhebber is de MSX nog altijd een grandioos systeem. De
cartridgeslots bieden enorm veel mogelijkheden voor elektronische toepassingen
zoals aansturen van audiomixer IC´s, ADC´s DAC´s noem maar op. Dit is één van
de redenen dat ik mijn MSX nog steeds zeer regelmatig gebruik. Vrijwel
maandelijks neem ik de MSX mee naar radiomarkten om daar besturingsprintjes
voor amateur-zenders te programmeren. Het probleem is dat er een monitor aan de
MSX vast zit, dat neemt niet zo makkelijk mee. Op een gegeven moment kwam ik op
het idee om er een laptop van te maken, de eerste stap is dan het LCD display.
In principe kan
je een standaard display op de MSX aansluiten en er een programma voor
schrijven, maar om het compatibel te houden is de enige oplossing om de VDP te
gebruiken. Het probleem hierbij is dat voor een LCD scherm digitale signalen
nodig zijn, en de VDP heeft alleen analoge uitgangen voor de intensiteit van
rood, groen en blauw. In grafische mode zou de colour-bus uitkomst bieden, deze
kan dan direct de digitale informatie van het beeld geven, maar in tekstmode is
deze onbruikbaar. De colour-bus is kennelijk puur de data uit het video
geheugen, dus sprites, pallet-kleuren en patronen van tekstmode worden in de VDP
gegenereerd en komen helaas niet uit de colour-bus... Dat betekend dat de
analoge uitgangen gebruikt moeten worden. Ik heb de TDA8706 gebruikt om deze om
te zetten naar digitaal, deze is redelijk goed verkrijgbaar maar er zijn andere
ADC´s.
De enige optie is
dan een LCD display van een (oude) laptop, er zijn diverse verschillende
soorten LCD display´s maar het principe van aansturing is over het algemeen
gelijk. Wie het principe van de TV kent (MSX principe dus), ziet direct een
grote overeenkomst. Zowel de TV als deze display´s geven één pixel weer, maar
omdat die ene pixel lijn voor lijn met een hoge snelheid van links naar rechts
beweegt, en de kleur op elke positie juist ingesteld wordt, wordt er een
plaatje gegenereerd.
Een LCD scherm
met een resolutie van 800 bij 600 heeft 600 lijnen en op elke lijn 800 punten.
De meeste LCD schermen hebben de volgende aansluitingen:
VS / VSync / SP VSync, hiermee geef je aan dat het
display naar de eerste (bovenste) lijn moet gaan.
DE / Dclk Dot-clock, in het ritme van dit signaal haalt
het display de pixels binnen en zet ze achter alkaar, van links naar rechts op
de lijn.
HS / HSync HSync,
hiermee geef je aan dat het display naar de volgende (onderligende) lijn moet.
DTMG / ENAB HSync, als het display naar een nieuwe lijn is gegaan
wacht het display met schrijven totdat dit signaal hoog wordt. Het display
triggert op een positieve flank, dus hoog
(Niet bij alle displays)
houden werkt helaas niet... Deze ingang kan in principe gewoon aan HSync gelegd
worden.
Proto type demonstrated at
Tilburg 2001, picture by Fony.
Het TFT scherm dat hier gebruikt is, is de LT121SS-105.pdf
Op de MSX markt
in Tilburg in 2000 werden een aantal losse MSX2 moederborden gedumpt,
waarschijnlijk van een NMS8235, hiervan heb ik er een aantal gekocht om mee te
experimenteren. Helaas ontbreken er wel een paar onderdelen, er hoort nog een
klein printje bovenop voor het videosignaal, mijn monitor wou niet
synchroniseren maar verder doen die printen alles.
Globaal kunnen de
laptop schermen worden verdeeld over twee groepen, er zijn LCD schermen die uit
twee helften bestaan en er zijn LCD schermen die één geheel zijn.
De eerste groep
(DSTN) is voor de MSX niet echt bruikbaar. Deze display´s schrijven namelijk de
onderhelft en de bovenhelft tegelijk... Mijn eerste experiment was met een
LM64P80, dit is een zwart-wit display die ook uit twee helften bestaat. Ik wou
hier maar mee beginnen, het is een vrij oud display en als die in rook opgaat
is het minder erg dan een TFT scherm opblazen. Om het display goed te
doorgronden wou ik hem eerst aansluiten op de printerpoort van de PC zodat ik
de originele aansturing kon nabootsen, maar wat ik ook deed er kwam niets
zinnigs uit. Bij een bepaald datapatroon werd het beeld oranje (?) en trok hij
ineens een stroom van 1.5 Ampére i.p.v. 0.5 Ampére, na een minuut begon hij een
onaangename geur af te geven en heb ik hem maar weer eens uit gezet.
De originele
aansturing volgens de datasheet is eigenlijk niet goed te realiseren met de MSX
maar ik heb toch maar besloten om de MSX erop aan te sluiten. Een comparator
(LM339) zette het analoge signaal om naar een 1 bit digitaal signaal en uit het
CSync signaal kan je eenvoudig de VSync halen door middel van een RC filter.
Wat betreft de HSync, hiervoor kan direct het CSync signaal gebruikt worden
omdat de HSync van het LCD display triggert op de neergaande flank. En er was
beeld.
Schema
van de testopstelling
Bij een display
dat uit twee helften bestaat zijn de besturingssignalen hetzelfde, maar beide
helften hebben aparte data ingangen. De LM64P80 is 640*480, na een VSync begint
de bovenste helft op lijn 0 maar de onderste op 240. Dus bij een display dat
uit twee helften bestaat moet de data voor beide helften tegelijk beschikbaar
zijn... Dat is niet bij een MSX. Bij gebruik van zo´n display is het dus alleen
mogelijk om op één helft beeld te krijgen, of op beide helften hetzelfde beeld
door de datalijnen aan elkaar te leggen.
Uiteindelijk heb
ik toch heel voorzichtig, het kleuren scherm op de MSX aangesloten, met
dezelfde signalen. Dit scherm is van het type LT121SS-153 van Samsung, deze is
één geheel en heeft een resolutie van 800*600. Voor het gemak heb ik alle
datalijnen aan alkaar gesoldeerd en aan die fantastische 1 bit ADC gelegd en er
moesten nog wat buffers bijgeplaatst worden omdat het LCD scherm 3.3V is. Na
tien keer controleren heb ik hem maar eens aan gezet. En... helemaal niets!
Snel weer uit. Voor de Dot-clock had ik, voor de zekerheid, de 5MHz uitgang
(DLCLK) van de VDP gebruikt. Toen me de geur van het vorige weer te binnen
schoot, heb ik toch maar besloten om de DHCLK van 10MHz te gebruiken. En ja,
weer beeld! Het is kennelijk mogelijk om een LCD display te langzaam aan te
sturen...
In de datasheet
van het display staat eigenlijk officieel een minimale clock van 38MHz, maar
ja, dat kan niet. Bovendien staat voor elke puls beschreven hoeveel clockpulsen
of lijn-sync pulsen de puls actief moet zijn. Ook daar klopt niets van.
Gelukkig zit het display op een vrij logische, digitale manier in elkaar. Met
de datasheet hoef je het niet zo erg nauw te nemen, die is gebaseerd op
non-interlaced VGA signalen.
Toen werd het
eens tijd voor optimalisatie van de schakeling. Om het gehele beeld zichtbaar
te kunnen maken moet er rekening gehouden worden met de interlacing van de TV
standaard. Eerst worden alle oneven lijnen (dus lijn 1, dan lijn 3, dan lijn 5,
etc..) beschreven en daarna de even lijnen (2, 4, 6, etc..). Het onderscheid
tussen een even en een oneven raster kan bepaald worden d.m.v. de BLEO uigang
van de VDP of door het patroon van halve lijnen voor en na de VSync puls. De
laatste is de officiele methode, maar de MSX VDP geeft helaas bijna nooit een
echt interlaced signaal, in basic bijvoorbeeld niet. Met VDP register 9 ( VDP(10) ) kan interlace aangezet worden. Als de controle
uitgevoerd zou worden m.b.v. het aantal halve lijnen wordt er dus meestal maar
één raster op het LCD scherm beschreven. Daarom is het beter de BLEO uitgang te
controleren, deze wisselt altijd tussen even en oneven. Het nadeel is hiervan
is dat de schakeling alleen werkt op de V9938 en de V9958 en niet gebruikt kan
worden om bijvoorbeeld TV te kijken.
Bij elke HSync
moet het display dus twee lijnen verder gaan i.p.v. één, van lijn één naar lijn
3 of van lijn 2 naar lijn 4. Er moet dus telkens een lijn overgeslagen worden.
Dit is eenvoudig
op te lossen door een extra syncpuls te geven. De beste plaats voor deze extra
puls is ná de originele sync puls op de plaats van de colour-burst, dit is een
ruimte waar geen display data staat.
Origineel
signaal uit de VDP
Om te voorkomen
dat het beeld gaat trillen moet in elk geval de DTMG puls telkens op een
constante tijd na de originele HSync van de VDP komen.
Signaal
voor het display
In mijn geval
wordt er een 800*600 display gebruikt, om het beeldvullend te krijgen moet er
een vrij hoge pixel-clock gebruikt worden. De totale schermbreedte is 512 plus
ca 16 punten voor de border. DHClk is
dus 10.738635MHz voor ca. 528 pixels, maar het scherm heeft 800 punten. Dus om
de data over de breedte uit te smeren moet 800 gedeeld worden door 528, dat is
1.51515. Dit getal vermenigvuldigen met de DHClk is 16.270659MHz. Het fraaiste
is dat dit signaal gerelateerd is aan de DHClk uitgang van de VDP. Wat er
gebeurt is het volgende:
Als de
clocksignalen niet aan elkaar gerelateerd zijn worden de pixels die op de grens
zitten soms gelijk gemaakt aan de voorlopende en soms aan de volgende.
Bijvoorbeeld dot 1, in deze situatie is hij gelijk aan dot 0 maar als bij de
volgende lijn de DotClk net iets later is, wordt dot 1 gelijk aan dot 2. Dit
geeft nooit een perfect stilstaand beeld. Alle clocksignalen afkomstig van de
VDP staan direct in verband staan met het kristal. Dus het mooiste is om de
kristal frequentie te delen, maar dit zou betekenen dat de kristalfrequentie
gedeeld moet worden door door 1.32, dat is erg latsig. Het is mogelijk om te
delen door anderhalf door een oscillator van 42.9545 (2 * de kristalfrequentie)
te delen door 3, en de helft aan te bieden aan de VDP. Dit heeft tot gevolg dat
er een kleine strook aan de linker kant niet gebruikt wordt.
Voor kleinere
display´s is het makkelijkste om direct de DHClk te gebruiken, een display van
640*480 is dan op ca. 112 na pixels na voor het grootste deel gebruikt.
Om het aantal
analoge externe componenten te beperken, is het handigste om het meeste werk
door een PIC processor te laten doen. In een PIC zijn eenvoudig voorwaarden te
programmeren, bijvoorbeeld wanneer er nou wel of geen extra sync gegenereerd
moet worden.
In rust staat de
PIC in een loep van 2 instrukties te controleren of de CSync laag wordt, een
probleem hierbij is dat de tijd tussen de neergaande flank en het verlaten van
de loep niet constant is. De eerste instruktie is de controle zelf en kost
0,4uS en de tweede is een GOTO en kost 0,8uS. De neergaande flank kan op elk
moment komen, de PIC verlaat de loep dan ergens tussen de 0,4uS en 1,2uS na het
verschijnen van de neergaande flank. Voor de signalen HSync en VSync is een
speling van 0,8uS geen probleem, maar voor het DTMG signaal is dit teveel. Bij
een dot-clock van 16.27MHz komt 0,8uS overeen met 13 pixels.
Om ervoor te
zorgen dat het display op het juiste moment begint te schrijven wordt het BLEO
signaal van de VDP gebruikt. Het BLEO signaal geeft aan of er niets gebeurt, of
er een lijn van het even raster afgedrukt wordt, of een lijn van het oneven
raster:
Deze uitgang kan
behalve 0 en 5 volt een tussenwaarde hebben van ongeveer 3 volt. Dit is dus net
niet digitaal, een comparator (LM339) maakt hier twee digitale signalen van, de
ene geeft aan dat BLEO > 1V en de andere geeft aan dat BLEO > 3.5V. Het
staat vast dat als BLEO > 1V, dat er een lijn geschreven moet worden, dit
signaal wordt gebruikt als DTMG signaal voor het display.
Schema
voor de synchronisatie
De PIC genereert
HSync en VSync uit het CSync signaal van de VDP en houdt daarbij rekening met
het even/oneven raster. Aan het digitale signaal uit de comparator voor BLEO
> 3.5V kan de PIC zien of het huidige raster even of oneven is.
Het programma is
geschreven voor een clocksnelheid van 10MHz, de PIC kan dus geclockt worden
door de DHClk uitgang van de VDP.
Omdat de signalen
voor het LCD display 3.3 Volt zijn en de PIC 5 Volt uitgangen heeft, wordt er
softwarematig een soort open-collector uitgang gecreëerd. Dit wordt gedaan door
de uitgang vast in te stellen op laag (0V), en als er een hoog gegeven moet
worden wordt de uitgang als ingang geschakeld. De pull-up weerstanden trekken
het signaal dan naar de 3.3 Volt.
Voor een oneven
raster moet het display op lijn 1 beginnen en voor een even raster dus op lijn
2. Dat betekent dat er voor een oneven raster op de eerste lijn geen extra
sync-puls gegenereerd zou moeten worden. Een ander probleem hierbij is dat de
PIC na het detecteren van een HSync van de VDP dan eerst nog moet uitzoeken
wanneer er precies een extra sync gegeven moet worden. Omdat dit extra tijd
kost, ongeveer 4uS, duurt het 4uS langer voordat de extra sync gegeven wordt en
valt de extra sync in de beeld informatie en dan raken de eerste ca. 20 pixels
verloren. Daarom wordt er áltijd een extra syncpuls gegeven direct na de
originele, daarna kan de PIC nadenken en kan op één van de eerste lijnen
bovenaan nog een tweede exta syncpuls gegeven om op het even raster uit te
komen.
Aan het begin van
het programmais een kort stukje initialisatie geplaatst. Hier wacht de PIC ca.
70mS met het aanbieden van data aan het display, om ervoor te zorgen dat het
display goed opstart.
Bij het label
´MAIN´ staat de PIC te wachten tot het CSync signaal laag wordt. Als het laag
is en vrij direct weer hoog wordt, springt de PIC naar ´CHKH´. Duurt het wat
langer voordat het signaal weer hoog is, is de PIC inmiddels weer een paar
instrukties verder en springt hij naar ´HSYN´. Als het nóg langer duurt komt de
PIC vanzelf in de VSync routine. Per raster koaan het display, om ervoor te
zorgen dat het display goed opstart.aan het display, om ervoor te zorgen dat
het display goed opstart.mt de PIC 6* in dit VSync stukje, op de derde keer
wordt de VSync uitgang laag gemaakt en op de zesde keer weer hoog. Bij ´HSYN´
wordt eerst direct de extra HSync gegeven, daarna gecontroleerd of de 3e
HSync gegeven moet worden. De 3e sync wordt gegeven op de 12e
keer dat ´HSYN´uitgevoerd wordt én als BLEO>3.5V. Bij het detecteren van een
korte CSync puls wordt er verder niets gedaan, de PIC wacht tot het signaal
weer hoog wordt en begint opnieuw.
CSync
signaal uit de VDP
De eerste maand
heeft het LCD scherm eigenlijk geen fatsoenlijke kleuren weergegeven. Alle 6
datalijnen van rood, groen en blauw zaten aan elkaar dus elke kleur was
maximaal aan of uit. In totaal waren er acht kleuren zichtbaar, niet echt
ideaal. Het blijkt dat alle datalijnen geïnverteerd moeten worden, als alle
bits 0 zijn, is de kleur maximaal. In principe geeft het digitale getal op de
data-ingangen weer hoe sterk de kleur gedempt moet worden. Helaas is dit is nét
anders bij de VDP, een hogere spanning van de RGB uitgangen betekend een
heldere intensiteit op het scherm. Hoe hoger de spanning op het R pootje, des
te meer rood, hoe lager de spanning op G, deste minder groen etc. Vrijwel elke
AD converter geeft bij een lage spanning alle bits nul en bij een hoge spanning
één. Dit past dus niet helemaal, het LCD scherm geeft juist de maximale
intensiteit bij alle bits nul... Dit is op twee manieren op te lossen, óf alle
bitjes inverteren, óf het analoge signaal uit de VDP inverteren. Analoog
inverteren is mogelijk door een versterkertrapje met één transistor, maar dan
is het wel het beste om de versterker DC gekoppeld te houden en ook nog stabiel
bij temperatuurswisseling.
Het liep op een
gegeven moment vast op fatsoenlijke A/D converters, ik had gekozen voor het
type TDA8706A omdat mijn scherm 3,3V nodig had. Blijkbaar is het lastig om een
3,3V A/D converter te vinden, als er enigszins een keuze mogelijk is heeft 5V
duidelijk de voorkeur, 5V AD converters zijn er genoeg.
Op een gegeven
moment stond er op internet een adres waar de TDA8706 te krijgen was, die had
ik dus gekocht. Later bleek ook deze een 5V versie te zijn, jammer dan... Voor
3,3V moet het echt de TDA8706A zijn. Uiteindelijk heb ik toch deze ADC’s
gebruikt omdat het anders waarschijnlijk eindeloos gaat duren. Afgezien van de
spanningen op de data-uitgang is eigenlijk elke AD converter te gebruiken die
tot ca 16MHz kan omzetten, voor de TDA8706 kan bijvoorbeeld ook een TDA8703
genomen worden. Een andere veel voorkomende AD converter is de TDA8708, deze
heeft meer mogelijkheden maar die zijn eigenlijk totaal overbodig... Al deze
mogelijkheden worden verder niet gebruikt, bovendien heeft hij meer externe
componenten nodig en heeft hij een grotere behuizing. Het voordeel is dat hij
wel beter te krijgen is. Deze AD converters zijn oorspronkelijk ook bedoeld
voor video signalen, ze hebben dus in elk geval een ‘Clamp’ ingang.
Omdat voor deze
5V AD converter toch een extra buffering nodig is naar de 3V3 voor het display,
wordt hier het inverteren gedaan m.b.v. een inverterende buffer. In dit geval
zijn er ook geen analoge problemen.
Naast het analoge
signaal van de VDP heeft de AD converter nog een clock en een clamp signaal
nodig.
Clock:
Elke keer bij het
hoog worden van het clocksignaal zet de AD converter het analoge signaal om en
wordt de digitale data op de uitgangen gezet. In principe zou deze clock met de
DHCLK van de VDP gestuurd kunnen worden, omdat de VDP met DHCLK aangeeft of er
een nieuwe pixel geschreven wordt. De analoge uitgang van de VDP veranderd dus
ook hoogstens één keer per DHCLK periode, en bij een resolutie van 256 zelfs
één keer per twee DHCLK periodes. Één keer per DHCLK het analoge signaal
omzetten zou voldoende zijn, maar een voorwaarde is dat dan ook het LCD scherm
dezelfde clock krijgt. Als het LCD scherm een clocksignaal krijgt wat niet in
verband staat met de clock van de AD converter, ontstaat er een soort sneeuw in
beeld. Dit wordt veroorzaakt doordat de AD converter bij elke clock puls even
tijd nodig heeft om de nieuwe omgezette data goed op de data-uitgangen te
zetten. Het omzetten van een data-uitgang van 0 naar 5V of terug kost altijd
even tijd. Het LCD scherm kijkt eveneens in het ritme van de clock naar zijn
data-ingangen, als de clock van de AD converter en het LCD scherm niet
synchroon lopen zal het geregeld voorkomen dat het scherm de data leest terwijl
de databits nog niet goed staan, valse data dus...
Een lastig
probleem is dat een heleboel TFT-LCD schermen geen lagere clock dan 14MHz
bijken te accepteren, dit is een groot probleem voor LCD schermen van 640*480.
De VDP geeft 512 pixels in het ritme van DHCLK, de DHCLK is 10.738MHz dus elke pixel
duurt 1 / 10.738Mhz = 93.12ns. Alle 512 pixels op een rij duren dus 512 *
93.12ns = 47,67us. Als het LCD scherm van 640 pixels een clock van 14MHz
krijgt, doet hij er 45.7us over om alle 640 pixels te beschrijven, de VDP heeft
dan nog 2uS te gaan en alle pixels in de laatste 2uS vallen dus buiten het
scherm... Een LCD scherm van 800*600 doet er bij 14MHz ongeveer 57,1uS over,
bij schermen van 800*600 en hoger raakt er dus geen beeld-informatie verloren.
Clamp:
Bij een zwart
scherm worden de analoge uitgangen van de VDP ongeveer 2,6V en bij volledig wit
3.6V. Het bereik van de AD converter ligt tussen 2,2V en 3,1V. Met een
spanningsdeler is dit goed te benaderen. Het clamp signaal wordt gebruikt om
ervoor te zorgen dat de AD converter bij het zwart nivo ook constant een
digitale 0 geeft. De AD converter moet weten en onthouden welk analoog
spanningsnivo voor zwart staat. De VDP geeft tussen de HSync en het begin van
de lijn-informatie een korte tijd een zwart nivo, in deze periode valt bij het
PAL systeem de colour-burst voor het synchroniseren van de kleurdecodering in
PAL ontvangers. Deze zwart-periode wordt gebruikt om de ADC’s op in te stellen,
de PIC processor volgt het videosignaal en weet wanneer het zwart nivo komt, op
dit moment geeft de PIC een puls op uitgang B6.
Naast de Clamp
uitgang heeft de PIC nog een extra functie gekregen. LCD schermen moeten
gedurende een aantal miliseconden geen data krijgen na een power-up. Het blijkt
dat in sommige gevallen het LCD scherm last krijgt van latch-up, in dit geval
wordt scherm onduidelijk. Eens verkeerd opgestart blijft verkeerd, totdat de
spanning van het display af wordt gehaald. Om dit te voorkomen houdt de PIC de
ingangen van het display laag bij het opstarten, dit is makkelijk te doen omdat
alle gebruikte drivers open-collector drivers zijn i.v.m. de conversie naar
3,3V.
Door het gebruik
van een los-staande 16MHz oscillator, bleef het beeld altijd nog een beetje
onrustig. Het enige wat hier tegen te doen is, is de clock synchroniseren met
de clock van de VDP of de clock ervan afleiden. Het handigste is waarschijnlijk
om de kristalfrequentie van de VDP te
gebruiken, dit is de klok vaaruit de VDP al zijn signalen afleidt, maar dit is
tevens de hoogste frequentie die aanwezig is. Het is makkelijker om een
frequentie te delen dan te vermenigvuldigen. De kristalfrequentie is 21.477MHz,
om op ongeveer 16MHz uit te komen moet deze frequentiedus gedeeld worden door
1,5. het is niet het makkelijkste deeltal maar het is goed te doen. Dit is een
schema waarmee in dit geval de clock gedeeld wordt door 1,5:
Clock divider, 21.47727 *
3/4
De NAND poorten
zijn weer een open drain versie om voor het display op 3v3 uit te komen. De
74HC393 is een standaard een binaire teller, deze telt mee met het clock signaal,
bij elke clock-puls komt de volgende binaire waarde op de uitgang. Eerst zijn
de A en B uitgangen beide 0, één clock puls later wordt uitgang A hoog, nog één
clock puls later wordt B hoog en A laag, weer één clock puls later worden beide
uitgangen hoog. De C en D uitgangen tellen op dezelfde weize door maar zijn
niet van belang. Het gaat erom dat de NAND poort die aan uitgangen A en B zit,
de clock blokkeerd als A en B beide hoog zijn. In deze situatie wordt namelijk
de uitgang van deze NAND laag en houdt dus d.m.v. het wired-and principe de
clock uitgang van de andere NAND laag. In principe zijn er dus twee uitgangen
aan elkaar gekoppeld, dit kan geen kwaad omdat beide uitgangen alleen naar de
0V kunnen schakelen, er kan dus nooit de situatie optreden dat de ene driver
+5V op de clock wil zetten en de andere 0V. Op deze clock uitgang wordt ook nog
een uitgang van de PIC aangesloten, om het LCD scherm goed op te starten bij
het inschakelen. De PIC is softwraematig zó geschakeld dat deze pin een uitgang
is die een 0 stuurt, óf een ingang is als er een 1 (mag) komen.
Verder hadden de
aan elkaar bebakte componenten het probleem dat de verbindingsdraden te lang
waren geworden. Als een frequentie van 16MHz door een open-collector poort
gaat, moet er al een behoorlijk lage pull-up weerstand op om nog een redelijke
blok zichtbaar te maken. Bij 3v3 is de maximale pull-up weerstand ongeveer
100Ohm. Nadat alles redelijk ‘netjes’ op een experimenteerprintje was gezet was
het beeld al weer zichbaar stabieler. Tot slot was er een hoop verbetering te
winnen door meer te ontkoppelen. Bij CMOS IC’s die op 16MHz draaien en ook nog
een voedingsdraad hebben van 10cm is met de scoop een rimpel van 1V op 3,3v te
meten... Bij elke overgang van laag naar hoog of andersom trekken IC’s
stroompulsen die door de inductie van dat draadje een spanningsval geven van 1V
over dat draadje. Dit betekend dat de voeding soms 2.3v is en dan weer 3.3v,
dit is niet zo erg gunstig voor een stabiel beeld... Dit probleem is opgelost
m.b.v. véél ontkoppel condensatoren, voor elke voeding bij elk IC één
condensator van 100nF. Dit is ook gebruikelijk maar tijdens het testen heb ik
nooit zin gehad om ze erop te solderen, achteraf was het beter om het direct te
doen omdat het een stuk makkelijker experimenteerd.
Het programma is
aangepast voor Clamp signaal voor de ADC’s en voor de opstart-vertraging:
; VSync
generator met even/odd delay
; A0 = U
VSYNC
; A1 = HSYNC
; B1 =
I BLEO
; B6 =
U Clamp
; B7 =
U Mute clock
; VSYNC counter 0D
; HSYNC
counter 0F
; Wait
loop 14
list p=16f84
#include
p16f84.inc
BSF 03,5
MOVLW 07F ;Port B pull-up
MOVWF 01
MOVLW 0FC ;Iint port A, VSync and HSync are
held low when pin in output mode
MOVWF 05
MOVLW 03F ;Init port B, ADC clamp and
LCDclock are held low when pin in output mode
MOVWF 06
BCF 03,5
MOVLW 0FC ;Set pins to output mode
MOVWF 05
MOVLW 000
MOVWF 06 ;Now all outputs are held
low
CLRF 0D ;Reset VSync counter
MOVLW 3 :Wait to prevent latch-up
MOVWF 15
CLRF 14
CLRF 13
INIT: DECFSZ 13,1
GOTO INIT
DECFSZ 14,1
GOTO INIT
DECFSZ 15,1
GOTO INIT
BSF 03,5 ;Release the inputs
BSF 05,0 ;Set VSync pin to input mode
BSF 05,1 ;Set HSync pin to input mode
BSF 06,7 ;Set LCDclock pin to input
mode
BCF 03,5
MAIN: BTFSC 05,1 ;Read CSync input
GOTO MAIN ;Still high à wait
BSF 06,6 ;Let ADC clamp the DC level, when
sync is low…
BTFSC 05,1
GOTO CHKH
BTFSC 05,1
GOTO CHKH
BTFSC 05,1
GOTO CHKH
BTFSC 05,1
GOTO CHKH ;High already à short sync pulse means
line contains no picture information, jump to CHKH
BTFSC 05,1
GOTO HSYN
BTFSC 05,1
GOTO HSYN
BTFSC 05,1
GOTO HSYN ;Longer sync pulse, jump to HSYN
;----------------------------------------------------------
VSync pulse -------------------------------------------------------------
MOVLW 0F3 ;Reset
HSync counter
MOVWF 0F
INCF 0D,1 ;Vertraging VSync
MOVFW 0D
SUBLW 003
BTFSS 03,2 ;3e
keer?
GOTO VSY1
BSF 03,5
;Ja, VSync laag
BCF 05,0
BCF 03,5
VSY1: MOVFW 0D
SUBLW 006 ;Lengte
VSync puls
BTFSS 03,2 ;6e
keer?
GOTO CHKH
BSF 03,5
;Ja, VSync hoog
BSF 05,0
BCF 03,5
GOTO CHKH
;----------------------------------------------------------
HSync pulse -------------------------------------------------------------
HSYN: BCF 06,6 ;A longer sync pulse means the
line contains picture information
BSF 03,5 ;Switch CSync pin to output to
generate the extra sync pulse
BCF 05,1
NOP
NOP
NOP
NOP
BSF 05,1
BCF 03,5
CLRF 0D ;Reset VSync counter
MOVLW 008 ;Wait for BLEO
MOVWF 14
WAIT: DECFSZ 14,1
GOTO WAIT
BTFSS 0F,7 ;Time
to give third sync pulse?
GOTO CHKH ;Already done this frame, jump to
CHKH
INCF 0F,1 ;Increase line counter
BTFSS 03,2
GOTO CHKH ;Not
yet
BTFSC 06,1 ;Time for third sync, is this
even frame?
GOTO CHKH ;No, odd frame à no
third sync
BSF 03,5 ;Give third sync pulse
BCF 05,1
NOP
NOP
NOP
NOP
BSF 05,1
BCF 03,5
NOP ;Wait
to prevent unvalid pulse detection due to capacitance of CSync line
NOP
NOP
NOP
CHKH: BCF 06,6 ;Disable ADC clamping
CHKW: BTFSS 05,1 ;End of CSync pulse?
GOTO CHKW
GOTO MAIN ;Yes, jump to MAIN again
dw
0x0102
dw
0x0304
dw
_LP_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
end
Het
uiteindelijke schema