|
Decoder
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Om vanuit de Adres-bus de data naar de juiste Sid, of de juiste register van de Latches te laten gaan, moet het adres worden gedecodeerd. Deze taak wordt verricht door de Decoder. Daarnaast krijgt de Decoder een Kristal Oscillator van 1MHz (voor de phi2 (Φ2, "p2") van de Sid's) en een Lcd-Teller, die de bewerkingstijd (van 40 usec) van het Lcd-Display telt (een soort van Timer). Een ander "probleem" is de verkrijgbaarheid van de benodigde IC-s en daardoor de ruimte op de print (zie Lcd-Timer). Het schema zelf is in deze 3 delen verdeeld.
Het Decoderen.Het decoderen van het adres is recht-toe recht-aan en gebeurt met 4 losse decoder-IC's (74hct138). Bij 2 decoders worden maar 1 uitgang gebruikt, wat eventueel met losse poorten gedaan zou kunnen worden. Echter decoders nemen minder ruimte op de print in, dus zijn het decoders geworden. Om een adres te decoderen, moet er eerst bekend worden welke losse adressen de diverse componenten krijgen. Allereerst is het maximum Sids op 8 gesteld, dit aantal zorgt dat er maar 1 decoder nodig is om alle 8 Sids te kunnen adresseren (IC1). Er is bekend dat een Sid 32 adressen nodig heeft ($00..$1F) - Deze decodering gebeurt in de Sids zelf. Bij elkaar zijn dit (8 * 32 =) 256 adres-posities. Van de Latches is bekend dat er 6 registers zijn, dit geeft een bereik van 8 adressen weer (8 is 2^3). Dit kan met 1 decoder (IC3). Hiervan zijn er 5 write-registers en 1 read-register. Dit read-register geeft een extra verdeling en dus extra poorten, of een extra decoder. Hier is gekozen voor de extra decoder (IC4). Om dit aantal mooi te laten passen met het bereik van de Sids, zijn ook voor deze registers totaal 256 adres-posities verdeeld. Dit resulteert wel dat de registers een aantal keer worden gespiegeld (256 DIV 8 geeft 32 spiegelingen => 5 adres-lijnen), ik heb gekozen om de spiegeling te beperken tot 4 keer (en is er dus nog een extra decoder nodig (IC2)). Bij elkaar geeft dit de volgende twee tabellen.
Dit geheel resulteert dus in twee gebieden van elk 256 adres-posities. De verdeling tussen deze twee gebieden wordt door de eerst volgende adres-lijn gemaakt (Adres-lijn A8). Hogere Adres-lijnen worden er niet gebruikt in de ArSid, maar zouden altijd nog geïmplementeerd kunnen worden (Adres A9 t/m A14). Een extra detail is een lijn "Adres-Enable". Hiermee moeten alle I/O worden uitgeschakeld, bijvoorbeeld tijdens het voorbereiden van een nieuw adres om van te lezen of naar te schrijven. Nogmaals deze Adres/Data-bus structuur is afgeleid van de 6502 processor (c.q. 6510), maar mij is niet bekend hoe men het daar opgelost heeft wanneer de processor ergens (intern) mee bezig was, zonder dat er geheugen benaderd moest worden.
De Oscillator.De Sids hebben een tijdbasis nodig met een frequentie van 1 MegaHertz (1.000MHz). In een 65xx structuur wordt deze gehaald uit het klok-signaal van de processor, phi2 genaamd (Φ2, "p2"). Hier moet het apart worden opgewekt. Het kan dat er een klok-signaal op de Arduino Mega print aanwezig is, echter de Arduino werkt op 8MHz (en wellicht nog hoger). De oscillator is opgebouwd middels een beproefd recept. Een kristal en een IC 74LS04 vormen de basis - dit moet een LS-type zijn. Een HCT-type regaeert veel te snel om te oscilleren op de frequentie van het kristal. De poorten IC5-a en IC5-b vormen de feitelijke oscillator, poort IC5-c is een buffertje.
De Lcd-Timer.Bij het schrijven naar het Lcd-Display heeft het display ongeveer 40 micro seconden (40us) nodig om de bewerking af te ronden. Deze bewerkingstijd is er ook bij het lezen van het Display, maar in de ArSid wordt alleen geschreven naar het Display. Hier moet rekening mee worden gehouden en dit kan op 3 manieren.
Er is gekozen voor de laatste optie, de hardware-matige oplossing met een 8-bits teller. Het idee is dat een teller-IC, aangesloten op de Φ2 (1MHz = 1us) en bij 40us stopt met tellen. Een schrijf-pulse naar het Lcd-Display reset deze teller, zodat deze weer begint met tellen. 40us is geen mooie macht van 2, dus wordt er een hardware-vergelijker (IC7, een 74hct85) gebruikt om bij de benodigde stand de teller te laten stoppen. Met Dip-Switches (S1) wordt deze eindstand opgegeven. Misschien is 40us te weinig, daarom is de stand hier bepaald op 44us. Het kan ook dat de 40us te veel is ... ook dit kan dan nog eenvoudig worden aangepast. Een mooi IC hiervoor was gevonden in de 74hct590, dat alle benodigde teller-functies in zich heeft (8-bits, tellen, teller-stop, reset). Dit type is echter alleen in SMD (Surface Mounted Device) beschikbaar - en dus niet geschikt voor mijn vaardigheden. In DIP (Dual In Pin, de standaard IC's met twee rijen pinnetjes) kom ik dan op het type 74hct393 (IC6). Hier zitten twee losse tellers in met elk de volgende eigenschappen: 4-bits, tellen, reset. Een teller-stop moet zelf worden gerealiseert en gebeurt hier met een extra IC met Nand-poorten (IC8-c en IC8-d, een 74hct00). De extra ruimte die de 74hct00 gaat innemen zorgt dat er geen ruimte meer op de print is voor de Dip-Switches. Een blik op de print geeft twee opties voor de Dip-Switches: (Optie 2) een los printje, gemonteerd met een extra schroefje die met draadjes wordt aangesloten op de vergelijker (74hct85), of (Optie 1) met behulp van print-pennen "boven" op de vergelijker monteren. De foto's geven aan dat ik hier voor optie 1 heb gekozen.
De print.De print zelf is zo smal mogelijk gemaakt, om de meest (nog) mogelijke ruimte te creëren voor de Sids - iets waar nu al echt rekening mee moet worden gehouden. Nu blijkt ook dat de centimeter die naast de voedingsprint is gehouden, wellicht te breed is geweest, waardoor ik nu de overgebleven ruimte zo vol mogelijk moet zien te maken voor het volledige ontwerp. Zelfs de DipSwitches (S1) monteren op de print zelf, maakte de print al te breed (ook al ging het maar om 7.5mm = 3 gaatjes). De Dipswitches was dan namelijk gepland halverwege naast IC6 en IC7. De print is volgens een geijkt concept opgebouwd. Montage gaatjes boren, koper-sporen onderbreken, IC-voeten, andere componenten, konnectoren, draadjes en dan op naar de volgende stap.
Het testen.Eerst is de oscillator getest (IC5). Een oscilloscoop geeft een keurig signaal van 1.000 MHz (±10.1 kHz, toch nog 1 procent afwijking - geen idee hoe hoorbaar deze afwijking is). Misschien dat hier nog een ander ontwerp voor de oscillator moet komen. Daarna is de teller-IC (IC6) (en toebehoren (IC8)) in de print geprikt en getest. Het oscilloscoop-beeld geeft hier wel een niet-verwacht beeld van onregelmatige pulsen op het B-kanaal (= uitgang Q3 van de teller IC6). Verwacht was een keurige verdeling van 8 pulsen boven geeft 1 puls beneden. De vergelijker kon op dit moment nog niet worden getest, omdat dit onderdeel nog niet binnen was. Wel is de Dip-Switch (S1) alvast op zijn plek geprikt. Als laatste zijn de vier ecoder-IC's (IC1 .. IC4) op hun plaats geprikt. De LedRij is als indicatie-Led's op de uitgangen naar resp. de Latches (IC3 en IC4) en de Sids (IC1) aangesloten. Ook zijn de aansluit-connectoren gemaakt tussen de Arduino-Mega, de Latches en de Decoder. Op de foto's is ook al de (kale) print voor de Sids te zien (rechts onder) en een extra stukje Flat-kabel (voor de Data-bus) is al (opgerold) neergelegd richting de Sids-print. Tenslotte is er een programmaatje gemaakt die een teller-variabele stuurt naar de toekomstige Adres-bus. Niet alle test-resultaten zijn op de foto gezet, slechts een groene brandende Led van de LedRij. Wat nu volgt is een uitgebreide test van de samenwerking van de Arduino, Decoder en Latches.
Testen met de Led Rij.De test-procedure en programma-opbouw is dezelfde als bij de Latches. Maar bij het testen van de LedRij dienen enkele funkties worden aangepast aan de Decoder, namelijk allen die de adres-bus en data-bus aanroepen. De Adres-bus funkties moeten worden aangepast van een 6-lijns enable naar een 9 bits adres-bus (gecombineerd met een enable). Bij de declaratie van de variabele aa moet het type byte worden veranderd in word. De lage 8-bits van het adres moeten naar PortC en de hoogste bit(s) moet(en) naar PortL. De Data-bus funkties moeten worden aangepast met een "Enable/Disable" systeem en een juiste R/~W aansturing. Er is een extra vertraging nodig tussen het klaar zetten van de Data op de Data-bus en het geven van de Enable-puls. Zonder deze vertraging laat de led Rij een onregelmatig ge"knipper" zien van Leds die niet aangezet worden. Dit verklaart waarom sommige regels twee keer worden uitgevoerd. Theorie over de Sids (en met name de 8580-Sids) doet mij vermoeden dat er nog meer vertraging in deze funktie moet komen, of dat er nog gekeken moet worden naar het Φ2 (p2) signaal ... maar dat wordt een zorg voor later. Getest is ook dat het niet aktiveren van de Write (op de R/~W-lijn) ook daadwerkelijk geen enkel register aktiveerd (en dus geen enkele Led laat branden). Op zich is dit wel een belangrijke funktie. Het continue aktiveren van de Write aktiveert namelijk WEL de registers en zal zorgen voor onbedoelde akties. Voor de rest zijn in de Write_Data() funktie ook alle (losse) Adres-regels gedaan. Dit weer om minder tijd-vertragingen te geven bij funktie-oproepen (en zo). Alles is hier gericht op zo snel mogelijke afhandelingen, met alleen een vertraging waar het echt nodig is.
Testen met de Lcd.Hier is de test-procedure en programma opbouw ook dezelfde als bij de Latches. En ook hier hoeven alleen de procedures voor de Adres-bus en Data-bus worden aangepast. Daarna werkte dit programma meteen zonder verdere debugging, zoals de foto's laat zien (die met de tekst "Arsid Decoder Check"). De ledRij is hier (net als bij de Latches) keurig met de potmeters te beïnvloeden. De funktie Read_Data() is bij deze test weggelaten en wordt straks bij de schakelaars (opnieuw) geschreven.
Testen met de schakelaars.En ook hier is de test-procedure en programma opbouw dezelfde als bij de Latches. En ook hier hoeven alleen de procedures voor de Adres-bus en Data-bus worden aangepast. Daarna werkte dit programma meteen zonder verdere debugging, zoals de foto's laat zien (die met de tekst "Arsid Decoder Check"). En net als bij de Latches zijn de posities van alle potmeters en van alle schakelaars op het Display te zien en is de ledRij is hier (net als bij de Latches) keurig met de potmeters te beïnvloeden.
De Lcd-TimerUiteraard moet de Lcd-Timer op zich nog getest worden. Eerst moeten enkele tijden worden vastgesteld van de diverse funkties. Een methode is om de interne tijdbasis van de Arduino Mega te nemen, zoals die gegevens wordt via de funktie tijd = Micros();. In het kort wordt de tijd uit deze funktie genomen aan het begin EN aan het eind van de te testen funkties en dan het verschil hiervan te tonen. Echter voor het zover is, moet eerst het aantal funkties voor de lcd worden uitgebreid met het volgende:
Voor het doel hier, zijn deze funkties hier niet opgenomen, maar worden uitgebreid besproken wanneer deze funkties in een eigen Library opgenomen zijn. De bij-dit-deel behorende listing is daarom ook erg kort. Wat hier WEL belangrijk is, is de delay(42); in de funktie Lcd-Out(). Deze ingebouwde vertraging staat hier nog vast en deze vertraging moet door de Lcd_Timer worden vervangen. Maar voordat het zover is ... Aan het eind van de listing staan enkele tijden van geteste funkties. Wat opvalt is dat de timer-funktie Micros() zelf een resolutie heeft van 4 micro secondes. Wat ook opvalt is het tijdsverloop tussen 0uS en 4uS. Er zijn zelf nog geen enkele interupt-routines geaktiveerd, welicht komt dit verloop door interupt-routines die intern al lopen. Tevens is dit verloop bij alle geteste funkties waargenomen en variëerd tussen 4uS en 12uS. De funktie Lcd-out() heeft 54±2uS nodig. Hierbij wordt er maar 1 teken naar het Lcd Display gestuurd MET de geprogrammeerde Delay(42) erin. De funktie Lcd_print() heeft 4uS meer nodig (namelijk 58±4uS), veroorzaakt door de daarin gebouwde while() constructie die nodig is om een gehele string af te lopen. Hoe meer tekens Lcd_print() moet afdrukken, hoe langer het duurt, tot 4108±4uS voor een heel scherm met tekens ... 4.1 millisecondes voor een heel scherm. De funktie Lcd_number() heeft voor 1 cijfer 152±2uS nodig. Voor 5 cijfers worden dit 664±4uS. Het verlagen van de delay(42); tot delay(32); verlaagt de vertraging tot 44±4uS (bij de funktie Lcd_out()). Dit is een versnelling met 10uS. Omdat ik de Vergelijker-IC (74hct85) nog niet heb, heb ik besloten om (tijdelijk) één van de uitgangen van de teller (74hct393) eens door te koppelen aan de uitgangspin (pin 6, 74hct85). Ik heb extra pinnen gesoldeerd op de print-connectoren voor de oscilloscoop ... en wel op de aansluiting van de Lcd, afkomstig van de latches (probe A) en de Lcd, gaande naar de Arduino probe B) - of te wel, de reset van de Tellers en de uitgang van de Vergelijker. De twee (grijze) probes van de scoop zijn duidelijk te zien op de foto. Het beeld van de scoop gaf eerst aan dat er iets niet helemaal goed zat. De brede Arduino Mega connector zit onlogischer in elkaar dan verwacht, want ik had er twee aansluitingen verwisseld (de Φ2 en de Lcd). Het goed-om solderen geeft een goed beeld en het programma gaat zoals gepland. Nu is het een questie geweest om de juiste teller-uitgang (74hct393) te pakken. Pulseert een uitgang te snel, dan geeft het Lcd Display de teksten op willekeurige posities ... een teken dat het schrijven naar het display te snel gaat. Het verbinden van teller-uitgang Q1 (van teller 2, pin 10, 74hct393) (= pin 15 op de Vergelijker, 74hct85) blijkt een goede te zijn. Met een vertraging van 40±0uS (!) toont het display een stabiel beeld. Wat opvalt is dat deze 40uS op zich ook stabiel is. Bovendien geeft de scoop deze 40uS keurig weer in zijn vakjes. Een bewijs dat het Timer-idee op zich goed is ... maar, zonder Vergelijker, is het nog niet kompleet.
Theoretische bepaling van de waarde voor de Dip-Switches.Er is een theoretische waarde waarop de Dip-Switches ingesteld zouden moeten worden voor een juist gedrag van het Lcd-Display. De Datasheet van het display zegt dat het minimaal 40usec nodig heeft voor een juiste werking, tijd die gebruikt wordt om display-insructies te interpreteren en de tekens naar de juiste positie te sturen. Deze 40usec is bus leidend. Wetend dat de vertraginsteller op 1MHz loopt en om het display zeker genoeg tijd te geven, moet er minimaal tot de waarde 40 worden geteld. Op 1MHz komt dit overeen met 40usec. Ietsje erbij, geeft 44usec. 44 decimaal komt overeen met %0010 1100. Dit is de waarde die in het schema staat boven de (8-bits) teller-IC en de vergelijker-IC. Dit geeft de volgende tabel (inclusief gemeten waardes en display conclusies).
De Vergelijker-IC en de Dip-Switches.Nadat de Vergelijker-IC (74hct85) (eindelijk) is binnengekomen, is ook dit gedeelte getest. Er kwam nog een vergeten draadbrugje op de opsteekprint met de Dip-Switchen aan het licht. De oscilloscoop is weer aangesloten op de punten Lcd-Timer (linksboven in het schema, het derde aansluitpunt) en Lcd-Enable (rechtsmidden in het schema, het onderste aansluitpunt) en de Dip-Switches zijn één voor één omgezet (op dit punt werd de vergeten draadbrug ontdekt). Na de eerder bepaalde waarde van %1011 op de Dip-Switches te hebben ingesteld, ontstond er een gemeten Lcd-tijd van 52usec tot 56usec. De oscilloscoop geeft een Lcd-tijd van 53usec tot 54usec. Langzamer dan de eerder bepaalde 44usec. Uiteraard is deze instel-waarde gevarieerd en dan blijkt er een belangrijk kantelpunt te zitten bij de waardes van %0111 en %1000. De theoretische waarde is duidelijk te hoog bepaald. Zoals de foto's ook aangeven functioneerd het Lcd-Display niet correct bij de waarde van %0111. Er vallen tekens weg en het titelscherm is door elkaar gehusseld, puinhoop dus. Er is wel een vertragingswaarde zichtbaar van 36usec tot 40usec. Dit is dus duidelijk te snel. Met de Dip-Swichen ingesteld op een waarde hoger (%1000), dan worden de tekens wel correct op het display aangegeven en ontstaat er een vertragingswaarde van 40usec en 44usec (de oscilloscoop geeft een tijd van 41usec tot 42usec). Is er bij de te-snelle instel-waardes nog wel een meet-getal te lezen op het display, bij een instel-waarde van %0000 (onderste regel in de tabel) valt dit meet-getal niet meer te ontdekken, omdat hij wegvalt in de getallen-puinhoop op het display. De Oscilloscoop geeft wel een waarde, namelijk van 7usec tot 8usec, keurig binnen de verwachtingen van de tabel - elke Dip-Switch stap is 4usec. Op zich is het kantel-punt van %0111 en %1000 op de Dip-Switches een mooie waarde, omdat deze evenveel naar boven als naar beneden kan worden ingesteld. De gemeten waarde van 41.5usec (gemiddeld) valt ook keurig boven de waarde van 40usec die het display nodig heeft. Wat op de oscilloscoop ook opvalt is dat de teller-tijd varieert binnen 1usec. In bovenstaand tabel is dit ook aangegeven. En dit is ook te zien doordat de teller in het laatste osciloscoop plaatje schijnbaar telt tot stand 33.5. Deze variatie wordt veroorzaakt door de a-synchrone reset van de teller EN doordat de oscilatoren van zowel de Arduino, als op de decoder-print niet met elkaar gekoppeld zijn en dus niet synchroon met elkaar lopen. De éne keer wordt de reset van de teller ge-de-activeerd als de clock-pulse laag is, een andere keer wanneer deze hoog is. Wat ook opvalt is dat de oscilloscoop een vertraginstijd geeft van 41usec tot 42usec en dat de Arduino een waarde van 40usec tot 44usec aangeeft. Deze afwijking wordt hoofdzakelijk veroorzaakt door de resolutie van 4usec die de gebruikte meet-funkties hebben. Al met al geeft het laatste oscilloscoop-beeld een plaatje die aan de verwachtingen voldoet en waarbij alle tijden te verklaren zijn aan de aan de Dip-Switch instellingen en werking van de functies van het draaiende programma.
Einde Test.Nu in deze fase alles werkt, kunnen de volgende fases worden gestart (zoals de Sids print en versterkers). De meest essentiele I/O-routines werken, de rest hoeft er alleen nog omheen worden geprogrammeerd. Ook kan nu alvast begonnen worden met andere stukjes programma, zoals noten-tabellen of de opbouw van diverse schermen, of "libraries" bouwen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
De aansluitingen van DecoderDiverse tests van de Latches-print
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1: De broncode van Decoder met LedRij(Sun 03 July 2016) Het testen van de Decoder met de LedRij. Hierbij is de Decoder en de Aansturing nodig.
2: De broncode van Decoder met Lcd(Sun 03 July 2016) Het testen van de Decoder met de Lcd. Hierbij is de Decoder en de LedRij (met Aansturing) nodig.
3: De broncode van Decoder met Schakelaars(Sun 03 July 2016) Het testen van de Decoder met de Schakelaars. Hierbij is de Decoder, de Lcd en de LedRij (met Aansturing) nodig.
4: De broncode van Decoder met Lcd-Timing(Sun 17 July 2016) Het testen van de Decoder met de Lcd-Timer. Hierbij is de Decoder, de Lcd en de LedRij (met Aansturing) nodig.
5: De broncode van Decoder met LcdOut-funktie(Sun 17 July 2016) De nieuwe funktie LcdOut(), die werkt met de Lcd-Timer.
|
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes] |