Info over diverse MIDI chips Onbekend, 00-00-00 -Informatie over de 8251 en 8253 , de midi chips van de turbo R GT -Informatie over de m6850 ACIA , de muziekmodule midi chip -Informatie over de Z80 PIO, gebruikt in de midisaurus Informatie uit : MICROCOMPUTER SYSTEEMACHITECTUUR Deel 3 KEMPER, J.P. 3e DRUK 1984 ISBN 90-6523-005-X Bevat informatie over : 8255 PPI Z80-PIO (midi saurus) 6820/21 PIA 8251 USART (midi turbo R GT) Z80-SIO Z80-CTC M6850 ACIA (midi muziekmodule) M6852 SSDA 8253 (midi turbo R) 8251A USART E0 = buffer register voor de te zenden data of de ontvangen data E1 = status register of mode instruction/command register ******************* STATUS REGISTER ****************************************** Als het stauts register wordt uitgelezen, dan hebben de bits de volgende betekenis: Bit 0 TxRDY Transmitter Ready De betekenis van dit bit is enigzins verschillend van de TxRDY pin. Het bit TxRDY is hoog als het data buffer van de zender leeg is. Voor het hoog zijn echter van de pin TxRDY is niet alleen het leeg zijn van het databuffer voldoende, maar ook moet de inputpin CTS (CLear To Send) laag zijn en moet de zender geenabled zijn (zie command instruction). Bit 1 RxRDY Receiver Ready Dezelfde betekenis als de pin RxRDY Bit 2 TxEMPTY Transmitter Empty Dezelfde betekenis als de pin TxEMPTY Bit 3 PE Parity Error De PE flag wordt geset als een pariteits fout door de ontvanger wordt gedetecteerd, Dit bit wordt gereset door het ER bit uit de command instruction. Bit 4 OE Overrun Error De OE flag wordt geset als de processor een karakter in het ontvangbuffer niet gelezen heft als daar reeds een volgend ontvangen karakter wordt ingezet. Dit bit wordt gereset door het ER bit in de Command instruction. Bit 5 FE Framing Error De FE flag wordt geset als aan het einde van een datawoord geen geldig stopbit wordt ontvangen. Dit bit kan worden gereset met het ER bit in de command instruction Bit 6 SYNDET Sync Detection Dit bit heeft dezelfde betekenis als de pin SYNDET Bit 7 DSR Data Set Ready Dit bit is 1 als de pin DSR laag is (actief) en 0 als de pin DSR hoog is (niet actief). ******************* MODE INSTRUCTION ***************************************** Moet als eerste opgegeven worden na een reset van de 8251 Hij moet gezet worden in het command register Bit 1,0 B2,1 00=synchrone mode 01=baud rate factor is 1 10=baud rate factor is 16 11=baud rate factor is 64 Bit 3,2 L2,1 00=5 data bits 01=6 data bits 10=7 data bits 11=8 data bits Als minder dan 8 bits karakters zijn gedefinieerd, dan moet bij schrijven naar de 8251 de actuele data op de minst significante plaatsen in het datawoord staan.De andere bits zijn don't cares.Bij het lezen van ontvangen data zijn deze bits 0. Bit 4 PEN 0=geen pariteitsbit 1=pariteitsbit aanwezig Als een paritietsbit aanwezig is dan maakt dit geen deel uit van de databits die door de processor worden gelezen of geschreven. Bij zenden wordt dit bit door de 8251A toegevoegd , bi ontvangen wordt het gecontroleerd. Bit 5 EP 0=oneven pariteit 1=even pariteit Dit bit is een don't care als voor het bit PEN een 0 is gedefinieerd. Bit 7,6 S2,1 00= niet toegestaan 01=1 stopbit 10=1.5 stopbit 11=2 stopbits Deze bits hebben slechts betrekking op de zender. De ontvanger heeft altijd voldoende aan 1 stopbit. Indien voor de bits B2,1 is gedefinieerd 00, dan heben we te maken met de synchrone mode. De betekenis van de bits S2,1 is dan als volgt: Bit 6 ESD 0=interne synchronisatie : pin SYNDET is output 1=externe synchronisatie : pin SYNDET is input Bit 7 SCS 0=1 sync karakter 1=2 sync karakters Welke karakters als Sync karakter(s) dienen moet direct na de mode instruction in het commando register geschreven worden. ____________________ E1 | mode instruction | -------------------- E1 | sync karakter 1 |------| -------------------- |sync mode only E1 | sync karakter 2 | -----| -------------------- E1 | command instr. | -------------------- E0 | | | DATA | / / / / | | -------------------- E1 | command instr. | -------------------- E0 | | | DATA | / / / / | | -------------------- E1 | command instr. | -------------------- Asynchrone mode (zenden) Als een karakter naar het data register van de 8251 is geschreven, dan wordt automatisch een startbit toegevoegd, gevolgd door de databits (minst significante bit eerst), eventueel een pariteitsbit als dat was aangegeven in de mode instruction en uiteindelijk het aantal gevraagde stopbits. Daarna wordt het aldus gevormde woord als een serieele bitreeks met een tempo gelijk aan 1x, 1/16x of 1/64x de frequentie van TxC, zoals aangegeven in de mode instruction. Als geen data woorden naar de 8251 worden geschreven worden, dan blijft de TxD lijn in de mark state Asynchrone mode (ontvangen) De RxD lijn is normaal hoog (mark). een neergaande flank op deze lijn geeft het begin aan van een startbit. De geldigheid van dit startbit wordt een halve nittijd later opnieuw gecontroleerd (alleen in de 16x en de 64 x mode) als dan opnieuw een laag wordt gedetecteerd dan is een geldig startbit gezienen wordt de bit teller gestart. Op het nominale midden van de bits wordt een sample genomen en in het schuifregister geschoven (op de opgaande flank van RxC). Als een pariteitsfout optreed dan wordt de parity error flag geset. Als geen stopbit wordt gezien wordt de framing error flag geset. Let op dat de ontvanger slechts een enkel stopbit checkt, ook al zijn in de mode instruction meerder stopbits opgegeven. Het ontvangen datawoord wordt vervolgens in het databuffer geklokt en de RxRDY pin wordt hoog. Als in het buffer nog een woord stond dat nog niet door de processor was gelezen, dan wordt de overrun error flag geset. Het optreden van een va de genoemde fouten heeft geen enkele invloed op de werking op de werking van de 8251A. Synchrone mode (zenden) Het verschil met de asynchrone mode is dat altijd data wordt uitgezonden in het tempo van TxC. Als er geen karakters worden geschreven naar het zend buffer, dan worden automatichs synckarakters door de 8251A uitgezonden, 1 of 2 zoals in de mode instruction is aangegeven. Let op dat de pen TxEMPTY hoog blijft zolang synckarakters worden uitgezonden. TxEMPTY wordt weer laag als een data woord naar de 8251 wordt geschreven. Synchrone mode (ontavngen) In deze mode kan geprogrammeerd worden dat intern of extern gesynchroniseerd moet worden op de woordgrens. Als is geprogrameerd dat dit intern moet gebeuren, dan kan de 8251A in de zigenaamde hunt'-mode gezet worden (zie command reg.) Data op de RxD pin wordt dan gesampled op de opgaande flank van RxC en na elk ingeschoven bit wordt de inhoud van het schuifregister vergeleken met het eerste synckarakter. Als er twee synckarakters zijn geprogrameerd dan wordt ook het daarop volgende datawoord met dit tweede synckarakter vergeleken. Als beide synckarakters zijn ontvangen dan ver laat de 8251 de hunt mode en is in karaktersynchronisatie. Dit is te zien aan het feit dat het SYNDET bit en de SYNDET pen 1 zijn. De eerst volgende keer dat de status wordt uitgelezen wordt SYNDET weer laag. Als een pariteitsbit is geprogrameerd, dan wordt SYNDET pas hoog als ook het pariteits bit ontvangen is. In de externe synchronisatie mode, wordt synchronisatie bereikt als de SYNDET pin van buiten af hoog wordt gemaakt. Hiermee wordt bereikt dat de 8251 de 'hunt mode gedwongen verlaat. Na een cyclus van RxC mag SYNDET weer laag worden. Parity error en overrun error worden op dezelfde manier geset als in de asynchrone mode. ******************** COMMAND INSTRUCTION ************************************* Na het geven van de mode instruction kan op elk gewenst moment een command instruction gegeven worden.Een command instruction heeft alleen betrekking op de actuele uitvoering van het in de instruction gegeven formaat. De betekenis van de commmand instruction woord is: Bit 0 TxEN 0=disable zender 1=enable zender Bit 1 DTR 0=DTR pin is hoog (inactief) 1=DTR pin is laag (actief) Bit 2 RxEN 0=disable ontvanger 1=enable ontvanger Bit 3 SBRK 0=geen effect 1=zend BREAK karakter (TxD laag) Bit 4 ER 0=geen effect 1=reset error flags PE,OE en FE Bit 5 RTS 0=RTS pin is hoog (inactief) 1=RTS pin is laag (actief) Bit 6 IR 0=geen effect 1=internal reset Na een interne reset moet (evenals een externe reset) opnieuw een mode instructie naar de 8251 worden gestuurd. Bit 7 EH 0=geen effect 1=hunt mode (sync mode) 8253 programmeerbare timer/counter De 8253 bevat 3 identieke 16 bits pre-settable downcounters.Elke counter heeft een klok ingang. Een opgaande flank op deze ingang verlaagt de 16 bits counter met 1. ________ |count-|<---- clk 0/1/2 | er | |0/1/2 |<---- gate 0/1/2 | |----> out 0/1/2 ________ Elke counter heeft verder een gate input waarmee in het algemeen het tellen van de counter kan worden geenable of gedisabled.Elke counter heeft tenslotte een multifunctionele uitgang , die aangeeft dat de timer/counter zijn taak heeft uitgevoerd. Deze uitgang kan aangesloten worden op een andere applicatie of hij kan als interrupt gebruikt worden. Bij iedere tellet zijn 2 16 bits register aanwezig. Het ene register bevat de initiele tellerwaarde. Vanuit dit register wordt een counter steeds geladen. In de autoload mode gebeurt dit laden automatische wanneer de counter naar 0 wordt verlaagd. Het tweede 16 bits register wordt gebruikt om eeb counter die nog loopt uit te lezen. Het programmeren: De volgende byte moet naar het mode woord geschreven worden Bit 7,6 SC1,0 00=select conter0 01=select conter1 10=select conter2 11=niet toegestaan Bit 5,4 RL1,0 00=latch counter 01=lees/laad alleen MSB 10=lees/laad alleen LSB 11=lees/laad LSB en MSB 00 In deze bits maakt het mogelijk, zonder dat het telen van de counter wordt verstoord, een counter uit te lezen. Er ordt eenvoudig een latch commando gegeven en een copie van de counter wordt in een 16 bits register vastgelegd. Dit register kan dan met een normale lees-of input operatie worden uitgelezen. 01 Geeft aan dat bij een lees of schrijf operatie slechts het meest significantie byte van de 16 bits counter bij de operatie wordt betrokken. 10 Echter definieert juist dat de minst significante 8 bits worden gelzen. 11 programeert de 8253 zo ,dat steeds twee lees en schrijfoperaties moeten worden uitgevoerd. Altijd heeft de eerste operatie betrekking op het minst significante byte en de tweede operatie op ht meest significante byte. Bit 3,2,1 M2,1,0 000=mode 0 001=mode 1 x10=mode 2 x11=mode 3 100=mode 4 101=mode 5 Bit 0 BCD 0=binair tellen 1=BCD tellen MODE 0 (interrupt on terminal count) De ouput lijn is na de mode programmering laag. Nadat de counter is geladen blijft de output laag en de counter telt. als de teller 0 wordt dan zal de output hoog worden en hoog blijven totdat de betreffende counter opnieuw geladen wordt of opnieuw geprogrameerd wordt. Bijvoorbeeld:timeout van een modem. MODE 1 (programmeerbare one-shot De uitgang van de counter wordt laag op de telslag volgend op de opgaande flank van de gate input. De uitgang wordt hoog als de counter tot nul is afgelaagd. Als tijdens het laagzijn van de output een nieuwe waard in de counter wordt geladen heeft dat geen invloed op de duur van de oneshot puls. De one-shot is hertriggerbaar, dat wil zeggen dat de output laag blijft gedurende de volledige telcyclus na een opgaande flank van de gate lijn. MODE 2 (Rate generator) In deze mode is de 8253 een deler. De output is laag gedurende een enkele periode van ed clock ingang. De periode van de ene puls tot de volgende puls tot de volgende is gelijk aan de telwaarde. Als de counter met een nieuwe waarde wordt geladen dan heeft dat pas effect op de volgende telcyclus. Aan het begin daarvan wordt immers de counter opnieuw gladen. De gate ingang kan gebruikt worden om de teller te synchroniseren. Bijvoorbeeld: real time clock MODE 3 (block golf generator) Deze mode is hetzelfde als mode 2, echter met dit verschil dat nu de output een halve periode hoog is en een halve periode laag. Wordt de counter met een oneven waarde geladen, dan is de uitgang hoog gedurende (N+1)/2 clk pulsen en laag gedurende (n-1)/2 clk pulsen. Bijvoorbeeld: baudrate generator !!!!!!! Deze mode is zeer geschikt om een klok te realiseren voor een 8251A. Stel dat we te maken hebben met en asynchrone teerminel die op 300 Baud werkt. De USART is zo geprogrammeerd dat de aangeboden ontvanger en zenderklok door 16 wordt gedeeld. We moeten dan TxC en RxC gelik maken aan 300x16 = 4800 Hz. Dat betekent dat de periodeduur van de blokgolf 208.33 microseconden moet zijn. Als de cLK ingang van de gebruikte counter een periode duur van 500 nanoseconden,dan moeten we de counter dus laden met 471 (1a1H) MODE 4 (software triggered strobe) In deze mode zal de uitgang na het zetten van de mode hoog worden. Als het countregister is geladen begint de counter te tellen. Als deze 0 is dan wordt de uitgang gedurende een enkele clk periode laag en wordt daarna weer hoog. De uitgang blijft hoog totdat de counter opnieuw wordt geladen. MODE 5 (hardware triggered strobe) In dit geval zal de counter gaan tellen na een opgaande flank van de gate lijn. Deze mode is hertriggerbaar. De counter zal een gehele geprogrammeerde tellerwaarde aftellen na een opgaande flank van de gat ingang. Bijvoorbeeld:pulsbreedte meting **************** registers M6850 ACIA ************************************** command woord: Bit 7 0=Disable receiver interrupts 1=enable receiver interrupts Bit 6,5 00=RTS laag, disable transmitterinterrupts 01=RTS laag, enable transmitter interrupts 10=RTS hoog, disable transmitter interrupts 11=RTS laag, disable transmitter interrupts ;zend Break karakter Bit 4,3,2 000= 7bits, even pariteit, 2stopbits 001= 7bits,oneven pariteit, 2stopbits 010= 7bits, even pariteit, 1stopbit 011= 7bits,oneven pariteit, 1stopbit 100= 8bits, geen pariteit, 2stopbits 101= 8bits, geen pariteit, 1stopbit 110= 8bits, even pariteit, 1stopbit 111= 8bits,oneven pariteit, 1stopbit Bit 1,0 00=1xclockrate 01=1/16xclockrate 10=1/64xclockrate 11=internal reset Na het opstarten zal de M6850 ACIA eerst gereset moeten worden met Bit 1,0 (11) Status register: Bit 7 IRQ Dit bit is hoog als er een interruptrequest loopt. Bit 6 PE Parity Error Bit 5 OVRN Overrun Error Een overrun error error veroorzaakt een interrupt. Bit 4 FE Framing Error Bit 5 CTS Clear To Send Als de CTS pin hoog (inactief) is dan wordt de statusbit 1 (Transmit data register empty) 0 gemaakt.Ok de hierbij behorende interrupt wordt niet op de IRQ pin geplatst. De software zal dientengevolge geen data naar het transmitbuffer zenden en aldus de zender disabelen. Bit 2 DCD Data Carrier Detect Als DCD een laag -hoog overgang maakt dan wordt een interrupt gegenereerd en het DCD bit wordt 1. Bit 2 blijft 1 totdat het statusregister is gelezen door de processor, ook al was de DCD pin intussen weer laag. Bit 1 TDRE Transmit Data Register Empty Dit bit wordt 1 als de inhoud van het zendbuffer in het schuifregister wordt geklokt. Het blijft 1 zolang geen nieuw karakter in het zendbuffer wordt geschreven. Dit bit veroorzaakt een interrupt als transmitter interrupts zijn geenabled. Bit 0 RDRF Receive Data Register Full Dit bit wordt 1 als een volledig datawoord door de zender is ontvangen en in het ontvangbuffer is geplaatst. Als Receiver interrupts zijn geenabled,veroorzaakt een 1 in dit bit en interrupt. Als het bit DCD 1 is dan wordt het RDRF bit0 gehouden, zodat geen niet bestaande data door de processor wordt gelezen. ************************ Z80 PIO en de MIDISAURUS **************************** De midisaurus bestaat uit een z80 pio ,een groot flatpack,een eprom,een stukje s-ram en nog wat ondersteunende electronica De Midi saurus heeft 4 poortadressen: &H70 buffer poort A voor de te lezen data of te schrijven data &H71 register bij schrijven of &H72 buffer poort B voor de te lezen data of te schrijven data &H73 register voor uitgang B van de PIO Het register (A&B) is als volgt opgebouwd: b7 b6 b5 b4 b3 b2 b1 b0 | | | | | | | | | | | | -------------- indentificatie als register data | | ---------- don't care ------- mode: b7 b6 0 0 = output (mode0) 0 1 = input (mode1) 1 0 = bidirectioneel (mode3) 1 1 = bit control |